Beispiel #1
0
def build(wd, sources):

    destdir = '../SBA/'
    global opts

    flags = []
    switches = []
    boost = 0

    # MACROS
    wordsz = 64
    WORDSZ = 'WORDSZ=' + str(wordsz)
    GL = 'GPRM_LANGUAGE'
    NEW = ''
    VERBOSE = ''  #V='VERBOSE'
    # Compile for VM (otherwise compiles to model HW)
    SEQVM = 'SEQVM=0'
    USE_THREADS = 'USE_THREADS=0'
    DISTR = 'DISTR=0'
    use_pthreads = False
    # B ashkan
    USE_TILERA = ''  #X= 'USE_TILERA'
    use_tilera = False
    USE_MIC = ''
    use_mic = False
    # E ashkan
    STEAL = ''
    KERNEL_HAS_STATE = ''
    KERNEL_LOCK = ''
    THREADED_CORE = ''  # 'THREADED_CORE=0'
    threaded_core = False
    # Count CPU cycles
    CYCLES = ''  # 'CYCLES'
    TIMINGS = ''  # 'TIMINGS'
    STATIC_ALLOC = 'STATIC_ALLOC'

    # Flags
    #Smash= '-fstack-protector '# Ashkan
    WARN = ''  #'-Wall '
    CXX0X = '-std=c++11'
    PTHREADS = '-pthread'
    OPTSPEED = '-O3 -fno-exceptions -fno-rtti '
    OPTSIZE = '-Os -fno-exceptions -fno-rtti '
    OPTTHREADS = '-O2 '  # '-ansi-alias '
    DEBUG = ''
    ARCH = ''
    NO_SOCKET = ''
    OPT = '-O2 '
    CYGWIN = 0
    PIC = ''  #'-fPIC '
    # These are used by the build script to generate flags/switches
    OSX = 0
    # Flag for cross-compilation
    XC = 0
    # Use LLVM
    # LLVM=1: x86, LLVM=2: ppc
    LLVM = 0
    # SystemC
    SC = 0
    H = 0  # Help
    LIB = False
    SHLIB = False
    MACROS = []  # ['INTERFACE_OBJ']
    yaml_config = '../../SystemConfigurations/SBA.yml'

    #use options without leading '-': scons v=0 gui=QtGui
    opts = Variables()
    opts.Add('v', 'Verbose', 0)
    opts.Add('w', 'Warnings', 0)
    opts.Add('new', 'New', 0)
    opts.Add('xc', 'Crosscompile', 'NONE')
    opts.Add('llvm', 'Use LLVM', 0)
    opts.Add('win', 'CygWin', 0)
    opts.Add('vm', 'Virtual Machine', 0)
    opts.Add('sock', 'Use POSIX socket interface', 1)
    opts.Add('svm', 'Sequential Virtual Machine', 0)
    # options can't take . or / in the strings!!
    #    opts.Add('yml','YAML configuration file','') #'../../SBA.yml')
    opts.Add('cycles', 'Count CPU cycles', 0)
    opts.Add('timings', 'Time program execution', 0)
    opts.Add('dyn', 'Dynamic memory', 0)
    opts.Add('pthreads', 'Use POSIX Threads', 0)
    opts.Add('lib', 'Compile as a library named gannet ', 0)
    opts.Add('shlib', 'Compile as a shared library named gannet ', 0)
    opts.Add('steal', 'Enable task stealing', 0)
    opts.Add('stateful', 'For stateful kernels', 0)
    opts.Add('locking', 'Always lock access to stateful kernels', 0)
    opts.Add('wordsz', 'Set WORDSZ', 64)
    opts.Add('ptcore', 'Use POSIX Threaded Core', 0)
    opts.Add('dbg', 'Debug', 0)
    opts.Add('nogen', "Don't generate C++ sources from Ruby code", 0)
    opts.Add('opt', 'Optimise', 'speed')  # or 'size'
    opts.Add(
        'D',
        'Macros (add as a string: D="MACRO1:1 MACRO2 MACRO3:whatever"\nSCons is too stupid to allow "=")',
        '')  # add additional macros as a string
    opts.Add('h', 'Help', 0)

    args = sys.argv[1:]
    #import getopt
    #rest = getopt.getopt(args,"hABCD")
    for arg in args:
        if re.match("(\w+)=(\w+)", arg):
            (k, v) = arg.split('=')
            opts.args[k] = v

    #exit(opts.options)

    for param in os.environ.keys():
        if param == "VERBOSE":
            VERBOSE = 'VERBOSE'
        if param == "GPRM_YML_CONFIG":
            yaml_config = os.environ["GPRM_YML_CONFIG"]

    for option in opts.options:
        if option.key == 'v' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            VERBOSE = 'VERBOSE'
        if option.key == 'w' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            WARN = '-Wall '
        if option.key == 'new' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            NEW = 'NEW=1'
        if option.key == 'xc' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            XC = 1
            # B ashkan
            if opts.args[option.key] == 'Tilera':
                use_tilera = True
                USE_TILERA = 'USE_TILERA'
            elif opts.args[option.key] == 'MIC':
                use_mic = True
                USE_MIC = 'USE_MIC'
                '-ansi-alias '
            # E ashkan
            OPT = OPTSPEED
        if option.key == 'llvm' and opts.args.has_key(
                option.key):  # and opts.args[option.key]!=option.default:
            if opts.args[option.key] == '1':
                LLVM = 1
            elif opts.args[option.key] == '2':
                LLVM = 2
            else:
                LLVM = 0
            OPT = OPTSPEED
        if option.key == 'win' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            CYGWIN = 1
        if option.key == 'vm' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            VM = 'VM=1'
        if option.key == 'svm' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            VM = 'VM=1'
            SEQVM = 'SEQVM=1'
