aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2019-07-04 12:06:01 +1000
committerSteve Bennett <steveb@workware.net.au>2019-11-06 17:42:55 +1000
commitdc4ba7770d580800634f90b67a24e077b4a26d98 (patch)
tree8cc4f220d7fb7cfd5dd1b78d2cd278e79fabdf12
parent0104b324bc89ab1dce883be1e3b5510296c695ea (diff)
downloadjimtcl-dc4ba7770d580800634f90b67a24e077b4a26d98.zip
jimtcl-dc4ba7770d580800634f90b67a24e077b4a26d98.tar.gz
jimtcl-dc4ba7770d580800634f90b67a24e077b4a26d98.tar.bz2
build: improve build for shared objects
Rather than listing the build rules for each shared object (loadable module) in the Makefile template, generate the build rules in configure. Also, if an extension is configured as a module, any automatic dependencies required by the extension are configured as modules by default. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--Makefile.in97
-rw-r--r--auto.def17
-rw-r--r--autosetup/local.tcl16
3 files changed, 29 insertions, 101 deletions
diff --git a/Makefile.in b/Makefile.in
index 5f664dc..67d503c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -154,102 +154,7 @@ $(LIBJIM): $(OBJS)
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SH_LDFLAGS) -o $@ $(OBJS) $(LDLIBS) $(LIBS)
@endif
-# Note that $> $^ is for compatibility with both GNU make and BSD make
-readdir.so: jim-readdir.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-readdir.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-readdir.o $(SH_LIBJIM)
-
-array.so: jim-array.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-array.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-array.o $(SH_LIBJIM)
-
-clock.so: jim-clock.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-clock.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-clock.o $(SH_LIBJIM)
-
-file.so: jim-file.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-file.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-file.o $(SH_LIBJIM)
-
-interp.so: jim-interp.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-interp.o jim-interp.c
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-interp.o $(SH_LIBJIM) @LDLIBS_interp@
-
-posix.so: jim-posix.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-posix.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-posix.o $(SH_LIBJIM)
-
-regexp.so: jim-regexp.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-regexp.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-regexp.o $(SH_LIBJIM)
-
-syslog.so: jim-syslog.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-syslog.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-syslog.o $(SH_LIBJIM)
-
-readline.so: jim-readline.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-readline.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-readline.o $(SH_LIBJIM) @LDLIBS_readline@
-
-pack.so: jim-pack.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-pack.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-pack.o $(SH_LIBJIM) @LDLIBS_pack@
-
-tclprefix.so: jim-tclprefix.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-tclprefix.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-tclprefix.o $(SH_LIBJIM) @LDLIBS_tclprefix@
-
-sqlite3.so: jim-sqlite3.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-sqlite3.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-sqlite3.o $(SH_LIBJIM) @LDLIBS_sqlite3@
-
-win32.so: jim-win32.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-win32.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-win32.o $(SH_LIBJIM) @LDLIBS_win32@
-
-mk.so: jim-mk.cpp
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CXX) $(CXXFLAGS) $(SHOBJ_CFLAGS) -c -o jim-mk.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-mk.o $(SH_LIBJIM) @LDLIBS_mk@
-
-sdl.so: jim-sdl.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-sdl.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-sdl.o $(SH_LIBJIM) @LDLIBS_sdl@
-
-zlib.so: jim-zlib.c
- $(ECHO) " CC ${@:.so=.o}"
- $(Q)$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-zlib.o $> $^
- $(ECHO) " LDSO $@"
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-zlib.o $(SH_LIBJIM) @LDLIBS_zlib@
+@BUILD_SHOBJS@
docs: Tcl.html
diff --git a/auto.def b/auto.def
index e7afbc6..e80618a 100644
--- a/auto.def
+++ b/auto.def
@@ -495,6 +495,23 @@ define EXTRA_OBJS $extra_objs
# Restore the user-specified LIBS
define LIBS $LIBS
+# Now generate the Makefile rules to build the external C shared objects
+# It is easier to do this here rather than listing them out explicitly in Makefile.in
+set lines {}
+foreach mod $extinfo(module-c) {
+ set objs {}
+ set libs [get-define LDLIBS_$mod]
+ set src jim-$mod.c
+ lappend lines "$mod.so: $src"
+ set obj [file rootname $src].o
+ lappend lines "\t\$(ECHO)\t\"\tCC\t$obj\""
+ lappend lines "\t\$(Q)\$(CC) \$(CFLAGS) \$(SHOBJ_CFLAGS) -c -o $obj $src"
+ lappend lines "\t\$(ECHO)\t\"\tLDSO\t\$@\""
+ lappend lines "\t\$(Q)\$(CC) \$(CFLAGS) \$(LDFLAGS) \$(SHOBJ_LDFLAGS) -o \$@ $obj \$(SH_LIBJIM) $libs"
+ lappend lines ""
+}
+define BUILD_SHOBJS [join $lines \n]
+
make-config-header jim-config.h -auto {HAVE_LONG_LONG* JIM_UTF8} -bare JIM_VERSION -none *
make-config-header jimautoconf.h -auto {jim_ext_* TCL_PLATFORM_* TCL_LIBRARY USE_* JIM_* _FILE_OFFSET*} -bare {S_I*}
make-template Makefile.in
diff --git a/autosetup/local.tcl b/autosetup/local.tcl
index 9517b27..ba2bb3d 100644
--- a/autosetup/local.tcl
+++ b/autosetup/local.tcl
@@ -32,7 +32,7 @@ proc ext-get-status {ext} {
return ?
}
-proc check-extension-status {ext required} {
+proc check-extension-status {ext required {asmodule 0}} {
global withinfo
set status [ext-get-status $ext]
@@ -79,7 +79,13 @@ proc check-extension-status {ext required} {
}
}
- if {$ext in $withinfo(mod)} {
+ # asmodule=1 means that the parent is a module so
+ # any automatically selected dependencies should also be modules
+ if {$asmodule == 0 && $ext in $withinfo(mod)} {
+ set asmodule 1
+ }
+
+ if {$asmodule} {
# This is a module, so ignore LIBS
# LDLIBS_$ext will contain the appropriate libs for this module
define LIBS $LIBS
@@ -88,7 +94,7 @@ proc check-extension-status {ext required} {
if {$depinfo(n) == 0} {
# Now extension dependencies
foreach i [ext-get $ext dep] {
- set status [check-extension-status $i $required]
+ set status [check-extension-status $i $required $asmodule]
#puts "$ext: dep $i $required => $status"
incr depinfo($status)
if {$depinfo(n)} {
@@ -108,8 +114,8 @@ proc check-extension-status {ext required} {
return [ext-set-status $ext n]
}
- # Selected as a module?
- if {$ext in $withinfo(mod)} {
+ # Selected as a module directly or because of a parent dependency?
+ if {$asmodule} {
if {[ext-has $ext tcl]} {
# Easy, a Tcl module
msg-result "Extension $ext...tcl"