source: trunk/SConstruct

Last change on this file was 3128, checked in by VincentMcIntyre, 7 years ago

asap/trunk - add -std=c++11 compilation flag since we started using the shared_ptr feature in r3121

File size: 7.1 KB
Line 
1import os
2import sys
3import distutils.sysconfig
4import platform
5import SCons
6
7# try to autodetect numpy
8def get_numpy_incdir():
9    try:
10        # try to find an egg
11        from pkg_resources import require
12        tmp = require("numpy")
13        import numpy
14        return numpy.__path__[0]+"/core/include"
15    except Exception:
16        # now try standard package
17        try:
18            import numpy
19            return numpy.__path__[0]+"/core/include"
20        except ImportError:
21            pass
22    return ""
23
24def get_libdir():
25    return os.path.basename(distutils.sysconfig.get_config_var('LIBDIR'))
26
27LIBDIR = 'lib' #get_libdir()
28
29EnsureSConsVersion(1,0,0)
30
31opts = Variables("options.cache")
32opts.AddVariables(
33                ("extraroot", "Addition tree to look for packages", None),
34                ("extraflags", "Additional build flags", None),
35                PathVariable("casacoreroot", "The location of casacore",
36                             "/usr/local"),
37                BoolVariable("casacorestatic",
38                             "Link statically against casacore",
39                             False),
40                ("boostroot", "The root dir where boost is installed", None),
41                ("boostlib", "The name of the boost python library",
42                 "boost_python"),
43                ("boostlibdir", "The boost library location", None),
44                ("boostincdir", "The boost header file location", None),
45                ("cfitsioroot",
46                 "The root directory where cfistio is installed", None),
47                ("cfitsiolibdir", "The cfitsio library location", None),
48                ("cfitsiolib", "The cfitsio library name", "cfitsio"),
49                ("cfitsioincdir", "The cfitsio include location", None),
50                ("rpfitslib", "The rpfits library name", "rpfits"),
51                ("rpfitsroot",
52                 "The root directory where rpfits is installed", None),
53                ("rpfitslibdir", "The rpfits library location", None),
54
55                ("pyraproot", "The root directory where libpyrap is installed",
56                 None),
57                ("numpyincdir", "numpy header file directory",
58                 get_numpy_incdir()),
59                BoolVariable("enable_pyrap",
60                             "Use pyrap conversion library from system",
61                             False),
62                ("pyraplib", "The name of the pyrap library", "pyrap"),
63                ("pyraplibdir", "The directory where libpyrap is installed",
64                 None),
65                ("pyrapincdir", "The pyrap include location",
66                 None),
67                EnumVariable("mode", "The type of build.", "release",
68                           ["release","debug"], ignorecase=1),
69                EnumVariable("makedoc",
70                             "Build the userguide in specified format",
71                             "none",
72                             ["none", "pdf", "html"], ignorecase=1),
73                BoolVariable("apps", "Build cpp apps", True),
74                BoolVariable("alma", "Enable alma specific functionality",
75                             False),
76                )
77
78env = Environment( toolpath = ['./scons'],
79                   tools = ["default", "utils", "casa"],
80                   ENV = { 'PATH' : os.environ[ 'PATH' ],
81                          'HOME' : os.environ[ 'HOME' ] },
82                   options = opts)
83
84env.Help(opts.GenerateHelpText(env))
85env.SConsignFile()
86if not ( env.GetOption('clean') or env.GetOption('help') ):
87
88    conf = Configure(env)
89    if conf.env.get("extraroot", None):
90        conf.env.AddCustomPackage('extra')
91    conf.env.Append(CPPPATH=[distutils.sysconfig.get_python_inc()])
92    if not conf.CheckHeader("Python.h", language='c'):
93        Exit(1)
94    pylib = 'python'+distutils.sysconfig.get_python_version()
95    if env['PLATFORM'] == "darwin":
96        conf.env.Append(FRAMEWORKS=["Python"])
97    else:
98        if not conf.CheckLib(library=pylib, language='c'): Exit(1)
99
100    conf.env.AddCustomPackage('boost')
101    libname = conf.env["boostlib"]
102    if libname.find(".") > -1 and os.path.exists(libname):
103        conf.env.AppendUnique(LIBS=[env.File(libname)])
104    else:
105        if not conf.CheckLibWithHeader(libname,
106                                       'boost/python.hpp', language='c++'):
107            Exit(1)
108
109    if not conf.CheckLib("m"):
110        Exit(1)
111    # test for cfitsio
112    conf.env.AddCustomPackage('cfitsio')
113    libname = conf.env["cfitsiolib"]
114    if not conf.CheckHeader("fitsio.h"):
115        #SuSE is being special
116        conf.env.AppendUnique(CPPPATH=['/usr/include/libcfitsio0'])
117        if not conf.CheckHeader("fitsio.h"):
118            Exit(1)
119    if libname.find(".") > -1 and os.path.exists(libname):
120        conf.env.AppendUnique(LIBS=[env.File(libname)])
121    else:
122        if not conf.CheckLib(libname, language='c'):
123            Exit(1)
124
125    conf.env.AddCustomPackage('rpfits')
126    if not conf.CheckLibWithHeader(conf.env["rpfitslib"], "RPFITS.h",
127                                   language="c"):
128        Exit(1)
129   
130    libpath = ""
131    for p in [conf.env["casacoreroot"], conf.env.get("extraroot", "")]:
132        pth = os.path.join(p, "include", "casacore")       
133        if os.path.exists(pth):
134            libpath = os.path.join(p, LIBDIR)
135            conf.env.AppendUnique(CPPPATH=[pth,pth+'/..'])
136            break
137    cclibs = ["casa_python", "casa_images", "casa_ms",
138              "casa_coordinates", "casa_lattices",
139              "casa_fits", "casa_measures", "casa_scimath",
140              "casa_scimath_f", "casa_tables", "casa_casa"]
141    if conf.env["casacorestatic"]:
142        libs = [ env.File(os.path.join(libpath, "lib"+lib+".a")) \
143                 for lib in cclibs ]
144    else:
145        conf.env.AppendUnique(LIBPATH=libpath)
146        if not conf.CheckLibWithHeader("casa_casa", "casa/aips.h",
147                                       language='c++', autoadd=0):
148            Exit(1)
149        libs = cclibs
150    conf.env.PrependUnique(LIBS=libs)
151
152    if not conf.CheckLib('stdc++', language='c++'): Exit(1)
153    if conf.env["alma"]:
154        conf.env.Append(CPPFLAGS=['-DUSE_CASAPY'])
155    if conf.env.get("extraflags"):
156        flags = conf.env.ParseFlags(conf.env["extraflags"])
157        conf.env.MergeFlags(flags)
158    env = conf.Finish()
159
160opts.Save('options.cache', env)
161
162env["version"] = "4.3.x"
163
164if env['mode'] == 'release':
165    if env["PLATFORM"] != "darwin":
166        env.Append(LINKFLAGS=['-Wl,-O1', '-s'])
167    env.Append(CCFLAGS=["-O2"])
168    env.Append(CCFLAGS=["-std=c++11"])
169else:
170    env.Append(CCFLAGS=["-g", "-W", "-Wall"])
171
172# Export for SConscript files
173Export("env")
174
175# build externals
176ext = env.SConscript("external-alma/SConscript")
177
178# build library
179so = env.SConscript("src/SConscript", variant_dir="build", duplicate=0)
180
181apps = env.SConscript("apps/SConscript")
182
183# test module import, to see if there are unresolved symbols
184def test_module(target,source,env):
185    pth = str(target[0])
186    mod = os.path.splitext(pth)[0]
187    sys.path.insert(2, os.path.split(mod)[0])
188    __import__(os.path.split(mod)[1])
189    print "ok"
190    return 0
191
192def test_str(target, source, env):
193    return "Testing module..."
194
195taction = Action(test_module, test_str)
196env.AddPostAction(so, taction)
197
198if env.GetOption("clean"):
199    Execute(Delete(".sconf_temp"))
200    Execute(Delete("options.cache"))
201    Execute(Delete(".sconsign.dblite"))
202if env["makedoc"].lower() != "none":
203    env.SConscript("doc/SConscript")
Note: See TracBrowser for help on using the repository browser.