--- defsetup.py +++ defsetup.py @@ -78,73 +78,27 @@ ###################################################################### # WCSLIB -WCSVERSION = "4.8.2" -WCSLIB = "wcslib" # Path to wcslib -WCSLIB_PATCHED = "wcslib" -WCSLIBC = join(WCSLIB_PATCHED, "C") # Path to wcslib source files -WCSFILES = [ # List of wcslib files to compile - 'flexed/wcsbth.c', - 'flexed/wcspih.c', - 'flexed/wcsulex.c', - 'flexed/wcsutrn.c', - 'cel.c', - 'lin.c', - 'log.c', - 'prj.c', - 'spc.c', - 'sph.c', - 'spx.c', - 'tab.c', - 'wcs.c', - 'wcserr.c', - 'wcsfix.c', - 'wcshdr.c', - 'wcsprintf.c', - 'wcsunits.c', - 'wcsutil.c'] -WCSFILES = [join(WCSLIBC, x) for x in WCSFILES] +from subprocess import Popen, PIPE +from re import match -###################################################################### -# WCSLIB CONFIGURATION - -# The only configuration parameter needed at compile-time is how to -# specify a 64-bit signed integer. Python's ctypes module can get us -# that information, but it is only available in Python 2.5 or later. -# If we can't be absolutely certain, we default to "long long int", -# which is correct on most platforms (x86, x86_64). If we find -# platforms where this heuristic doesn't work, we may need to hardcode -# for them. -def determine_64_bit_int(): - try: - try: - import ctypes - except ImportError: - raise ValueError() - - if ctypes.sizeof(ctypes.c_longlong) == 8: - return "long long int" - elif ctypes.sizeof(ctypes.c_long) == 8: - return "long int" - elif ctypes.sizeof(ctypes.c_int) == 8: - return "int" - else: - raise ValueError() - - except ValueError: - return "long long int" +def pkgconfig(*packages, **kw): + flag_map = {'-I': 'include_dirs', '-L': 'library_dirs', '-l': 'libraries'} + arg = "--libs --cflags --modversion %s" % ' '.join(packages) + for tok in Popen(["pkg-config "+ arg],stdout=PIPE, shell=True).communicate()[0].split(): + token = tok.decode("utf-8") + if(match("[0-9]",token)): + kw.setdefault("version",[]).append(token) + else: + kw.setdefault(flag_map.get(token[:2]), []).append(token[2:]) + return kw -h_file = StringIO() -h_file.write(""" -/* WCSLIB library version number. */ -#define WCSLIB_VERSION %s - -/* 64-bit integer data type. */ -#define WCSLIB_INT64 %s -""" % (WCSVERSION, determine_64_bit_int())) -write_if_different(join(srcroot, 'src', 'wcsconfig.h'), h_file.getvalue()) +WCSLIB = pkgconfig('wcslib') +WCSVERSION = WCSLIB['version'][0] ###################################################################### # GENERATE DOCSTRINGS IN C + +###################################################################### docstrings = {} with open(join(srcroot, 'doc', 'docstrings.py'), 'rb') as fd: docstrings_content = fd.read() @@ -233,7 +186,8 @@ ###################################################################### # DISTUTILS SETUP -libraries = [] +libraries = WCSLIB['libraries'] +include_dirs = [numpy_include, join(srcroot, "src")] + WCSLIB['include_dirs'] define_macros = [('ECHO', None), ('WCSTRIG_MACRO', None), ('PYWCS_BUILD', None), @@ -282,13 +236,8 @@ PYWCS_EXTENSIONS = [ Extension('pywcs._pywcs', - WCSFILES + PYWCS_SOURCES, - include_dirs = - [numpy_include, - join(srcroot, WCSLIBC), - WCSLIBC, - join(srcroot, "src") - ], + PYWCS_SOURCES, + include_dirs=include_dirs, define_macros=define_macros, undef_macros=undef_macros, extra_compile_args=extra_compile_args, @@ -309,7 +258,6 @@ 'ext_modules' : PYWCS_EXTENSIONS, 'data_files' : [ ( 'pywcs/include', ['src/*.h']), - ( 'pywcs/include/wcslib', [ WCSLIBC + '/*.h'] ), ( 'pywcs/tests/maps', ['lib/pywcs/tests/maps/*.hdr']), ( 'pywcs/tests/spectra', ['lib/pywcs/tests/spectra/*.hdr']), ( 'pywcs/tests/data', ['lib/pywcs/tests/data/*.hdr'])