# doesn't work if the path has dots or slashes!
#        if option.key == 'yml' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
#            print "YAML!"
#            yaml_config=opts.args[option.key]
        if option.key == 'sock' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            NO_SOCKET = 'NO_SOCKET'
            sockpatt = re.compile('^\.\.\/GannetSocket')
            nsources = filter(lambda s: not (sockpatt.search(s)), sources)
            sources = nsources
        if option.key == 'wordsz' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            wordsz = opts.args[option.key]
            WORDSZ = 'WORDSZ=' + str(wordsz)
        if option.key == 'lib' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            LIB = True
        if option.key == 'shlib' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            SHLIB = True
        if option.key == 'steal' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            STEAL = 'STEAL=1'
        if option.key == 'stateful' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            KERNEL_HAS_STATE = 'KERNEL_HAS_STATE=1'
        if option.key == 'locking' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            KERNEL_LOCK = 'KERNEL_LOCK=1'
        if option.key == 'pthreads' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            USE_THREADS = 'USE_THREADS=1'
            use_pthreads = True
            OPT = OPTTHREADS
        if option.key == 'ptcore' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            THREADED_CORE = 'THREADED_CORE=1'
            threaded_core = True
            OPT = OPTTHREADS
        if option.key == 'distr' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            DISTR = 'DISTR=1'
            OPT = OPTSPEED
        if option.key == 'cycles' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            CYCLES = 'CYCLES'
        if option.key == 'timings' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            TIMINGS = 'TIMINGS'
        if option.key == 'dyn' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            STATIC_ALLOC = ''
        if option.key == 'dbg' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            DEBUG = '-g -O0 '  #'-g -fno-exceptions -fno-rtti '
            OPT = ''
        if option.key == 'opt' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            OPT = OPTSPEED
        if option.key == 'D' and opts.args.has_key(
                option.key) and opts.args[option.key] != option.default:
            macrostr = re.sub('\s*:\s*', '=', opts.args[option.key])
            MACROS = macrostr.split(' ')
        if option.key == 'h' and opts.args.has_key(option.key):
            H = 1

    if commands.getoutput("uname") == "Darwin":
        OSX = 1
        switches += ['DARWIN']
        PTHREADS = ''
        if SC == 1:
            ARCH = '-arch i386'

    # Ashkan commented this out
    #if XC==1:
    #    switches.append('__ppc__')

    FLAGS = ''
    SWITCHES = ''
    flags += [CXX0X, WARN, DEBUG, ARCH, PIC, OPT, PTHREADS]
    # Ashkan added USE_TILERA
    switches += [
        VERBOSE, SEQVM, WORDSZ, CYCLES, TIMINGS, STATIC_ALLOC, NO_SOCKET,
        USE_THREADS, THREADED_CORE, DISTR, STEAL, KERNEL_HAS_STATE,
        KERNEL_LOCK, USE_TILERA, USE_MIC
    ] + MACROS
    for flag in flags:
        if flag != '':
            FLAGS += flag + ' '

    for switch in switches:
        if re.search('BOOST', switch):
            boost = 1
        if switch != '':
            SWITCHES += '-D' + switch + ' '

    GPRM_DIR = os.environ["GPRM_DIR"]
    #    print "GPRM_DIR:"+GPRM_DIR

    bin = 'gannetvm' + str(wordsz)
    if LIB:
        sources.append(GPRM_DIR + '/GPRM/src/gannet.cc')
    else:
        sources.append(GPRM_DIR + '/GPRM/src/gannetvm.cc')
    #------------------------------------------------------------------------------
    cxx = os.environ['CXX']

    #    gcc_version = os.popen('g++ -dumpversion').read().rstrip("\n\r")
    #    gcc_version_tuple = [int(x) for x in gcc_version.split('.')]
    ## WV: HACK! TOO SPECIFIC! USE ENV VAR!
    #    if (gcc_version_tuple[1]<6):
    #        cxx='/opt/local/bin/g++-mp-4.8'
    #    else:
    #        cxx='g++'
    ##Ashkan" none of them, icpc!
    #	cxx='/home/ashkan/intel/composer_xe_2013_sp1.2.144/bin/intel64/icpc -no-offload -vec-report6'

    if XC == 1:
        # cxx='powerpc-405-linux-gnu-g++'
        if use_tilera:
            #         cxx='tile-c++'
            cxx = 'tile-g++'
        elif use_mic:
            cxx = '/home/ashkan/intel/composer_xe_2013_sp1.2.144/bin/intel64/icpc -mmic -no-offload -vec-report6'
        else:
            print "WARNING: NO VALID CROSS COMPILATION TARGET, using host CXX"
    if LLVM == 1:
        cxx = 'i686-pc-linux-gnu-g++'

    env = Environment(variables=opts,
                      CXX=cxx,
                      CXXFLAGS=FLAGS + SWITCHES,
                      LINKFLAGS=[PTHREADS])
    #    env.VariantDir(wd+'build/',GPRM_DIR+'/GPRM/build/', duplicate=0)
    #   Help(opts.GenerateHelpText(env))
    if H == 1:
        print(opts.GenerateHelpText(env))
        exit(1)

    if XC == 1:
        HOME = os.environ['HOME']
        env['ENV'][
            'PATH'] = os.environ["GPRM_XC_PATH"] + ":" + env['ENV']['PATH']
        print env['ENV']['PATH']

    if LLVM == 1:
        env['ENV'][
            'PATH'] = os.environ["GPRM_LLVM_PATH"] + ":" + env['ENV']['PATH']
        print env['ENV']['PATH']

#FIXME: dl only needed for dynamic loading!
#libs=['m','dl']
    libs = ['m']
    if use_pthreads or threaded_core:
        libs += ['pthread']
    # Ashkan added tmc
    if use_tilera:
        libs += []
#        libs+=['tmc']
#libs+=['pthread','boost_thread-mt']

