All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [RFC PATCH 1/1] jupyterlab: new package
@ 2024-04-18 22:26 Graeme Smecher
  2024-04-29 15:38 ` Graeme Smecher
  2024-04-30 20:05 ` Yann E. MORIN
  0 siblings, 2 replies; 3+ messages in thread
From: Graeme Smecher @ 2024-04-18 22:26 UTC (permalink / raw)
  To: buildroot
  Cc: Jugurtha BELKALEM, Graeme Smecher, Asaf Kahlon, James Hilliard,
	Thomas Petazzoni

JupyterLab is a "web-based interactive development environment for
notebooks, code, and data. Its flexible interface allows users to
configure and arrange workflows in data science, scientific computing,
computational journalism, and machine learning." [1]

Why BuildRoot? JupyterLab makes a great
interactive front-end for embedded instrumentation:
they replace web-based interfaces, encourage open scriptability, and
bridge the gap between interactive and scripted use-cases. High-end lab
gear (think: oscilloscopes) generally comes with some of these ingredients
but it's usually vendor-specific, often half-hearted, and usually
inherit its ergonomics from IEEE-488 (no thanks).

For example: JupyterLab is already used in Xilinx's PYNQ framework [2],
which uses Yocto as a distribution builder.

[1]: https://jupyter.org
[2]: http://www.pynq.io

Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
---
 package/Config.in                             | 21 ++++++++
 package/jupyter-client/Config.in              |  6 +++
 package/jupyter-client/jupyter-client.mk      | 15 ++++++
 package/jupyter-core/Config.in                |  6 +++
 package/jupyter-core/jupyter-core.mk          | 13 +++++
 package/jupyter-events/Config.in              |  6 +++
 package/jupyter-events/jupyter-events.mk      | 13 +++++
 package/jupyter-ipython-kernel/Config.in      |  8 +++
 .../jupyter-ipython-kernel.mk                 | 19 +++++++
 package/jupyter-nbclient/Config.in            |  6 +++
 package/jupyter-nbclient/jupyter-nbclient.mk  | 13 +++++
 package/jupyter-nbconvert/0001-certs.patch    | 23 ++++++++
 package/jupyter-nbconvert/Config.in           |  6 +++
 .../jupyter-nbconvert/jupyter-nbconvert.mk    | 14 +++++
 package/jupyter-nbformat/Config.in            |  6 +++
 package/jupyter-nbformat/jupyter-nbformat.mk  | 14 +++++
 package/jupyter-notebook-shim/Config.in       |  6 +++
 .../jupyter-notebook-shim.mk                  | 14 +++++
 .../jupyter-server/0001-dependencies.patch    | 14 +++++
 package/jupyter-server/Config.in              |  7 +++
 package/jupyter-server/jupyter-server.mk      | 14 +++++
 package/jupyterlab-pygments/Config.in         |  6 +++
 .../jupyterlab-pygments.mk                    | 14 +++++
 package/jupyterlab-server/Config.in           |  6 +++
 .../jupyterlab-server/jupyterlab-server.mk    | 13 +++++
 package/jupyterlab/0001-dependencies.patch    | 14 +++++
 package/jupyterlab/Config.in                  | 52 +++++++++++++++++++
 package/jupyterlab/jupyterlab.mk              | 18 +++++++
 package/python-bleach/Config.in               |  7 +++
 package/python-bleach/python-bleach.mk        | 14 +++++
 package/python-comm/Config.in                 |  7 +++
 package/python-comm/python-comm.mk            | 14 +++++
 package/python-fastjsonschema/Config.in       |  6 +++
 .../python-fastjsonschema.mk                  | 13 +++++
 .../python-hatch-jupyter-builder.mk           | 14 +++++
 .../python-hatch-nodejs-version.mk            | 15 ++++++
 package/python-json-logger/Config.in          |  7 +++
 .../python-json-logger/python-json-logger.mk  | 13 +++++
 package/python-json5/Config.in                |  6 +++
 package/python-json5/python-json5.mk          | 14 +++++
 .../python-matplotlib/0001-dependencies.patch | 19 +++++++
 package/python-overrides/Config.in            |  7 +++
 package/python-overrides/python-overrides.mk  | 14 +++++
 package/python-platformdirs/Config.in         |  6 +++
 .../python-platformdirs.mk                    | 19 +++++++
 package/python-prometheus-client/Config.in    |  6 +++
 .../python-prometheus-client.mk               | 13 +++++
 package/python-send2trash/Config.in           |  7 +++
 .../python-send2trash/python-send2trash.mk    | 14 +++++
 49 files changed, 602 insertions(+)
 create mode 100644 package/jupyter-client/Config.in
 create mode 100644 package/jupyter-client/jupyter-client.mk
 create mode 100644 package/jupyter-core/Config.in
 create mode 100644 package/jupyter-core/jupyter-core.mk
 create mode 100644 package/jupyter-events/Config.in
 create mode 100644 package/jupyter-events/jupyter-events.mk
 create mode 100644 package/jupyter-ipython-kernel/Config.in
 create mode 100644 package/jupyter-ipython-kernel/jupyter-ipython-kernel.mk
 create mode 100644 package/jupyter-nbclient/Config.in
 create mode 100644 package/jupyter-nbclient/jupyter-nbclient.mk
 create mode 100644 package/jupyter-nbconvert/0001-certs.patch
 create mode 100644 package/jupyter-nbconvert/Config.in
 create mode 100644 package/jupyter-nbconvert/jupyter-nbconvert.mk
 create mode 100644 package/jupyter-nbformat/Config.in
 create mode 100644 package/jupyter-nbformat/jupyter-nbformat.mk
 create mode 100644 package/jupyter-notebook-shim/Config.in
 create mode 100644 package/jupyter-notebook-shim/jupyter-notebook-shim.mk
 create mode 100644 package/jupyter-server/0001-dependencies.patch
 create mode 100644 package/jupyter-server/Config.in
 create mode 100644 package/jupyter-server/jupyter-server.mk
 create mode 100644 package/jupyterlab-pygments/Config.in
 create mode 100644 package/jupyterlab-pygments/jupyterlab-pygments.mk
 create mode 100644 package/jupyterlab-server/Config.in
 create mode 100644 package/jupyterlab-server/jupyterlab-server.mk
 create mode 100644 package/jupyterlab/0001-dependencies.patch
 create mode 100644 package/jupyterlab/Config.in
 create mode 100644 package/jupyterlab/jupyterlab.mk
 create mode 100644 package/python-bleach/Config.in
 create mode 100644 package/python-bleach/python-bleach.mk
 create mode 100644 package/python-comm/Config.in
 create mode 100644 package/python-comm/python-comm.mk
 create mode 100644 package/python-fastjsonschema/Config.in
 create mode 100644 package/python-fastjsonschema/python-fastjsonschema.mk
 create mode 100644 package/python-hatch-jupyter-builder/python-hatch-jupyter-builder.mk
 create mode 100644 package/python-hatch-nodejs-version/python-hatch-nodejs-version.mk
 create mode 100644 package/python-json-logger/Config.in
 create mode 100644 package/python-json-logger/python-json-logger.mk
 create mode 100644 package/python-json5/Config.in
 create mode 100644 package/python-json5/python-json5.mk
 create mode 100644 package/python-matplotlib/0001-dependencies.patch
 create mode 100644 package/python-overrides/Config.in
 create mode 100644 package/python-overrides/python-overrides.mk
 create mode 100644 package/python-platformdirs/Config.in
 create mode 100644 package/python-platformdirs/python-platformdirs.mk
 create mode 100644 package/python-prometheus-client/Config.in
 create mode 100644 package/python-prometheus-client/python-prometheus-client.mk
 create mode 100644 package/python-send2trash/Config.in
 create mode 100644 package/python-send2trash/python-send2trash.mk

diff --git a/package/Config.in b/package/Config.in
index 1935077f0f..2fe7b75ba2 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -698,6 +698,18 @@ endif
 	source "package/haserl/Config.in"
 	source "package/janet/Config.in"
 	source "package/jimtcl/Config.in"
+	source "package/jupyter-client/Config.in"
+	source "package/jupyter-core/Config.in"
+	source "package/jupyter-events/Config.in"
+	source "package/jupyter-ipython-kernel/Config.in"
+	source "package/jupyter-nbclient/Config.in"
+	source "package/jupyter-nbconvert/Config.in"
+	source "package/jupyter-nbformat/Config.in"
+	source "package/jupyter-notebook-shim/Config.in"
+	source "package/jupyter-server/Config.in"
+	source "package/jupyterlab/Config.in"
+	source "package/jupyterlab-pygments/Config.in"
+	source "package/jupyterlab-server/Config.in"
 	source "package/lua/Config.in"
 	source "package/luainterpreter/Config.in"
 	source "package/luajit/Config.in"
@@ -1013,6 +1025,7 @@ menu "External python modules"
 	source "package/python-bidict/Config.in"
 	source "package/python-bitarray/Config.in"
 	source "package/python-bitstring/Config.in"
