This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 73bc5cbcc interpreters: Add mquickjs JavaScript interpreter integration
73bc5cbcc is described below
commit 73bc5cbcc61e3a887a6af4c17e7c9a86eef737eb
Author: Huang Qi <[email protected]>
AuthorDate: Thu Dec 25 14:37:31 2025 +0800
interpreters: Add mquickjs JavaScript interpreter integration
Add complete integration for the MicroQuickJS JavaScript interpreter,
supporting both CMake and Make build systems with automatic source
acquisition.
Key features:
* FetchContent downloads mquickjs from bellard/mquickjs if local
git repository is not available in interpreters/mquickjs/mquickjs/
* Builds mqjs_stdlib host tool to generate mqjs_stdlib.h and
mquickjs_atom.h headers during build
* Creates libmquickjs library with proper header generation dependencies
to prevent parallel build failures
* Provides mqjs NSH application for interactive JavaScript execution
* Configurable task priority and stack size via Kconfig options
(INTERPRETERS_MQJS_PRIORITY, INTERPRETERS_MQJS_STACKSIZE)
* Supports both 32-bit and 64-bit architectures with appropriate build flags
Files added:
* CMakeLists.txt - CMake build configuration with FetchContent support
* Kconfig - Configuration options for interpreter features
* Make.defs - Make build definitions
* Makefile - Alternative Make-based build support
* .gitignore - Ignores generated files and local mquickjs source directory
Signed-off-by: Huang Qi <[email protected]>
---
interpreters/mquickjs/.gitignore | 2 +
interpreters/mquickjs/CMakeLists.txt | 123 +++++++++++++++++++++++++++++++++++
interpreters/mquickjs/Kconfig | 24 +++++++
interpreters/mquickjs/Make.defs | 30 +++++++++
interpreters/mquickjs/Makefile | 92 ++++++++++++++++++++++++++
5 files changed, 271 insertions(+)
diff --git a/interpreters/mquickjs/.gitignore b/interpreters/mquickjs/.gitignore
new file mode 100644
index 000000000..87708e7fd
--- /dev/null
+++ b/interpreters/mquickjs/.gitignore
@@ -0,0 +1,2 @@
+*.d
+mquickjs/
diff --git a/interpreters/mquickjs/CMakeLists.txt
b/interpreters/mquickjs/CMakeLists.txt
new file mode 100644
index 000000000..51d505860
--- /dev/null
+++ b/interpreters/mquickjs/CMakeLists.txt
@@ -0,0 +1,123 @@
+#
##############################################################################
+# apps/interpreters/mquickjs/CMakeLists.txt
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
contributor
+# license agreements. See the NOTICE file distributed with this work for
+# additional information regarding copyright ownership. The ASF licenses this
+# file to you under the Apache License, Version 2.0 (the "License"); you may
not
+# use this file except in compliance with the License. You may obtain a copy
of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+#
##############################################################################
+
+if(CONFIG_INTERPRETERS_MQJS)
+ set(MQJS_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/mquickjs)
+
+ # Prefer local git repo if it exists, otherwise download tarball
+ if(EXISTS ${MQJS_SOURCE_DIR}/.git)
+ # Use local git-managed mquickjs
+ set(MQJS_DIR ${MQJS_SOURCE_DIR})
+ message(STATUS "Using local mquickjs git repo: ${MQJS_DIR}")
+ else()
+ # Download mquickjs to build directory
+ FetchContent_Declare(
+ mquickjs_fetch
+ URL https://github.com/bellard/mquickjs/archive/refs/heads/main.zip
+ DOWNLOAD_NO_PROGRESS true
+ TIMEOUT 30)
+
+ FetchContent_MakeAvailable(mquickjs_fetch)
+
+ # The source directory after FetchContent_MakeAvailable
+ set(MQJS_DIR ${mquickjs_fetch_SOURCE_DIR})
+ message(STATUS "Using downloaded mquickjs: ${MQJS_DIR}")
+ endif()
+
+ # Detect target architecture for header generation
+ if(CONFIG_ARCH_64BIT)
+ set(MQJS_BUILD_FLAGS "-m64")
+ else()
+ set(MQJS_BUILD_FLAGS "-m32")
+ endif()
+
+ include(ExternalProject)
+
+ # Build mqjs_stdlib host tool using mquickjs Makefile
+ ExternalProject_Add(
+ mqjs_stdlib_host
+ SOURCE_DIR ${MQJS_DIR}
+ BINARY_DIR ${MQJS_DIR}
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND make mqjs_stdlib
+ INSTALL_COMMAND ""
+ BUILD_BYPRODUCTS ${MQJS_DIR}/mqjs_stdlib)
+
+ # Generate mqjs_stdlib.h
+ add_custom_command(
+ OUTPUT ${MQJS_DIR}/mqjs_stdlib.h
+ COMMAND ${MQJS_DIR}/mqjs_stdlib ${MQJS_BUILD_FLAGS} >
+ ${MQJS_DIR}/mqjs_stdlib.h
+ DEPENDS mqjs_stdlib_host
+ COMMENT "Generating mqjs_stdlib.h")
+
+ # Generate mquickjs_atom.h
+ add_custom_command(
+ OUTPUT ${MQJS_DIR}/mquickjs_atom.h
+ COMMAND ${MQJS_DIR}/mqjs_stdlib -a ${MQJS_BUILD_FLAGS} >
+ ${MQJS_DIR}/mquickjs_atom.h
+ DEPENDS mqjs_stdlib_host
+ COMMENT "Generating mquickjs_atom.h")
+
+ # Custom target for header generation
+ add_custom_target(mqjs_headers_gen DEPENDS ${MQJS_DIR}/mqjs_stdlib.h
+ ${MQJS_DIR}/mquickjs_atom.h)
+
+ # Create mquickjs library
+ nuttx_add_library(libmquickjs)
+ target_sources(
+ libmquickjs
+ PRIVATE ${MQJS_DIR}/mquickjs.c ${MQJS_DIR}/dtoa.c ${MQJS_DIR}/libm.c
+ ${MQJS_DIR}/cutils.c ${MQJS_DIR}/readline.c
+ ${MQJS_DIR}/readline_tty.c)
+ target_include_directories(libmquickjs PRIVATE ${MQJS_DIR})
+ nuttx_export_header(TARGET libmquickjs INCLUDE_DIRECTORIES ${MQJS_DIR})
+
+ # Ensure headers are generated before building library
+ add_dependencies(libmquickjs mqjs_headers_gen)
+
+ # Add mquickjs include directory to global include paths
+ set_property(
+ TARGET nuttx
+ APPEND
+ PROPERTY NUTTX_INCLUDE_DIRECTORIES ${NUTTX_APPS_DIR}/interpreters/mquickjs)
+
+ # Create mqjs NSH application
+ set(MQJS_PRIORITY ${CONFIG_INTERPRETERS_MQJS_PRIORITY})
+ set(MQJS_STACKSIZE ${CONFIG_INTERPRETERS_MQJS_STACKSIZE})
+
+ nuttx_add_application(
+ NAME
+ mqjs
+ PRIORITY
+ ${MQJS_PRIORITY}
+ STACKSIZE
+ ${MQJS_STACKSIZE}
+ SRCS
+ ${MQJS_DIR}/mqjs.c
+ INCLUDE_DIRECTORIES
+ ${MQJS_DIR}
+ DEPENDS
+ libmquickjs
+ mqjs_headers_gen)
+
+endif()
diff --git a/interpreters/mquickjs/Kconfig b/interpreters/mquickjs/Kconfig
new file mode 100644
index 000000000..06e8906b7
--- /dev/null
+++ b/interpreters/mquickjs/Kconfig
@@ -0,0 +1,24 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+config INTERPRETERS_MQJS
+ tristate "MicroQuickJS JavaScript interpreter"
+ default n
+
+if INTERPRETERS_MQJS
+
+config INTERPRETERS_MQJS_PRIORITY
+ int "MicroQuickJS interpreter priority"
+ default 100
+ ---help---
+ Task priority of the MicroQuickJS interpreter.
+
+ config INTERPRETERS_MQJS_STACKSIZE
+ int "MicroQuickJS interpreter stack size"
+ default 8192
+ ---help---
+ Size of the stack allocated for MicroQuickJS interpreter.
+
+ endif # INTERPRETERS_MQJS
diff --git a/interpreters/mquickjs/Make.defs b/interpreters/mquickjs/Make.defs
new file mode 100644
index 000000000..8850fa7b6
--- /dev/null
+++ b/interpreters/mquickjs/Make.defs
@@ -0,0 +1,30 @@
+############################################################################
+# apps/interpreters/mquickjs/Make.defs
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+ifneq ($(CONFIG_INTERPRETERS_MQJS),)
+CONFIGURED_APPS += $(APPDIR)/interpreters/mquickjs
+
+# It allows `<mquickjs.h>` import.
+CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/interpreters/mquickjs/mquickjs
+CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/interpreters/mquickjs/mquickjs
+
+endif
diff --git a/interpreters/mquickjs/Makefile b/interpreters/mquickjs/Makefile
new file mode 100644
index 000000000..2c1ed3e49
--- /dev/null
+++ b/interpreters/mquickjs/Makefile
@@ -0,0 +1,92 @@
+############################################################################
+# apps/interpreters/mquickjs/Makefile
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(APPDIR)/Make.defs
+
+MQJS_UNPACK = mquickjs
+MQJS_ARCHIVE = mquickjs-master.zip
+MQJS_URL = https://github.com/bellard/mquickjs/archive/refs/heads/master.zip
+
+# Determine target word size for header generation
+ifeq ($(CONFIG_ARCH_64BIT),y)
+MQJS_BUILD_FLAGS = -m64
+else
+MQJS_BUILD_FLAGS = -m32
+endif
+
+CSRCS = $(MQJS_UNPACK)/mquickjs.c \
+ $(MQJS_UNPACK)/dtoa.c \
+ $(MQJS_UNPACK)/libm.c \
+ $(MQJS_UNPACK)/cutils.c \
+ $(MQJS_UNPACK)/readline.c \
+ $(MQJS_UNPACK)/readline_tty.c
+
+PROGNAME = mqjs
+PRIORITY = $(CONFIG_INTERPRETERS_MQJS_PRIORITY)
+STACKSIZE = $(CONFIG_INTERPRETERS_MQJS_STACKSIZE)
+MODULE = $(CONFIG_INTERPRETERS_MQJS)
+MAINSRC = $(MQJS_UNPACK)/mqjs.c
+
+# Download archive
+$(MQJS_ARCHIVE):
+ $(Q) echo "Downloading $(MQJS_ARCHIVE)"
+ $(Q) curl -L $(MQJS_URL) -o $(MQJS_ARCHIVE)
+
+# Unpack archive
+$(MQJS_UNPACK): $(MQJS_ARCHIVE)
+ $(Q) echo "Unpacking $(MQJS_ARCHIVE) to $(MQJS_UNPACK)"
+ $(Q) unzip -q -o $(MQJS_ARCHIVE)
+ $(Q) mv bellard-mquickjs-* $(MQJS_UNPACK)
+ $(Q) touch $(MQJS_UNPACK)
+
+# Build host tool via upstream Makefile
+$(MQJS_UNPACK)/mqjs_stdlib:
+ $(Q) echo "Building mquickjs host tool via upstream Makefile"
+ $(Q) rm -f $(MQJS_UNPACK)/mqjs_stdlib
+ $(Q) $(MAKE) -C $(MQJS_UNPACK) HOSTCC=$(HOSTCC) mqjs_stdlib
+
+# Generate stdlib header using built host tool
+$(MQJS_UNPACK)/mqjs_stdlib.h: $(MQJS_UNPACK)/mqjs_stdlib
+ $(Q) echo "Generating mquickjs stdlib header"
+ $(MQJS_UNPACK)/mqjs_stdlib $(MQJS_BUILD_FLAGS) > $@
+
+# Generate atom header using built host tool
+$(MQJS_UNPACK)/mquickjs_atom.h: $(MQJS_UNPACK)/mqjs_stdlib
+ $(Q) echo "Generating mquickjs atom header"
+ $(MQJS_UNPACK)/mqjs_stdlib -a $(MQJS_BUILD_FLAGS) > $@
+
+# Download and unpack only if not a git repository
+context:: $(MQJS_UNPACK)/mqjs_stdlib.h $(MQJS_UNPACK)/mquickjs_atom.h
+
+# Clean up on distclean
+distclean::
+ifneq ($(wildcard $(MQJS_UNPACK)/.git),)
+ $(Q) $(MAKE) -C $(MQJS_UNPACK) clean
+else
+ $(call DELDIR, $(MQJS_UNPACK))
+endif
+ $(call DELFILE, $(MQJS_ARCHIVE))
+
+# Dependencies
+$(MQJS_UNPACK)/mquickjs.c: $(MQJS_UNPACK)/mquickjs_atom.h
+
+include $(APPDIR)/Application.mk