# SBA classes should not use boost shared libraries, only header files
    if boost == 1:
        libs += ['boost_program_options']

    INCpaths = ['.', '../', GPRM_DIR + '/GPRM/src/SBA/'
                ]  # ,GPRM_DIR+'/GPRM/SBA/ServiceCoreLibraries/']
    LIBpaths = []

    if boost == 1:
        INCpaths += [os.environ['BOOST_INC']]

    if OSX == 1 or OSX == 0:  # UGLY HACK!
        INCpaths = [
            wd + '/gensrc/', wd + '/src/GPRM/Kernel/', wd + '/src/', '.',
            '../', GPRM_DIR + '/GPRM/src/SBA/', GPRM_DIR + '/GPRM/src/'
        ]
        #        LIBpaths=['/opt/local/lib/gcc48/','/opt/local/lib/','/usr/local/lib/']
        #        libs=['m']
        if boost == 1:
            INCpaths += [os.environ['BOOST_INC']]
            libs += [os.environ['BOOST_LIB']]

    #WV: to have multiple targets, we just need to set bin : bin is short for
    #env.Program(target=bin,...)

    if LIB:
        glib = env.Library('gannet',
                           sources,
                           LIBS=libs,
                           LIBPATH=LIBpaths,
                           CPPPATH=INCpaths)
    elif SHLIB:
        glib = env.SharedLibrary('gannet',
                                 sources,
                                 LIBS=libs,
                                 LIBPATH=LIBpaths,
                                 CPPPATH=INCpaths)
    else:
        prog = env.Program(bin,
                           sources,
                           LIBS=libs,
                           LIBPATH=LIBpaths,
                           CPPPATH=INCpaths)
        env.Install(wd + '/bin', prog)
        env.Alias('install', wd + '/bin')  # make this wd+'/bin' ?
Beispiel #2
0
def GetBuildEnvironment(targets,arguments):
  env = Environment();
  env.EnsurePythonVersion(2,3)
  env.EnsureSConsVersion(0,96)
  env.SetOption('implicit_cache',1)
  env.TargetSignatures('build')
  if 'mode' in arguments:
    buildname = arguments['mode']
  else:
    buildname = 'default'
  options_file = '.' + buildname + '_options'
  if not exists(options_file):
    opts = Options('.options_cache',arguments)
  else:
    opts = Options(options_file,arguments)
  opts.AddOptions(
    BoolOption('assertions','Include assertions in the code',1),
    BoolOption('debug','Build with debug options turned on',1),
    BoolOption('inline','Cause inline code to be inline',0),
    BoolOption('optimize','Build object files with optimization',0),
    BoolOption('profile','Generate profiling aware code',0),
    BoolOption('small','Generate smaller code rather than faster',0),
    BoolOption('strip','Strip executables of their symbols',0),
  )
  opts.Add('confpath','Specify additional configuration dirs to search','')
  opts.Add('prefix','Specify where to install HLVM','/usr/local')
  opts.Add('suites','Specify a list of test suites to run')
  opts.Add('with_llvm','Specify where LLVM is located','/usr/local')
  opts.Add('with_apr','Specify where apr is located','/usr/local/apr')
  opts.Add('with_apru','Specify where apr-utils is located','/usr/local/apr')
  opts.Add('with_libxml2','Specify where LibXml2 is located','/usr/local')
  opts.Add('with_gxx','Specify where the GCC C++ compiler is located',
           '/usr/local/bin/g++')
  opts.Add('with_llc','Specify where the LLVM compiler is located',
           '/usr/local/bin/llc')
  opts.Add('with_llvm_ld','Specify where the LLVM GCC Linker is located',
           '/usr/local/bin/llvm-ld')
  opts.Add('with_llvmdis','Specify where the LLVM disassembler is located',
           '/usr/local/bin/llvm-dis')
  opts.Add('with_llvmas','Specify where the LLVM assembler is located',
           '/usr/local/bin/llvm-as')
  opts.Add('with_llvmgcc','Specify where the LLVM C compiler is located',
           '/usr/local/bin/llvm-gcc')
  opts.Add('with_llvmgxx','Specify where the LLVM C++ compiler is located',
           '/usr/local/bin/llvm-g++')
  opts.Add('with_llvmar','Specify where the LLVM bytecode archiver is located',
           '/usr/local/bin/llvm-g++')
  opts.Add('with_llvm2cpp','Specify where the LLVM llvm2cpp program is located',
           '/usr/local/bin/llvm2cpp')
  opts.Add('with_gperf','Specify where the gperf program is located',
           '/usr/local/bin/gperf')
  opts.Add('with_runtest','Specify where DejaGnu runtest program is located',
           '/usr/local/bin/runtest')
  opts.Add('with_doxygen','Specify where the doxygen program is located',
           '/usr/local/bin/doxygen')
  opts.Add('with_xsltproc','Specify where the XSLT processor is located',
           '/usr/local/bin/xsltproc')
  opts.Add('with_pod2html','Specify where the POD to HTML generator is located',
           '/usr/local/bin/pod2html')
  opts.Add('with_pod2man','Specify where the POD to MAN generator is located',
           '/usr/local/bin/pod2man')
  opts.Add('with_xmllint','Specify where the xmllint program is located',
           '/usr/local/bin/xmllint')
  opts.Update(env)
  env['HLVM_Copyright'] = 'Copyright (c) 2006 Reid Spencer'
  env['HLVM_Maintainer'] = 'Reid Spencer <rspencer@reidspencer>'
  env['HLVM_Version'] = '0.2svn'
  env['HLVM_SO_CURRENT'] = '0'
  env['HLVM_SO_REVISION'] = '1'
  env['HLVM_SO_AGE'] = '0'
  env['HLVM_SO_VERSION'] = env['HLVM_SO_CURRENT']+':'+env['HLVM_SO_REVISION']
  env['HLVM_SO_VERSION'] += ':' + env['HLVM_SO_AGE']
  env['CCFLAGS']  = ' -pipe -Wall -Wcast-align -Wpointer-arith -Wno-long-long'
  env['CCFLAGS'] += ' -pedantic'
  env['CXXFLAGS'] = ' -pipe -Wall -Wcast-align -Wpointer-arith -Wno-deprecated'
  env['CXXFLAGS']+= ' -Wold-style-cast -Woverloaded-virtual -Wno-unused'
  env['CXXFLAGS']+= ' -Wno-long-long -pedantic -fno-operator-names -ffor-scope'
  env['CXXFLAGS']+= ' -fconst-strings'
  env['CPPDEFINES'] = { '__STDC_LIMIT_MACROS':None, '_GNU_SOURCE':None }
  VariantName=''
  if env['small'] == 1:
    VariantName='S'
    env.Append(CCFLAGS=' -Os')
    env.Append(CXXFLAGS=' -Os')
  else :
    VariantName='s'

  if env['profile'] == 1:
    VariantName+='P'
    env.Append(CCFLAGS=' -pg')
    env.Append(CXXFLAGS=' -pg')
  else :
    VariantName+='p'

  if env['assertions'] == 1:
    VariantName+='A'
    env.Append(CPPDEFINES={'HLVM_ASSERT':None})
  else :
    VariantName+='a'

  if env['debug'] == 1 :
    VariantName += 'D'
    env.Append(CCFLAGS=' -ggdb')
    env.Append(CXXFLAGS=' -ggdb')
    env.Append(CPPDEFINES={'HLVM_DEBUG':None})
    env.Append(LINKFLAGS='-ggdb')
  else :
    VariantName+='d'

  if env['inline'] == 1:
    VariantName+='I'
  else :
    VariantName+='i'
    env.Append(CXXFLAGS=' -fno-inline')

  if env['optimize'] == 1 :
    VariantName+='O'
    env.Append(CCFLAGS=' -O3')
    env.Append(CXXFLAGS=' -O3')
    env.Append(LINKFLAGS='-O3')
  else :
    VariantName+='o'

  if env['strip']:
    VariantName +='T'
    env['LINKFLAGS'] += ' -s'
  else:
    VariantName += 't'

  BuildDir = buildname 
  env['Variant'] = VariantName
  env['BuildDir'] = BuildDir
  env['AbsObjRoot'] = env.Dir('#' + BuildDir).abspath
  env['AbsSrcRoot'] = env.Dir('#').abspath
  env.Prepend(CPPPATH=[pjoin('#',BuildDir)])
  env.Prepend(CPPPATH=['#'])
  env['LIBPATH'] = []
  env['BINPATH'] = []
  env['LLVMASFLAGS'] = ''
  env['LLVM2CPPFLAGS'] = ''
  env['LLVMGXXFLAGS'] = ''
  env['LLVMGCCFLAGS'] = ''
  env.BuildDir(BuildDir,'#',duplicate=0)
  env.SConsignFile(pjoin(BuildDir,'sconsign'))
  if 'install' in COMMAND_LINE_TARGETS:
    env.Alias('install',[
      env.Dir(pjoin(env['prefix'],'bin')),
      env.Dir(pjoin(env['prefix'],'lib')),
      env.Dir(pjoin(env['prefix'],'include')),
      env.Dir(pjoin(env['prefix'],'docs'))
    ])

  env.Help("""
HLVM Build Environment

Usage Examples:: 
  scons             - to do a normal build
  scons --clean     - to remove all derived (built) objects
  scons check       - to run the DejaGnu test suite
  scons install     - to install HLVM to a target directory
  scons docs        - to generate the doxygen documentation

Options:
""" + opts.GenerateHelpText(env,sort=cmp))
  print "HLVM BUILD MODE: " + VariantName + " (" + buildname + ")"
  ConfigureHLVM(env)
  now = datetime.datetime.utcnow();
  env['HLVM_ConfigTime'] = now.ctime();
  opts.Save(options_file,env)
  return env
