diff --git a/setup.py b/setup.py index 6924b1b..a909a18 100644 --- a/setup.py +++ b/setup.py @@ -6,6 +6,7 @@ Minimal setup.py for building gswc. import os import shutil import sys +import subprocess import pkg_resources from setuptools import Extension, setup @@ -21,36 +22,43 @@ def read(*parts): class build_ext(_build_ext): # Extension builder from pandas without the cython stuff def build_extensions(self): + cmd = ["cargo", "cinstall", + "--manifest-path", "src/GSW-rs/Cargo.toml", + f"--destdir={self.build_temp}", + "--prefix=gsw", + "--libdir=gsw"] + rv = subprocess.Popen(cmd).wait() + if rv != 0: + sys.exit(rv) + + gsw_obj = os.path.join(self.build_temp, "gsw") + if sys.platform == "win32": + gsw_obj = os.path.join(gsw_obj, "gsw.lib") + else: + gsw_obj = os.path.join(gsw_obj, "libgsw.a") + + # private libs to link on windows + windows_libs = ["advapi32.lib", "bcrypt.lib", "ws2_32.lib", "userenv.lib", "msvcrt.lib", "ntdll.lib"] + numpy_incl = pkg_resources.resource_filename("numpy", "core/include") for ext in self.extensions: if hasattr(ext, "include_dirs") and not numpy_incl in ext.include_dirs: ext.include_dirs.append(numpy_incl) + + if hasattr(ext, "extra_objects") and not gsw_obj in ext.extra_objects: + ext.extra_objects.append(gsw_obj) + if sys.platform == "win32": + ext.extra_objects += windows_libs + _build_ext.build_extensions(self) -# MSVC can't handle C complex, and distutils doesn't seem to be able to -# let us force C++ compilation of .c files, so we use the following hack for -# Windows. -if sys.platform == "win32": - cext = "cpp" - shutil.copy( - "src/c_gsw/gsw_oceanographic_toolbox.c", - "src/c_gsw/gsw_oceanographic_toolbox.cpp", - ) - shutil.copy("src/c_gsw/gsw_saar.c", "src/c_gsw/gsw_saar.cpp") -else: - cext = "c" - -ufunc_src_list = [ - "src/_ufuncs.c", - "src/c_gsw/gsw_oceanographic_toolbox." + cext, - "src/c_gsw/gsw_saar." + cext, -] +ufunc_src_list = ["src/_ufuncs.c"] config = { "ext_modules": [Extension("gsw._gsw_ufuncs", ufunc_src_list)], - "include_dirs": [os.path.join(rootpath, "src", "c_gsw")], + "include_dirs": [os.path.join(rootpath, "src", "GSW-rs", "assets")], "cmdclass": {"build_ext": build_ext}, }