diff --git a/fast-servo/linien-pyrp3-monitor.patch b/fast-servo/linien-pyrp3-monitor.patch new file mode 100644 index 0000000..6830c84 --- /dev/null +++ b/fast-servo/linien-pyrp3-monitor.patch @@ -0,0 +1,141 @@ +# 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"])], + ) diff --git a/flake.nix b/flake.nix index 63bd1c2..33d4c0d 100644 --- a/flake.nix +++ b/flake.nix @@ -110,13 +110,23 @@ rev = "v${version}"; hash = "sha256-43TTlpJ5SMAjQM71bNVvrWQyciRXM3zpuA/Dw41AEgU="; }; - nativeBuildInputs = with pkgs-armv7l.python3Packages; [ setuptools wheel setuptools-scm ]; + patches = ./fast-servo/linien-pyrp3-monitor.patch; + nativeBuildInputs = with pkgs-armv7l.python3Packages; [ + setuptools wheel setuptools-scm + ] ++ (with pkgs-armv7l; [ gcc gnumake ]); propagatedBuildInputs = with pkgs-armv7l.python3Packages; [ myhdl rpyc4 cached-property numpy ]; + postInstall = '' + cp monitor/libmonitor.so $out/lib + ''; + postFixup = '' + substituteInPlace $out/${pkgs.python3.sitePackages}/pyrp3/raw_memory.py \ + --replace "libmonitor.so" "$out/lib/libmonitor.so" + ''; }; linien-server = pkgs-armv7l.python3Packages.buildPythonPackage rec {