def initOcl(*envt):
    if envt == ():
        env = Environment()
    else:
        env = envt[0]

    global opts, dev, plat, kernel, kopts, kernel_opts, useF, useDyn, mcModel, OPENCL_DIR, useOclWrapper

    help = """
    Options:
     lib=0|1 [1] build an OclWrapper library
    *dyn=0|1 [0] build a dynamic Library             OclBuilder.useDyn
    *mcm=s|m|l [s] mcmodel flag for gcc/gfortran
    *plat=AMD|NVIDIA|Intel|Altera|MIC [NVIDIA]
    *dev=CPU|GPU|ACC|FPGA [GPU] device
     gpu=-1|0|1 [-1, means automatic selection]
     acc=-1|0|1 [-1, means automatic selection]
     O=[gcc -O flag] [3]
     F=0|1 [0] use the functional (non-OO) interface OclBuilder.useF
     V=1.1|1.2 [1.2] OpenCL C++ API version
     info=0|1                                        (DEVINFO, PLATINFO)
    *oclwrapper=0|1 [1] use the OclWrapper API       OclBuilder.useOclWrapper

    The following flags can be used to define macros in your code, they are passed on to the OpenCL kernel as well.
     kernel=<number> [1]                             KERNEL   
     sel=<number> [1] generic selection flag         SELECT
     w=<number> [1024] width, e.g. for matrix        WIDTH 
     wx,wy,wz=<number> [128,128,64] x/y/z dimensions WX,WY,WZ
     nth=<number> [1] number of threads per core     NTH
     ngroups=<number> [0] number of workgroups		 NGROUPS
     order=<number> [1] loop order			        LOOP_ORDER 
     ref=0|1|2 [1]     reference 2=ref only          REF
     v=0|1 [1]         verbose                       VERBOSE 
     warn=0|1 [1]      warnings                      WARNINGS
     mode=0|1|2   COPY|COPY+ALLOC|USE 
     dbg=0|1 [0]                                     OCLDBG
     nruns= [1]                                      NRUNS
    *kopts=<string> kernel options, can only be a single alphanumeric string 
                    if you need complex options, put them in the Scons script
                    For example, to add a path for kernel includes:
                    OclBuilder.kopts='-I/abs/path/to/includes'

    D=[comma-sep list of macros, without values]

    The options marked with * can be set as OclBuilder.OPTION=VALUE in the SCons script
    The macros controlled by the other options are listed on the right
    The directory for the OclWrapper can be accessed via OclBuilder.OPENCL_DIR
    """
    # by default, use the OclWrapper.
    if not 'useOclWrapper' in globals():
        useOclWrapper = True

    if commands.getoutput("uname") == "Darwin":
        OSX = 1
        OSFLAG = '-DOSX'
    else:
        OSX = 0
        OSFLAG = '-D__LINUX__'

    OPENCL_DIR = os.environ['OPENCL_DIR']
    opts = Variables()
    CWD = os.environ['PWD']
    args = sys.argv[1:]
    for arg in args:
        if re.match("(\w+)=(\w+)", arg):
            (k, v) = arg.split('=')
            opts.args[k] = v

    oclwrapper = getOpt('oclwrapper', 'OclWrapper', '1')
    if oclwrapper != '1':
        useOclWrapper = False

    dev = getOpt('dev', 'Device', 'GPU')
    plat = getOpt('plat', 'Platform', 'NVIDIA')
    #    print "PLAT:"+plat
    if OSX == 1:
        plat = 'Apple'
    if plat == 'AMD':
        AMD_SDK_PATH = os.environ['AMDAPPSDKROOT']
    elif plat == 'Intel':
        INTEL_SDK_PATH = os.environ['INTELOCLSDKROOT']
    elif plat == 'MIC':
        INTEL_SDK_PATH = os.environ['INTELOCLSDKROOT']
        dev = 'ACC'
    elif plat == 'Altera':
        ALTERA_SDK_PATH = os.environ['ALTERAOCLSDKROOT']
        dev = 'ACC'
    else:
        if plat != 'Apple':
            NVIDIA_SDK_PATH = os.environ['NVSDKCUDA_ROOT']
            if os.environ['OPENCL_GPU'] != 'NVIDIA':
                #                print 'No NVIDIA platform, defaulting to AMD CPU'
                if os.environ['OPENCL_CPU'] == 'AMD':
                    AMD_SDK_PATH = os.environ['AMDAPPSDKROOT']
                    plat = 'AMD'
                    dev = 'CPU'
                elif os.environ['OPENCL_ACC'] == 'Intel':
                    INTEL_SDK_PATH = os.environ['INTELOCLSDKROOT']
                    plat = 'MIC'
                    dev = 'ACC'
                elif os.environ['OPENCL_ACC'] == 'Altera':
                    ALTERA_SDK_PATH = os.environ['ALTERAOCLSDKROOT']
                    plat = 'Altera'
                    dev = 'FPGA'
                elif os.environ['OPENCL_CPU'] == 'Intel':
                    INTEL_SDK_PATH = os.environ['INTELOCLSDKROOT']
                    plat = 'Intel'
                    dev = 'CPU'
                else:
                    print 'No OpenCL-capable GPU found'
                    exit
