Subversion Repositories DevTools

Rev

Rev 6177 | Rev 6276 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

########################################################################
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
#
# Module name   : PLATFORM_CFG.PM
# Module type   : Makefile system
# Compiler(s)   : Perl
# Environment(s): jats
#
# Description   : Provides platform configuration information
#
#                 The main pupose of this configuration information is to
#                 prevent JATS from attempting to build software on
#                 a platform that does not support the required compilers
#
#                 ie: Its not possible to build PPC_302E on a windows
#                     Nor is it possbile to build WIN32 on a Sun Sparc
#
#                 This can be done via GBE_BUILDFILTER, but results in
#                 an unwieldy GBE_BUILDFILTER. Better to prune the
#                 targets at the start
#
#......................................................................#

require 5.008_002;
use strict;
use warnings;

package PlatformConfig;
use JatsError;

#
#   An array of known Keywords and Aliases
#       Keywords should not be used for platform names
#       Aliases are set up for the user
# 
our @BuildAliases = qw (NATIVE INSTRUMENT PKG_WIN PKG_RPM PKG_DEB SK );
our @BuildKeywords = ( qw (TOOLSET GENERIC GENERIC_MACHTYPE), @BuildAliases );

#
#   The following structure is a hash of arrays
#   The hash key is a supported machine type - one per machine
#   The data is an array of supported PLATFORMS
#   Each platform may have a : seperated list of tags
#   Known tags include:
#       TOOLSET - Sutable for building JATS tools
#       NATIVE  - Can be expected to run on the build machine
#       KNOWN - Indicated platform is known to this machine type. Used to test existence 
#       GENERIC - Can be built on any machine
#       DEVLINUX - Part of the DEVLINUX alias
#       LINUX - Part of the LINUX alias 
#       LMOS - Bastard Platforms from Hell
#       PKG_DEB - Install Debian Packages   
#       PKG_RPM - Install RPM Packages
#       PKG_WIN - Install Windows Installers
#       SK - The SK familty of platforms
#
our %BuildAvailability = (
    'linux_i386' => [
        'ANDROIDARM:ANDROIDNDK',
        'ANDROIDMIPS:ANDROIDNDK',
        'ANDROIDX86:ANDROIDNDK',
        'ANDROID',
        'ARM9TDMI:DEVLINUX:LMOS:PKG_DEB',
        'COBRA:DEVLINUX:LMOS:PKG_DEB',
        'COBRA2:DEVLINUX:LMOS:PKG_DEB',
        'HAMMERHEAD:PKG_DEB',
        'JAVA:NATIVE',
        'LINUX86',
        'LINUX_ARMV4',
        'LINUX_EMU',
        'LINUX_ETX:DEVLINUX:LMOS',
        'LINUX_I386:NATIVE:TOOLSET',
        'PPC_603E:DEVLINUX:LMOS:PKG_DEB',
        'SK20:DEVLINUX:PKG_DEB:SK',
        'SK20V41:DEVLINUX:PKG_DEB:SK',
        'UBUNTU12:NATIVE:TOOLSET:DEVLINUX:LMOS:PKG_DEB',
        'UBUNTU12_INSTRUMENT:NATIVE:DEVLINUX:INSTRUMENT',
        'UBUNTU12C11:NATIVE:TOOLSET:DEVLINUX:LMOS:PKG_DEB',
        'UBUNTU12C11_INSTRUMENT:NATIVE:DEVLINUX:INSTRUMENT',
        'VIPER2:DEVLINUX:PKG_DEB',
        ],

    'linux_x64' => [
        'LINUX_I386:NATIVE:PKG_DEB',
        'JAVA:NATIVE',
        'UBUNTU14:NATIVE:TOOLSET:LINUX:PKG_DEB',
        'UBUNTU14_INSTRUMENT:NATIVE:LINUX:INSTRUMENT',
        'UBUNTU16:NATIVE:TOOLSET:LINUX:PKG_DEB',
        'UBUNTU16_INSTRUMENT:NATIVE:LINUX:INSTRUMENT',
        'ANDROIDARM:ANDROIDNDK',
        'ANDROIDMIPS:ANDROIDNDK',
        'ANDROIDX86:ANDROIDNDK',
        'ANDROID',
        'ARM9TDMI:DEVLINUX:LMOS',
        'COBRA:DEVLINUX:LMOS:PKG_DEB',
        'COBRA2:DEVLINUX:LMOS:PKG_DEB',
        'HAMMERHEAD',
        'LINUX_ETX:DEVLINUX:LMOS',
        'PPC_603E:DEVLINUX:LMOS:PKG_DEB',
        'SK20:DEVLINUX:PKG_DEB:SK',
        'SK20V41:DEVLINUX:PKG_DEB:SK',
        'SK100:DEVLINUX:PKG_DEB:SK',
        'UBUNTU12C11:NATIVE:DEVLINUX:LMOS:PKG_DEB',
        'UBUNTU12C11_INSTRUMENT:NATIVE:DEVLINUX:INSTRUMENT',
        'VIPER2:DEVLINUX:PKG_DEB',
        ],

    'linux_el7_x64' => [
        'RHEL7:LINUX:TOOLSET:NATIVE:PKG_RPM',
        'RHEL7_INSTRUMENT:NATIVE:LINUX:INSTRUMENT',
        ],

    'solaris10_sparc32' => [
        'SOLARIS10_SPARC32:NATIVE:TOOLSET',
        'SOLARIS10_SPARC64:NATIVE',
        'JAVA:NATIVE',
        ],

    'solaris10_x86' => [
        'SOLARIS10_X86:NATIVE:TOOLSET',
        'SOLARIS10_X64:NATIVE',
        'JAVA',
        ],

    'sparc' => [
        'SOLARIS:NATIVE:TOOLSET:TARGET_CFG=SOLARIS8_SPARC32',
        'SOLARIS_I386',
        'SOLARIS_SPARC',
        'JAVA:NATIVE',
        ],

    'win32' => [
        'ANDROID',
        'ACEX',
        'AMX',
        'ARM_I5100',
        'AVR_IAR',
        'BORLAND',
        'CMOS386',
        'CMOS68K',
        'CORTEXM3_IAR',
        'CSHARP:NATIVE',
        'CSHARP2005:NATIVE',
        'CSHARP2008:NATIVE',
        'CSHARP2010:NATIVE',
        'CSHARP2012:NATIVE',
        'CSHARP2015:NATIVE',
        'DAFBR_MOS',
        'DAFBR_WIN',
        'DELPHI7',
        'DF4OBE',
        'DOS16',
        'DOS32',
        'EEPP386',
        'EETP386',
        'EOS',
        'EOSM68K',
        'EOSP386',
        'GMPCA',
        'GO32',
        'H8S',
        'H400',
        'HK386PC',
        'HKAVM',
        'HKAVM2',
        'HKBCP',
        'HKDDU',
        'HKGAK',
        'HKMPR',
        'HKPCA',
        'INGEN',
        'INTELLECT',
        'JAVA:NATIVE',
        'MCR',
        'MERG',
        'MOS68K',
        'MOS68KRM',
        'MOSCF',
        'MPT',
        'VSDEVRC',
        'NGBCP',
        'NGDDU',
        'PHARLAP',
        'PHP',
        'RIORDS',
        'THYRON',
        'VB6',
        'VERIX',
        'VIXITP',
        'VS2003:NATIVE',
        'VS2005:NATIVE:MSWIN32',
        'VS2008:NATIVE',
        'VS2010:NATIVE',
        'VS2012:NATIVE:TOOLSET:MSWIN32:PKG_WIN',
        'VS2015:NATIVE:TOOLSET:MSWIN32:PKG_WIN',
        'WCEIPA280:WINCE',
        'WCEIT3000:WINCE',
        'WCENAUTIZX5',
        'WCEPA961:WINCE',
        'WCEPA962:WINCE',
        'WCEPA962_500:WINCE',
        'WCEPCM7220:WINCE',
        'WCEPSION_420',
        'WCEPSION_500:WINCE',
        'WCEPSION_500_emu:WINCE',
        'WCEPSION_500_VS2005:WINCE',
        'WCEPSPC_arm:WINCE',
        'WCEPSPC_emu:WINCE',
        'WCEX86A420:WINCE',
        'WCEX86A500:WINCE',
        'WCEX86A500_SOM4455:WINCE',
        'WIN32:NATIVE:TOOLSET:MSWIN32:LMOS:PKG_WIN',
        'VS2012_X64:NATIVE:MSWIN64:PKG_WIN',
        'VS2015_X64:NATIVE:MSWIN64:PKG_WIN',
        ],

);