+	source "package/python-bleach/Config.in"
 	source "package/python-bleak/Config.in"
 	source "package/python-blinker/Config.in"
 	source "package/python-bluezero/Config.in"
@@ -1042,6 +1055,7 @@ menu "External python modules"
 	source "package/python-colorama/Config.in"
 	source "package/python-colorlog/Config.in"
 	source "package/python-colorzero/Config.in"
+	source "package/python-comm/Config.in"
 	source "package/python-configshell-fb/Config.in"
 	source "package/python-constantly/Config.in"
 	source "package/python-construct/Config.in"
@@ -1090,6 +1104,7 @@ menu "External python modules"
 	source "package/python-falcon/Config.in"
 	source "package/python-fastapi/Config.in"
 	source "package/python-fastapi-sessions/Config.in"
+	source "package/python-fastjsonschema/Config.in"
 	source "package/python-filelock/Config.in"
 	source "package/python-fire/Config.in"
 	source "package/python-flask/Config.in"
@@ -1159,7 +1174,9 @@ menu "External python modules"
 	source "package/python-jeepney/Config.in"
 	source "package/python-jinja2/Config.in"
 	source "package/python-jmespath/Config.in"
+	source "package/python-json-logger/Config.in"
 	source "package/python-json-schema-validator/Config.in"
+	source "package/python-json5/Config.in"
 	source "package/python-jsonmodels/Config.in"
 	source "package/python-jsonschema/Config.in"
 	source "package/python-jsonschema-specifications/Config.in"
@@ -1215,6 +1232,7 @@ menu "External python modules"
 	source "package/python-numpy/Config.in"
 	source "package/python-oauthlib/Config.in"
 	source "package/python-opcua-asyncio/Config.in"
+	source "package/python-overrides/Config.in"
 	source "package/python-orjson/Config.in"
 	source "package/python-outcome/Config.in"
 	source "package/python-packaging/Config.in"
@@ -1233,11 +1251,13 @@ menu "External python modules"
 	source "package/python-pigpio/Config.in"
 	source "package/python-pillow/Config.in"
 	source "package/python-pip/Config.in"
+	source "package/python-platformdirs/Config.in"
 	source "package/python-pluggy/Config.in"
 	source "package/python-ply/Config.in"
 	source "package/python-portend/Config.in"
 	source "package/python-posix-ipc/Config.in"
 	source "package/python-priority/Config.in"
+	source "package/python-prometheus-client/Config.in"
 	source "package/python-prompt-toolkit/Config.in"
 	source "package/python-protobuf/Config.in"
 	source "package/python-psutil/Config.in"
@@ -1337,6 +1357,7 @@ menu "External python modules"
 	source "package/python-segno/Config.in"
 	source "package/python-selenium/Config.in"
 	source "package/python-semver/Config.in"
+	source "package/python-send2trash/Config.in"
 	source "package/python-sentry-sdk/Config.in"
 	source "package/python-serial/Config.in"
 	source "package/python-serial-asyncio/Config.in"
