Skip to content
Snippets Groups Projects
SConstruct 7.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • Carl Timmer's avatar
    Carl Timmer committed
    ################################
    # scons build system file
    ################################
    #
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Much of this file can be used as a boilerplate build file.
    #
    # The parts that are dependent on the details of the software
    # package being compiled are:
    #
    #   1) the name and version of this software package
    #   2) the needed header files and libraries
    #   3) what type of documentation needs to be installed
    #   4) the scons files to be run in the source directories
    
    Carl Timmer's avatar
    Carl Timmer committed
    #
    ################################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Get various python modules
    import re, sys, os, string, subprocess, SCons.Node.FS
    
    from subprocess import Popen, PIPE
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Get useful python functions we wrote
    import coda
    
    # Created files & dirs will have this permission
    os.umask(002)
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    # Software version
    
    Carl Timmer's avatar
    Carl Timmer committed
    versionMajor = '16'
    
    Unknown's avatar
     
    Unknown committed
    versionMinor = '2'
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Determine the os and machine names
    
    Carl Timmer's avatar
    Carl Timmer committed
    uname    = os.uname();
    platform = uname[0]
    machine  = uname[4]
    
    osname   = os.getenv('CODA_OSNAME', platform + '-' +  machine)
    
    # Create an environment while importing the user's PATH & LD_LIBRARY_PATH.
    # This allows us to get to other compilers for example.
    env = Environment(ENV = {'PATH' : os.environ['PATH'], 'LD_LIBRARY_PATH' : os.environ['LD_LIBRARY_PATH']})
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    ################################
    # 64 or 32 bit operating system?
    ################################
        
    # How many bits is the operating system?
    # For Linux 64 bit x86 machines, the "machine' variable is x86_64,
    # but for Darwin or Solaris there is no obvious check so run
    # a configure-type test.
    
    Carl Timmer's avatar
    Carl Timmer committed
    is64bits = coda.is64BitMachine(env, platform, machine)
    if is64bits:
        print "We're on a 64-bit machine"
    
    Carl Timmer's avatar
    Carl Timmer committed
        print "We're on a 32-bit machine"
    
    
    #############################################
    # Command line options (view with "scons -h")
    #############################################
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    Help('\n-D                  build from subdirectory of package\n')
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('\nlocal scons OPTIONS:\n')
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    # debug option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--dbg', dest='ddebug', default=False, action='store_true')
    
    Carl Timmer's avatar
    Carl Timmer committed
    debug = GetOption('ddebug')
    
    Carl Timmer's avatar
    Carl Timmer committed
    if debug: print "Enable debugging"
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('--dbg               compile with debug flag\n')
    
    # 32 bit option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--32bits', dest='use32bits', default=False, action='store_true')
    
    Carl Timmer's avatar
    Carl Timmer committed
    use32bits = GetOption('use32bits')
    
    Carl Timmer's avatar
    Carl Timmer committed
    if use32bits: print "use 32-bit libs & executables even on 64 bit system"
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('--32bits            compile 32bit libs & executables on 64bit system\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Pthread read/write locks option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--no-rwlock', dest='norwlock', default=False, action='store_true')
    
    noReadWriteLocks = GetOption('norwlock')
    
    Carl Timmer's avatar
    Carl Timmer committed
    if noReadWriteLocks: print "compile without read-write locks"
    
    Help('--no-rwlock         compile without pthread read/write locks\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # install directory option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--prefix', dest='prefix', nargs=1, default='', action='store')
    
    Carl Timmer's avatar
    Carl Timmer committed
    prefix = GetOption('prefix')
    Help('--prefix=<dir>      use base directory <dir> when doing install\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # include install directory option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--incdir', dest='incdir', nargs=1, default=None, action='store')
    
    Carl Timmer's avatar
    Carl Timmer committed
    incdir = GetOption('incdir')
    Help('--incdir=<dir>      copy header  files to directory <dir> when doing install\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # library install directory option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--libdir', dest='libdir', nargs=1, default=None, action='store')
    
    Carl Timmer's avatar
    Carl Timmer committed
    libdir = GetOption('libdir')
    Help('--libdir=<dir>      copy library files to directory <dir> when doing install\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # binary install directory option
    
    Carl Timmer's avatar
    Carl Timmer committed
    AddOption('--bindir', dest='bindir', nargs=1, default=None, action='store')
    
    Carl Timmer's avatar
    Carl Timmer committed
    bindir = GetOption('bindir')
    Help('--bindir=<dir>      copy binary  files to directory <dir> when doing install\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    #########################
    # Compile flags
    #########################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Debug/optimization flags
    
    Carl Timmer's avatar
    Carl Timmer committed
    debugSuffix = ''
    
    Carl Timmer's avatar
    Carl Timmer committed
    if debug:
    
        #debugSuffix = '-dbg'
    
    Carl Timmer's avatar
    Carl Timmer committed
        # Compile with -g and add debugSuffix to all executable names
    
    Carl Timmer's avatar
    Carl Timmer committed
        env.Append(CCFLAGS = ['-g'], PROGSUFFIX = debugSuffix)
    
    Carl Timmer's avatar
    Carl Timmer committed
    else:
    
    Carl Timmer's avatar
    Carl Timmer committed
        env.Append(CCFLAGS = ['-O3'])
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    
    # Take care of 64/32 bit issues
    if is64bits:
        # Setup 64 bit machine to compile either 32 or 64 bit libs & executables
        coda.configure32bits(env, use32bits, platform)
    elif not use32bits:
        use32bits = True
    
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    execLibs = ['']
    
    
    if noReadWriteLocks:
        env.Append(CPPDEFINES = ['NO_RW_LOCK'])
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    # Platform dependent quantities.
    # Default to standard Linux libs.
    execLibs = ['m', 'pthread', 'dl', 'rt']
    if platform == 'Darwin':
        execLibs = ['pthread', 'dl']
    
    Carl Timmer's avatar
    Carl Timmer committed
        env.Append(CPPDEFINES = ['Darwin'], SHLINKFLAGS = ['-multiply_defined', '-undefined', '-flat_namespace'])
    
        env.Append(CCFLAGS = ['-fmessage-length=0'])
    
    if is64bits and use32bits:
    
        osname = osname + '-32'
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    print "OSNAME =", osname
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Hidden sub directory into which variant builds go
    
    Carl Timmer's avatar
    Carl Timmer committed
    archDir = '.' + osname + debugSuffix
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    #########################
    # Install stuff
    #########################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    libInstallDir     = ""
    binInstallDir     = ""
    incInstallDir     = ""
    archIncInstallDir = ""
    
    Carl Timmer's avatar
    Carl Timmer committed
    # If a specific installation dir for includes is not specified
    # on the command line, then the architecture specific include
    # dir is a link to local ../common/include directory.
    archIncLocalLink = None
    if (incdir == None):
        archIncLocalLink = '../common/include'
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # If we going to install ...
    if 'install' in COMMAND_LINE_TARGETS:
        # Determine installation directories
        installDirs = coda.getInstallationDirs(osname, prefix, incdir, libdir, bindir)
        
        mainInstallDir    = installDirs[0]
        osDir             = installDirs[1]
        incInstallDir     = installDirs[2]
        archIncInstallDir = installDirs[3]
        libInstallDir     = installDirs[4]
        binInstallDir     = installDirs[5]
        
        # Create the include directories (make symbolic link if possible)
    
    Carl Timmer's avatar
    Carl Timmer committed
        coda.makeIncludeDirs(incInstallDir, archIncInstallDir, osDir, archIncLocalLink)
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
        print 'Main install dir  = ', mainInstallDir
        print 'bin  install dir  = ', binInstallDir
        print 'lib  install dir  = ', libInstallDir
        print 'inc  install dirs = ', incInstallDir, ", ", archIncInstallDir
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    else:
    
    Carl Timmer's avatar
    Carl Timmer committed
        print 'No installation being done'
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    print
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # use "install" on command line to install libs & headers
    Help('install             install libs, headers, and binaries\n')
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('install -c          uninstall libs, headers, and binaries\n')
    
    ##################################################
    # Special Include Directory for java header files
    ##################################################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Because we're using JNI, we need access to <jni.h> when compiling. 
    if not coda.configureJNI(env):
        print "\nJava Native Interface header is required, set JAVA_HOME, exiting\n"
        Exit(0)
    
    Carl Timmer's avatar
    Carl Timmer committed
    ###############################
    # Documentation (un)generation
    ###############################
    
    
    if 'doc' in COMMAND_LINE_TARGETS:
    
    Carl Timmer's avatar
    Carl Timmer committed
        coda.generateDocs(env, True, False, True, "java/org/jlab/coda/et")
    
    Carl Timmer's avatar
    Carl Timmer committed
    if 'undoc' in COMMAND_LINE_TARGETS:
        coda.removeDocs(env)
    
    
    
    # use "doc" on command line to create tar file
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('doc                 create doxygen/javadoc (in ./doc)\n')
    
    
    # use "undoc" on command line to create tar file
    
    Carl Timmer's avatar
    Carl Timmer committed
    Help('undoc               remove doxygen/javadoc (in ./doc)\n')
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    #########################
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Tar file creation
    
    Carl Timmer's avatar
    Carl Timmer committed
    #########################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    if 'tar' in COMMAND_LINE_TARGETS:
    
    Carl Timmer's avatar
    Carl Timmer committed
        coda.generateTarFile(env, 'et', versionMajor, versionMinor)
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    # use "tar" on command line to create tar file
    Help('tar                 create tar file (in ./tar)\n')
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    ######################################################
    # Lower level scons files (software package dependent)
    ######################################################
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Make available to lower level scons files
    
    Carl Timmer's avatar
    Carl Timmer committed
    Export('env archDir incInstallDir libInstallDir binInstallDir archIncInstallDir execLibs debugSuffix')
    
    Carl Timmer's avatar
    Carl Timmer committed
    
    
    Carl Timmer's avatar
    Carl Timmer committed
    # Run lower level build files
    
    env.SConscript('src/libsrc/SConscript',   variant_dir='src/libsrc/'+archDir,   duplicate=0)
    env.SConscript('src/execsrc/SConscript',  variant_dir='src/execsrc/'+archDir,  duplicate=0)
    env.SConscript('src/examples/SConscript', variant_dir='src/examples/'+archDir, duplicate=0)
    
    Carl Timmer's avatar
    Carl Timmer committed
    env.SConscript('src/test/SConscript',     variant_dir='src/test/'+archDir,     duplicate=0)