#
#   The above data will be reorganised and placed into the following
#   hashes to simplify data access
#
my %TargetByTag;
my %TagByTarget;

#-------------------------------------------------------------------------------
# Function        : InitData
#
# Description     : Init data structures
#                   Done once
#
#                   Convert the $BuildAvailability entry array into a hash to 
#                   simplify lookup. Add in the GENERIC target:
#                       GENERIC         - can be built on ANY machine
#
# Inputs          : None
#
# Returns         : Nothing
#
sub InitData
{
    #
    #   Only do this work once
    #
    return if exists $TagByTarget{'GENERIC'};
    #
    #   Validate build machine
    #
    Error("GBE_MACHTYPE has not been defined ") unless defined $::GBE_MACHTYPE;
    Error (__PACKAGE__ . " : Unknown build machine type: $::GBE_MACHTYPE")
        unless ( exists $BuildAvailability{$::GBE_MACHTYPE} );

    #
    #   Convert the array into a hash to speed up access later
    #   Create GENERIC platform
    #
    push @{$BuildAvailability{$::GBE_MACHTYPE}}, 'GENERIC:GENERIC';

    #
    #   Create Machine Type specific Generic
    #       GENERIC_XXXX:GENERIC_MACHTYPE:TOOLSET
    #   
    my $genericMachTypes = 'GENERIC_' . uc ($::GBE_MACHTYPE);
    push @{$BuildAvailability{$::GBE_MACHTYPE}}, join (':', $genericMachTypes, 'GENERIC_MACHTYPE', 'TOOLSET' );

    foreach ( @{$BuildAvailability{$::GBE_MACHTYPE}}  )
    {
        my @data = split(':', $_ );
        my $target = shift @data;

        $TagByTarget{$target}{'KNOWN'} = 1;
        foreach my $item ( @data )
        {
            ($item, my $value) = split (/=/, $item,2);
            $value = 1 unless defined $value;
            $TagByTarget{$target}{uc($item)} = $value;
            push @{$TargetByTag{uc($item)}}, $target;
        }
    }

    #DebugDumpData("TagByTarget", \%TagByTarget);
    #DebugDumpData("TargetByTag", \%TargetByTag);
}

#-------------------------------------------------------------------------------
# Function        : getTargetsByTag 
#
# Description     : Fetch an array of build platforms that are tagged
#
# Inputs          : $tag    - Tag to process
#
# Returns         : An array of targets. May be empty
#

sub getTargetsByTag
{
    my ($tag) = @_;
    Error("Internal: getTargetsByTag. No tag specified") unless ($tag);
    InitData();

    if (exists ($TargetByTag{uc($tag)}) )
    {
        return @{$TargetByTag{uc($tag)}};
    }

    my @empty;
    return @empty;
}

#-------------------------------------------------------------------------------
# Function        : targetHasTag 
#
# Description     : Determineif the named target has the specified tag
#
# Inputs          : $target
#                   $tag 
#
# Returns         : Value of the Tag. May be 1
#                   Tags of the form NAME=VALUE wull return 'VALUE'
#
sub targetHasTag
{
    my ($target, $tag) = @_;
    Error("Internal: targetHasTag. No target specified") unless ($target);
    Error("Internal: targetHasTag. No tag specified") unless ($tag);

    InitData();
    if (exists ($TagByTarget{$target}) && exists ($TagByTarget{$target}{$tag}))
    {
        return $TagByTarget{$target}{$tag};
    }
    return 0;
}

1;