diff --git a/package/jupyter-client/Config.in b/package/jupyter-client/Config.in
new file mode 100644
index 0000000000..1086780aed
--- /dev/null
+++ b/package/jupyter-client/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_CLIENT
+	bool "jupyter-client"
+	help
+	  Jupyter Client
+
+	  https://github.com/jupyter-client/jupyter_client
diff --git a/package/jupyter-client/jupyter-client.mk b/package/jupyter-client/jupyter-client.mk
new file mode 100644
index 0000000000..1946585929
--- /dev/null
+++ b/package/jupyter-client/jupyter-client.mk
@@ -0,0 +1,15 @@
+################################################################################
+#
+# jupyter-client
+#
+################################################################################
+
+JUPYTER_CLIENT_VERSION = v8.2.0
+JUPYTER_CLIENT_SITE = $(call github,jupyter,jupyter_client,$(JUPYTER_CLIENT_VERSION))
+JUPYTER_CLIENT_SETUP_TYPE = pep517
+JUPYTER_CLIENT_LICENSE = BSD-3-Clause
+JUPYTER_CLIENT_LICENSE_FILES = LICENSE
+JUPYTER_CLIENT_DEPENDENCIES = host-python-hatchling
+
+$(eval $(python-package))
+$(eval $(host-python-package))
diff --git a/package/jupyter-core/Config.in b/package/jupyter-core/Config.in
new file mode 100644
index 0000000000..1d8a534a18
--- /dev/null
+++ b/package/jupyter-core/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_CORE
+	bool "jupyter-core"
+	help
+	  Jupyter Core
+
+	  https://github.com/jupyter/jupyter_core
diff --git a/package/jupyter-core/jupyter-core.mk b/package/jupyter-core/jupyter-core.mk
new file mode 100644
index 0000000000..4b9e7a5bdb
--- /dev/null
+++ b/package/jupyter-core/jupyter-core.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# jupyter-core
+#
+################################################################################
+
+JUPYTER_CORE_VERSION = v5.3.0
+JUPYTER_CORE_SITE = $(call github,jupyter,jupyter_core,$(JUPYTER_CORE_VERSION))
+JUPYTER_CORE_SETUP_TYPE = pep517
+JUPYTER_CORE_LICENSE = BSD-3-Clause
+JUPYTER_CORE_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/jupyter-events/Config.in b/package/jupyter-events/Config.in
new file mode 100644
index 0000000000..f5b0496b33
--- /dev/null
+++ b/package/jupyter-events/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_EVENTS
+	bool "jupyter-events"
+	help
+	  Jupyter Events
+
+	  https://github.com/jupyter/jupyter_events
diff --git a/package/jupyter-events/jupyter-events.mk b/package/jupyter-events/jupyter-events.mk
new file mode 100644
index 0000000000..32ae5a774f
--- /dev/null
+++ b/package/jupyter-events/jupyter-events.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# jupyter-events
+#
+################################################################################
+
+JUPYTER_EVENTS_VERSION = v0.9.0
+JUPYTER_EVENTS_SITE = $(call github,jupyter,jupyter_events,$(JUPYTER_EVENTS_VERSION))
+JUPYTER_EVENTS_SETUP_TYPE = pep517
+JUPYTER_EVENTS_LICENSE = BSD-3-Clause
+JUPYTER_EVENTS_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/jupyter-ipython-kernel/Config.in b/package/jupyter-ipython-kernel/Config.in
new file mode 100644
index 0000000000..6be3d401c9
--- /dev/null
+++ b/package/jupyter-ipython-kernel/Config.in
@@ -0,0 +1,8 @@
+config BR2_PACKAGE_JUPYTER_IPYTHON_KERNEL
+	bool "jupyter-ipython-kernel"
+	select BR2_PACKAGE_HOST_PYTHON3
+	select BR2_PACKAGE_HOST_PYTHON3_SSL
+	help
+	  Jupyter IPython Kernel
+
+	  https://github.com/ipython/ipykernel
diff --git a/package/jupyter-ipython-kernel/jupyter-ipython-kernel.mk b/package/jupyter-ipython-kernel/jupyter-ipython-kernel.mk
new file mode 100644
index 0000000000..4b73577e7f
--- /dev/null
+++ b/package/jupyter-ipython-kernel/jupyter-ipython-kernel.mk
@@ -0,0 +1,19 @@
+################################################################################
+#
+# jupyter-ipython-kernel
+#
+################################################################################
+
+JUPYTER_IPYTHON_KERNEL_VERSION = v6.29.0
+JUPYTER_IPYTHON_KERNEL_SITE = $(call github,ipython,ipykernel,$(JUPYTER_IPYTHON_KERNEL_VERSION))
+JUPYTER_IPYTHON_KERNEL_SETUP_TYPE = setuptools
+JUPYTER_IPYTHON_KERNEL_LICENSE = BSD-3-Clause
+JUPYTER_IPYTHON_KERNEL_LICENSE_FILES = LICENSE
+
+define JUPYTER_IPYTHON_KERNEL_INSTALL_EXTRAS
+	cp -dpf $(@D)/ipykernel_launcher.py $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/site-packages
+endef
+
+JUPYTER_IPYTHON_KERNEL_POST_INSTALL_TARGET_HOOKS += JUPYTER_IPYTHON_KERNEL_INSTALL_EXTRAS
+
+$(eval $(python-package))
diff --git a/package/jupyter-nbclient/Config.in b/package/jupyter-nbclient/Config.in
new file mode 100644
index 0000000000..5087a318c3
--- /dev/null
+++ b/package/jupyter-nbclient/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_NBCLIENT
+	bool "jupyter-nbclient"
+	help
+	  Jupyter Notebook Client
+
+	  https://github.com/jupyter/nbclient
diff --git a/package/jupyter-nbclient/jupyter-nbclient.mk b/package/jupyter-nbclient/jupyter-nbclient.mk
new file mode 100644
index 0000000000..302b226f3e
--- /dev/null
+++ b/package/jupyter-nbclient/jupyter-nbclient.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# jupyter-nbclient
+#
+################################################################################
+
+JUPYTER_NBCLIENT_VERSION = v0.7.4
+JUPYTER_NBCLIENT_SITE = $(call github,jupyter,nbclient,$(JUPYTER_NBCLIENT_VERSION))
+JUPYTER_NBCLIENT_SETUP_TYPE = pep517
+JUPYTER_NBCLIENT_LICENSE = BSD-3-Clause
+JUPYTER_NBCLIENT_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/jupyter-nbconvert/0001-certs.patch b/package/jupyter-nbconvert/0001-certs.patch
new file mode 100644
index 0000000000..a9d00f3483
--- /dev/null
+++ b/package/jupyter-nbconvert/0001-certs.patch
@@ -0,0 +1,23 @@
+Use certifi Python package for CA certificates
+
+Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
+Upstream: N/A (system certificates manage this outside buildroot)
+--- nbconvert-7.3.1/hatch_build.py	2023-04-10 09:58:09.000000000 -0400
++++ nbconvert-7.3.1/hatch_build_new.py	2024-03-11 13:14:03.900065615 -0400
+@@ -1,6 +1,7 @@
+ """Custom build script for hatch backend"""
+ import os
+ import sys
++import certifi
+ from urllib.request import urlopen
+ 
+ from hatchling.builders.hooks.plugin.interface import BuildHookInterface
+@@ -47,7 +48,7 @@
+         os.makedirs(directory)
+     print("Downloading CSS: %s" % url)
+     try:
+-        css = urlopen(url).read()  # noqa
++        css = urlopen(url, cafile=certifi.where()).read()  # noqa
+     except Exception as e:
+         msg = f"Failed to download css from {url}: {e}"
+         print(msg, file=sys.stderr)
diff --git a/package/jupyter-nbconvert/Config.in b/package/jupyter-nbconvert/Config.in
new file mode 100644
index 0000000000..dca7cf0686
--- /dev/null
+++ b/package/jupyter-nbconvert/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_NBCONVERT
+	bool "jupyter-nbconvert"
+	help
+	  Jupyter Notebook Convert
+
+	  https://github.com/jupyter/nbconvert
diff --git a/package/jupyter-nbconvert/jupyter-nbconvert.mk b/package/jupyter-nbconvert/jupyter-nbconvert.mk
new file mode 100644
index 0000000000..cbaa1c2315
--- /dev/null
+++ b/package/jupyter-nbconvert/jupyter-nbconvert.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# jupyter-nbconvert
+#
+################################################################################
+
+JUPYTER_NBCONVERT_VERSION = v7.3.1
+JUPYTER_NBCONVERT_SITE = $(call github,jupyter,nbconvert,$(JUPYTER_NBCONVERT_VERSION))
+JUPYTER_NBCONVERT_SETUP_TYPE = pep517
+JUPYTER_NBCONVERT_LICENSE = BSD-3-Clause
+JUPYTER_NBCONVERT_LICENSE_FILES = LICENSE
+JUPYTER_NBCONVERT_DEPENDENCIES = host-openssl host-python-certifi
+
+$(eval $(python-package))
diff --git a/package/jupyter-nbformat/Config.in b/package/jupyter-nbformat/Config.in
new file mode 100644
index 0000000000..78a8b66749
--- /dev/null
+++ b/package/jupyter-nbformat/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_NBFORMAT
+	bool "jupyter-nbformat"
+	help
+	  Jupyter Notebook Format
+
+	  https://github.com/jupyter/nbformat
diff --git a/package/jupyter-nbformat/jupyter-nbformat.mk b/package/jupyter-nbformat/jupyter-nbformat.mk
new file mode 100644
index 0000000000..ed52724369
--- /dev/null
+++ b/package/jupyter-nbformat/jupyter-nbformat.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# jupyter-nbformat
+#
+################################################################################
+
+JUPYTER_NBFORMAT_VERSION = v5.8.0
+JUPYTER_NBFORMAT_SITE = $(call github,jupyter,nbformat,$(JUPYTER_NBFORMAT_VERSION))
+JUPYTER_NBFORMAT_SETUP_TYPE = pep517
+JUPYTER_NBFORMAT_LICENSE = BSD-3-Clause
+JUPYTER_NBFORMAT_LICENSE_FILES = LICENSE
+JUPYTER_NBFORMAT_DEPENDENCIES = host-python-hatch-nodejs-version
+
+$(eval $(python-package))
diff --git a/package/jupyter-notebook-shim/Config.in b/package/jupyter-notebook-shim/Config.in
new file mode 100644
index 0000000000..b2e6266fab
--- /dev/null
+++ b/package/jupyter-notebook-shim/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTER_NOTEBOOK_SHIM
+	bool "jupyter-notebook-shim"
+	help
+	  Jupyter Notebook Shim
+
+	  https://pypi.org/project/notebook-shim/
diff --git a/package/jupyter-notebook-shim/jupyter-notebook-shim.mk b/package/jupyter-notebook-shim/jupyter-notebook-shim.mk
new file mode 100644
index 0000000000..ab3009ea4c
--- /dev/null
+++ b/package/jupyter-notebook-shim/jupyter-notebook-shim.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# jupyter-notebook-shim
+#
+################################################################################
+
+JUPYTER_NOTEBOOK_SHIM_VERSION = 0.2.3
+JUPYTER_NOTEBOOK_SHIM_SOURCE = notebook_shim-$(JUPYTER_NOTEBOOK_SHIM_VERSION).tar.gz
+JUPYTER_NOTEBOOK_SHIM_SITE = https://files.pythonhosted.org/packages/ea/10/6c6c7adc0d61e72cfc4055d0671bbd12bdc6ffea86892e903bd2398b9019
+JUPYTER_NOTEBOOK_SHIM_SETUP_TYPE = pep517
+JUPYTER_NOTEBOOK_SHIM_LICENSE = BSD-3-Clause
+JUPYTER_NOTEBOOK_SHIM_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/jupyter-server/0001-dependencies.patch b/package/jupyter-server/0001-dependencies.patch
new file mode 100644
index 0000000000..61da5ba7c6
--- /dev/null
+++ b/package/jupyter-server/0001-dependencies.patch
@@ -0,0 +1,14 @@
+jupyter_server: Remove hatch-jupyter-builder dependency
+
+Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
+Upstream: N/A (needed to break buildroot-specific host/target dependency loop)
+--- jupyter_server-2.12.5/pyproject.toml	2024-01-16 09:57:59.000000000 -0500
++++ jupyter_server-2.12.5/pyproject_new.toml	2024-03-11 14:20:27.318247718 -0400
+@@ -129,7 +129,6 @@
+ artifacts = ["jupyter_server/static/style"]
+ 
+ [tool.hatch.build.hooks.jupyter-builder]
+-dependencies = ["hatch-jupyter-builder>=0.8.1"]
+ build-function = "hatch_jupyter_builder.npm_builder"
+ ensured-targets = [
+   "jupyter_server/static/style/bootstrap.min.css",
diff --git a/package/jupyter-server/Config.in b/package/jupyter-server/Config.in
new file mode 100644
index 0000000000..85b8a3f13a
--- /dev/null
+++ b/package/jupyter-server/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_JUPYTER_SERVER
+	bool "jupyter-server"
+	select BR2_PACKAGE_PYTHON_OVERRIDES
+	help
+	  Jupyter Server
+
+	  https://github.com/jupyter-server/jupyter_server
diff --git a/package/jupyter-server/jupyter-server.mk b/package/jupyter-server/jupyter-server.mk
new file mode 100644
index 0000000000..35aea174da
--- /dev/null
+++ b/package/jupyter-server/jupyter-server.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# jupyter-server
+#
+################################################################################
+
+JUPYTER_SERVER_VERSION = v2.12.5
+JUPYTER_SERVER_SITE = $(call github,jupyter-server,jupyter_server,$(JUPYTER_SERVER_VERSION))
+JUPYTER_SERVER_SETUP_TYPE = pep517
+JUPYTER_SERVER_LICENSE = BSD-3-Clause
+JUPYTER_SERVER_LICENSE_FILES = LICENSE
+JUPYTER_SERVER_DEPENDENCIES = host-python-hatch-jupyter-builder python-overrides
+
+$(eval $(python-package))
diff --git a/package/jupyterlab-pygments/Config.in b/package/jupyterlab-pygments/Config.in
new file mode 100644
index 0000000000..40a840e7f2
--- /dev/null
+++ b/package/jupyterlab-pygments/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTERLAB_PYGMENTS
+	bool "jupyterlab-pygments"
+	help
+	  Jupyterlab Pygments theme
+
+	  https://jupyter.org
diff --git a/package/jupyterlab-pygments/jupyterlab-pygments.mk b/package/jupyterlab-pygments/jupyterlab-pygments.mk
new file mode 100644
index 0000000000..7b88612485
--- /dev/null
+++ b/package/jupyterlab-pygments/jupyterlab-pygments.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# jupyterlab-pygments
+#
+################################################################################
+
+JUPYTERLAB_PYGMENTS_VERSION = 0.3.0
+JUPYTERLAB_PYGMENTS_SITE = $(call github,jupyterlab,jupyterlab_pygments,$(JUPYTERLAB_PYGMENTS_VERSION))
+JUPYTERLAB_PYGMENTS_LICENSE = BSD-3-Clause
+JUPYTERLAB_PYGMENTS_LICENSE_FILES = LICENSE
+JUPYTERLAB_PYGMENTS_DEPENDENCIES = host-python-platformdirs jupyterlab
+JUPYTERLAB_PYGMENTS_SETUP_TYPE = setuptools
+
+$(eval $(python-package))
diff --git a/package/jupyterlab-server/Config.in b/package/jupyterlab-server/Config.in
new file mode 100644
index 0000000000..89f1a82544
--- /dev/null
+++ b/package/jupyterlab-server/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_JUPYTERLAB_SERVER
+	bool "jupyterlab-server"
+	help
+	  Jupyterlab Server
+
+	  https://jupyter.org
diff --git a/package/jupyterlab-server/jupyterlab-server.mk b/package/jupyterlab-server/jupyterlab-server.mk
new file mode 100644
index 0000000000..b4a5eb2570
--- /dev/null
+++ b/package/jupyterlab-server/jupyterlab-server.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# jupyterlab-server
+#
+################################################################################
+
+JUPYTERLAB_SERVER_VERSION = v2.22.1
+JUPYTERLAB_SERVER_SITE = $(call github,jupyterlab,jupyterlab_server,$(JUPYTERLAB_SERVER_VERSION))
+JUPYTERLAB_SERVER_SETUP_TYPE = pep517
+JUPYTERLAB_SERVER_LICENSE = BSD-3-Clause
+JUPYTERLAB_SERVER_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/jupyterlab/0001-dependencies.patch b/package/jupyterlab/0001-dependencies.patch
new file mode 100644
index 0000000000..1e3b36dd9f
--- /dev/null
+++ b/package/jupyterlab/0001-dependencies.patch
@@ -0,0 +1,14 @@
+jupyterlab: Remove hatch-jupyter-builder dependency
+
+Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
+Upstream: N/A (needed to break buildroot-specific host/target dependency loop)
+--- jupyterlab-4.0.12/pyproject.toml	2024-01-30 09:17:41.000000000 -0500
++++ jupyterlab-4.0.12/pyproject_new.toml	2024-03-11 14:17:16.914647903 -0400
+@@ -187,7 +187,6 @@
+ ]
+ 
+ [tool.hatch.build.hooks.jupyter-builder]
+-dependencies = ["hatch-jupyter-builder>=0.3.2"]
+ build-function = "buildapi.builder"
+ ensured-targets = [
+     "jupyterlab/static/package.json",
diff --git a/package/jupyterlab/Config.in b/package/jupyterlab/Config.in
new file mode 100644
index 0000000000..9a91dc7a31
--- /dev/null
+++ b/package/jupyterlab/Config.in
@@ -0,0 +1,52 @@
+config BR2_PACKAGE_JUPYTERLAB
+	bool "jupyterlab"
+	select BR2_PACKAGE_LIBARGON2
+	select BR2_PACKAGE_JUPYTERLAB_SERVER
+	select BR2_PACKAGE_JUPYTERLAB_PYGMENTS
+	select BR2_PACKAGE_JUPYTER_CLIENT
+	select BR2_PACKAGE_JUPYTER_CORE
+	select BR2_PACKAGE_JUPYTER_EVENTS
+	select BR2_PACKAGE_JUPYTER_IPYTHON_KERNEL
+	select BR2_PACKAGE_JUPYTER_NBCLIENT
+	select BR2_PACKAGE_JUPYTER_NBCONVERT
+	select BR2_PACKAGE_JUPYTER_NBFORMAT
+	select BR2_PACKAGE_JUPYTER_NOTEBOOK_SHIM
+	select BR2_PACKAGE_JUPYTER_SERVER
+	select BR2_PACKAGE_PYTHON_ANYIO
+	select BR2_PACKAGE_PYTHON_ARGON2_CFFI
+	select BR2_PACKAGE_PYTHON_ARGON2_CFFI_BINDINGS
+	select BR2_PACKAGE_PYTHON_ASTTOKENS
+	select BR2_PACKAGE_PYTHON_ASYNC_LRU
+	select BR2_PACKAGE_PYTHON_BABEL
+	select BR2_PACKAGE_PYTHON_BLEACH
+	select BR2_PACKAGE_PYTHON_DATEUTIL
+	select BR2_PACKAGE_PYTHON_DEFUSEDXML
+	select BR2_PACKAGE_PYTHON_EXECUTING
+	select BR2_PACKAGE_PYTHON_COMM
+	select BR2_PACKAGE_PYTHON_FASTJSONSCHEMA
+	select BR2_PACKAGE_PYTHON_IPYTHON
+	select BR2_PACKAGE_PYTHON_JINJA2
+	select BR2_PACKAGE_PYTHON_JSON5
+	select BR2_PACKAGE_PYTHON_JSONSCHEMA
+	select BR2_PACKAGE_PYTHON_JSON_LOGGER
+	select BR2_PACKAGE_PYTHON_MATPLOTLIB
+	select BR2_PACKAGE_PYTHON_MATPLOTLIB_INLINE
+	select BR2_PACKAGE_PYTHON_PACKAGING
+	select BR2_PACKAGE_PYTHON_PLATFORMDIRS
+	select BR2_PACKAGE_PYTHON_PROMETHEUS_CLIENT
+	select BR2_PACKAGE_PYTHON_PSUTIL
+	select BR2_PACKAGE_PYTHON_PYYAML
+	select BR2_PACKAGE_PYTHON_PYZMQ
+	select BR2_PACKAGE_PYTHON_REQUESTS
+	select BR2_PACKAGE_PYTHON_SEND2TRASH
+	select BR2_PACKAGE_PYTHON_SNIFFIO
+	select BR2_PACKAGE_PYTHON_STACK_DATA
+	select BR2_PACKAGE_PYTHON_TORNADO
+	select BR2_PACKAGE_PYTHON_TRAITLETS
+	select BR2_PACKAGE_PYTHON_WEBENCODINGS
+	select BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT
+	select BR2_PACKAGE_PYTHON3_SQLITE
+	help
+	  Jupyterlab
+
+	  https://jupyter.org
diff --git a/package/jupyterlab/jupyterlab.mk b/package/jupyterlab/jupyterlab.mk
new file mode 100644
index 0000000000..690697e62a
--- /dev/null
+++ b/package/jupyterlab/jupyterlab.mk
@@ -0,0 +1,18 @@
+################################################################################
+#
+# jupyterlab
+#
+################################################################################
+
+JUPYTERLAB_VERSION = v4.0.12
+JUPYTERLAB_SITE = $(call github,jupyterlab,jupyterlab,$(JUPYTERLAB_VERSION))
+JUPYTERLAB_SETUP_TYPE = pep517
+JUPYTERLAB_LICENSE = MIT
+JUPYTERLAB_LICENSE_FILES = LICENSE
+JUPYTERLAB_DEPENDENCIES = \
+	host-python-hatch-jupyter-builder \
+	host-python-hatchling \
+	jupyter-core \
+	jupyterlab-server
+
+$(eval $(python-package))
diff --git a/package/python-bleach/Config.in b/package/python-bleach/Config.in
new file mode 100644
index 0000000000..83a32b9ae7
--- /dev/null
+++ b/package/python-bleach/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_PYTHON_BLEACH
+	bool "python-bleach"
+	help
+	  Bleach is an allowed-list-based HTML sanitizing library that
+	  escapes or strips markup and attributes.
+
+	  https://pypi.org/project/bleach
diff --git a/package/python-bleach/python-bleach.mk b/package/python-bleach/python-bleach.mk
new file mode 100644
index 0000000000..6ffdc9e4f8
--- /dev/null
+++ b/package/python-bleach/python-bleach.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-bleach
+#
+################################################################################
+
+PYTHON_BLEACH_VERSION = 6.0.0
+PYTHON_BLEACH_SOURCE = bleach-$(PYTHON_BLEACH_VERSION).tar.gz
+PYTHON_BLEACH_SITE = https://files.pythonhosted.org/packages/7e/e6/d5f220ca638f6a25557a611860482cb6e54b2d97f0332966b1b005742e1f
+PYTHON_BLEACH_SETUP_TYPE = setuptools
+PYTHON_BLEACH_LICENSE = Mozilla
+PYTHON_BLEACH_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/python-comm/Config.in b/package/python-comm/Config.in
new file mode 100644
index 0000000000..8aa68143df
--- /dev/null
+++ b/package/python-comm/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_PYTHON_COMM
+	bool "python-comm"
+	help
+	  Provides a way to register a Kernel Comm implementation, as
+	  per the Jupyter kernel protocol.
+
+	  https://pypi.org/project/comm/
diff --git a/package/python-comm/python-comm.mk b/package/python-comm/python-comm.mk
new file mode 100644
index 0000000000..c2231043bd
--- /dev/null
+++ b/package/python-comm/python-comm.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-comm
+#
+################################################################################
+
+PYTHON_COMM_VERSION = 0.1.3
+PYTHON_COMM_SOURCE = comm-$(PYTHON_COMM_VERSION).tar.gz
+PYTHON_COMM_SITE = https://files.pythonhosted.org/packages/d6/1a/9937a10f8fd6d9f0f72fa0ab520cec7e50c534b215f8fd2d28e0f0a7f9a7
+PYTHON_COMM_SETUP_TYPE = pep517
+PYTHON_COMM_LICENSE = BSD-3-Clause
+PYTHON_COMM_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/python-fastjsonschema/Config.in b/package/python-fastjsonschema/Config.in
new file mode 100644
index 0000000000..00278c5b82
--- /dev/null
+++ b/package/python-fastjsonschema/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_PYTHON_FASTJSONSCHEMA
+	bool "python-fastjsonschema"
+	help
+	  Python fastjsonschema
+
+	  https://github.com/horejsek/python-fastjsonschema
diff --git a/package/python-fastjsonschema/python-fastjsonschema.mk b/package/python-fastjsonschema/python-fastjsonschema.mk
new file mode 100644
index 0000000000..289c768911
--- /dev/null
+++ b/package/python-fastjsonschema/python-fastjsonschema.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# python-fastjsonschema
+#
+################################################################################
+
+PYTHON_FASTJSONSCHEMA_VERSION = v2.16.3
+PYTHON_FASTJSONSCHEMA_SITE = $(call github,horejsek,python-fastjsonschema,$(PYTHON_FASTJSONSCHEMA_VERSION))
+PYTHON_FASTJSONSCHEMA_SETUP_TYPE = setuptools
+PYTHON_FASTJSONSCHEMA_LICENSE = BSD-3-Clause
+PYTHON_FASTJSONSCHEMA_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/python-hatch-jupyter-builder/python-hatch-jupyter-builder.mk b/package/python-hatch-jupyter-builder/python-hatch-jupyter-builder.mk
new file mode 100644
index 0000000000..27dede22fe
--- /dev/null
+++ b/package/python-hatch-jupyter-builder/python-hatch-jupyter-builder.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-hatch-jupyter-builder
+#
+################################################################################
+
+PYTHON_HATCH_JUPYTER_BUILDER_VERSION = v0.8.3
+PYTHON_HATCH_JUPYTER_BUILDER_SITE = $(call github,jupyterlab,hatch-jupyter-builder,$(PYTHON_HATCH_JUPYTER_BUILDER_VERSION))
+PYTHON_HATCH_JUPYTER_BUILDER_LICENSE = BSD-3-Clause
+PYTHON_HATCH_JUPYTER_BUILDER_LICENSE_FILES = LICENSE.txt
+PYTHON_HATCH_JUPYTER_BUILDER_SETUP_TYPE = setuptools
+HOST_PYTHON_HATCH_JUPYTER_BUILDER_DEPENDENCIES = host-python-hatchling host-python-hatch-vcs
+
+$(eval $(host-python-package))
diff --git a/package/python-hatch-nodejs-version/python-hatch-nodejs-version.mk b/package/python-hatch-nodejs-version/python-hatch-nodejs-version.mk
new file mode 100644
index 0000000000..ab2372b2a0
--- /dev/null
+++ b/package/python-hatch-nodejs-version/python-hatch-nodejs-version.mk
@@ -0,0 +1,15 @@
+################################################################################
+#
+# python-hatch-nodejs-version
+#
+################################################################################
+
+PYTHON_HATCH_NODEJS_VERSION_VERSION = 0.3.1
+PYTHON_HATCH_NODEJS_VERSION_SOURCE = hatch_nodejs_version-$(PYTHON_HATCH_NODEJS_VERSION_VERSION).tar.gz
+PYTHON_HATCH_NODEJS_VERSION_SITE = https://files.pythonhosted.org/packages/1a/f7/e563b874c1ebd181e002b56801562516408fa1ff12bbba4f803faa4f433b
+PYTHON_HATCH_NODEJS_VERSION_LICENSE = MIT
+PYTHON_HATCH_NODEJS_VERSION_LICENSE_FILES = LICENSE.txt
+PYTHON_HATCH_NODEJS_VERSION_SETUP_TYPE = pep517
+HOST_PYTHON_HATCH_NODEJS_VERSION_DEPENDENCIES = host-python-hatchling
+
+$(eval $(host-python-package))
diff --git a/package/python-json-logger/Config.in b/package/python-json-logger/Config.in
new file mode 100644
index 0000000000..7bfce46261
--- /dev/null
+++ b/package/python-json-logger/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_PYTHON_JSON_LOGGER
+	bool "python-json-logger"
+	help
+	  Allow standard python logging to output log data as json
+	  objects.
+
+	  https://pypi.org/project/python-json-logger/
diff --git a/package/python-json-logger/python-json-logger.mk b/package/python-json-logger/python-json-logger.mk
new file mode 100644
index 0000000000..afbd44e2f3
--- /dev/null
+++ b/package/python-json-logger/python-json-logger.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# python-json-logger
+#
+################################################################################
+
+PYTHON_JSON_LOGGER_VERSION = 2.0.7
+PYTHON_JSON_LOGGER_SITE = https://files.pythonhosted.org/packages/4f/da/95963cebfc578dabd323d7263958dfb68898617912bb09327dd30e9c8d13
+PYTHON_JSON_LOGGER_LICENSE = BSD-2-Clause
+PYTHON_JSON_LOGGER_LICENSE_FILES = LICENSE
+PYTHON_JSON_LOGGER_SETUP_TYPE = setuptools
+
+$(eval $(python-package))
diff --git a/package/python-json5/Config.in b/package/python-json5/Config.in
new file mode 100644
index 0000000000..bba8715d84
--- /dev/null
+++ b/package/python-json5/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_PYTHON_JSON5
+	bool "python-json5"
+	help
+	  A Python implementation of the JSON5 data format.
+
+	  https://pypi.org/project/json5
diff --git a/package/python-json5/python-json5.mk b/package/python-json5/python-json5.mk
new file mode 100644
index 0000000000..07c44350c2
--- /dev/null
+++ b/package/python-json5/python-json5.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-json5
+#
+################################################################################
+
+PYTHON_JSON5_VERSION = 0.9.11
+PYTHON_JSON5_SOURCE = json5-$(PYTHON_JSON5_VERSION).tar.gz
+PYTHON_JSON5_SITE = https://files.pythonhosted.org/packages/da/8b/26535688697b6129c0ccec7806162db0d01c9bc8b8994ab1e87c32ef9648
+PYTHON_JSON5_LICENSE = Apache
+PYTHON_JSON5_LICENSE_FILES = LICENSE
+PYTHON_JSON5_SETUP_TYPE = setuptools
+
+$(eval $(python-package))
diff --git a/package/python-matplotlib/0001-dependencies.patch b/package/python-matplotlib/0001-dependencies.patch
new file mode 100644
index 0000000000..ed72892ba6
--- /dev/null
+++ b/package/python-matplotlib/0001-dependencies.patch
@@ -0,0 +1,19 @@
+Disable dependency on numpy at package level (satisfied by buildroot)
+
+Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
+Upstream: N/A
+--- python-matplotlib-3.4.3/setup.py	2024-03-11 17:19:07.569386025 -0400
++++ python-matplotlib-3.4.3/setup_new.py	2024-03-11 17:19:46.297258324 -0400
+@@ -300,12 +300,10 @@
+     python_requires='>={}'.format('.'.join(str(n) for n in py_min_version)),
+     setup_requires=[
+         "certifi>=2020.06.20",
+-        "numpy>=1.16",
+     ],
+     install_requires=[
+         "cycler>=0.10",
+         "kiwisolver>=1.0.1",
+-        "numpy>=1.16",
+         "pillow>=6.2.0",
+         "pyparsing>=2.2.1",
+         "python-dateutil>=2.7",
diff --git a/package/python-overrides/Config.in b/package/python-overrides/Config.in
new file mode 100644
index 0000000000..165872978f
--- /dev/null
+++ b/package/python-overrides/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_PYTHON_OVERRIDES
+	bool "python-overrides"
+	help
+	  A decorator to automatically detect mismatch when overriding a
+	  method.
+
+	  https://pypi.org/project/overrides
diff --git a/package/python-overrides/python-overrides.mk b/package/python-overrides/python-overrides.mk
new file mode 100644
index 0000000000..0a10a65b35
--- /dev/null
+++ b/package/python-overrides/python-overrides.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-overrides
+#
+################################################################################
+
+PYTHON_OVERRIDES_VERSION = 7.7.0
+PYTHON_OVERRIDES_SOURCE = overrides-$(PYTHON_OVERRIDES_VERSION).tar.gz
+PYTHON_OVERRIDES_SITE = https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2
+PYTHON_OVERRIDES_SETUP_TYPE = setuptools
+PYTHON_OVERRIDES_LICENSE = Mozilla
+PYTHON_OVERRIDES_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/python-platformdirs/Config.in b/package/python-platformdirs/Config.in
new file mode 100644
index 0000000000..625b93b923
--- /dev/null
+++ b/package/python-platformdirs/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_PYTHON_PLATFORMDIRS
+	bool "python-platformdirs"
+	help
+	  Python Platformdirs
+
+	  https://github.com/platformdirs/platformdirs
diff --git a/package/python-platformdirs/python-platformdirs.mk b/package/python-platformdirs/python-platformdirs.mk
new file mode 100644
index 0000000000..e570f1e361
--- /dev/null
+++ b/package/python-platformdirs/python-platformdirs.mk
@@ -0,0 +1,19 @@
+################################################################################
+#
+# python-platformdirs
+#
+################################################################################
+
+PYTHON_PLATFORMDIRS_VERSION = 3.5.0
+PYTHON_PLATFORMDIRS_SOURCE = platformdirs-$(PYTHON_PLATFORMDIRS_VERSION).tar.gz
+PYTHON_PLATFORMDIRS_SITE = https://files.pythonhosted.org/packages/91/17/3836ffe140abb245726d0e21c5b9b984e2569e7027c20d12e969ec69bd8a
+PYTHON_PLATFORMDIRS_SETUP_TYPE = pep517
+PYTHON_PLATFORMDIRS_LICENSE = MIT
+PYTHON_PLATFORMDIRS_LICENSE_FILES = LICENSE
+PYTHON_PLATFORMDIRS_DEPENDENCIES = \
+	host-python-hatch-vcs \
+	host-python-hatchling \
+	host-python-setuptools-scm
+
+$(eval $(python-package))
+$(eval $(host-python-package))
diff --git a/package/python-prometheus-client/Config.in b/package/python-prometheus-client/Config.in
new file mode 100644
index 0000000000..4d192620b5
--- /dev/null
+++ b/package/python-prometheus-client/Config.in
@@ -0,0 +1,6 @@
+config BR2_PACKAGE_PYTHON_PROMETHEUS_CLIENT
+	bool "python-prometheus-client"
+	help
+	  Prometheus Client
+
+	  https://github.com/prometheus/client_python
diff --git a/package/python-prometheus-client/python-prometheus-client.mk b/package/python-prometheus-client/python-prometheus-client.mk
new file mode 100644
index 0000000000..a3650b9331
--- /dev/null
+++ b/package/python-prometheus-client/python-prometheus-client.mk
@@ -0,0 +1,13 @@
+################################################################################
+#
+# python-prometheus-client
+#
+################################################################################
+
+PYTHON_PROMETHEUS_CLIENT_VERSION = v0.16.0
+PYTHON_PROMETHEUS_CLIENT_SITE = $(call github,prometheus,client_python,$(PYTHON_PROMETHEUS_CLIENT_VERSION))
+PYTHON_PROMETHEUS_CLIENT_SETUP_TYPE = setuptools
+PYTHON_PROMETHEUS_CLIENT_LICENSE = Apache
+PYTHON_PROMETHEUS_CLIENT_LICENSE_FILES = LICENSE
+
+$(eval $(python-package))
diff --git a/package/python-send2trash/Config.in b/package/python-send2trash/Config.in
new file mode 100644
index 0000000000..70aa56ddc3
--- /dev/null
+++ b/package/python-send2trash/Config.in
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_PYTHON_SEND2TRASH
+	bool "python-send2trash"
+	help
+	  Send2Trash is a small package that sends files to the Trash
+	  (or Recycle Bin) natively and on all platforms.
+
+	  https://pypi.org/project/send2trash
diff --git a/package/python-send2trash/python-send2trash.mk b/package/python-send2trash/python-send2trash.mk
new file mode 100644
index 0000000000..3bca24c253
--- /dev/null
+++ b/package/python-send2trash/python-send2trash.mk
@@ -0,0 +1,14 @@
+################################################################################
+#
+# python-send2trash
+#
+################################################################################
+
+PYTHON_SEND2TRASH_VERSION = 1.8.2
+PYTHON_SEND2TRASH_SOURCE = Send2Trash-$(PYTHON_SEND2TRASH_VERSION).tar.gz
+PYTHON_SEND2TRASH_SITE = https://files.pythonhosted.org/packages/4a/d2/d4b4d8b1564752b4e593c6d007426172b6574df5a7c07322feba010f5551
+PYTHON_SEND2TRASH_LICENSE = BSD-3-Clause
+PYTHON_SEND2TRASH_LICENSE_FILES = LICENSE
+PYTHON_SEND2TRASH_SETUP_TYPE = pep517
+
+$(eval $(python-package))
-- 
2.39.2

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Buildroot] [RFC PATCH 1/1] jupyterlab: new package
  2024-04-18 22:26 [Buildroot] [RFC PATCH 1/1] jupyterlab: new package Graeme Smecher
@ 2024-04-29 15:38 ` Graeme Smecher
  2024-04-30 20:05 ` Yann E. MORIN
  1 sibling, 0 replies; 3+ messages in thread
From: Graeme Smecher @ 2024-04-29 15:38 UTC (permalink / raw)
  To: buildroot
  Cc: Jugurtha BELKALEM, Asaf Kahlon, James Hilliard, Thomas Petazzoni,
	Yann E. MORIN

Hi all,

On 4/18/24 15:26, Graeme Smecher wrote:
> JupyterLab is a "web-based interactive development environment for
> notebooks, code, and data. Its flexible interface allows users to
> configure and arrange workflows in data science, scientific computing,
> computational journalism, and machine learning." [1]
> 
> Why BuildRoot? JupyterLab makes a great
> interactive front-end for embedded instrumentation:
> they replace web-based interfaces, encourage open scriptability, and
> bridge the gap between interactive and scripted use-cases. High-end lab
> gear (think: oscilloscopes) generally comes with some of these ingredients
> but it's usually vendor-specific, often half-hearted, and usually
> inherit its ergonomics from IEEE-488 (no thanks).
> 
> For example: JupyterLab is already used in Xilinx's PYNQ framework [2],
> which uses Yocto as a distribution builder.

I haven't heard any comments back yet - I realize this is a large patchset
and is going to take some time to settle out.

Comments welcome. Please also let me know if there's anyone missing from CC
who should weigh in.

There is some earlier discussion here:

	https://lore.kernel.org/buildroot/ed1bff77-5934-f09a-ab39-ca4eea6b4b12@threespeedlogic.com/T/

best,
Graeme
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Buildroot] [RFC PATCH 1/1] jupyterlab: new package
  2024-04-18 22:26 [Buildroot] [RFC PATCH 1/1] jupyterlab: new package Graeme Smecher
  2024-04-29 15:38 ` Graeme Smecher
@ 2024-04-30 20:05 ` Yann E. MORIN
  1 sibling, 0 replies; 3+ messages in thread
