# -*- mode: python; coding: utf-8 -*- # Copyright (c) 2018 Radio Astronomy Software Group # Licensed under the 2-clause BSD License from __future__ import absolute_import, division, print_function import glob import os import io import sys import platform from setuptools import setup, Extension from setuptools.command.build_ext import build_ext from distutils.sysconfig import get_config_var from distutils.version import LooseVersion # When setting up, the binary extension modules haven't yet been built, so # without a workaround we can't use the pyuvdata code to get the version. os.environ["PYUVDATA_IGNORE_EXTMOD_IMPORT_FAIL"] = "1" def branch_scheme(version): """Local version scheme that adds the branch name for absolute reproducibility.""" if version.exact or version.node is None: return version.format_choice("", "+d{time:{time_format}}", time_format="%Y%m%d") else: if version.branch == "master": return version.format_choice("+{node}", "+{node}.dirty") else: return version.format_choice("+{node}.{branch}", "+{node}.{branch}.dirty") # this solution works for `pip install .`` but not `python setup.py install`... class CustomBuildExtCommand(build_ext): """build_ext command for use when numpy headers are needed.""" def run(self): # Import numpy here, only when headers are needed import numpy # Add numpy headers to include_dirs self.include_dirs.append(numpy.get_include()) # Call original build_ext command build_ext.run(self) with io.open("README.md", "r", encoding="utf-8") as readme_file: readme = readme_file.read() def is_platform_mac(): return sys.platform == "darwin" # For mac, ensure extensions are built for macos 10.9 when compiling on a # 10.9 system or above, overriding distuitls behaviour which is to target # the version that python was built for. This may be overridden by setting # MACOSX_DEPLOYMENT_TARGET before calling setup.py # implementation based on pandas, see https://github.com/pandas-dev/pandas/issues/23424 if is_platform_mac(): if "MACOSX_DEPLOYMENT_TARGET" not in os.environ: current_system = LooseVersion(platform.mac_ver()[0]) python_target = LooseVersion(get_config_var("MACOSX_DEPLOYMENT_TARGET")) if python_target < "10.9" and current_system >= "10.9": os.environ["MACOSX_DEPLOYMENT_TARGET"] = "10.9" global_c_macros = [ ("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"), ] casa_reqs = ["python-casacore"] healpix_reqs = ["astropy_healpix"] cst_reqs = ["pyyaml"] test_reqs = ( casa_reqs + healpix_reqs + cst_reqs + ["pytest", "pytest-cases", "pytest-cov", "coverage", "pre-commit"] ) doc_reqs = ["sphinx", "pypandoc"] setup_args = { "name": "pyuvdata", "author": "Radio Astronomy Software Group", "url": "https://github.com/RadioAstronomySoftwareGroup/pyuvdata", "license": "BSD", "description": "an interface for astronomical interferometeric datasets in python", "long_description": readme, "long_description_content_type": "text/markdown", "package_dir": {"pyuvdata": "pyuvdata"}, "packages": [ "pyuvdata", "pyuvdata.tests", "pyuvdata.uvbeam", "pyuvdata.uvcal", "pyuvdata.uvdata", "pyuvdata.uvflag", ], "cmdclass": {"build_ext": CustomBuildExtCommand}, "ext_modules": [ Extension( "pyuvdata._miriad", sources=[ "pyuvdata/uvdata/src/miriad_wrap.cpp", "pyuvdata/uvdata/src/uvio.c", "pyuvdata/uvdata/src/hio.c", "pyuvdata/uvdata/src/pack.c", "pyuvdata/uvdata/src/bug.c", "pyuvdata/uvdata/src/dio.c", "pyuvdata/uvdata/src/headio.c", "pyuvdata/uvdata/src/maskio.c", ], define_macros=global_c_macros, include_dirs=["pyuvdata/uvdata/src"], ) ], "scripts": [fl for fl in glob.glob("scripts/*") if not os.path.isdir(fl)], "use_scm_version": {"local_scheme": branch_scheme}, "include_package_data": True, "install_requires": ["numpy>=1.15", "scipy", "astropy>=3.2.3", "h5py"], "tests_require": ["pytest", "pytest-cases"], "extras_require": { "casa": casa_reqs, "healpix": healpix_reqs, "cst": cst_reqs, "all": casa_reqs + healpix_reqs + cst_reqs, "test": test_reqs, "doc": doc_reqs, "dev": test_reqs + doc_reqs, }, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Scientific/Engineering :: Astronomy", ], "keywords": "radio astronomy interferometry", } if __name__ == "__main__": setup(**setup_args)