source: trunk/SConstruct @ 1433

Last change on this file since 1433 was 1433, checked in by Malte Marquarding, 16 years ago

allow ALMA specific build

File size: 8.3 KB
Line 
1import os
2import sys
3import distutils.sysconfig
4import platform
5import SCons
6
7moduledir = distutils.sysconfig.get_python_lib()
8if  platform.architecture()[0] == '64bit':
9    # hack to install into /usr/lib64 if scons is in the 32bit /usr/lib/
10    if moduledir.startswith("/usr/lib/"):
11        moduledir = moduledir.replace("lib", "lib64")
12
13opts = Options("options.cfg")
14opts.AddOptions(
15                ("FORTRAN", "The fortran compiler", None),
16                ("f2clib", "The fortran to c library", None),
17                PathOption("prefix",
18                "The root installation path",
19                           distutils.sysconfig.PREFIX),
20                PathOption("moduledir",
21                            "The python module path (site-packages))",
22                            moduledir),
23                PathOption("casacoreroot", "The location of casacore",
24                                    "/usr/local"),
25                ("boostroot", "The root dir where boost is installed", None),
26                ("boostlib", "The name of the boost python library",
27                 "boost_python"),
28                ("boostlibdir", "The boost library location", None),
29                ("boostincdir", "The boost header file location", None),
30                ("lapackroot",
31                 "The root directory where lapack is installed", None),
32                ("lapacklibdir", "The lapack library location", None),
33                ("lapacklib",
34                 "The lapack library name (e.g. for specialized AMD libraries",
35                 "lapack"),
36                ("blasroot",
37                 "The root directory where blas is installed", None),
38                ("blaslibdir", "The blas library location", None),
39                ("blaslib",
40                 "The blas library name (e.g. for specialized AMD libraries",
41                 "blas"),
42                ("cfitsioroot",
43                 "The root directory where cfistio is installed", None),
44                ("cfitsiolibdir", "The cfitsio library location", None),
45                ("cfitsiolib", "The cfitsio library name", "cfitsio"),
46                ("cfitsioincdir", "The cfitsio include location", None),
47                ("wcsroot",
48                 "The root directory where wcs is installed", None),
49                ("wcslibdir", "The wcs library 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#               ("rpfitsincdir", "The rpfits include location", None),
55                EnumOption("mode", "The type of build.", "release",
56                           ["release","debug"], ignorecase=1),
57                ("makedist",
58                 "Make a binary archive giving a suffix, e.g. sarge or fc5",
59                 ""),
60                EnumOption("makedoc", "Build the userguide in specified format",
61                           "none",
62                           ["none", "pdf", "html"], ignorecase=1),
63                BoolOption("apps", "Build cpp apps", False),
64                BoolOption("alma", "Enable alma specific functionality", False)
65                )
66
67env = Environment( toolpath = ['./scons'],
68                   tools = ["default", "archiver", "utils",
69                            "quietinstall"],
70                   ENV = { 'PATH' : os.environ[ 'PATH' ],
71                          'HOME' : os.environ[ 'HOME' ] },
72                   options = opts)
73
74Help(opts.GenerateHelpText(env))
75env.SConsignFile()
76
77if env["PLATFORM"] == "darwin":
78    env.EnsureSConsVersion(0,96,95)
79
80casacoretooldir = os.path.join(env["casacoreroot"],"share",
81                                   "casacore")
82if not os.path.exists(casacoretooldir):
83    print "Could not find casacore scons tools"
84    Exit(1)
85
86# load casacore specific build flags
87env.Tool('casaoptions', [casacoretooldir])
88env.AddCommonOptions(opts)
89opts.Update(env)
90env.Tool('casa', [casacoretooldir])
91
92if not env.GetOption('clean'):
93    conf = Configure(env)
94
95    conf.env.AppendUnique(LIBPATH=os.path.join(conf.env["casacoreroot"],
96                                               "lib"))
97    conf.env.AppendUnique(CPPPATH=os.path.join(conf.env["casacoreroot"],
98                                               "include", "casacore"))
99    if not conf.CheckLib("casa_casa", language='c++'): Exit(1)
100    conf.env.PrependUnique(LIBS=["casa_ms", "casa_components",
101                                 "casa_coordinates", "casa_lattices",
102                                 "casa_fits", "casa_measures", "casa_scimath",
103                                 "casa_scimath_f", "casa_tables",
104                                 "casa_mirlib"])
105    conf.env.Append(CPPPATH=[distutils.sysconfig.get_python_inc()])
106    if not conf.CheckHeader("Python.h", language='c'):
107        Exit(1)
108    pylib = 'python'+distutils.sysconfig.get_python_version()
109    if env['PLATFORM'] == "darwin":
110        conf.env.Append(FRAMEWORKS=["Python"])
111    else:
112        if not conf.CheckLib(library=pylib, language='c'): Exit(1)
113
114    conf.env.AddCustomPackage('boost')
115    if not conf.CheckLibWithHeader(env["boostlib"],
116                                   'boost/python.hpp', language='c++'):
117        Exit(1)
118    # test for cfitsio
119    if not conf.CheckLib("m"): Exit(1)
120    conf.env.AddCustomPackage('cfitsio')
121    if not conf.CheckLibWithHeader(conf.env["cfitsiolib"],
122                                   'fitsio.h', language='c'):
123        Exit(1)
124    conf.env.AddCustomPackage('wcs')
125    if not conf.CheckLibWithHeader('wcs', 'wcslib/wcs.h', language='c'):
126        Exit(1)
127    conf.env.AddCustomPackage('rpfits')
128    if not conf.CheckLib(conf.env["rpfitslib"], language="c"):
129        Exit(1)
130
131    # test for blas/lapack
132    conf.env.AddCustomPackage("lapack")
133    if not conf.CheckLib(conf.env["lapacklib"]): Exit(1)
134    blasname = conf.env.get("blaslib", "blas")
135    conf.env.AddCustomPackage("blas")
136    if not conf.CheckLib(conf.env["blaslib"]): Exit(1)
137    conf.env.CheckFortran(conf)
138    if not conf.CheckLib('stdc++', language='c++'): Exit(1)
139    if conf.env["alma"]:
140        conf.env.Append(CPPFLAGS=['-DUSE_ALMA'])
141    env = conf.Finish()
142
143env["version"] = "2.2.x"
144
145if env['mode'] == 'release':
146    if env["PLATFORM"] != "darwin":
147        env.Append(LINKFLAGS=['-Wl,-O1', '-s'])
148    env.Append(CCFLAGS=["-O2"])
149else:
150    env.Append(CCFLAGS=["-g", "-Wall"])
151
152# Export for SConscript files
153Export("env")
154
155# build externals
156env.SConscript("external/SConscript")
157# build library
158so = env.SConscript("src/SConscript", build_dir="build", duplicate=0)
159# test module import, to see if there are unresolved symbols
160def test_module(target,source,env):
161    pth = str(target[0])
162    mod = os.path.splitext(pth)[0]
163    sys.path.insert(2, os.path.split(mod)[0])
164    __import__(os.path.split(mod)[1])
165    print "ok"
166    return 0
167def test_str(target, source, env):
168    return "Testing module..."
169
170taction = Action(test_module, test_str)
171env.AddPostAction(so, taction)
172
173# install targets
174somod = env.Install("$moduledir/asap", so )
175pymods = env.Install("$moduledir/asap", env.SGlob("python/*.py"))
176bins = env.Install("$prefix/bin", ["bin/asap", "bin/asap_update_data"])
177shares = env.Install("$moduledir/asap/data", "share/ipythonrc-asap")
178env.Alias('install', [somod, pymods, bins, shares])
179
180# install aips++ data repos
181rootdir=None
182outdir =  os.path.join(env["moduledir"],'asap','data')
183sources = ['ephemerides','geodetic']
184if os.path.exists("/nfs/aips++/data"):
185    rootdir = "/nfs/aips++/data"
186elif os.path.exists("data"):
187    rootdir = "./data"
188if rootdir is not None:
189    ofiles, ifiles = env.WalkDirTree(outdir, rootdir, sources)
190    data =  env.InstallAs(ofiles, ifiles)
191    env.Alias('install', data)
192
193# make binary distribution
194if len(env["makedist"]):
195    env["stagedir"] = "asap-%s-%s" % (env["version"], env["makedist"])
196    env.Command('Staging distribution for archive in %s' % env["stagedir"],
197                '', env.MessageAction)
198    st0 = env.QInstall("$stagedir/asap", [so,  env.SGlob("python/*.py")] )
199    env.QInstall("$stagedir/bin", ["bin/asap", "bin/asap_update_data"])
200    env.QInstall("$stagedir", ["bin/install"])
201    env.QInstall("$stagedir/asap/data", "share/ipythonrc-asap")
202    if rootdir is not None:
203        # This creates a directory Using data table... - disabled
204        #env.Command("Using data tables in %s" % rootdir,
205        #           '', env.MessageAction)
206        outdir =  os.path.join(env["stagedir"],'asap','data')
207        ofiles, ifiles = env.WalkDirTree(outdir, rootdir, sources)
208        env.QInstallAs(ofiles, ifiles)
209    else:
210        env.Command("No data tables available. Use 'asap_update_data' after install",
211                    '', env.MessageAction)
212    arch = env.Archiver(os.path.join("dist",env["stagedir"]),
213                        env["stagedir"])
214    env.AddPostAction(arch, Delete("$stagedir"))
215if env["makedoc"].lower() != "none":
216    env.SConscript("doc/SConscript")
217
218if env["apps"]:
219    env.SConscript("apps/SConscript")
220
221if env.GetOption("clean"):
222    Execute(Delete(".sconf_temp"))
Note: See TracBrowser for help on using the repository browser.