From: Yann E. MORIN @ 2024-04-30 20:05 UTC (permalink / raw)
  To: Graeme Smecher
  Cc: Jugurtha BELKALEM, James Hilliard, Thomas Petazzoni, Asaf Kahlon,
	buildroot

Graeme, All,

Thanks for the effort in porting JupyterLab to Buildroot, I can see that
it's a complex stack!

James, there are a few uestions for you below (search your first name)...

On 2024-04-18 15:26 -0700, Graeme Smecher spake thusly:
> JupyterLab is a "web-based interactive development environment for
> notebooks, code, and data. Its flexible interface allows users to
> configure and arrange workflows in data science, scientific computing,
> computational journalism, and machine learning." [1]

Although I can see how JupyretLab is interesting, I am not sure its
purpose is so interesting in embedded products. I know that Buildroot is
also used to create OCI images for cloudy stuff, but even there I am not
sure it is so interesting.

To me, JupyterLab is a quick-anmd-dirty solution to whip around a little
bit of (python) code to deal with some data from some kind of datalake
(or datapond, or datapuddle? ;-]) with little to no maintainability in
the code, just slightly glorified snippets not much more complex like
one-liners like data.plot(type="scaterplot", range=([0.0, 1.0], [-1.0, 1.0]))

Yes, I know the above is a bit exagerated...

