diff --git a/Makefile b/Makefile index 5a818ec6d6fc741b2724d1e20469a68cb3d40af4..4c2da1774d42b4d22e0e2a96728dcef6f87f51cb 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ TARGET_LIB_DIR := lib CC := gcc LD := gcc MAKE := /usr/bin/make +MKDIR_P := mkdir -p # Libraries LIBS := -lbinary_c $(shell $(BINARY_C)/binary_c-config --libs) @@ -38,27 +39,30 @@ OBJECTS := $(C_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) OBJ_FLAGS := -c # Shared lib files and flags -SO_NAME := $(TARGET_LIB_DIR)/libbinary_c_api.so +SO_NAME := $(TARGET_LIB_DIR)/libbinary_c_python_api.so SO_FLAGS := -shared -# To create python shared library -PY_EXEC := python3 -PY_SETUP := setup.py -#PY_OPTIONS := build_ext --build-lib $(TARGET_LIB_DIR) -PY_OPTIONS := build_ext --inplace +all: create_directories create_objects create_library -all: +debug: create_directories create_objects_debug create_library_debug + +create_directories: + ${MKDIR_P} ${TARGET_LIB_DIR} + ${MKDIR_P} ${OBJ_DIR} + +create_objects: $(CC) -DBINARY_C=$(BINARY_C) $(CFLAGS) $(INCDIRS) $(C_SRC) -o $(OBJECTS) $(OBJ_FLAGS) $(LIBS) - $(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS) - $(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS) -debug: +create_objects_debug: $(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(CFLAGS) $(INCDIRS) $(C_SRC) -o $(OBJECTS) $(OBJ_FLAGS) $(LIBS) - $(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS) - $(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS) +create_library: + $(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS) + +create_library_debug: + $(CC) -DBINARY_C=$(BINARY_C) -DBINARY_C_PYTHON_DEBUG $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS) -test: +echo_vars: @echo OBJECTS: $(OBJECTS) @echo LIBS: $(LIBS) @echo C_SRC: $(C_SRC) diff --git a/setup.py b/setup.py index ab47b88dc120048d3b4ad35b473992cd744e83ac..9397399c46eca471978ff76104c4572c51c95275 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,17 @@ """ Setup script for binarycpython """ -import setuptools -from distutils.core import setup, Extension - 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. # Functions def readme(): @@ -24,13 +29,39 @@ def license(): def check_version(installed_binary_c_version, required_binary_c_versions): """Function to check the installed version and compare it to the required version""" message = """ - The binary_c version that is installed ({}) does not match the binary_c versions ({}) + 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 ) assert installed_binary_c_version in required_binary_c_versions, message +def execute_make(): + """ + Function to execute the makefile. + + 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(stderr.decode('utf-8')) + print("Aborting") + sys.exit(-1) + + else: + print(stdout.decode("utf-8")) + print("Successfully built the libbinary_c_api.so") + + ### REQUIRED_BINARY_C_VERSIONS = ["2.1.7"] @@ -129,7 +160,7 @@ INCLUDE_DIRS = ( else [] ) -LIBRARIES = ["binary_c"] + BINARY_C_LIBS + ["binary_c_api"] +LIBRARIES = ["binary_c"] + BINARY_C_LIBS + ["binary_c_python_api"] LIBRARY_DIRS = [ os.path.join(BINARY_C_DIR, "src"), @@ -163,7 +194,6 @@ RUNTIME_LIBRARY_DIRS = list(dict.fromkeys(RUNTIME_LIBRARY_DIRS)) # print("macros: ", str(BINARY_C_DEFINE_MACROS) + "\n") # print('\n') -#quit() ############################################################ # Making the extension function ############################################################ @@ -171,7 +201,7 @@ RUNTIME_LIBRARY_DIRS = list(dict.fromkeys(RUNTIME_LIBRARY_DIRS)) BINARY_C_PYTHON_API_MODULE = Extension( # name="binarycpython.core.binary_c", - name="binary_c_python_api", + name="binarycpython._binary_c_bindings", sources=["src/binary_c_python.c"], include_dirs=INCLUDE_DIRS, libraries=LIBRARIES, @@ -187,6 +217,16 @@ BINARY_C_PYTHON_API_MODULE = Extension( # Making the extension function ############################################################ +# Override build command +class CustomBuildCommand(distutils.command.build.build): + + def run(self): + execute_make() + + # Run the original build command + # print(super().run()) + distutils.command.build.build.run(self) + setup( name="binarycpython", version="0.2", @@ -201,22 +241,20 @@ setup( ), author="David Hendriks", author_email="davidhendriks93@gmail.com", + long_description_content_type='text/markdown', long_description=readme(), url="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python", license="gpl", - package_dir={ - "binarycpython": "binarycpython", - "binarycpython.utils": "binarycpython/utils", - # 'binarycpython.core': 'lib', - }, + keywords = ['binary_c', 'astrophysics', 'stellar evolution', 'population synthesis'], # Keywords that define your package best packages=[ "binarycpython", "binarycpython.utils", - # 'binarycpython.core', + "binarycpython.core", + "binarycpython.tests", + "binarycpython.tests.core", ], - # package_data={ - # 'binarycpython.core': ['libbinary_c_api.so'], - # }, + install_requires=["numpy", "pytest", "h5py"], + include_package_data=True, ext_modules=[BINARY_C_PYTHON_API_MODULE], # binary_c must be loaded classifiers=[ @@ -231,4 +269,7 @@ setup( "Topic :: Scientific/Engineering :: Physics", "Topic :: Software Development :: Libraries :: Python Modules", ], + + cmdclass={'build': CustomBuildCommand}, + )