You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

  • deploySCons.py creates an SConscript file in src subdirectory of each package based on use statements in requirements file:
#-*- python -*-
Import('packageSetup', 'ROOT', 'cfitsio')
env=Environment(CPPPATH=[], LIBPATH=[], LIBS=[])
for item in ('CPPPATH', 'LIBPATH', 'LIBS'):
    env[item].extend(ROOT[item])
    env[item].extend(cfitsio[item])
packageSetup('tip', env)
  • This will only work if the req file has use statements for every library it needs to link against, e.g., in astro req file, the use ROOT * IExternal line has been added. This is preferable to relying on implicit uses inherited from other packages.
package astro

version v2r9
#$Id: requirements,v 1.113 2007/05/08 13:55:08 burnett Exp $

author  T. Burnett <tburnett@u.washington.edu>

use GlastPolicy  * -no_auto_imports
use facilities   *
use cfitsio * IExternal 
use CLHEP v3* IExternal
use extFiles * IExternal -no_auto_imports # for jphephem data
use tip *
use ROOT * IExternal

apply_pattern package_include
apply_pattern package_linkopts
apply_pattern package_stamps

private

#the following prepend makes the includes and src folders available locally
macro_prepend includes "-I $(ASTROROOT)/src -I.." WIN32 "/I $(ASTROROOT)\src /I.. "

#kill "truncation from double to float"
macro_append astro_cppflags "" WIN32 " /wd4305"

macro source *.cxx WIN32 "*.h *.cxx"
library astro -no_share \
 -s=../astro $(source) \
 -s=../src $(source) \
 -s=healpix $(source) *.cc \
 -s=wcslib  $(source) *.c\
 -s=jplephem $(source) 


# simple program to test basic functionality

pattern astro_package_test \
 private ; \
 macro test_source "test/*.cxx " WIN32 "-s=../src/test *.h *.cxx " ; \
 application test_<package> -group=test $(test_source) <extra> ; \
 public

apply_pattern astro_package_test

# this is the test program from G. Tosti
# application orbit test/orbit/Orbit.cxx 

#application testHTM test/htm/*.cxx
  • In the top level SConstruct file, source code is found by looking for all filename patterns *.c* and directories to be added to CPPPATH (for includes) are found by matching *.h. Since more than one .cxx file in a given package may contain a main() function, this scheme will fail once one tries to link. It would be better if all source code for the library lived in the src directory. The packages astro and irfs/handoff_response violate this convention.
  • In just the three lowest level packages facilities, tip, and astro there are three different ways to specify application builds. It would be better to have a single convention, with ancillary application-specific source code living in the application subdirectory.
  • It would help if test programs had a standard name, test_<package>.cxx, and there was only one that lives in the src/test subdir.
  • The equivalent of our policy package patterns should be implemented as python functions in the top-level SConstruct:
#-*- python -*-
"""
@brief Top-level SConstruct file for example checkout package build.

@author J. Chiang <jchiang@slac.stanford.edu>
"""
#
# $Header: /nfs/slac/g/glast/ground/cvs/users/jchiang/DeploySCons/SConstruct,v 1.7 2007/05/22 01:08:06 jchiang Exp $
#
import os, glob

baseDir = os.path.abspath(os.curdir)

if os.name == 'nt':
    bindir = 'VC8debug'
    env.Append(CCFLAGS=['/EHsc'])
    env['ENV']['TMP'] = os.environ['TMP']
elif os.name == 'posix':
    bindir = 'rh9_gcc32'
#    bindir = 'rhel4_gcc34'

def srcFiles(path):
    query = '/usr/bin/find %s -name \*.c\* -print' % path
    files = [item.strip() for item in os.popen(query)
             if item.find('./test') == -1]
    query = '/usr/bin/find %s -name \*.h -print' % path
    hfiles = [item.strip() for item in os.popen(query)
              if item.find('./test') == -1]
    cpppaths = {}
    for item in hfiles:
        cpppaths[os.path.abspath(os.path.split(item)[0])] = 1
    return files, cpppaths.keys()

def packageSetup(package, env):
    packagedir = os.path.abspath('..')
    src_files, paths = srcFiles(os.curdir)
    cpppath = [packagedir]
    cpppath.extend(paths)
    env.Append(CPPPATH=cpppath, CCFLAGS=['-g'])
    library = env.StaticLibrary(package, src_files)
    installdir = os.path.join(packagedir, bindir)
    env.Install(installdir, library)
    env.Alias(package, installdir)
    env.Default(package)
    Export('package', 'packagedir', 'env', 'installdir')
    SConscript(os.path.join('test', 'SConstruct'))

def extlibEnv(package, version, libs=None):
    packageDir = os.path.join(os.environ['GLAST_EXT'], package, version)
    if libs is None:
        libs = [package]
    return Environment(CPPPATH=[os.path.join(packageDir, 'include')],
                       LIBPATH=[os.path.join(packageDir, 'lib')],
                       LIBS=libs)

CLHEP = extlibEnv('CLHEP', '1.9.2.2')
cfitsio = extlibEnv('cfitsio', 'v3006')
ROOT = extlibEnv('ROOT', os.path.join('v5.10.00', 'root'),
                 libs=['Core', 'Cint', 'Tree', 'Matrix', 'Physics',
                       'Graf', 'Graf3d', 'Gpad', 'Rint', 'Postscript',
                       'TreePlayer', 'Hist', 'pthread', 'm', 'dl'])
fftw = extlibEnv('fftw', '3.0.1')
pil = extlibEnv('pil', '2.0.1')
xerces = extlibEnv('xerces', '2.6.0')
cppunit = extlibEnv('cppunit', '1.10.2')

exports = ['bindir', 'packageSetup', 'cfitsio', 'CLHEP', 'ROOT', 
           'fftw', 'pil', 'xerces', 'cppunit']

def packageEnv(package, version):
    packageDir = os.path.join(baseDir, package, version)
    return Environment(CPPPATH=[os.path.join(packageDir)],
                       LIBPATH=[os.path.join(packageDir, bindir)],
                       LIBS=[package]), packageDir

packages = {'facilities' : 'v2r12p5',
            'tip' : 'v2r12',
            'astro' : 'v2r9',
            'st_stream' : 'v0r5',
            'hoops' : 'v0r4p5',
            'st_graph' : 'v1r7',
            'st_app' : 'v2'}

for package in packages:
    exec('%s, %sDir = packageEnv("%s", "%s")' % (package, package,
                                                 package, packages[package]))
    exports.append(package)

Export(*exports)

for package in packages:    
    exec('SConscript(os.path.join(%sDir, "src", "SConscript"))' % package)
  • No labels