But see below...

> Why BuildRoot? JupyterLab makes a great
> interactive front-end for embedded instrumentation:
> they replace web-based interfaces, encourage open scriptability, and
> bridge the gap between interactive and scripted use-cases. High-end lab
> gear (think: oscilloscopes) generally comes with some of these ingredients
> but it's usually vendor-specific, often half-hearted, and usually
> inherit its ergonomics from IEEE-488 (no thanks).

That last bit had me really laugh (I can relate), thanks! :-)

But now, I think I see where you're trying to get, so let me try and
rehash what you are saying to see if I understood correctly.

What you are suggesting is that JupyterLab be used as a frontend to a
device, like an oscilloscope, that is highly customisable (think:
trigger condition, range, duration, number of inputs, and whatnots) that
makes a progrmmable environment better suited to use all those features,
but where giving a bare python interpreter is, well, too bare.

Is that right?

If so, then I do think it does make a lot of sense indeed to have such a
stack available in Buildroot.

See below for a very high-altitude preliminary review.

> For example: JupyterLab is already used in Xilinx's PYNQ framework [2],
> which uses Yocto as a distribution builder.
> 
> [1]: https://jupyter.org
> [2]: http://www.pynq.io
> 
> Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
> ---
>  package/Config.in                             | 21 ++++++++
>  package/jupyter-client/Config.in              |  6 +++
>  package/jupyter-client/jupyter-client.mk      | 15 ++++++
>  package/jupyter-core/Config.in                |  6 +++
>  package/jupyter-core/jupyter-core.mk          | 13 +++++
>  package/jupyter-events/Config.in              |  6 +++
>  package/jupyter-events/jupyter-events.mk      | 13 +++++
>  package/jupyter-ipython-kernel/Config.in      |  8 +++
>  .../jupyter-ipython-kernel.mk                 | 19 +++++++
>  package/jupyter-nbclient/Config.in            |  6 +++
>  package/jupyter-nbclient/jupyter-nbclient.mk  | 13 +++++
>  package/jupyter-nbconvert/0001-certs.patch    | 23 ++++++++
>  package/jupyter-nbconvert/Config.in           |  6 +++
>  .../jupyter-nbconvert/jupyter-nbconvert.mk    | 14 +++++
>  package/jupyter-nbformat/Config.in            |  6 +++
>  package/jupyter-nbformat/jupyter-nbformat.mk  | 14 +++++
>  package/jupyter-notebook-shim/Config.in       |  6 +++
>  .../jupyter-notebook-shim.mk                  | 14 +++++
>  .../jupyter-server/0001-dependencies.patch    | 14 +++++
>  package/jupyter-server/Config.in              |  7 +++
>  package/jupyter-server/jupyter-server.mk      | 14 +++++
>  package/jupyterlab-pygments/Config.in         |  6 +++
>  .../jupyterlab-pygments.mk                    | 14 +++++
>  package/jupyterlab-server/Config.in           |  6 +++
>  .../jupyterlab-server/jupyterlab-server.mk    | 13 +++++
>  package/jupyterlab/0001-dependencies.patch    | 14 +++++
>  package/jupyterlab/Config.in                  | 52 +++++++++++++++++++
>  package/jupyterlab/jupyterlab.mk              | 18 +++++++
>  package/python-bleach/Config.in               |  7 +++
>  package/python-bleach/python-bleach.mk        | 14 +++++
>  package/python-comm/Config.in                 |  7 +++
>  package/python-comm/python-comm.mk            | 14 +++++
>  package/python-fastjsonschema/Config.in       |  6 +++
>  .../python-fastjsonschema.mk                  | 13 +++++
>  .../python-hatch-jupyter-builder.mk           | 14 +++++
>  .../python-hatch-nodejs-version.mk            | 15 ++++++
>  package/python-json-logger/Config.in          |  7 +++
>  .../python-json-logger/python-json-logger.mk  | 13 +++++
>  package/python-json5/Config.in                |  6 +++
>  package/python-json5/python-json5.mk          | 14 +++++
>  .../python-matplotlib/0001-dependencies.patch | 19 +++++++
>  package/python-overrides/Config.in            |  7 +++
>  package/python-overrides/python-overrides.mk  | 14 +++++
>  package/python-platformdirs/Config.in         |  6 +++
>  .../python-platformdirs.mk                    | 19 +++++++
>  package/python-prometheus-client/Config.in    |  6 +++
>  .../python-prometheus-client.mk               | 13 +++++
>  package/python-send2trash/Config.in           |  7 +++
>  .../python-send2trash/python-send2trash.mk    | 14 +++++
>  49 files changed, 602 insertions(+)

