Newer
Older
David Hendriks
committed
"""
Setup script for binarycpython
"""
import os
import subprocess
import re
import sys
import setuptools
from distutils.core import setup, Extension
import distutils.command.build
# TODO: replace the tasks that call binary_c-config with a single function that handles the return status a bit better.
def version():
"""
opens VERSION and returns version number
"""
with open("VERSION") as file:
return file.read().strip()
David Hendriks
committed
# Functions
def readme():
"""Opens readme file and returns content"""
with open("README.md") as file:
David Hendriks
committed
return file.read()
David Hendriks
committed
def license():
"""Opens license file and returns the content"""
with open("LICENSE.md") as file:
return file.read()
David Hendriks
committed
def check_version(installed_binary_c_version, required_binary_c_versions):
David Hendriks
committed
"""Function to check the installed version and compare it to the required version"""
message = """
Something went wrong. Make sure that binary_c config exists.
Possibly the binary_c version that is installed ({}) does not match the binary_c versions ({})
that this release of the binary_c python module requires.
""".format(
installed_binary_c_version, required_binary_c_versions
)
David Hendriks
committed
assert installed_binary_c_version in required_binary_c_versions, message
David Hendriks
committed
def execute_make():
"""
This makefile builds the binary_c_python_api library that python will use to interface wth
"""
# Custom extra command:
make_command = ["make"]
p = subprocess.run(make_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = p.stdout # stdout = normal output
stderr = p.stderr # stderr = error output
if p.returncode != 0:
print("Something went wrong when executing the makefile:")
print("Aborting")
sys.exit(-1)
else:
print(stdout.decode("utf-8"))
print("Successfully built the libbinary_c_api.so")
David Hendriks
committed
###
REQUIRED_BINARY_C_VERSIONS = ["2.1.7", "2.2pre1", "2.2.0", "2.2.1"]
David Hendriks
committed
####
GSL_DIR = os.getenv("GSL_DIR", None)
David Hendriks
committed
"Warning: GSL_DIR is not set, this might lead to errors along the installation if\
there is no other version of GSL in the include dirs"
BINARY_C_DIR = os.getenv("BINARY_C", None)
if not BINARY_C_DIR:
print(
"\n\n****\n**** Error: the BINARY_C environment variable is not set.\n**** This environment variable should point to the root of your binary_c\n**** installation (i.e. the directory you acquired from the repository).\n**** Aborting setup.\n****\n\n"
)

Izzard, Robert Dr (Maths & Physics)
committed
quit(1)
David Hendriks
committed
# TODO: write code to know exact parent directory of this file.
CWD = os.getcwd()
############################################################
# Getting information from binary_c
############################################################
David Hendriks
committed
# binary_c must be installed.
BINARY_C_CONFIG = os.path.join(BINARY_C_DIR, "binary_c-config")
David Hendriks
committed
BINARY_C_VERSION = (
subprocess.run([BINARY_C_CONFIG, "version"], stdout=subprocess.PIPE, check=True)
David Hendriks
committed
.stdout.decode("utf-8")
.split()
)
check_version(BINARY_C_VERSION[0], REQUIRED_BINARY_C_VERSIONS)
David Hendriks
committed
David Hendriks
committed
BINARY_C_INCDIRS = (
subprocess.run(
[BINARY_C_CONFIG, "incdirs_list"], stdout=subprocess.PIPE, check=True
)
.stdout.decode("utf-8")
.split()
)
David Hendriks
committed
BINARY_C_LIBDIRS = (
subprocess.run(
[BINARY_C_CONFIG, "libdirs_list"], stdout=subprocess.PIPE, check=True
)
.stdout.decode("utf-8")
.split()
)
David Hendriks
committed
BINARY_C_CFLAGS = (
subprocess.run([BINARY_C_CONFIG, "cflags"], stdout=subprocess.PIPE, check=True)
.stdout.decode("utf-8")
.split()
)
David Hendriks
committed
# BINARY_C_CFLAGS.remove('-fvisibility=hidden')
BINARY_C_LIBS = (
subprocess.run([BINARY_C_CONFIG, "libs_list"], stdout=subprocess.PIPE, check=True)
.stdout.decode("utf-8")
.split()
)
# create list of tuples of defined macros
David Hendriks
committed
BINARY_C_DEFINE_MACROS = []
DEFINES = (
subprocess.run(
[BINARY_C_CONFIG, "define_macros"], stdout=subprocess.PIPE, check=True
)
.stdout.decode("utf-8")
.split()
)
David Hendriks
committed
LONE = re.compile("^-D(.+)$")
PARTNER = re.compile("^-D(.+)=(.+)$")
for x in DEFINES:
y = PARTNER.match(x)
David Hendriks
committed
BINARY_C_DEFINE_MACROS.extend([(y.group(1), y.group(2))])
else:
David Hendriks
committed
y = LONE.match(x)
David Hendriks
committed
BINARY_C_DEFINE_MACROS.extend([(y.group(1), None)])
David Hendriks
committed
# add API header file
API_h = os.path.join(BINARY_C_DIR, "src", "API", "binary_c_API.h")
############################################################
David Hendriks
committed
# Setting all directories and LIBRARIES to their final values
############################################################
INCLUDE_DIRS = [
os.path.join(BINARY_C_DIR, "src"),
os.path.join(BINARY_C_DIR, "src", "API"),
"include",
] + BINARY_C_INCDIRS
if GSL_DIR:
INCLUDE_DIRS += [os.path.join(GSL_DIR, "include")]
# LIBRARIES = ["binary_c"] + BINARY_C_LIBS + ["binary_c_python_api"]
LIBRARIES = ["binary_c"] + BINARY_C_LIBS
David Hendriks
committed
LIBRARY_DIRS = [
"./",
os.path.join(CWD, "lib/"),
David Hendriks
committed
] + BINARY_C_LIBDIRS
David Hendriks
committed
RUNTIME_LIBRARY_DIRS = [
"./",
os.path.join(CWD, "lib/"),
David Hendriks
committed
] + BINARY_C_LIBDIRS
# filter out duplicates
INCLUDE_DIRS = list(dict.fromkeys(INCLUDE_DIRS))
BINARY_C_LIBS = list(dict.fromkeys(BINARY_C_LIBS))
LIBRARIES = list(dict.fromkeys(LIBRARIES))
LIBRARY_DIRS = list(dict.fromkeys(LIBRARY_DIRS))
RUNTIME_LIBRARY_DIRS = list(dict.fromkeys(RUNTIME_LIBRARY_DIRS))
David Hendriks
committed
# print('\n')
# print("BINARY_C_CONFIG: ", str(BINARY_C_CONFIG) + "\n")
# print("incdirs: ", str(INCLUDE_DIRS) + "\n")
# print("BINARY_C_LIBS: ", str(BINARY_C_LIBS) + "\n")
# print("LIBRARIES: ", str(LIBRARIES) + "\n")
# print("LIBRARY_DIRS: ", str(LIBRARY_DIRS) + "\n")
# print("RUNTIME_LIBRARY_DIRS: ", str(RUNTIME_LIBRARY_DIRS) + "\n")
# print("BINARY_C_CFLAGS: ", str(BINARY_C_CFLAGS) + "\n")
# print("API_h: ", str(API_h) + "\n")
# print("macros: ", str(BINARY_C_DEFINE_MACROS) + "\n")
# print('\n')
############################################################
# Making the extension function
############################################################
David Hendriks
committed
BINARY_C_PYTHON_API_MODULE = Extension(
name="binarycpython._binary_c_bindings",
include_dirs=INCLUDE_DIRS,
libraries=LIBRARIES,
library_dirs=LIBRARY_DIRS,
David Hendriks
committed
define_macros=[] + BINARY_C_DEFINE_MACROS,
extra_objects=[],
extra_compile_args=[],
David Hendriks
committed
language="C",
headers = ["src/includes/header.h"]
############################################################
# Making the extension function
############################################################
# Override build command
class CustomBuildCommand(distutils.command.build.build):
def run(self):
# Run the original build command
distutils.command.build.build.run(self)
name="binarycpython",
description="""This is a python API for binary_c (versions {}) by David Hendriks, Rob Izzard and collaborators. Based on the initial set up by Jeff andrews.""".format(
David Hendriks
committed
",".join(REQUIRED_BINARY_C_VERSIONS),
",".join(REQUIRED_BINARY_C_VERSIONS),
author="David Hendriks",
author_email="davidhendriks93@gmail.com",
long_description=readme(),
# long_description="hello",
url="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python",
keywords=[
"binary_c",
"astrophysics",
"stellar evolution",
"population synthesis",
], # Keywords that define your package best
David Hendriks
committed
packages=[
"binarycpython",
"binarycpython.utils",
"binarycpython.utils.population_extensions",
"binarycpython.tests",
David Hendriks
committed
],
install_requires=[ # TODO: can we centralise this?
"cachetools",
"compress_pickle",
"datasize",

Izzard, Robert Dr (Maths & Physics)
committed
"diskcache",

Izzard, Robert Dr (Maths & Physics)
committed
"flufl.lock",
"h5py",
"halo",
"humanize",
"msgpack",
"numpy",
"pandas",
"pathos",
"psutil",
"pytest",
"str2bool",
"strip-ansi",
include_package_data=True,
David Hendriks
committed
ext_modules=[BINARY_C_PYTHON_API_MODULE], # binary_c must be loaded
David Hendriks
committed
"Development Status :: 4 - Beta",
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3",
"Programming Language :: C",
"Topic :: Education",
"Topic :: Scientific/Engineering :: Physics",
"Topic :: Software Development :: Libraries :: Python Modules",
],
cmdclass={"build": CustomBuildCommand},