Skip to content
Snippets Groups Projects
Select Git revision
  • 1945fba2d445e171c774d61ee875df6f9256c106
  • master default protected
  • RAP-1145-new-point-response-interface
  • initialize_telescope_class_without_ms
  • rtd-ubuntu24-plucky
  • ast-1644-temp-fix
  • ast-1600-fix-beam-for-meerkat-ska-mid
  • readthedocs-c++17
  • mwa_python_wrapper
  • ast-1384-remove-element-index-argument
  • ast-1509-fix-polarization-orientation-in-gridded-response
  • add-test-for-squared-mueller-matrices
  • 1493-extend-python-bindings
  • ast-1493-implement-response-dishpoint-1
  • ast-1325-prototype-ska-beam-model-interface
  • ast-1416-oskar-ska-sdp-func-1
  • ast-1386-create-default-element
  • ast-1384-fix-sorted-frequencies-check-sphericalharmonicsresponse-1
  • ast-1111-add-vector-bindings
  • ast-973-add-test-for-lobes-coefficients
  • ast-645-add-beam-normalisation-mode-preapplied
  • v0.7.2
  • v0.7.1
  • v0.7.0
  • v0.6.2
  • v0.6.1
  • v0.6.0
  • v0.5.8
  • v0.5.7
  • v0.5.6
  • v0.5.5
  • v0.5.4
  • v0.5.3
  • v0.5.2
  • v0.5.1
  • v0.4.0
  • v0.3.1
  • v0.3.0
  • v0.2.0
  • v0.1.3
  • v0.1.2
41 results

setup.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    setup.py 5.54 KiB
    #!/usr/bin/env python
    # coding: utf-8
    
    # Copyright (c) 2016 The Pybind Development Team, All rights reserved.
    
    # Setup.py that calls CMake. Largely taken from https://github.com/pybind/cmake_example/
    
    import os
    import re
    import subprocess
    import sys
    
    from setuptools import Extension, setup
    from setuptools.command.build_ext import build_ext
    
    
    # Set the location where data files are to be installed
    EVERYBEAM_DATADIR = os.path.join("share", "everybeam")
    
    
    # A CMakeExtension needs a sourcedir instead of a file list.
    # The name must be the _single_ output extension from the CMake build.
    # If you need multiple extensions, see scikit-build.
    class CMakeExtension(Extension):
        def __init__(self, name, sourcedir=""):
            Extension.__init__(self, name, sources=[])
            self.sourcedir = os.path.abspath(sourcedir)
    
    
    class CMakeBuild(build_ext):
        def build_extension(self, ext):
            extdir = os.path.abspath(
                os.path.dirname(self.get_ext_fullpath(ext.name))
            )
    
            # required for auto-detection & inclusion of auxiliary "native" libs
            if not extdir.endswith(os.path.sep):
                extdir += os.path.sep
    
            debug = (
                int(os.environ.get("DEBUG", 0))
                if self.debug is None
                else self.debug
            )
            cfg = "Debug" if debug else "Release"
    
            # CMake lets you override the generator - we need to check this.
            # Can be set with Conda-Build, for example.
            cmake_generator = os.environ.get("CMAKE_GENERATOR", "")
    
            # Set Python_EXECUTABLE instead if you use PYBIND11_FINDPYTHON
            cmake_args = [
                f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}",
                f"-DPYTHON_EXECUTABLE={sys.executable}",
                f"-DCMAKE_BUILD_TYPE={cfg}",  # not used on MSVC, but no harm
            ]
            build_args = []
            # Adding CMake arguments set as environment variable
            # (needed e.g. to build for ARM OSx on conda-forge)
            if "CMAKE_ARGS" in os.environ:
                cmake_args += [
                    item for item in os.environ["CMAKE_ARGS"].split(" ") if item
                ]
    
            # Adding CMake arguments specific to building EveryBeam
            cmake_args += [
                "-DBUILD_WITH_PYTHON=On",
                f"-DEVERYBEAM_DATADIR={EVERYBEAM_DATADIR}",
            ]
    
            # Using Ninja-build since it a) is available as a wheel and b)
            # multithreads automatically. MSVC would require all variables be
            # exported for Ninja to pick it up, which is a little tricky to do.
            # Users can override the generator with CMAKE_GENERATOR in CMake
            # 3.15+.
            if not cmake_generator or cmake_generator == "Ninja":
                try:
                    import ninja  # noqa: F401
    
                    ninja_executable_path = os.path.join(ninja.BIN_DIR, "ninja")
                    cmake_args += [
                        "-GNinja",
                        f"-DCMAKE_MAKE_PROGRAM:FILEPATH={ninja_executable_path}",
                    ]
                except ImportError:
                    pass
    
            if sys.platform.startswith("darwin"):
                # Cross-compile support for macOS - respect ARCHFLAGS if set
                archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", ""))
                if archs:
                    cmake_args += [
                        "-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))
                    ]
    
            # Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level
            # across all generators.
            if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ:
                # self.parallel is a Python 3 only way to set parallel jobs by hand
                # using -j in the build_ext call, not supported by pip or PyPA-build.
                if hasattr(self, "parallel") and self.parallel:
                    # CMake 3.12+ only.
                    build_args += [f"-j{self.parallel}"]
    
            build_temp = os.path.join(self.build_temp, ext.name)
            if not os.path.exists(build_temp):
                os.makedirs(build_temp)
    
            subprocess.check_call(["which", "g++"])
            subprocess.check_call(
                ["cmake", ext.sourcedir] + cmake_args, cwd=build_temp
            )
            subprocess.check_call(
                ["cmake", "--build", "."] + build_args, cwd=build_temp
            )
    
    
    # Install the coefficient files in a location outside the python package --
    # <prefix>/share/everbeam, where <prefix> is the python install prefix --
    # which makes them easier to find for other programs.
    data_files = []
    for root, _, files in os.walk("coeffs"):
        data_files.append(
            (
                EVERYBEAM_DATADIR,
                [os.path.join(root, f) for f in files],
            )
        )
    
    # The information here can also be placed in setup.cfg - better separation of
    # logic and declaration, and simpler if you include description/version in a file.
    setup(
        name="everybeam",
        version="0.5.1",
        author="André Offringa",
        author_email="offringa@astron.nl",
        description="EveryBeam",
        long_description=open("README.md", "rt").read(),
        long_description_content_type="text/markdown",
        ext_modules=[CMakeExtension("everybeam")],
        cmdclass={"build_ext": CMakeBuild},
        zip_safe=False,
        python_requires=">=3.6",
        install_requires=["numpy"],
        url="https://everybeam.readthedocs.io/",
        classifiers=[
            "Development Status :: 5 - Production/Stable",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
            "Programming Language :: C++",
            "Programming Language :: Python :: 3",
            "Topic :: Scientific/Engineering :: Astronomy",
        ],
        data_files=data_files,
    )