[v3,1/2] package/pocketpy: new package

Message ID 20250604123243.420711-1-dario.binacchi@amarulasolutions.com
State New
Headers show
Series
  • [v3,1/2] package/pocketpy: new package
Related show

Commit Message

Dario Binacchi June 4, 2025, 12:32 p.m. UTC
It is a portable Python 3.x interpreter, written in C11. It has no
dependencies other than the C standard library, which can be easily
integrated into your C/C++ project

Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
---

Changes v2 -> v3:
 - Add package/pocketpy/0001-Fix-getchar-helper.patch.
 - Add depends on !BR2_STATIC_LIBS for dlfcn.h

Changes v1 -> v2:
 - mv staging commands under POCKETPY_INSTALL_STAGING_CMDS hook.
 
 DEVELOPERS                                    |  1 +
 package/Config.in                             |  1 +
 .../pocketpy/0001-Fix-getchar-helper.patch    | 91 +++++++++++++++++++
 package/pocketpy/Config.in                    |  9 ++
 package/pocketpy/pocketpy.hash                |  3 +
 package/pocketpy/pocketpy.mk                  | 25 +++++
 6 files changed, 130 insertions(+)
 create mode 100644 package/pocketpy/0001-Fix-getchar-helper.patch
 create mode 100644 package/pocketpy/Config.in
 create mode 100644 package/pocketpy/pocketpy.hash
 create mode 100644 package/pocketpy/pocketpy.mk

Patch

diff --git a/DEVELOPERS b/DEVELOPERS
index a7bb3bd83460..46d24afceb71 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -811,6 +811,7 @@  F:	package/armadillo/
 F:	package/babeld/
 F:	package/iana-assignments/
 F:	package/inih/
+F:	package/pocketpy/
 F:	package/sscep/
 F:	package/tinyinit/
 F:	package/ufs-utils/
diff --git a/package/Config.in b/package/Config.in
index 579b5ffc87d5..9aad65488a6c 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -968,6 +968,7 @@  if BR2_STATIC_LIBS
 comment "External PHP extensions need a toolchain w/ dynamic library"
 endif
 endif
+	source "package/pocketpy/Config.in"
 	source "package/python3/Config.in"
 if BR2_PACKAGE_PYTHON3
 menu "External python modules"