That's a huge diff.

What you should do to ease review, is to split your change in multiple
patches, one for each new component you add, in the order from the
deepest dependency, workigng toward adding the last package that ties
them all together, e.g. (assuming 30 patches):

    [0001/0030] package/python-fastjsonschema: new package
    [0002/0030] package/python-overrides: new package
    [...]
    [0028/0030] package/jupyter-server: new package
    [0029/0030] package/jupyter-client: new package
    [0030/0030] package/jupyterlab: new package

It would also be wonderfull if there was a runtime test for jupyterlab;
see in support/testing/ for manu examples.

[--SNIP--]
> diff --git a/package/jupyter-client/Config.in b/package/jupyter-client/Config.in
> new file mode 100644
> index 0000000000..1086780aed
> --- /dev/null
> +++ b/package/jupyter-client/Config.in
> @@ -0,0 +1,6 @@
> +config BR2_PACKAGE_JUPYTER_CLIENT
> +	bool "jupyter-client"

It's a python package, so it should either depend on BR2_PACKAGE_PYTHON3,
or select it and depend on the same conditions as python3 itslef, i.e.:

    depends on BR2_PACKAGE_PYTHON3

or:

    depends on BR2_USE_WCHAR  # python3
    depends on BR2_USE_MMU  # python3
    depends on BR2_TOOLCHAIN_HAS_THREADS  # python3
    depends on !BR2_STATIC_LIBS  # python3
    select BR2_PACKAGE_PYTHON3