#        else:
#            print 'NVIDIA'
    env['KERNEL_OPTS'] = []
    gpu = getOpt('gpu', 'GPU', '-1')
    acc = getOpt('acc', 'ACC', '-1')
    devidxflag = '-DDEVIDX=-1'
    if gpu != '-1':
        devidxflag = '-DDEVIDX=' + gpu
        dev = 'GPU'

    if acc != '-1':
        devidxflag = '-DDEVIDX=' + acc
        dev = 'ACC'

    kernel = getOpt('kernel', 'KERNEL', '1')
    sel = getOpt('sel', 'SELECT', '1')
    nth = getOpt('nth', '#threads', '1')
    ngroups = getOpt('ngroups', '#workgroups', '0')
    loop_order = getOpt('order', 'loop order', '1')
    if not 'kopts' in globals():
        kopts = getOpt(
            'kopts',
            'OpenCL kernel compilation options. Can only be a single alphanumeric string.',
            '-cl-fast-relaxed-math')
    nruns = getOpt('nruns', 'Number of runs', '1')
    width = getOpt('w', 'Width', '1024')
    wx = getOpt('wx', 'X-width', '128')
    wy = getOpt('wy', 'Y-width', '128')
    wz = getOpt('wz', 'Z-width', '64')
    env.Append(KERNEL_OPTS=['-DKERNEL=' + kernel])
    env.Append(KERNEL_OPTS=['-DSELECT=' + sel])
    env.Append(KERNEL_OPTS=['-DNTH=' + nth])
    env.Append(KERNEL_OPTS=['-DWIDTH=' + width])
    env.Append(KERNEL_OPTS=['-DWX=' + wx])
    env.Append(KERNEL_OPTS=['-DWY=' + wy])
    env.Append(KERNEL_OPTS=['-DWZ=' + wz])
    env.Append(KERNEL_OPTS=['-DLOOP_ORDER=' + loop_order])
    ref = getOpt('ref', 'Reference', '1')
    refflag = '-DREF'

    verbose = getOpt('v', 'Verbose', '0')
    vflag = '-DVERBOSE'
    if verbose == '0':
        vflag = ''

    warnings = getOpt('warn', 'Warnings', '1')
    wflag = '-Wall'
    if warnings == '0':
        vflag = ''

    version = getOpt('V', 'Version',
                     '1.2')  # FIXME! V1.2 is broken on most platforms
    verflag = ''
    if version == '1.2':
        verflag = '-DOCLV2'

    dbg = getOpt('dbg', 'Debug', '0')
    dbgflag = '-g'
    dbgmacro = '-DOCLDBG=1'
    if dbg == '0':
        dbgmacro = ''
        dbgflag = ''

    useF = getOpt('F', 'Functional', 0)
    if 'useF' in env:
        if env['useF'] == 1:
            useF = '1'

    useDyn = getOpt('dyn', 'Dynamic Library', 0)
    if 'useDyn' in env:
        if env['useDyn'] == 1:
            useDyn = '1'

    mcModel = getOpt('mcm', 'GCC Code Model Flag', 's')

    optim = getOpt('O', 'Optimisation', '2')
    optflag = '-O' + optim
    mode = getOpt('mode', 'Mode', '1')
    memreadflag = '-DMRMODE=' + mode
    devinfo = getOpt('info', 'DeviceInfo', '0')
    devinfoflag = ''
    platinfoflag = ''
    if devinfo == '1':
        devinfoflag = '-DDEVINFO'
        platinfoflag = '-DPLATINFO'

    defs = getOpt('D', 'Defines', None)
    defflags = []
    if defs != None:
        deflist = defs.split(',')
        defflags = map(lambda s: '-D' + s, deflist)

    DEVFLAGS = ['-DDEV_' + dev, devidxflag] + env['KERNEL_OPTS'] + [
        '-DNRUNS=' + nruns, '-DNGROUPS=' + ngroups, '-DREF=' + ref, vflag,
        verflag, memreadflag, devinfoflag, platinfoflag
    ] + defflags
    if plat == 'Altera':
        DEVFLAGS += ['-DFPGA']
    if dev == 'CPU':
        dbg_dev = dbgmacro + ' '
    else:
        dbg_dev = ''
    kernel_opts = '\\"' + kopts + ' -DEXT_DEFS ' + dbg_dev + (' '.join(
        env['KERNEL_OPTS'])) + '\\"'
    KERNEL_OPTS = ['-DKERNEL_OPTS=' + kernel_opts + '']
    if commands.getoutput("uname") == "Darwin":
        DEVFLAGS += ['-DOSX']
    if useOclWrapper:
        oclsources = map(
            lambda s: OPENCL_DIR + '/OpenCLIntegration/' + s,
            ['Timing.cc', 'DeviceInfo.cc', 'PlatformInfo.cc', 'OclWrapper.cc'])
        env['OCLSOURCES'] = oclsources
    if plat == 'Altera':
        oclsources += [
            OPENCL_DIR + '/OpenCLIntegration/libstdcxx-compatibility.cpp'
        ]
    if OSX == 1 and 'ROOTSYS' in os.environ:
        print 'Setting CXX to g++-4.2 for CERN ROOT on OS X'
        env['CXX'] = [
            'g++-4.2'
        ]  # FIXME: because any higher g++ results in ERROR: malloc: *** error for object 0x7fff7064c500: pointer being freed was not allocated
    elif 'CXX_COMPILER' in os.environ:
        env['CXX'] = [os.environ['CXX_COMPILER']]
    elif 'CXX' in os.environ:
        env['CXX'] = [os.environ['CXX']]
    if True or plat != 'Altera':
        env.Append(CXXFLAGS=['-std=c++11', wflag, dbgflag, dbgmacro, optflag] +
                   DEVFLAGS + KERNEL_OPTS)
    else:
        env.Append(CXXFLAGS=[wflag, dbgflag, dbgmacro, optflag] + DEVFLAGS +
                   KERNEL_OPTS)
    env.Append(CFLAGS=[wflag, dbgflag, optflag] + DEVFLAGS + KERNEL_OPTS)
    env['MACROS'] = DEVFLAGS
    #env.Append(CXXFLAGS = ['-mcmodel=large']

    env.Help(help)
    #if useOclWrapper:
    #env.Append(CPPPATH=[OPENCL_DIR,OPENCL_DIR+'/OpenCLIntegration'])
    env.Append(CPPPATH=[OPENCL_DIR + '/OpenCLIntegration'])
    #   else:
    #       env.Append(CPPPATH=[OPENCL_DIR])
    if OSX == 1:
        env.Append(FRAMEWORKS=['OpenCL'])