diff --git a/package/pocketpy/0001-Fix-getchar-helper.patch b/package/pocketpy/0001-Fix-getchar-helper.patch
new file mode 100644
index 000000000000..4247c0590b6d
--- /dev/null
+++ b/package/pocketpy/0001-Fix-getchar-helper.patch
@@ -0,0 +1,91 @@ 
+From 3a35bd3285936c99875da3f57c44de3ef85e3022 Mon Sep 17 00:00:00 2001
+From: Dario Binacchi <dario.binacchi@amarulasolutions.com>
+Date: Wed, 4 Jun 2025 12:19:22 +0200
+Subject: [PATCH] Fix getchar() helper
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The getchar() function is defined as a macro in uClibc, raising the
+next following errors:
+
+>>> pocketpy 2.0.8 Building
+GIT_DIR=. PATH="/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/host/bin:/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/host/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  /usr/bin/cmake --build /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/ -j3 --
+[ 50%] Building C object CMakeFiles/pocketpy.dir/Unity/unity_pocketpy_c.c.o
+In file included from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/host/arc-buildroot-linux-uclibc/sysroot/usr/include/stdio.h:71,
+                 from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/include/pocketpy/common/utils.h:3,
+                 from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/include/pocketpy/common/str.h:4,
+                 from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/include/pocketpy/common/smallmap.h:4,
+                 from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/src/common/smallmap.c:1,
+                 from /builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/CMakeFiles/pocketpy.dir/Unity/unity_pocketpy_c.c:9:
+/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/src/interpreter/vm.c: In function ‘py_replinput’:
+/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/src/interpreter/vm.c:813:42: error: expected identifier before ‘(’ token
+  813 |         int c = pk_current_vm->callbacks.getchar();
+      |                                          ^~~~~~~
+/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/src/interpreter/vm.c:813:42: error: expected statement before ‘)’ token
+  813 |         int c = pk_current_vm->callbacks.getchar();
+      |                                          ^~~~~~~
+/builds/jolivain/buildroot/br-test-pkg/bootlin-arcle-hs38-uclibc/build/pocketpy-2.0.8/src/interpreter/vm.c:813:42: error: expected statement before ‘)’ token
+  813 |         int c = pk_current_vm->callbacks.getchar();
+
+Link: https://gitlab.com/jolivain/buildroot/-/pipelines/1847795347
+Link: https://gitlab.com/jolivain/buildroot/-/jobs/10217736977
+Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>
+Upstream: backport from https://github.com/pocketpy/pocketpy/pull/371
+---
+ include/pocketpy/pocketpy.h | 2 +-
+ src/interpreter/vm.c        | 4 ++--
+ src/public/modules.c        | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h
+index a44faa41a922..2d6d2ff4aad7 100644
+--- a/include/pocketpy/pocketpy.h
++++ b/include/pocketpy/pocketpy.h
+@@ -69,7 +69,7 @@ typedef struct py_Callbacks {
+     /// Used by `print` to output a string.
+     void (*print)(const char*);
+     /// Used by `input` to get a character.
+-    int (*getchar)();
++    int (*getch)();
+ } py_Callbacks;
+ 
+ /// Native function signature.
+diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c
+index 2bae82740ac7..1a69d9dffd11 100644
+--- a/src/interpreter/vm.c
++++ b/src/interpreter/vm.c
+@@ -67,7 +67,7 @@ void VM__ctor(VM* self) {
+ 
+     self->callbacks.importfile = pk_default_importfile;
+     self->callbacks.print = pk_default_print;
+-    self->callbacks.getchar = getchar;
++    self->callbacks.getch = getchar;
+ 
+     self->last_retval = *py_NIL();
+     self->curr_exception = *py_NIL();
+@@ -810,7 +810,7 @@ int py_replinput(char* buf, int max_size) {
+     printf(">>> ");
+ 
+     while(true) {
+-        int c = pk_current_vm->callbacks.getchar();
++        int c = pk_current_vm->callbacks.getch();
+         if(c == EOF) return -1;
+ 
+         if(c == '\n') {
+diff --git a/src/public/modules.c b/src/public/modules.c
+index 3efb362701e2..257726b7c539 100644
+--- a/src/public/modules.c
++++ b/src/public/modules.c
+@@ -205,7 +205,7 @@ static bool builtins_input(int argc, py_Ref argv) {
+     c11_sbuf buf;
+     c11_sbuf__ctor(&buf);
+     while(true) {
+-        int c = pk_current_vm->callbacks.getchar();
++        int c = pk_current_vm->callbacks.getch();
+         if(c == '\n' || c == '\r') break;
+         if(c == EOF) break;
+         c11_sbuf__write_char(&buf, c);
+-- 
+2.43.0
+
diff --git a/package/pocketpy/Config.in b/package/pocketpy/Config.in
new file mode 100644
index 000000000000..b0bd0cafe008
--- /dev/null
+++ b/package/pocketpy/Config.in
@@ -0,0 +1,9 @@ 
+config BR2_PACKAGE_POCKETPY
+	bool "pocketpy"
+	depends on BR2_INSTALL_LIBSTDCPP
+	depends on !BR2_STATIC_LIBS # dlfcn.h
+	help
+	  pocketpy is a portable Python 3.x interpreter,
+	  written in C11.
+
+	  https://github.com/pocketpy/pocketpy
diff --git a/package/pocketpy/pocketpy.hash b/package/pocketpy/pocketpy.hash
new file mode 100644
index 000000000000..aabd5f077a2b
--- /dev/null
+++ b/package/pocketpy/pocketpy.hash
@@ -0,0 +1,3 @@ 
+# locally computed
+sha256  5e07994d66311a6b5ac032cc5243aaabe3ab318946971e7fa1cd0614934efc81  pocketpy-2.0.8.tar.gz
+sha256  d3a2bf8ca609a75941e980e62c13cf5a21aeaa4a2502822934d282fe7de5d319  LICENSE
diff --git a/package/pocketpy/pocketpy.mk b/package/pocketpy/pocketpy.mk
new file mode 100644
index 000000000000..20a8e9ad1e20
--- /dev/null
+++ b/package/pocketpy/pocketpy.mk
@@ -0,0 +1,25 @@ 
+################################################################################
+#
+# pocketpy
+#
+################################################################################
+
+POCKETPY_VERSION = 2.0.8
+POCKETPY_SITE = $(call github,pocketpy,pocketpy,v$(POCKETPY_VERSION))
+POCKETPY_LICENSE = MIT
+POCKETPY_LICENSE_FILES = LICENSE
+POCKETPY_INSTALL_STAGING = YES
+
+POCKETPY_CONF_OPTS = -DPK_BUILD_SHARED_LIB=ON
+
+define POCKETPY_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/libpocketpy.so* $(TARGET_DIR)/usr/lib
+endef
+
+define POCKETPY_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/libpocketpy.so* $(STAGING_DIR)/usr/lib
+	$(INSTALL) -m 755 -d $(STAGING_DIR)/usr/include/pocketpy
+	cp -r $(@D)/include/* $(STAGING_DIR)/usr/include/pocketpy
+endef
+
+$(eval $(cmake-package))