Use libmonitor compiled by gnumake #59
|
@ -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"])],
|
||||
)
|
12
flake.nix
12
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"
|
||||
sb10q
commented
I think you don't need placeholder? Just $out would work. I think you don't need placeholder? Just $out would work.
fsagbuya
commented
It seems that installing
I commented it out and have it only build libmonitor.so and have nix install it via It seems that installing `libmonitor.so` via the Makefile alone is not compatible with nix:
```
cp libmonitor.so /nix/store/sxr2igfkwhxbagri49b8krmcqz168sim-python3-3.11.8/lib
cp: cannot create regular file '/nix/store/sxr2igfkwhxbagri49b8krmcqz168sim-python3-3.11.8/lib/libmonitor.so': Permission denied
```
I [commented it out](https://git.m-labs.hk/M-Labs/nix-servo/src/commit/ba41975e2c01da4eda0ddb48946debedae346c3c/fast-servo/linien-pyrp3-monitor.patch#L114-L118) and have it only build libmonitor.so and have nix install it via `postInstall`.
|
||||
'';
|
||||
};
|
||||
|
||||
linien-server = pkgs-armv7l.python3Packages.buildPythonPackage rec {
|
||||
|
|
Loading…
Reference in New Issue
Can't those two lines be replaced with just "make"?