#        if useDyn=='1' and useF=='1':
#            env.Append(LIBPATH=['.'])
#            env.Append(LIBS=['OclWrapper'])
    else:
        if plat != 'Altera':
            env.Append(LIBS=['OpenCL'])
        if plat == 'AMD':
            env.Append(CPPPATH=[
                AMD_SDK_PATH + '/include/', AMD_SDK_PATH +
                '/include/CL', '/usr/include/CL'
            ])
            env.Append(LIBPATH=[AMD_SDK_PATH + '/lib/x86_64'])
        elif plat == 'Intel':
            env.Append(CPPPATH=[
                INTEL_SDK_PATH + '/include/', INTEL_SDK_PATH + '/include/CL'
            ])
            env.Append(LIBPATH=[INTEL_SDK_PATH + '/lib64'])
        elif plat == 'MIC':
            env.Append(CPPPATH=[INTEL_SDK_PATH + '/include/'])
            env.Append(LIBPATH=[INTEL_SDK_PATH + '/lib64'])
        elif plat == 'Altera':
            env.Append(CPPPATH=map(lambda s: ALTERA_SDK_PATH + s, [
                '/host/include/', '/common/inc', '/board/nalla_pcie/include'
            ]))
            env.Append(
                LIBPATH=[
                    ALTERA_SDK_PATH + '/host/linux64/lib',
                    ALTERA_SDK_PATH + '/board/nalla_pcie/linux64/lib'
                ]
            )  #,ALTERA_SDK_PATH+'/'+os.environ['AOCL_BOARD_PACKAGE_ROOT']+'/linux64/lib'])
            env.Append(LIBS=[
                'alteracl', 'dl', 'acl_emulator_kernel_rt', 'alterahalmmd',
                'nalla_pcie_mmd', 'elf', 'rt', 'stdc++'
            ])
            env.Append(CXXFLAGS=['-fPIC'])
        else:  # means NVIDIA
            env.Append(CPPPATH=[
                NVIDIA_SDK_PATH + '/OpenCL/common/inc', NVIDIA_SDK_PATH +
                '/OpenCL/common/inc/CL'
            ])

    if useF == '1':
        if 'FORTRAN_COMPILER' in os.environ:
            env['FORTRAN'] = os.environ['FORTRAN_COMPILER']
            env['F95'] = os.environ['FORTRAN_COMPILER']
        if 'FC' in os.environ:
            env['FORTRAN'] = os.environ['FC']
            env['F95'] = os.environ['FC']
        if ('GFORTRAN' in os.environ
                and env['FORTRAN'] == os.environ['GFORTRAN']):
            env['FORTRANFLAGS'] = env['CFLAGS']
            if OSX == 1:
                env['LINKFLAGS'] = ['-Wl,-stack_size,0x40000000'
                                    ]  # Give OS X 1G stack
            env.Append(FORTRANFLAGS=[
                '-Wno-aliasing', '-Wno-unused', '-Wno-unused-dummy-argument',
                '-cpp', '-m64', '-ffree-form', '-ffree-line-length-0',
                '-fconvert=big-endian'
            ])
            #env.Append(FORTRANFLAGS=['-mcmodel=large'])
            #env['F95FLAGS']=['-Wno-aliasing','-Wno-unused','-Wno-unused-dummy-argument','-cpp','-m64','-mcmodel=medium','-ffree-form','-ffree-line-length-0','-fconvert=big-endian']
            env['F95FLAGS'] = [
                '-Wno-aliasing', '-Wno-unused', '-Wno-unused-dummy-argument',
                '-cpp', '-m64', '-ffree-form', '-ffree-line-length-0',
                '-fconvert=big-endian'
            ]
            env.Append(F95FLAGS=env['CFLAGS'])
        else:
            env['CFLAGS'].pop(0)
            env['CFLAGS'].pop(0)
            env['CFLAGS'].pop(0)
            env['FORTRANFLAGS'] = env['CFLAGS']
            env.Append(FORTRANFLAGS=['-m64', '-fast', '-Mipa=fast'])
        if useOclWrapper:
            if useDyn == '1':
                flib = env.SharedLibrary('OclWrapperF', [
                    oclsources,
                    OPENCL_DIR + '/OpenCLIntegration/OclWrapperF.cc'
                ])
            else:
                flib = env.Library('OclWrapperF', [
                    oclsources,
                    OPENCL_DIR + '/OpenCLIntegration/OclWrapperF.cc'
                ])
            fflib = env.Object(
                'oclWrapper.o',
                OPENCL_DIR + '/OpenCLIntegration/oclWrapper.f95')
