# Fix for bus error issues when compiling cpython extensions in pyrp3 v1.2.0+ # Patch sourced from: https://github.com/linien-org/pyrp3/tree/e6688acf8bd79d2dbe1d192d09c1a1baf1f6c67b (setup.py & monitor/Makefile) # Reference: https://github.com/elhep/Fast-Servo-Firmware/blob/master/OS/scripts/linien_install_requirements.sh#L28 diff --git a/monitor/Makefile b/monitor/Makefile new file mode 100644 index 0000000..044d88e --- /dev/null +++ b/monitor/Makefile @@ -0,0 +1,31 @@ +# Makefile for libmonitor + +OBJS = monitor.o +SRCS = $(subst .o,.c, $(OBJS)) +OSOBJS = monitor.os +TARGETLIB=libmonitor.so +CFLAGS=-g -std=gnu99 -Wall -Werror +LIBS=-lm -lpthread + +# Use CROSS_COMPILE=arm-linux-gnueabi- +CC=$(CROSS_COMPILE)gcc +INSTALL_DIR ?= . + + +all: $(TARGETLIB) +lib: $(TARGETLIB) + +%.os: %.c + $(CC) -c -fPIC $(CFLAGS) $< -o $@ + +$(TARGETLIB): $(OSOBJS) + $(CC) -o $@ -shared $^ $(CFLAGS) $(LIBS) + +clean: + rm -f $(TARGETLIB) *.o *.os + +# Install target - creates 'lib/' sub-directory in $(INSTALL_DIR) and copies all +# executables to that location. +install: + mkdir -p $(INSTALL_DIR)/lib + cp $(TARGETLIB) $(INSTALL_DIR)/lib \ No newline at end of file diff --git a/pyrp3/raw_memory.py b/pyrp3/raw_memory.py index ce1b28e..233b82a 100644 --- a/pyrp3/raw_memory.py +++ b/pyrp3/raw_memory.py @@ -1,12 +1,9 @@ from ctypes import POINTER, c_uint32, cast, cdll, create_string_buffer, sizeof -from importlib.machinery import EXTENSION_SUFFIXES from pathlib import Path import numpy as np -libmonitor_file = str( - Path(__file__).parent / ".." / "monitor{}".format(EXTENSION_SUFFIXES[0]) -) +libmonitor_file = 'libmonitor.so' libmonitor = cdll.LoadLibrary(libmonitor_file) libmonitor.read_value.restype = c_uint32 diff --git a/setup.py b/setup.py index 98bdaee..b0a8af4 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,10 @@ import re -from distutils.core import Extension, setup +import os + +from distutils.core import setup +from distutils.command.build import build +from distutils.command.install import install + from pathlib import Path # from https://stackoverflow.com/a/7071358/2750945 @@ -11,9 +16,50 @@ if mo: verstr = mo.group(1) else: raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,)) + +# Patch from https://github.com/linien-org/pyrp3/blob/e6688acf8bd79d2dbe1d192d09c1a1baf1f6c67b/setup.py#L16-L55 +build_dir = "monitor/" + +def compile_libmonitor(): + cwd = os.getcwd() # get current directory + try: + os.chdir(build_dir) + os.system("make clean") + os.system("make all") + finally: + os.chdir(cwd) + + +def install_libmonitor(prefix=""): + cwd = os.getcwd() # get current directory + try: + os.chdir(build_dir) + os.system("make install INSTALL_DIR={prefix}".format(prefix=prefix)) + finally: + os.chdir(cwd) + + +class lib_build(build): + def run(self): + compile_libmonitor() + build.run(self) + + +class lib_install(install): + def run(self): + compile_libmonitor() + install_libmonitor(self.prefix) + # install.run(self) + +# Will use nix to install libmonitor +cmdclass = { + "build": lib_build +} + this_directory = Path(__file__).parent long_description = (this_directory / "README.rst").read_text() + setup( name="pyrp3", version=verstr, @@ -32,6 +78,7 @@ setup( "cached_property>=1.5.2", "numpy>=1.11.0", ], + cmdclass=cmdclass, classifiers=[ "Intended Audience :: Developers", "Intended Audience :: Education", @@ -45,5 +92,4 @@ setup( "Topic :: Software Development :: Libraries :: Python Modules", ], keywords=["redpitaya", "FPGA", "zynq"], - ext_modules=[Extension("monitor", ["monitor/monitor.c"])], )