aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-05-30 12:36:30 +1000
committerSteve Bennett <steveb@workware.net.au>2011-06-10 14:00:34 +1000
commit382a35e21340439b0c2557cc125fb12ac5d135e3 (patch)
tree236ceb935f3f7805243dcce4dca4304000524220
parentdbe7729d6b03470bf91de94a998b1c2e56b4ee3b (diff)
downloadjimtcl-382a35e21340439b0c2557cc125fb12ac5d135e3.zip
jimtcl-382a35e21340439b0c2557cc125fb12ac5d135e3.tar.gz
jimtcl-382a35e21340439b0c2557cc125fb12ac5d135e3.tar.bz2
Create static extension loader dynamically
Makes it easier when adding new extensions Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--Makefile.in13
-rw-r--r--jim-load-static-exts.c71
-rw-r--r--make-load-static-exts.tcl45
3 files changed, 52 insertions, 77 deletions
diff --git a/Makefile.in b/Makefile.in
index 4978864..256dbee 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -34,7 +34,7 @@ endif
.EXPORT_ALL_VARIABLES:
-OBJS := jim-subcmd.o jim-interactive.o jim-format.o jim.o utf8.o jimregexp.o @EXTRA_OBJS@
+OBJS := load-static-exts.o jim-subcmd.o jim-interactive.o jim-format.o jim.o utf8.o jimregexp.o @EXTRA_OBJS@
JIMSH := jimsh@EXEEXT@
@@ -46,9 +46,7 @@ EXTENSION_TCL := $(patsubst %,%.tcl,@JIM_TCL_EXTENSIONS@)
# Create C extensions from pure Tcl extensions
jim-%.c: %.tcl
- @tclsh@ @srcdir@/make-c-ext.tcl $< >$@
-
-OBJS += jim-load-static-exts.o
+ @tclsh@ @srcdir@/make-c-ext.tcl $< >$@ || ( rm $@; exit 1)
all: $(JIMSH) $(EXTENSION_MODS)
@@ -82,9 +80,12 @@ ifneq (@JIM_UTF8@,)
utf8.o: unicode_mapping.c
unicode_mapping.c: @srcdir@/UnicodeData.txt @srcdir@/parse-unidata.tcl
- @tclsh@ @srcdir@/parse-unidata.tcl @srcdir@/UnicodeData.txt >$@
+ @tclsh@ @srcdir@/parse-unidata.tcl @srcdir@/UnicodeData.txt >$@ || ( rm $@; exit 1)
endif
+load-static-exts.c: @srcdir@/make-load-static-exts.tcl Makefile
+ @tclsh@ @srcdir@/make-load-static-exts.tcl @JIM_EXTENSIONS@ >$@ || ( rm $@; exit 1)
+
ifeq ($(jim_libtype),static)
$(LIBJIM): $(OBJS) $(EXTENSION_OBJS)
$(AR) cr $@ $^
@@ -102,7 +103,7 @@ Tcl.html: jim_tcl.txt
@tclsh@ @srcdir@/make-index $^ | asciidoc -o $@ -d manpage - || cp @srcdir@/Tcl_shipped.html Tcl.html
clean:
- rm -f *.o *.so lib*.a $(JIMSH) Tcl.html unicode_mapping.c @GENERATED_SRCS@
+ rm -f *.o *.so lib*.a $(JIMSH) Tcl.html unicode_mapping.c load-static-exts.c @GENERATED_SRCS@
distclean: clean
rm -f jimautoconf.h jim-config.h Makefile config.log
diff --git a/jim-load-static-exts.c b/jim-load-static-exts.c
deleted file mode 100644
index efa0303..0000000
--- a/jim-load-static-exts.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include "jim.h"
-#include "jimautoconf.h"
-
-#define LOAD_EXT(n) \
- extern int Jim_ ## n ## Init(Jim_Interp *); \
- Jim_ ## n ## Init(interp);
-
-int Jim_InitStaticExtensions(Jim_Interp *interp)
-{
-#ifdef jim_ext_stdlib
- LOAD_EXT(stdlib);
-#endif
-#ifdef jim_ext_package
- LOAD_EXT(package);
-#endif
-#ifdef jim_ext_load
- LOAD_EXT(load);
-#endif
-#ifdef jim_ext_aio
- LOAD_EXT(aio);
-#endif
-#ifdef jim_ext_readdir
- LOAD_EXT(readdir);
-#endif
-#ifdef jim_ext_regexp
- LOAD_EXT(regexp);
-#endif
-#ifdef jim_ext_eventloop
- LOAD_EXT(eventloop);
-#endif
-#ifdef jim_ext_file
- LOAD_EXT(file);
-#endif
-#ifdef jim_ext_exec
- LOAD_EXT(exec);
-#endif
-#ifdef jim_ext_clock
- LOAD_EXT(clock);
-#endif
-#ifdef jim_ext_glob
- LOAD_EXT(glob);
-#endif
-#ifdef jim_ext_array
- LOAD_EXT(array);
-#endif
-#ifdef jim_ext_posix
- LOAD_EXT(posix);
-#endif
-#ifdef jim_ext_signal
- LOAD_EXT(signal);
-#endif
-#ifdef jim_ext_tclcompat
- LOAD_EXT(tclcompat);
-#endif
-#ifdef jim_ext_syslog
- LOAD_EXT(syslog);
-#endif
-#ifdef jim_ext_oo
- LOAD_EXT(oo);
-#endif
-#ifdef jim_ext_tree
- LOAD_EXT(tree);
-#endif
-#ifdef jim_ext_pack
- LOAD_EXT(pack);
-#endif
-#ifdef jim_ext_binary
- LOAD_EXT(binary);
-#endif
- return JIM_OK;
-}
diff --git a/make-load-static-exts.tcl b/make-load-static-exts.tcl
new file mode 100644
index 0000000..955127d
--- /dev/null
+++ b/make-load-static-exts.tcl
@@ -0,0 +1,45 @@
+#!/usr/bin/env tclsh
+
+# Usage: make-load-static-exts extname ... >load-static-exts.c
+
+# Creates load-static-exts.c based on the configured static extensions
+
+# There are some dependencies on static extensions which require
+# a certain load order. Do this by setting priorities and sorting.
+
+array set pri {
+ stdlib 0
+ readdir 1
+ glob 2
+ oo 1
+ tree 2
+ pack 1
+ binary 2
+}
+
+foreach i $argv {
+ set p 1
+ if {[info exists pri($i)]} {
+ set p $pri($i)
+ }
+ lappend exts [list $p $i]
+}
+set exts [lsort $exts]
+
+puts {
+/* autogenerated - do not edit */
+#include "jim.h"
+#include "jimautoconf.h"
+int Jim_InitStaticExtensions(Jim_Interp *interp)
+}
+puts \{
+
+foreach e $exts {
+ set ext [lindex $e 1]
+ puts "\textern int Jim_${ext}Init(Jim_Interp *);"
+ puts "\tJim_${ext}Init(interp);"
+}
+
+puts "\treturn JIM_OK;"
+
+puts \}