(this comment applies globally to this patch)

> +	help
> +	  Jupyter Client
> +
> +	  https://github.com/jupyter-client/jupyter_client
> diff --git a/package/jupyter-client/jupyter-client.mk b/package/jupyter-client/jupyter-client.mk
> new file mode 100644
> index 0000000000..1946585929
> --- /dev/null
> +++ b/package/jupyter-client/jupyter-client.mk
> @@ -0,0 +1,15 @@
> +################################################################################
> +#
> +# jupyter-client
> +#
> +################################################################################
> +
> +JUPYTER_CLIENT_VERSION = v8.2.0
> +JUPYTER_CLIENT_SITE = $(call github,jupyter,jupyter_client,$(JUPYTER_CLIENT_VERSION))
> +JUPYTER_CLIENT_SETUP_TYPE = pep517
> +JUPYTER_CLIENT_LICENSE = BSD-3-Clause
> +JUPYTER_CLIENT_LICENSE_FILES = LICENSE
> +JUPYTER_CLIENT_DEPENDENCIES = host-python-hatchling
> +
> +$(eval $(python-package))
> +$(eval $(host-python-package))

Why are both the target and host variants required?

I found nothing that has host-jupyter-client in its _DEPENDENCIES list
in your patch.

[--SNIP--]
> diff --git a/package/jupyter-nbconvert/0001-certs.patch b/package/jupyter-nbconvert/0001-certs.patch
> new file mode 100644
> index 0000000000..a9d00f3483
> --- /dev/null
> +++ b/package/jupyter-nbconvert/0001-certs.patch
> @@ -0,0 +1,23 @@
> +Use certifi Python package for CA certificates
> +
> +Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
> +Upstream: N/A (system certificates manage this outside buildroot)

Sorry, I am not sure to understand this...

If you need system certifcates, then you should select the ca-certifacte
package.

If you need certifi, you must also select it (and propagate its
dependencies):
    select BR2_PACKAGEPYTHON_CERTIFI

