source: trunk/SConstruct @ 2485

Last change on this file since 2485 was 2485, checked in by Malte Marquarding, 12 years ago

Remove install target and casacore scons dependency

File size: 9.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_moduledir(prefix="/usr/local"):
25    moduledir = distutils.sysconfig.get_python_lib(1,0, prefix)
26    if sys.platform.startswith('linux') \
27            and platform.architecture()[0] == '64bit' \
28            and platform.dist()[0].lower() not in ['debian', 'ubuntu']:
29        # hack to install into /usr/lib64 if scons is in the 32bit /usr/lib/
30        if moduledir.startswith("/usr"):
31           moduledir = moduledir.replace("lib", "lib64")
32    return moduledir
33
34EnsureSConsVersion(1,0,0)
35
36opts = Variables("options.cfg")
37opts.AddVariables(
38                ("FORTRAN", "The fortran compiler", None),
39                ("f2clib", "The fortran to c library", None),
40                PathVariable("prefix",
41                "The root installation path",
42                           distutils.sysconfig.PREFIX),
43                ("moduledir",
44                 "The python module path (site-packages))",
45                 None),
46                PathVariable("casacoreroot", "The location of casacore",
47                             "/usr/local"),
48                ("boostroot", "The root dir where boost is installed", None),
49                ("boostlib", "The name of the boost python library",
50                 "boost_python"),
51                ("boostlibdir", "The boost library location", None),
52                ("boostincdir", "The boost header file location", None),
53                ("lapackroot",
54                 "The root directory where lapack is installed", None),
55                ("lapacklibdir", "The lapack library location", None),
56                ("lapacklib",
57                 "The lapack library name (e.g. for specialized AMD libraries",
58                 "lapack"),
59                ("blasroot",
60                 "The root directory where blas is installed", None),
61                ("blaslibdir", "The blas library location", None),
62                ("blaslib",
63                 "The blas library name (e.g. for specialized AMD libraries",
64                 "blas"),
65                ("cfitsioroot",
66                 "The root directory where cfistio is installed", None),
67                ("cfitsiolibdir", "The cfitsio library location", None),
68                ("cfitsiolib", "The cfitsio library name", "cfitsio"),
69                ("cfitsioincdir", "The cfitsio include location", None),
70                ("wcslib", "The wcs library name", "wcs"),
71                ("wcsroot",
72                 "The root directory where wcs is installed", None),
73                ("wcslibdir", "The wcs library location", None),
74                ("rpfitslib", "The rpfits library name", "rpfits"),
75                ("rpfitsroot",
76                 "The root directory where rpfits is installed", None),
77                ("rpfitslibdir", "The rpfits library location", None),
78                ("pyraproot", "The root directory where libpyrap is installed",
79                 None),
80                ("numpyincdir", "numpy header file directory",
81                 get_numpy_incdir()),
82                ("pyraplib", "The name of the pyrap library", "pyrap"),
83                ("pyraplibdir", "The directory where libpyrap is installed",
84                 None),
85                ("pyrapincdir", "The pyrap include location",
86                 None),
87                BoolVariable("enable_pyrap", "Use pyrap conversion library",
88                             False),
89
90                EnumVariable("mode", "The type of build.", "release",
91                           ["release","debug"], ignorecase=1),
92                ("makedist",
93                 "Make a binary archive giving a suffix, e.g. sarge or fc5",
94                 ""),
95                EnumVariable("makedoc", "Build the userguide in specified format",
96                           "none",
97                           ["none", "pdf", "html"], ignorecase=1),
98                BoolVariable("apps", "Build cpp apps", True),
99                BoolVariable("alma", "Enable alma specific functionality",
100                             False),
101                )
102
103env = Environment( toolpath = ['./scons'],
104                   tools = ["default", "archiver", "utils",
105                            "quietinstall", "casaoptions", "casa"],
106                   ENV = { 'PATH' : os.environ[ 'PATH' ],
107                          'HOME' : os.environ[ 'HOME' ] },
108                   options = opts)
109
110Help(opts.GenerateHelpText(env))
111env.SConsignFile()
112
113if not env.GetOption('clean'):
114    conf = Configure(env)
115
116    conf.env.AppendUnique(LIBPATH=os.path.join(conf.env["casacoreroot"],
117                                               "lib"))
118    conf.env.AppendUnique(CPPPATH=os.path.join(conf.env["casacoreroot"],
119                                               "include", "casacore"))
120    if not conf.CheckLib("casa_casa", language='c++'): Exit(1)
121    conf.env.PrependUnique(LIBS=["casa_images", "casa_ms", "casa_components",
122                                 "casa_coordinates", "casa_lattices",
123                                 "casa_fits", "casa_measures", "casa_scimath",
124                                 "casa_scimath_f", "casa_tables",
125                                 "casa_mirlib"])
126    conf.env.Append(CPPPATH=[distutils.sysconfig.get_python_inc()])
127    if not conf.CheckHeader("Python.h", language='c'):
128        Exit(1)
129    pylib = 'python'+distutils.sysconfig.get_python_version()
130    if env['PLATFORM'] == "darwin":
131        conf.env.Append(FRAMEWORKS=["Python"])
132    else:
133        if not conf.CheckLib(library=pylib, language='c'): Exit(1)
134
135    conf.env.AddCustomPackage('boost')
136    if not conf.CheckLibWithHeader(conf.env["boostlib"],
137                                   'boost/python.hpp', language='c++'):
138        Exit(1)
139
140#    conf.env.AddCustomPackage('pyrap')
141    if False and conf.CheckLib(conf.env["pyraplib"], language='c++', autoadd=0):
142        conf.env.Append(CPPFLAGS=['-DHAVE_LIBPYRAP'])
143#        conf.env.PrependUnique(LIBS=env['pyraplib'])
144    else:
145        conf.env.AppendUnique(CPPPATH=[conf.env["numpyincdir"]])
146        # numpy 1.0 uses config.h; numpy >= 1.1 uses numpyconfig.h
147        if conf.CheckHeader("numpy/config.h") or \
148               conf.CheckHeader("numpy/numpyconfig.h"):
149            conf.env.Append(CPPDEFINES=["-DAIPS_USENUMPY"])
150        else:
151            conf.env.Exit(1)
152        conf.env.Append(CPPFLAGS=['-DHAVE_LIBPYRAP'])
153        # compile in pyrap here...
154        conf.env["pyrapint"] = "#/external/libpyrap/pyrap-0.3.2"
155    # test for cfitsio
156    if not conf.CheckLib("m"): Exit(1)
157    conf.env.AddCustomPackage('cfitsio')
158    if not conf.CheckLibWithHeader(conf.env["cfitsiolib"],
159                                   'fitsio.h', language='c'):
160        Exit(1)
161    conf.env.AddCustomPackage('wcs')
162    if not conf.CheckLibWithHeader(conf.env["wcslib"],
163                                   'wcslib/wcs.h', language='c'):
164        Exit(1)
165    conf.env.AddCustomPackage('rpfits')
166    if not conf.CheckLib(conf.env["rpfitslib"], language="c"):
167        Exit(1)
168
169    # test for blas/lapack
170    lapackname = conf.env.get("lapacklib", "lapack")
171    conf.env.AddCustomPackage("lapack")
172    if not conf.CheckLib(lapackname): Exit(1)
173    blasname = conf.env.get("blaslib", "blas")
174    conf.env.AddCustomPackage("blas")
175    if not conf.CheckLib(blasname): Exit(1)
176    conf.env.CheckFortran(conf)
177    if not conf.CheckLib('stdc++', language='c++'): Exit(1)
178    if conf.env["alma"]:
179        conf.env.Append(CPPFLAGS=['-DUSE_CASAPY'])
180    if not conf.env.get("moduledir"):
181        mdir = get_moduledir(conf.env.get("prefix"))
182        if env["PLATFORM"] == "darwin":
183            mdir = distutils.sysconfig.get_python_lib(1,0)           
184        conf.env["moduledir"] =  mdir
185    env = conf.Finish()
186
187env["version"] = "4.1.x"
188
189if env['mode'] == 'release':
190    if env["PLATFORM"] != "darwin":
191        env.Append(LINKFLAGS=['-Wl,-O1', '-s'])
192    env.Append(CCFLAGS=["-O2"])
193else:
194    env.Append(CCFLAGS=["-g", "-W", "-Wall"])
195
196# Export for SConscript files
197Export("env")
198
199# build externals
200env.SConscript("external-alma/SConscript")
201# build library
202so = env.SConscript("src/SConscript", variant_dir="build", duplicate=0)
203# test module import, to see if there are unresolved symbols
204def test_module(target,source,env):
205    pth = str(target[0])
206    mod = os.path.splitext(pth)[0]
207    sys.path.insert(2, os.path.split(mod)[0])
208    __import__(os.path.split(mod)[1])
209    print "ok"
210    return 0
211def test_str(target, source, env):
212    return "Testing module..."
213
214taction = Action(test_module, test_str)
215env.AddPostAction(so, taction)
216
217setup_py = None
218env.Alias('install', setup_py)
219
220# make binary distribution
221if len(env["makedist"]):
222    env["stagedir"] = "asap-%s" % (env["version"])
223    env.Command('Staging distribution for archive in %s' % env["stagedir"],
224                '', env.MessageAction)
225    env.QInstall("$stagedir/asap", [so,  env.SGlob("python/*.py")] )
226    env.QInstall("$stagedir/bin", ["bin/asap", "bin/asap_update_data"])
227    env.QInstall("$stagedir", ["packaging/setup.py"])
228    env.QInstall("$stagedir/debian", env.SGlob("packaging/debian/*") )
229    env.QInstall("$stagedir/asap/data", "share/ipythonrc-asap")
230    env.QInstall("$stagedir/asap/data", "share/ipy_user_conf.py")
231
232if env["apps"]:
233    env.SConscript("apps/SConscript")
234
235if env.GetOption("clean"):
236    Execute(Delete(".sconf_temp"))
237
238if env["makedoc"].lower() != "none":
239    env.SConscript("doc/SConscript")
Note: See TracBrowser for help on using the repository browser.