source: trunk/distutils/setupext.py @ 2494

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

added numpy detection

File size: 5.3 KB
Line 
1import os, sys, platform
2from distutils.command import build_ext
3
4def get_libdir():
5    if not platform.architecture()[0].startswith("64"):
6        return "lib"
7    dist = platform.dist()[0].lower()
8    distdict = dict(suse='lib64', redhat='lib64')   
9    return distdict.get(dist, 'lib')
10
11ARCHLIBDIR = get_libdir()
12
13
14def get_numpy():
15    if sys.platform != "darwin":
16        return
17    import numpy
18    return os.path.join(numpy.__path__[0], "core", "include")
19
20class casacorebuild_ext(build_ext.build_ext):
21    """
22    """
23    user_options = build_ext.build_ext.user_options + \
24            [('casacore-root=', None,
25              'Prefix for casacore installation location'),
26             ('pyrap=', None, 'Prefix for pyrap installation location'),
27             ('boost-root=', None,
28              'Prefix for boost_python installation location'),
29             ('boostlib=', None, 'Name of the boost_python library'),
30             ('cfitsio-root=', None,
31              'Prefix for cfitsio installation location'),
32             ('cfitsiolib=', None, 'Name of the cfitsio library'),
33             ('wcs-root=', None, 'Prefix for wcslib installation location'),
34             ('wcslib=', None, 'Name of the wcs library'),
35             ('rpfits-root=', None, 'Prefix for rpfits installation location'),
36             ('rpfitslib=', None, 'Name of the rpfits library'),
37             ('extra-root=', None,
38              'Extra root directory where muiltple packages could be found,'
39              ' e.g. $HOME, to add $HOME/lib etc to the build.'),
40             ]
41
42
43    def initialize_options(self):
44        """
45        Overload to enable custom settings to be picked up
46        """
47        build_ext.build_ext.initialize_options(self)
48        # attribute corresponding to directory prefix
49        # command line option
50        self.libraries = ['casa_casa']
51        self.boostlib = 'boost_python'
52        self.extra_root = None
53        self.casacore_root = '/usr/local'
54        self.boost_root = '/usr'
55        self.cfitsio_root = '/usr'
56        self.cfitsiolib = 'cfitsio'
57        self.wcs_root = '/usr/local'
58        self.wcslib = 'wcs'
59        self.rpfits_root = '/usr/local'
60        self.rpfitslib = 'rpfits'
61           
62    def finalize_options(self):
63        """
64        Overloaded build_ext implementation to append custom library
65        include file and library linking options
66        """
67        build_ext.build_ext.finalize_options(self)
68
69        if self.extra_root:
70            ldir = os.path.join(self.extra_root, ARCHLIBDIR)
71            if ldir not in self.library_dirs:
72                self.library_dirs += [ldir]
73            idir = os.path.join(self.extra_root, 'include')
74            if idir not in self.include_dirs:
75                self.include_dirs += [idir]
76
77        cclibdir = os.path.join(self.casacore_root, ARCHLIBDIR)
78        boostlibdir = os.path.join(self.boost_root, ARCHLIBDIR)
79        cfitsiolibdir = os.path.join(self.cfitsio_root, ARCHLIBDIR)
80        wcslibdir = os.path.join(self.wcs_root, ARCHLIBDIR)
81        rpfitslibdir = os.path.join(self.rpfits_root, ARCHLIBDIR)
82         
83        ccincdir = os.path.join(self.casacore_root, 'include', 'casacore')
84        boostincdir = os.path.join(self.boost_root, 'include')
85        cfitsioincdir = os.path.join(self.cfitsio_root, 'include')
86        cfitsioincdir2 = os.path.join(self.cfitsio_root, 'include', 'cfitsio')
87        # cfitsio can have  different path
88        if os.path.exists(cfitsioincdir2):
89            cfitsioincdir = cfitsioincdir2
90        wcsincdir = os.path.join(self.wcs_root, 'include')
91        rpfitsincdir = os.path.join(self.rpfits_root, 'include')
92
93        if cclibdir not in self.library_dirs:
94            self.library_dirs += [cclibdir]
95
96        numpyinc = get_numpy()
97        if numpyinc:
98            self.include_dirs += [numpyinc]
99
100        if ccincdir not in self.include_dirs:
101            self.include_dirs += [ccincdir]
102        if boostincdir not in self.include_dirs:
103            self.include_dirs += [boostincdir]
104        if cfitsioincdir not in self.include_dirs:
105            self.include_dirs += [cfitsioincdir]
106        if wcsincdir not in self.include_dirs:
107            self.include_dirs += [wcsincdir]
108        if rpfitsincdir not in self.include_dirs:
109            self.include_dirs += [rpfitsincdir]
110       
111        def add_static(lib, libdir):
112            if lib.endswith(".a"):
113                self.extensions[0].extra_objects.extend([lib])
114            else:
115                if libdir not in self.library_dirs:
116                    self.library_dirs += [libdir]
117                self.libraries += [lib]
118
119        add_static(self.boostlib, boostlibdir)
120        add_static(self.wcslib, wcslibdir)
121        add_static(self.cfitsiolib, cfitsiolibdir)
122        # always static anyway
123        self.libraries += [self.rpfitslib]
124
125        sysdir = '/usr/include'
126        if sysdir in self.include_dirs:
127            self.include_dirs.remove(sysdir)
128        sysdir = os.path.join('/usr', ARCHLIBDIR)
129        for d in self.library_dirs:
130            if d.startswith(sysdir):
131                sysdir = d
132                self.library_dirs.remove(sysdir)       
133                break
134
135
136    def build_extensions(self):
137        def remove_args(args):
138            out = []
139            delargs = ["-Wstrict-prototypes", "-Wshorten-64-to-32",
140                       "-fwrapv", ]
141            for arg in args:
142                if arg not in delargs and arg not in out:
143                    out.append(arg)
144            return out
145
146        self.compiler.compiler = remove_args(self.compiler.compiler)
147        self.compiler.compiler_so = remove_args(self.compiler.compiler_so)
148        self.compiler.compiler_cxx = remove_args(self.compiler.compiler_cxx)
149   
150        build_ext.build_ext.build_extensions(self)
Note: See TracBrowser for help on using the repository browser.