This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 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 094b988be interpreters: add Tcl support
094b988be is described below

commit 094b988be3a39440a191464fca32b4972a9d5f8c
Author: Carlos Sánchez de La Lama <[email protected]>
AuthorDate: Thu Jul 16 13:55:09 2026 +0200

    interpreters: add Tcl support
    
    Tcl is added using The Jim Interpreter. Jim is an opensource small-footprint
    implementation of the Tcl programming language. It implements a large subset
    of Tcl and adds new features like references with garbage collection,
    closures, built-in Object Oriented Programming system, Functional 
Programming
    commands, first-class arrays and UTF-8 support.
    
    Signed-off-by: Carlos Sánchez de La Lama <[email protected]>
---
 interpreters/jimtcl/CMakeLists.txt | 48 ++++++++++++++++++++++++++++
 interpreters/jimtcl/Kconfig        | 12 +++++++
 interpreters/jimtcl/Make.defs      |  3 ++
 interpreters/jimtcl/Makefile       | 64 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 127 insertions(+)

diff --git a/interpreters/jimtcl/CMakeLists.txt 
b/interpreters/jimtcl/CMakeLists.txt
new file mode 100644
index 000000000..ba3b64697
--- /dev/null
+++ b/interpreters/jimtcl/CMakeLists.txt
@@ -0,0 +1,48 @@
+if(CONFIG_INTERPRETERS_JIMTCL)
+  set(JIMTCL_VERSION 0.83)
+  set(JIMTCL_TARBALL ${JIMTCL_VERSION}.tar.gz)
+  set(JIMTCL_UNPACK jimtcl)
+  set(JIMTCL_URL_BASE https://github.com/msteveb/jimtcl/archive/refs/tags)
+  set(JIMTCL_URL ${JIMTCL_URL_BASE}/${JIMTCL_TARBALL})
+  set(JIMTCL_SRC ${CMAKE_CURRENT_BINARY_DIR}/${JIMTCL_UNPACK})
+
+  # We need the source available before declaring the application, because
+  # jimsh.c is added as an application source, so we can not integrate download
+  # into the external project.
+  FetchContent_Declare(jimtcl_fetch URL ${JIMTCL_URL} SOURCE_DIR
+                                        ${JIMTCL_UNPACK})
+
+  FetchContent_MakeAvailable(jimtcl_fetch)
+
+  ExternalProject_Add(
+    jimtcl_build
+    SOURCE_DIR ${JIMTCL_SRC}
+    PATCH_COMMAND sed -i -e "/^void Jim_SetEnviron/,/^/{s/^/\\/* /}" -e
+                  "/^void Jim_SetEnviron/,/^/{s/\$/ *\\//}" jim.c
+    CONFIGURE_COMMAND
+      ./configure --host=${CMAKE_C_COMPILER_TARGET}
+      "CFLAGS=$<JOIN:$<TARGET_PROPERTY:apps_jimsh,COMPILE_OPTIONS>, > 
-D$<JOIN:$<TARGET_PROPERTY:apps_jimsh,COMPILE_DEFINITIONS>, -D> 
-I$<JOIN:$<TARGET_PROPERTY:apps_jimsh,INCLUDE_DIRECTORIES>, -I> -isystem 
${CMAKE_SOURCE_DIR}/include -isystem ${CMAKE_BINARY_DIR}/include"
+    BUILD_COMMAND make libjim.a initjimsh.o
+    INSTALL_COMMAND ""
+    BUILD_IN_SOURCE TRUE
+    BUILD_BYPRODUCTS ${JIMTCL_SRC}/libjim.a ${JIMTCL_SRC}/_initjimsh.c)
+
+  nuttx_add_application(
+    NAME
+    jimsh
+    PRIORITY
+    100
+    STACKSIZE
+    8192
+    INCLUDE_DIRECTORIES
+    ${JIMTCL_SRC}
+    DEPENDS
+    jimtcl_build
+    SRCS
+    ${JIMTCL_SRC}/jimsh.c
+    ${JIMTCL_SRC}/_initjimsh.c)
+
+  set_property(GLOBAL APPEND PROPERTY NUTTX_EXTRA_LIBRARIES
+                                      ${JIMTCL_SRC}/libjim.a)
+
+endif()
diff --git a/interpreters/jimtcl/Kconfig b/interpreters/jimtcl/Kconfig
new file mode 100644
index 000000000..16a70db70
--- /dev/null
+++ b/interpreters/jimtcl/Kconfig
@@ -0,0 +1,12 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+config INTERPRETERS_JIMTCL
+       bool "The Jim (TCL) Interpreter"
+       default n
+       ---help---
+               Enable support for The Jim interpreter.
+               Jim is an opensource small-footprint implementation of the
+               Tcl programming language.
\ No newline at end of file
diff --git a/interpreters/jimtcl/Make.defs b/interpreters/jimtcl/Make.defs
new file mode 100644
index 000000000..eb5a44b0c
--- /dev/null
+++ b/interpreters/jimtcl/Make.defs
@@ -0,0 +1,3 @@
+ifneq ($(CONFIG_INTERPRETERS_JIMTCL),)
+CONFIGURED_APPS += $(APPDIR)/interpreters/jimtcl
+endif
\ No newline at end of file
diff --git a/interpreters/jimtcl/Makefile b/interpreters/jimtcl/Makefile
new file mode 100644
index 000000000..f470167f2
--- /dev/null
+++ b/interpreters/jimtcl/Makefile
@@ -0,0 +1,64 @@
+include $(APPDIR)/Make.defs
+
+PROGNAME  = jimsh
+PRIORITY  = 100
+STACKSIZE = 8192
+
+JIMTCL_VERSION  = 0.83
+JIMTCL_TARBALL  = $(JIMTCL_VERSION).tar.gz
+JIMTCL_UNPACK   = jimtcl
+JIMTCL_URL_BASE = https://github.com/msteveb/jimtcl/archive/refs/tags
+JIMTCL_URL      = $(JIMTCL_URL_BASE)/$(JIMTCL_TARBALL)
+JIMTCL_SRC      = $(JIMTCL_UNPACK)
+
+MAINSRC = $(JIMTCL_SRC)$(DELIM)jimsh.c
+
+# Obtain object list from jimtcl Makefile
+JIMTCL_OBJS := $(shell test -f $(JIMTCL_SRC)$(DELIM)Makefile           \
+                       && ( cat $(JIMTCL_SRC)$(DELIM)Makefile;         \
+                            printf 'print-%%:\n\techo $$($$*)' )       \
+                       | $(MAKE) -f - -s print-OBJS) initjimsh.o
+
+EXTOBJS = $(addprefix $(JIMTCL_SRC)$(DELIM), $(JIMTCL_OBJS))
+
+CFLAGS += -I$(JIMTCL_SRC)
+
+$(JIMTCL_SRC)$(DELIM)%.o: $(JIMTCL_SRC)$(DELIM)Makefile
+       $(Q) $(MAKE) -C $(JIMTCL_SRC) $*.o
+
+$(JIMTCL_SRC)$(DELIM)jimsh.c: $(JIMTCL_SRC)$(DELIM)Makefile
+
+$(JIMTCL_SRC)$(DELIM)_initjimsh.c: $(JIMTCL_SRC)$(DELIM)Makefile
+       $(Q) $(MAKE) -C $(JIMTCL_SRC) $(notdir $@)
+
+$(JIMTCL_SRC)$(DELIM)Makefile:
+       $(Q) cd $(dir $@)                                       \
+         && ./configure --host=$(patsubst %-,%,$(CROSSDEV))    \
+                        CFLAGS="$(CFLAGS)"
+
+# Get the source code and apply a small patch because environ is
+# not settable in Nuttx. This is not required for basic jimtcl
+# but build would fail without commenting it out.
+$(JIMTCL_TARBALL):
+       $(Q) echo "Downloading $(JIMTCL_TARBALL)"
+       $(Q) curl -O -L $(JIMTCL_URL)
+       $(Q) echo "Unpacking $(JIMTCL_TARBALL) to $(JIMTCL_UNPACK)"
+       $(Q) tar -xvzf $(JIMTCL_TARBALL)
+       $(Q) mv jimtcl-$(JIMTCL_VERSION) $(JIMTCL_UNPACK)
+       $(Q) sed -i '/^void Jim_SetEnviron/,/^}/{s/^/\/* /;s/$$/ *\//}' \
+         $(JIMTCL_SRC)$(DELIM)jim.c
+
+# Download and unpack tarball if no git repo found
+ifeq ($(wildcard $(JIMTCL_UNPACK)/.git),)
+context:: $(JIMTCL_TARBALL)
+endif
+
+clean::
+       $(Q) test -f $(JIMTCL_SRC)$(DELIM)Makefile      \
+         && $(MAKE) -C $(JIMTCL_SRC) clean
+
+distclean:: clean
+       $(call DELDIR, $(JIMTCL_UNPACK))
+       $(call DELFILE, $(JIMTCL_TARBALL))
+
+include $(APPDIR)/Application.mk

Reply via email to