#    else:
    if useOclWrapper:
        if useDyn == '1':
            lib = env.Library('OclWrapper', oclsources)
        else:
            lib = env.Library('OclWrapper', oclsources)
        env.Append(LIBPATH=['.', OPENCL_DIR + '/OpenCLIntegration/'])
    else:
        env.Append(LIBPATH=['.'])

    if useOclWrapper:
        if useF:
            #env.Append(LIBS=['OclWrapperF','stdc++'])
            env.Append(LIBS=['stdc++'])
            env.Install(OPENCL_DIR + '/OpenCLIntegration/lib', flib)
            env.Alias('installf', OPENCL_DIR + '/OpenCLIntegration/lib', flib)


#    else:
        env.Append(LIBS=['OclWrapper'])
        env.Install(OPENCL_DIR + '/OpenCLIntegration/lib', lib)
        env.Alias('install', OPENCL_DIR + '/OpenCLIntegration/lib', lib)
    return env
Beispiel #4
0
def build(wd,sources,flibs):

    destdir='../SBA/'
    global opts

    flags=[]
    switches=[]
    boost=0

    # MACROS
    wordsz=32
    WORDSZ='WORDSZ='+str(wordsz)
    GL='GANNET_LANGUAGE'
    NEW=''
    VERBOSE='' #V='VERBOSE'
    # No SystemC by default
    SYSC=''
    SC_IDP=''
    SYSC_FIXME=''
    # Compile for VM (otherwise compiles to model HW)
    VM='VM=0'
    SEQVM='SEQVM=0'
#    OLDVM='OLDVM=1'
    USE_THREADS='USE_THREADS=0'
    DISTR='DISTR=0'
    use_pthreads = False
    # B ashkan
    USE_TILERA='' #X= 'USE_TILERA'
    use_tilera = False
    # E ashkan
    THREADED_CORE='' # 'THREADED_CORE=0'
    threaded_core = False
    # Count CPU cycles
    CYCLES='' # 'CYCLES'
    TIMINGS='' # 'TIMINGS'
    STATIC_ALLOC='STATIC_ALLOC'

    # Flags
    #Smash= '-fstack-protector '# Ashkan
    WARN='' #'-Wall '
    CXX11 = '-std=c++11'
    OPTSPEED    = '-O3 -fno-exceptions -fno-rtti '
    OPTSIZE = '-Os -fno-exceptions -fno-rtti '
    OPTTHREADS = '-O3 '
    DEBUG = ''
    ARCH=''
    NO_SOCKET=''
    OPT = '-O3 '
    CYGWIN=0
    PIC = '' #'-fPIC '
    # These are used by the build script to generate flags/switches
    OSX=0
    # Flag for cross-compilation
    XC=0
    # Use LLVM
    # LLVM=1: x86, LLVM=2: ppc
    LLVM=0
    # SystemC
    SC=0
    H=0 # Help
    LIB=False
    MACROS = ['INTERFACE_OBJ']
    yaml_config='../../SystemConfigurations/SBA.yml'

    #use options without leading '-': scons v=0 gui=QtGui
    opts = Variables()
    opts.Add('v', 'Verbose', 0)
    opts.Add('w', 'Warnings', 0)
    opts.Add('new', 'New', 0)
    opts.Add('xc', 'Crosscompile',0)
    opts.Add('llvm', 'Use LLVM',0)
    opts.Add('win','CygWin',0)
    opts.Add('vm', 'Virtual Machine',0)
    opts.Add('sock', 'Use POSIX socket interface',1)
    opts.Add('svm', 'Sequential Virtual Machine',0)
# options can't take . or / in the strings!!
#    opts.Add('yml','YAML configuration file','') #'../../SBA.yml')
    opts.Add('cycles', 'Count CPU cycles',0)
    opts.Add('timings', 'Time program execution',0)
    opts.Add('dyn', 'Dynamic memory',0)
    opts.Add('pthreads', 'Use POSIX Threads',0)
    opts.Add('lib', 'Compile as library',0)
    opts.Add('wordsz', 'Set WORDSZ',32)
    opts.Add('ptcore', 'Use POSIX Threaded Core',0)    
    opts.Add('dbg', 'Debug',0)
    opts.Add('nogen',"Don't generate C++ sources from Ruby code",0) 
    opts.Add('opt', 'Optimise','speed') # or 'size'
    opts.Add('D','Macros (add as a string: D="MACRO1:1 MACRO2 MACRO3:whatever"\nSCons is too stupid to allow "=")','') # add additional macros as a string
    opts.Add('h', 'Help',0)

    args=sys.argv[1:]
    #import getopt
    #rest = getopt.getopt(args,"hABCD")
    for arg in args:
        if re.match("(\w+)=(\w+)",arg):
            (k,v)=arg.split('=')
            opts.args[k]=v

    #exit(opts.options)

    for param in os.environ.keys():
        if param == "VERBOSE":
            VERBOSE='VERBOSE'
        if param == "GANNET_YML_CONFIG":
            yaml_config=os.environ["GANNET_YML_CONFIG"]

    for option in opts.options:
        if option.key == 'v' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            VERBOSE='VERBOSE'
        if option.key == 'w' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            WARN='-Wall '
        if option.key == 'new' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            NEW='NEW=1'
        if option.key == 'xc' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            XC=1
            # B ashkan
            use_tilera=True
            USE_TILERA='USE_TILERA'
            # E ashkan
            OPT=OPTSPEED
        if option.key == 'llvm' and opts.args.has_key(option.key): # and opts.args[option.key]!=option.default:
            if opts.args[option.key]=='1':
                LLVM=1
            elif opts.args[option.key]=='2':
                LLVM=2
            else:
                LLVM=0
            OPT=OPTSPEED
        if option.key == 'win' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            CYGWIN=1
        if option.key == 'vm' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            VM='VM=1'
        if option.key == 'svm' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            VM='VM=1'
            SEQVM='SEQVM=1'
