forked from M-Labs/nix-servo
142 lines
3.7 KiB
Diff
142 lines
3.7 KiB
Diff
|
# 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"])],
|
||
|
)
|