I think the commit for that specific patch jupyter-nbconvert/0001-certs.patch 
needs to be a little bit extended if it really is needed (but I'd like
an explanation why the sytem ca-certificates can't be used).

> +--- nbconvert-7.3.1/hatch_build.py	2023-04-10 09:58:09.000000000 -0400
> ++++ nbconvert-7.3.1/hatch_build_new.py	2024-03-11 13:14:03.900065615 -0400

also, those filenames look dubious...

[--SNIP--]
> diff --git a/package/jupyter-server/0001-dependencies.patch b/package/jupyter-server/0001-dependencies.patch
> new file mode 100644
> index 0000000000..61da5ba7c6
> --- /dev/null
> +++ b/package/jupyter-server/0001-dependencies.patch
> @@ -0,0 +1,14 @@
> +jupyter_server: Remove hatch-jupyter-builder dependency
> +
> +Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
> +Upstream: N/A (needed to break buildroot-specific host/target dependency loop)

James, can you have a look at that please?

> +--- jupyter_server-2.12.5/pyproject.toml	2024-01-16 09:57:59.000000000 -0500
> ++++ jupyter_server-2.12.5/pyproject_new.toml	2024-03-11 14:20:27.318247718 -0400
> +@@ -129,7 +129,6 @@
> + artifacts = ["jupyter_server/static/style"]
> + 
> + [tool.hatch.build.hooks.jupyter-builder]
> +-dependencies = ["hatch-jupyter-builder>=0.8.1"]
> + build-function = "hatch_jupyter_builder.npm_builder"
> + ensured-targets = [
> +   "jupyter_server/static/style/bootstrap.min.css",
[--SNIP--]
> diff --git a/package/jupyterlab/0001-dependencies.patch b/package/jupyterlab/0001-dependencies.patch
> new file mode 100644
> index 0000000000..1e3b36dd9f
> --- /dev/null
> +++ b/package/jupyterlab/0001-dependencies.patch
> @@ -0,0 +1,14 @@
> +jupyterlab: Remove hatch-jupyter-builder dependency
> +
> +Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
> +Upstream: N/A (needed to break buildroot-specific host/target dependency loop)

James? ;-)

> +--- jupyterlab-4.0.12/pyproject.toml	2024-01-30 09:17:41.000000000 -0500
> ++++ jupyterlab-4.0.12/pyproject_new.toml	2024-03-11 14:17:16.914647903 -0400
> +@@ -187,7 +187,6 @@
> + ]
> + 
> + [tool.hatch.build.hooks.jupyter-builder]
> +-dependencies = ["hatch-jupyter-builder>=0.3.2"]
> + build-function = "buildapi.builder"
> + ensured-targets = [
> +     "jupyterlab/static/package.json",
> diff --git a/package/jupyterlab/Config.in b/package/jupyterlab/Config.in
> new file mode 100644
> index 0000000000..9a91dc7a31
> --- /dev/null
> +++ b/package/jupyterlab/Config.in
> @@ -0,0 +1,52 @@
> +config BR2_PACKAGE_JUPYTERLAB
> +	bool "jupyterlab"
> +	select BR2_PACKAGE_LIBARGON2
> +	select BR2_PACKAGE_JUPYTERLAB_SERVER
> +	select BR2_PACKAGE_JUPYTERLAB_PYGMENTS
> +	select BR2_PACKAGE_JUPYTER_CLIENT
> +	select BR2_PACKAGE_JUPYTER_CORE
> +	select BR2_PACKAGE_JUPYTER_EVENTS
> +	select BR2_PACKAGE_JUPYTER_IPYTHON_KERNEL
> +	select BR2_PACKAGE_JUPYTER_NBCLIENT
> +	select BR2_PACKAGE_JUPYTER_NBCONVERT
> +	select BR2_PACKAGE_JUPYTER_NBFORMAT
> +	select BR2_PACKAGE_JUPYTER_NOTEBOOK_SHIM
> +	select BR2_PACKAGE_JUPYTER_SERVER
> +	select BR2_PACKAGE_PYTHON_ANYIO
> +	select BR2_PACKAGE_PYTHON_ARGON2_CFFI
> +	select BR2_PACKAGE_PYTHON_ARGON2_CFFI_BINDINGS
> +	select BR2_PACKAGE_PYTHON_ASTTOKENS
> +	select BR2_PACKAGE_PYTHON_ASYNC_LRU
> +	select BR2_PACKAGE_PYTHON_BABEL
> +	select BR2_PACKAGE_PYTHON_BLEACH
> +	select BR2_PACKAGE_PYTHON_DATEUTIL
> +	select BR2_PACKAGE_PYTHON_DEFUSEDXML
> +	select BR2_PACKAGE_PYTHON_EXECUTING
> +	select BR2_PACKAGE_PYTHON_COMM
> +	select BR2_PACKAGE_PYTHON_FASTJSONSCHEMA
> +	select BR2_PACKAGE_PYTHON_IPYTHON
> +	select BR2_PACKAGE_PYTHON_JINJA2
> +	select BR2_PACKAGE_PYTHON_JSON5
> +	select BR2_PACKAGE_PYTHON_JSONSCHEMA
> +	select BR2_PACKAGE_PYTHON_JSON_LOGGER
> +	select BR2_PACKAGE_PYTHON_MATPLOTLIB
> +	select BR2_PACKAGE_PYTHON_MATPLOTLIB_INLINE
> +	select BR2_PACKAGE_PYTHON_PACKAGING
> +	select BR2_PACKAGE_PYTHON_PLATFORMDIRS
> +	select BR2_PACKAGE_PYTHON_PROMETHEUS_CLIENT
> +	select BR2_PACKAGE_PYTHON_PSUTIL
> +	select BR2_PACKAGE_PYTHON_PYYAML
> +	select BR2_PACKAGE_PYTHON_PYZMQ
> +	select BR2_PACKAGE_PYTHON_REQUESTS
> +	select BR2_PACKAGE_PYTHON_SEND2TRASH
> +	select BR2_PACKAGE_PYTHON_SNIFFIO
> +	select BR2_PACKAGE_PYTHON_STACK_DATA
> +	select BR2_PACKAGE_PYTHON_TORNADO
> +	select BR2_PACKAGE_PYTHON_TRAITLETS
> +	select BR2_PACKAGE_PYTHON_WEBENCODINGS
> +	select BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT
> +	select BR2_PACKAGE_PYTHON3_SQLITE

Woot, that's quite a list of dependnecies!

Besure that, when you select a package, you also propagate its own
dpednencies.

For example, to add:

    select BR2_PACKAGE_PYTHON_MATPLOTLIB

you also need to add the depends on from matplotlib itself;

    depends on BR2_INSTALL_LIBSTDCPP  # python-matplotlib
    depends on BR2_PACKAGE_PYTHON_NUMPY_ARCH_SUPPORTS  # python-matplotlib
    depends on BR2_TOOLCHAIN_USES_GLIBC || BR2_TOOLCHAIN_USES_MUSL  # python-matplotlib
    depends on BR2_TOOLCHAIN_GCC_AT_LEAST_9  # python-matplotlib
    depends on BR2_HOST_GCC_AT_LEAST_9  # python-matplotlib

and so on... Yes, this is going to be a bit tedious, but is required or
the package could be selected when all its dependencies (direct or
indirect) might not all be available.

Also, it is customary that, when selecting a python package, we add a
little blurb that hints it is a runtime-only dependency, like so:

    select BR2_PACKAGE_PYTHON_MATPLOTLIB  # runtime

(the goal is that, maybe one day we'll have a linter that checks that
whatever is selected is in _DEPENDENCIES, unless it's a runtime dep. One
day...)

> diff --git a/package/python-matplotlib/0001-dependencies.patch b/package/python-matplotlib/0001-dependencies.patch
> new file mode 100644
> index 0000000000..ed72892ba6
> --- /dev/null
> +++ b/package/python-matplotlib/0001-dependencies.patch
> @@ -0,0 +1,19 @@
> +Disable dependency on numpy at package level (satisfied by buildroot)
> +
> +Signed-off-by: Graeme Smecher <gsmecher@threespeedlogic.com>
> +Upstream: N/A

James? ;-)

> +--- python-matplotlib-3.4.3/setup.py	2024-03-11 17:19:07.569386025 -0400
> ++++ python-matplotlib-3.4.3/setup_new.py	2024-03-11 17:19:46.297258324 -0400
> +@@ -300,12 +300,10 @@
> +     python_requires='>={}'.format('.'.join(str(n) for n in py_min_version)),
> +     setup_requires=[
> +         "certifi>=2020.06.20",
> +-        "numpy>=1.16",
> +     ],
> +     install_requires=[
> +         "cycler>=0.10",
> +         "kiwisolver>=1.0.1",
> +-        "numpy>=1.16",
> +         "pillow>=6.2.0",
> +         "pyparsing>=2.2.1",
> +         "python-dateutil>=2.7",

OK, so overall, it does not look too scary. Big, but not so scary...

Care to respin a series with all the packages added one by one as
suggested above?

Note that this was only a brief review; when you resend, do not be
surprised to get additional comments on individual packages, as this is
gong to be easier to review in details...

Speaking of details: do onot hesitate to add a bit of details in your
commit logs, so that whatever issue you had to solve when wiriting the
patch, is explained, even if briefly. If youswondered about something,
chances are that we are all going to wonder about it as well, so your
solution needs explanations. But most important: think about yourself in
10-month time, when you need to look back at what you did (e.g. to fix a
bug, update a pakcage, whatever...)

Finally, I think the commit log you provided in this patch is not really
a commit log, but rather a cover-letter for the series. It's nice to
have a little blurb about expected usage in the commit log, but it bette
rfitsa cover-letter in this case, with the commit log of JupyterLab just
about the details of the packaging itself (i.e. what is special to
package it in Buldroot). Such a cover letter could be mostly made of the
explanations you gave above.

Thank you!

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-04-30 20:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-18 22:26 [Buildroot] [RFC PATCH 1/1] jupyterlab: new package Graeme Smecher
2024-04-29 15:38 ` Graeme Smecher
2024-04-30 20:05 ` Yann E. MORIN

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.