# doesn't work if the path has dots or slashes!
#        if option.key == 'yml' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
#            print "YAML!"
#            yaml_config=opts.args[option.key]
        if option.key == 'sock' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            NO_SOCKET='NO_SOCKET'
            sockpatt=re.compile('^\.\.\/GannetSocket')
            nsources=filter(lambda s: not(sockpatt.search(s)),sources)
            sources=nsources
        if option.key == 'wordsz' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            wordsz=opts.args[option.key]
            WORDSZ='WORDSZ='+str(wordsz)
        if option.key == 'lib' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            LIB=True
        if option.key == 'pthreads' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            USE_THREADS='USE_THREADS=1'
            use_pthreads=True
            OPT=OPTTHREADS
        if option.key == 'ptcore' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            THREADED_CORE='THREADED_CORE=1'
            threaded_core=True
            OPT=OPTTHREADS
        if option.key == 'distr' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            DISTR='DISTR=1'
            OPT=OPTSPEED
        if option.key == 'cycles' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            CYCLES='CYCLES'
        if option.key == 'timings' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            TIMINGS='TIMINGS'
        if option.key == 'dyn' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            STATIC_ALLOC=''
        if option.key == 'dbg' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            DEBUG='-g -O0 -DGMCF_DEBUG ' #'-g -fno-exceptions -fno-rtti '
            OPT=''
        if option.key == 'opt' and opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            OPT=OPTSPEED
        if option.key == 'D' and  opts.args.has_key(option.key) and opts.args[option.key]!=option.default:
            macrostr=re.sub('\s*:\s*','=',opts.args[option.key])
            MACROS=macrostr.split(' ')
        if option.key == 'h' and opts.args.has_key(option.key):
            H=1

    if commands.getoutput("uname") == "Darwin":
        OSX=1
        switches+=['DARWIN']
        if SC==1:
            ARCH='-arch i386'
            
    # ashkan commented it        
    #if XC==1:
    #    switches.append('__ppc__')

    FLAGS=''
    SWITCHES=''
    flags+=[CXX11,WARN,DEBUG,ARCH,PIC,OPT]
    # Ashkan added USE_TILERA
    switches+=[SYSC,SC_IDP,SYSC_FIXME,VERBOSE,NEW,VM,SEQVM,WORDSZ,CYCLES,TIMINGS,STATIC_ALLOC,NO_SOCKET,USE_THREADS,THREADED_CORE,DISTR, USE_TILERA]+MACROS
    for flag in flags:
        if flag !='':
            FLAGS+=flag+' '
            

    for switch in switches:
        if re.search('BOOST',switch):
            boost=1
        if switch != '':
            SWITCHES+='-D'+switch+' '

    GANNET_DIR=os.environ["GANNET_DIR"]
    print "GANNET_DIR:"+GANNET_DIR
 			
    bin='gmcfCoupler'
    if LIB:
       sources.append(GANNET_DIR+'/GPRM/src/gmcf.cc')
    else:
       sources.append(GANNET_DIR+'/GPRM/src/gmcfCoupler.cc')
    #------------------------------------------------------------------------------
    CXX = os.environ['CXX']
    gcc_version = os.popen(CXX+' -dumpversion').read().rstrip("\n\r")
    gcc_version_tuple = [int(x) for x in gcc_version.split('.')]
# WV: HACK! TOO SPECIFIC!
    if (gcc_version_tuple[1]<6):
        raise Exception('You need at least g++ 4.6 for this!')
    else:
        cxx=CXX
    if XC==1:
       # B ashkan
       # cxx='powerpc-405-linux-gnu-g++'
         cxx='tile-c++'
       # E ashkan
    if LLVM==1:
        cxx='i686-pc-linux-gnu-g++'

    env = Environment(variables = opts, CXX = cxx, CXXFLAGS = FLAGS+SWITCHES)
#    env.VariantDir(wd+'build/',GANNET_DIR+'/GPRM/build/', duplicate=0)    	
#   Help(opts.GenerateHelpText(env))
    if H==1:
        print(opts.GenerateHelpText(env))
        exit(1)

    if XC==1:
        HOME=os.environ['HOME']
        env['ENV']['PATH']=os.environ["GANNET_XC_PATH"]+":"+env['ENV']['PATH']
        print env['ENV']['PATH']

    if LLVM==1:
        env['ENV']['PATH']=os.environ["GANNET_LLVM_PATH"]+":"+env['ENV']['PATH']
        print env['ENV']['PATH']
 
#FIXME: dl only needed for dynamic loading!
#libs=['m','dl'] 
# In order to link a fortran library compiled with gfortran, we must include the gfortran library. Wonder what the equivalent is for ifort, pgfortran?
#FIXME!    libs=flibs+['gfortran','m'] 
    libs = ['m']    
    if use_pthreads or threaded_core:
        libs+=['pthread']


    INCpaths=[wd+'/gensrc/',wd+'/gensrc/GMCF/Models/',wd+'/src/','.','../',GANNET_DIR+'/GPRM/src/SBA/',GANNET_DIR+'/GPRM/src/']
    LIBpaths=[wd+'/gensrc/GMCF/Models/']

    if OSX==1:
        LIBpaths=[wd+'/gensrc/GMCF/Models/','/opt/local/lib/gcc49/','/opt/local/lib/','/usr/local/lib/']

    #WV: to have multiple targets, we just need to set bin : bin is short for
    #env.Program(target=bin,...)

    if LIB:
            glib=env.Library('gmcf',sources,LIBS=libs,LIBPATH=LIBpaths,CPPPATH=INCpaths)
#            env.Alias('install_gmcf',env.Install(wd+'/lib',glib))
    else:
            prog=env.Program(bin,sources,LIBS=libs,LIBPATH=LIBpaths,CPPPATH=INCpaths)
            env.Alias('install',env.Install(wd+'/bin',prog))