| all: |
| # |
| # Unless this file is named Makefile.in, you are probably looking |
| # at an automatically generated/filtered copy and should probably not |
| # edit it. |
| # |
| # This makefile is part of the teaish framework, a tool for building |
| # Tcl extensions, conceptually related to TEA/tclconfig but using the |
| # Autosetup configuration system instead of the GNU Autotools. |
| # |
| # A copy of this makefile gets processed for each extension separately |
| # and populated with info about how to build, test, and install the |
| # extension. |
| # |
| # Maintenance reminder: this file needs to stay portable with POSIX |
| # Make, not just GNU Make. Yes, that's unfortunate because it makes |
| # some things impossible (like skipping over swathes of rules when |
| # 'make distclean' is invoked). |
| # |
| |
| CC = @CC@ |
| INSTALL = @BIN_INSTALL@ |
| INSTALL.noexec = $(INSTALL) -m 0644 |
| |
| # |
| # Var name prefixes: |
| # |
| # teaish. => teaish core |
| # tx. => teaish extension |
| # |
| # Vars with a "tx." or "teaish." prefix are all "public" for purposes |
| # of the extension makefile, but the extension must not any "teaish." |
| # vars and must only modify "tx." vars where that allowance is |
| # specifically noted. |
| # |
| # Vars with a "teaish__" prefix are "private" and must not be used by |
| # the extension makefile. They may change semantics or be removed in |
| # any given teaish build. |
| # |
| tx.name = @TEAISH_NAME@ |
| tx.version = @TEAISH_VERSION@ |
| tx.name.pkg = @TEAISH_PKGNAME@ |
| tx.libdir = @TEAISH_LIBDIR_NAME@ |
| tx.loadPrefix = @TEAISH_LOAD_PREFIX@ |
| tx.tcl = @TEAISH_TCL@ |
| tx.makefile = @TEAISH_MAKEFILE@ |
| tx.makefile.in = @TEAISH_MAKEFILE_IN@ |
| tx.dll8.basename = @TEAISH_DLL8_BASENAME@ |
| tx.dll9.basename = @TEAISH_DLL9_BASENAME@ |
| tx.dll8 = @TEAISH_DLL8@ |
| tx.dll9 = @TEAISH_DLL9@ |
| tx.dll = $(tx.dll$(TCL_MAJOR_VERSION)) |
| tx.dir = @TEAISH_EXT_DIR@ |
| @if TEAISH_TM_TCL |
| # Input filename for tcl::tm-style module |
| tx.tm = @TEAISH_TM_TCL@ |
| # Target filename for tcl::tm-style installation |
| tx.tm.tgt = $(tx.name.pkg)-$(tx.version).tm |
| @endif |
| |
| @if TEAISH_DIST_NAME |
| tx.name.dist = @TEAISH_DIST_NAME@ |
| @else |
| tx.name.dist = $(teaish.name) |
| @endif |
| |
| teaish.dir = @abs_top_srcdir@ |
| #teaish.dir.autosetup = @TEAISH_AUTOSETUP_DIR@ |
| teaish.makefile = Makefile |
| teaish.makefile.in = $(teaish.dir)/Makefile.in |
| teaish__auto.def = $(teaish.dir)/auto.def |
| |
| # |
| # Autotools-conventional vars. We don't actually use these in this |
| # makefile but some may be referenced by vars imported via |
| # tclConfig.sh. They are part of the public API and may be reliably |
| # depended on from teaish.make.in. |
| # |
| bindir = @bindir@ |
| datadir = @datadir@ |
| exec_prefix = @exec_prefix@ |
| includedir = @includedir@ |
| infodir = @infodir@ |
| libdir = @libdir@ |
| libexecdir = @libexecdir@ |
| localstatedir = @localstatedir@ |
| mandir = @mandir@ |
| prefix = @prefix@ |
| runstatedir = @runstatedir@ |
| sbindir = @sbindir@ |
| sharedstatedir = @sharedstatedir@ |
| sysconfdir = @sysconfdir@ |
| |
| |
| # |
| # Vars derived (mostly) from tclConfig.sh. These may be reliably |
| # used from the extension makefile. |
| # |
| TCLSH = @TCLSH_CMD@ |
| TCL_CONFIG_SH = @TCL_CONFIG_SH@ |
| TCL_EXEC_PREFIX = @TCL_EXEC_PREFIX@ |
| TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ |
| TCL_LIBS = @TCL_LIBS@ |
| TCL_LIB_SPEC = @TCL_LIB_SPEC@ |
| TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ |
| TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ |
| TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@ |
| TCL_PREFIX = @TCL_PREFIX@ |
| TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ |
| TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@ |
| TCL_VERSION = @TCL_VERSION@ |
| TCLLIBDIR = @TCLLIBDIR@ |
| |
| # |
| # CFLAGS.configure = CFLAGS as known at configure-time. |
| # |
| # This ordering is deliberate: flags populated via tcl's |
| # [teaish-cflags-add] should preceed CFLAGS and CPPFLAGS (which |
| # typically come from the ./configure command-line invocation). |
| # |
| CFLAGS.configure = @SH_CFLAGS@ @TEAISH_CFLAGS@ @CFLAGS@ @CPPFLAGS@ $(TCL_INCLUDE_SPEC) |
| CFLAGS.configure += -DUSE_TCL_STUBS=@TEAISH_USE_STUBS@ |
| |
| # |
| # LDFLAGS.configure = LDFLAGS as known at configure-time. |
| # |
| # This ordering is deliberate: flags populated via tcl's |
| # [teaish-ldflags-add] should precede LDFLAGS (which typically |
| # comes from the ./configure command-line invocation). |
| # |
| LDFLAGS.configure = @TEAISH_LDFLAGS@ @LDFLAGS@ |
| |
| # |
| # Linker flags for linkhing a shared library. |
| # |
| LDFLAGS.shlib = @SH_LDFLAGS@ |
| |
| # |
| # The following tx.XYZ vars may be populated/modified by teaish.tcl |
| # and/or teaish.make. |
| # |
| |
| # |
| # tx.src is the list of source or object files to include in the |
| # (single) compiler/linker invocation. This will initially contain any |
| # sources passed to [teaish-src-add], but may also be appended to by |
| # teaish.make. |
| # |
| tx.src = @TEAISH_EXT_SRC@ |
| |
| # |
| # tx.CFLAGS is typically set by teaish.make, whereas TEAISH_CFLAGS |
| # gets set up via the configure script. |
| # |
| tx.CFLAGS = |
| tx.CPPFLAGS = |
| |
| # |
| # tx.LDFLAGS is typically set by teaish.make, whereas TEAISH_LDFLAGS |
| # gets set up via the configure script. |
| # |
| tx.LDFLAGS = |
| |
| # |
| # The list of 'dist' files may be appended to from teaish.make.in. |
| # It can also be set up from teaish.tcl using [teaish-dist-add] |
| # and/or [teaish-src-add -dist ...]. |
| # |
| tx.dist.files = @TEAISH_DIST_FILES@ |
| |
| # |
| # The base name for a distribution tar/zip file. |
| # |
| tx.dist.basename = $(tx.name.dist)-$(tx.version) |
| |
| # List of deps which may trigger an auto-reconfigure. |
| # |
| teaish__autogen.deps = \ |
| $(tx.makefile.in) $(teaish.makefile.in) \ |
| $(tx.tcl) \ |
| @TEAISH_PKGINDEX_TCL_IN@ @TEAISH_TM_TCL_IN@ \ |
| @AUTODEPS@ |
| |
| @if TEAISH_MAKEFILE_IN |
| $(tx.makefile): $(tx.makefile.in) |
| @endif |
| |
| teaish.autoreconfig = \ |
| @TEAISH_AUTORECONFIG@ |
| |
| # |
| # Problem: when more than one target can invoke TEAISH_AUTORECONFIG, |
| # we can get parallel reconfigures running. Thus, targets which |
| # may require reconfigure should depend on... |
| # |
| config.log: $(teaish__autogen.deps) |
| $(teaish.autoreconfig) |
| # ^^^ We would love to skip this when running [dist]clean, but there's |
| # no POSIX Make-portable way to do that. GNU Make can. |
| .PHONY: reconfigure |
| reconfigure: |
| $(teaish.autoreconfig) |
| |
| $(teaish.makefile): $(teaish__auto.def) $(teaish.makefile.in) \ |
| @AUTODEPS@ |
| |
| @if TEAISH_TESTER_TCL_IN |
| @TEAISH_TESTER_TCL_IN@: $(teaish__autogen.deps) |
| config.log: @TEAISH_TESTER_TCL_IN@ |
| @TEAISH_TESTER_TCL@: @TEAISH_TESTER_TCL_IN@ |
| @endif |
| @if TEAISH_TEST_TCL_IN |
| @TEAISH_TEST_TCL_IN@: $(teaish__autogen.deps) |
| config.log: @TEAISH_TEST_TCL_IN@ |
| @TEAISH_TEST_TCL@: @TEAISH_TEST_TCL_IN@ |
| @endif |
| |
| # |
| # CC variant for compiling Tcl-using sources. |
| # |
| CC.tcl = \ |
| $(CC) -o $@ $(CFLAGS.configure) $(CFLAGS) $(tx.CFLAGS) $(tx.CPPFLAGS) |
| |
| # |
| # CC variant for linking $(tx.src) into an extension DLL. Note that |
| # $(tx.src) must come before $(LDFLAGS...) for linking to third-party |
| # libs to work. |
| # |
| CC.dll = \ |
| $(CC.tcl) $(tx.src) $(LDFLAGS.shlib) \ |
| $(tx.LDFLAGS) $(LDFLAGS.configure) $(LDFLAGS) $(TCL_STUB_LIB_SPEC) |
| |
| @if TEAISH_ENABLE_DLL |
| # |
| # The rest of this makefile exists solely to support this brief |
| # target: the extension shared lib. |
| # |
| $(tx.dll): $(tx.src) config.log |
| @if [ "x" = "x$(tx.src)" ]; then \ |
| echo "Makefile var tx.src (source/object files) is empty" 1>&2; \ |
| exit 1; \ |
| fi |
| $(CC.dll) |
| |
| all: $(tx.dll) |
| @endif # TEAISH_ENABLE_DLL |
| |
| tclsh: $(teaish.makefile) config.log |
| @{ echo "#!/bin/sh"; echo 'exec $(TCLSH) "$$@"'; } > $@ |
| @chmod +x $@ |
| @echo "Created $@" |
| |
| # |
| # Run the generated test script. |
| # |
| .PHONY: test-pre test-prepre test-core test test-post test-extension |
| test-extension: # this name is reserved for use by teaish.make[.in] |
| @if TEAISH_ENABLE_DLL |
| test-prepre: $(tx.dll) |
| @endif |
| @if TEAISH_TESTER_TCL |
| teaish.tester.tcl = @TEAISH_TESTER_TCL@ |
| test-core.args = $(teaish.tester.tcl) |
| @if TEAISH_ENABLE_DLL |
| test-core.args += '$(tx.dll)' '$(tx.loadPrefix)' |
| @else |
| test-core.args += '' '' |
| @endif |
| test-core.args += @TEAISH_TESTUTIL_TCL@ |
| # Clients may pass additional args via test.args=... |
| # and ::argv will be rewritten before the test script loads, to |
| # remove $(test-core.args) |
| test.args ?= |
| test-core: test-pre |
| $(TCLSH) $(test-core.args) $(test.args) |
| test-gdb: $(teaish.tester.tcl) |
| gdb --args $(TCLSH) $(test-core.args) $(test.args) |
| test-vg.flags ?= --leak-check=full -v --show-reachable=yes --track-origins=yes |
| test-vg: $(teaish.tester.tcl) |
| valgrind $(test-vg.flags) $(TCLSH) $(test-core.args) $(test.args) |
| @else # !TEAISH_TESTER_TCL |
| test-prepre: |
| @endif # TEAISH_TESTER_TCL |
| test-pre: test-prepre |
| test-core: test-pre |
| test-post: test-core |
| test: test-post |
| |
| # |
| # Cleanup rules... |
| # |
| #.PHONY: clean-pre clean-core clean-post clean-extension |
| # |
| clean-pre: |
| clean-core: clean-pre |
| rm -f $(tx.dll8) $(tx.dll9) tclsh |
| clean-post: clean-core |
| clean: clean-post |
| |
| .PHONY: distclean-pre distclean-core distclean-post clean-extension |
| distclean-pre: clean |
| distclean-core: distclean-pre |
| rm -f Makefile |
| rm -f config.log config.defines.txt |
| @if TEAISH_MAKEFILE_IN |
| @if TEAISH_MAKEFILE |
| rm -f @TEAISH_MAKEFILE@ |
| @endif |
| @endif |
| @if TEAISH_TESTER_TCL_IN |
| rm -f $(teaish.tester.tcl) |
| @endif |
| @if TEAISH_PKGINDEX_TCL_IN |
| rm -f @TEAISH_PKGINDEX_TCL@ |
| @endif |
| @if TEAISH_PKGINIT_TCL_IN |
| rm -f @TEAISH_PKGINIT_TCL@ |
| @endif |
| @if TEAISH_TEST_TCL_IN |
| rm -f @TEAISH_TEST_TCL@ |
| @endif |
| distclean-post: distclean-core |
| distclean: distclean-post |
| # |
| # The (dist)clean-extension targets are reserved for use by |
| # client-side teaish.make. |
| # |
| # Client code which wants to clean up extra stuff should do so by |
| # adding their cleanup target (e.g. clean-extension) as a dependency |
| # to the 'clean' target, like so: |
| # |
| # clean: distclean-extension |
| # distclean: distclean-extension |
| # |
| distclean-extension: |
| clean-extension: |
| |
| # |
| # Installation rules... |
| # |
| @if TEAISH_ENABLE_INSTALL |
| .PHONY: install-pre install-core install-post install-test install-prepre install-extension |
| install-extension: # this name is reserved for use by teaish.make |
| |
| @if TEAISH_ENABLE_DLL |
| install-prepre: $(tx.dll) |
| @else |
| install-prepre: |
| @endif |
| |
| @if TEAISH_TM_TCL |
| install-core.tmdir = $(DESTDIR)@TEAISH_TCL_TM_DIR@ |
| @endif |
| |
| install-pre: install-prepre |
| install-core: install-pre |
| @if [ ! -d "$(DESTDIR)$(TCLLIBDIR)" ]; then \ |
| set -x; $(INSTALL) -d "$(DESTDIR)$(TCLLIBDIR)"; \ |
| fi |
| # ^^^^ on some platforms, install -d fails if the target already exists. |
| @if TEAISH_ENABLE_DLL |
| $(INSTALL) $(tx.dll) "$(DESTDIR)$(TCLLIBDIR)" |
| @endif |
| @if TEAISH_PKGINDEX_TCL |
| $(INSTALL.noexec) "@TEAISH_PKGINDEX_TCL@" "$(DESTDIR)$(TCLLIBDIR)" |
| @endif |
| @if TEAISH_PKGINIT_TCL |
| $(INSTALL.noexec) "@TEAISH_PKGINIT_TCL@" "$(DESTDIR)$(TCLLIBDIR)" |
| @endif |
| @if TEAISH_TM_TCL |
| @if [ ! -d "$(install-core.tmdir)" ]; then \ |
| set -x; $(INSTALL) -d "$(install-core.tmdir)"; \ |
| fi |
| $(INSTALL.noexec) "@TEAISH_TM_TCL@" "$(install-core.tmdir)/$(tx.tm.tgt)" |
| @endif |
| install-test: install-core |
| @echo "Post-install test of [package require $(tx.name.pkg) $(tx.version)]..."; \ |
| set xtra=""; \ |
| if [ x != "x$(DESTDIR)" ]; then \ |
| xtra='set ::auto_path [linsert $$::auto_path 0 [file normalize $(DESTDIR)$(TCLLIBDIR)/..]];'; \ |
| fi; \ |
| if echo \ |
| 'set c 0; ' $$xtra \ |
| '@TEAISH_POSTINST_PREREQUIRE@' \ |
| 'if {[catch {package require $(tx.name.pkg) $(tx.version)} xc]} {incr c};' \ |
| 'if {$$c && "" ne $$xc} {puts $$xc; puts "auto_path=$$::auto_path"};' \ |
| 'exit $$c' \ |
| | $(TCLSH) ; then \ |
| echo "passed"; \ |
| else \ |
| echo "FAILED"; \ |
| exit 1; \ |
| fi |
| install-post: install-test |
| install: install-post |
| |
| # |
| # Uninstall rules... |
| # |
| .PHONY: uninstall uninstall-pre uninstall-core uninstall-post uninstall-extension |
| uninstall-extension: # this name is reserved for use by teaish.make |
| uninstall-pre: |
| uninstall-core: uninstall-pre |
| @if TEAISH_ENABLE_DLL |
| rm -fr "$(DESTDIR)$(TCLLIBDIR)" |
| @endif |
| @if TEAISH_TM_TCL |
| rm -f "$(DESTDIR)$(install-core.tmdir)/$(tx.tm.tgt)" |
| @endif |
| |
| uninstall-post: uninstall-core |
| @echo "Uninstalled Tcl extension $(tx.name) $(tx.version)" |
| uninstall: uninstall-post |
| @endif # TEAISH_ENABLE_INSTALL |
| |
| @if TEAISH_MAKEFILE_IN |
| Makefile: $(tx.makefile.in) |
| config.log: $(teaish.makefile.in) |
| @endif |
| |
| # |
| # Package archive generation ("dist") rules... |
| # |
| @if TEAISH_ENABLE_DIST |
| @if BIN_TAR |
| @if BIN_ZIP |
| |
| # When installing teaish as part of "make dist", we need to run |
| # configure with similar flags to what we last configured with but we |
| # must not pass on any extension-specific flags, as those won't be |
| # recognized when running in --teaish-install mode, causing |
| # the sub-configure to fail. |
| dist.flags = --with-tclsh=$(TCLSH) |
| dist.reconfig = $(teaish.dir)/configure $(tx.dist.reconfig-flags) $(dist.flags) |
| |
| # Temp dir for dist.zip. Must be different than dist.tgz or else |
| # parallel builds may hose the dist. |
| teaish__dist.tmp.zip = teaish__dist_zip |
| # |
| # Make a distribution zip file... |
| # |
| dist.zip = $(tx.dist.basename).zip |
| .PHONY: dist.zip dist.zip-core dist.zip-post |
| #dist.zip-pre: |
| # We apparently can't add a pre-hook here, else "make dist" rebuilds |
| # the archive each time it's run. |
| $(dist.zip): $(tx.dist.files) |
| @rm -fr $(teaish__dist.tmp.zip) |
| @mkdir -p $(teaish__dist.tmp.zip)/$(tx.dist.basename) |
| @tar cf $(teaish__dist.tmp.zip)/tmp.tar $(tx.dist.files) |
| @tar xf $(teaish__dist.tmp.zip)/tmp.tar -C $(teaish__dist.tmp.zip)/$(tx.dist.basename) |
| @if TEAISH_DIST_FULL |
| @$(dist.reconfig) \ |
| --teaish-install=$(teaish__dist.tmp.zip)/$(tx.dist.basename) \ |
| --t-e-d=$(teaish__dist.tmp.zip)/$(tx.dist.basename) >/dev/null |
| @endif |
| @rm -f $(tx.dist.basename)/tmp.tar $(dist.zip) |
| @cd $(teaish__dist.tmp.zip) && zip -q -r ../$(dist.zip) $(tx.dist.basename) |
| @rm -fr $(teaish__dist.tmp.zip) |
| @ls -la $(dist.zip) |
| dist.zip-core: $(dist.zip) |
| dist.zip-post: dist.zip-core |
| dist.zip: dist.zip-post |
| dist: dist.zip |
| undist-zip: |
| rm -f $(dist.zip) |
| undist: undist-zip |
| @endif #BIN_ZIP |
| |
| # |
| # Make a distribution tarball... |
| # |
| teaish__dist.tmp.tgz = teaish__dist_tgz |
| dist.tgz = $(tx.dist.basename).tar.gz |
| .PHONY: dist.tgz dist.tgz-core dist.tgz-post |
| # dist.tgz-pre: |
| # see notes in dist.zip |
| $(dist.tgz): $(tx.dist.files) |
| @rm -fr $(teaish__dist.tmp.tgz) |
| @mkdir -p $(teaish__dist.tmp.tgz)/$(tx.dist.basename) |
| @tar cf $(teaish__dist.tmp.tgz)/tmp.tar $(tx.dist.files) |
| @tar xf $(teaish__dist.tmp.tgz)/tmp.tar -C $(teaish__dist.tmp.tgz)/$(tx.dist.basename) |
| @if TEAISH_DIST_FULL |
| @rm -f $(teaish__dist.tmp.tgz)/$(tx.dist.basename)/pkgIndex.tcl.in; # kludge |
| @$(dist.reconfig) \ |
| --teaish-install=$(teaish__dist.tmp.tgz)/$(tx.dist.basename) \ |
| --t-e-d=$(teaish__dist.tmp.zip)/$(tx.dist.basename) >/dev/null |
| @endif |
| @rm -f $(tx.dist.basename)/tmp.tar $(dist.tgz) |
| @cd $(teaish__dist.tmp.tgz) && tar czf ../$(dist.tgz) $(tx.dist.basename) |
| @rm -fr $(teaish__dist.tmp.tgz) |
| @ls -la $(dist.tgz) |
| dist.tgz-core: $(dist.tgz) |
| dist.tgz-post: dist.tgz-core |
| dist.tgz: dist.tgz-post |
| dist: dist.tgz |
| undist-tgz: |
| rm -f $(dist.tgz) |
| undist: undist-tgz |
| @else #!BIN_TAR |
| dist: |
| @echo "The dist rules require tar, which configure did not find." 1>&2; exit 1 |
| @endif #BIN_TAR |
| @else #!TEAISH_ENABLE_DIST |
| undist: |
| dist: |
| @if TEAISH_OUT_OF_EXT_TREE |
| @echo "'dist' can only be used from an extension's home dir" 1>&2; \ |
| echo "In this case: @TEAISH_EXT_DIR@" 1>&2; exit 1 |
| @endif |
| @endif #TEAISH_ENABLE_DIST |
| |
| Makefile: @TEAISH_TCL@ |
| |
| @if TEAISH_MAKEFILE_CODE |
| # |
| # TEAISH_MAKEFILE_CODE may contain literal makefile code, which |
| # gets pasted verbatim here. Either [define TEAISH_MAKEFILE_CODE |
| # ...] or use [teaish-make-add] to incrementally build up this |
| # content. |
| # |
| # <TEAISH_MAKEFILE_CODE> |
| @TEAISH_MAKEFILE_CODE@ |
| # </TEAISH_MAKEFILE_CODE> |
| @endif |
| |
| @if TEAISH_MAKEFILE |
| # |
| # TEAISH_MAKEFILE[_IN] defines any extension-specific state this file |
| # needs. |
| # |
| # It must set the following vars if they're not already accounted for |
| # via teaish.tcl. |
| # |
| # - tx.src = list of the extension's source files, being sure to |
| # prefix each with $(tx.dir) (if it's in the same dir as the |
| # extension) so that out-of-tree builds can find them. Optionally, |
| # [define] TEAISH_EXT_SRC or pass them to [teaish-src-add]. |
| # |
| # It may optionally set the following vars: |
| # |
| # - tx.CFLAGS = CFLAGS/CPPFLAGS. Optionally, [define] TEAISH_CFLAGS |
| # or pass them to [teaish-cflags-add]. |
| # |
| # - tx.LDFLAGS = LDFLAGS. Optionally, [define] TEAISH_LDFLAGS or |
| # pass them to [teaish-ldflags-add]. |
| # |
| # It may optionally hook into various targets as documented in |
| # /doc/extensions.md in the canonical teaish source tree. |
| # |
| # Interestingly, we don't have to pre-filter teaish.makefile.in - we |
| # can just @include it here. That skips its teaish-specific validation |
| # though. Hmm. |
| # |
| # <TEAISH_MAKEFILE> |
| Makefile: @TEAISH_MAKEFILE@ |
| @include @TEAISH_MAKEFILE@ |
| # </TEAISH_MAKEFILE> |
| @endif |