source: trunk/SConstruct @ 1740

Last change on this file since 1740 was 1740, checked in by Malte Marquarding, 14 years ago

Tidy up of install targets and comman-line options

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