build: VPATH-enable shared make machinery (out-of-tree)
With the autoconf layer relocatable, teach the shared make
files to read sources from the source tree and write objects into the
build tree. The ~26 "standard" and "near-standard" module Makefiles now
build out-of-tree with no per-module edits.
scripts/defs.mak.in:
* Add MAGICSRC = @abs_top_srcdir@ (absolute source top) and derive each
module's srcdir/VPATH from CURDIR relative to the build top:
BUILD_TOP := $(abspath $(MAGICDIR))
MODULE_SUBPATH := $(subst $(BUILD_TOP),,$(CURDIR))
srcdir := $(MAGICSRC)$(MODULE_SUBPATH)
VPATH := $(srcdir)
(MAGICDIR keeps meaning the *build* top; in-tree the trees coincide.)
* CPPFLAGS: add -I${MAGICSRC} (source top, for "<module>/<hdr>.h") and
-I${srcdir} (same-dir headers), keeping -I${MAGICDIR} for the generated
database/database.h in the build top.
* MAGIC_VERSION/REVISION read ${MAGICSRC}/VERSION; MAGIC_COMMIT uses
`git -C ${MAGICSRC}` so it works from a build dir outside the work-tree.
rules.mak:
* Compile rule: `-c $*.c` -> `-c $< -o $@` so the source is found via
VPATH in srcdir and the object is written to the build cwd.
* Depend and tags rules: prefix sources with $(srcdir)/ (they are passed
to the compiler/ctags directly, which do not honor VPATH).
scripts/configure.in: AC_CONFIG_FILES([rules.mak:rules.mak]) copies the
VPATH-aware rules.mak into the build top, so a single ${MAGICDIR}
resolves both `include`s in every subdir Makefile. Regenerated configure.
Known limitation (v1): the Depend post-processing sed strips
absolute-path headers, so with an absolute srcdir most header deps are
dropped; out-of-tree incremental header-change rebuilds are weaker.
Depend is already "optimistic/optional"; relativizing is a follow-up.
Verified out-of-tree: `tiles` and `drc` (the latter #includes the
generated database/database.h) build to completion; all objects land in
the build tree; the source tree stays clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5e9423fded
commit
1fba029d55
|
|
@ -16,7 +16,7 @@ depend: ${DEPEND_FILE}
|
||||||
# corrupting the output, the final MV is transactional. If that is needed
|
# corrupting the output, the final MV is transactional. If that is needed
|
||||||
# it indicates a missing dependency somewhere in a upstream/parent Makefile.
|
# it indicates a missing dependency somewhere in a upstream/parent Makefile.
|
||||||
${DEPEND_FILE}: ${DEPSRCS}
|
${DEPEND_FILE}: ${DEPSRCS}
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} ${DEPEND_FLAG} ${DEPSRCS} > ${DEPEND_FILE}$$PPID.tmp
|
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} ${DEPEND_FLAG} $(addprefix $(srcdir)/,${DEPSRCS}) > ${DEPEND_FILE}$$PPID.tmp
|
||||||
${SED} -e "/#/D" -e "/ \//s/ \/.*\.h//" -e "/ \\\/D" -i ${DEPEND_FILE}$$PPID.tmp
|
${SED} -e "/#/D" -e "/ \//s/ \/.*\.h//" -e "/ \\\/D" -i ${DEPEND_FILE}$$PPID.tmp
|
||||||
${MV} -f ${DEPEND_FILE}$$PPID.tmp ${DEPEND_FILE}
|
${MV} -f ${DEPEND_FILE}$$PPID.tmp ${DEPEND_FILE}
|
||||||
|
|
||||||
|
|
@ -26,7 +26,7 @@ ${DEPEND_FILE}: ${DEPSRCS}
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo --- compiling ${MODULE}/$*.o
|
@echo --- compiling ${MODULE}/$*.o
|
||||||
${RM} $*.o
|
${RM} $*.o
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} -c $*.c
|
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} -c $< -o $@
|
||||||
|
|
||||||
lib${MODULE}.o: ${OBJS}
|
lib${MODULE}.o: ${OBJS}
|
||||||
@echo --- linking lib${MODULE}.o
|
@echo --- linking lib${MODULE}.o
|
||||||
|
|
@ -55,7 +55,7 @@ clean:
|
||||||
${RM} ${CLEANS}
|
${RM} ${CLEANS}
|
||||||
|
|
||||||
tags: ${SRCS} ${LIB_SRCS}
|
tags: ${SRCS} ${LIB_SRCS}
|
||||||
ctags ${SRCS} ${LIB_SRCS}
|
ctags $(addprefix $(srcdir)/,${SRCS} ${LIB_SRCS})
|
||||||
|
|
||||||
# Depends are a somewhat optional part of the build process that are only useful when incremental
|
# Depends are a somewhat optional part of the build process that are only useful when incremental
|
||||||
# building. If the file is here it's here, if not continue with build optimistically
|
# building. If the file is here it's here, if not continue with build optimistically
|
||||||
|
|
|
||||||
|
|
@ -9300,6 +9300,8 @@ ac_config_files="$ac_config_files defs.mak:scripts/defs.mak.in"
|
||||||
|
|
||||||
ac_config_files="$ac_config_files scripts/makedbh:scripts/makedbh.in"
|
ac_config_files="$ac_config_files scripts/makedbh:scripts/makedbh.in"
|
||||||
|
|
||||||
|
ac_config_files="$ac_config_files rules.mak:rules.mak"
|
||||||
|
|
||||||
cat >confcache <<\_ACEOF
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# This file is a shell script that caches the results of configure
|
||||||
# tests run on this system so they can be shared between configure
|
# tests run on this system so they can be shared between configure
|
||||||
|
|
@ -10009,6 +10011,7 @@ do
|
||||||
case $ac_config_target in
|
case $ac_config_target in
|
||||||
"defs.mak") CONFIG_FILES="$CONFIG_FILES defs.mak:scripts/defs.mak.in" ;;
|
"defs.mak") CONFIG_FILES="$CONFIG_FILES defs.mak:scripts/defs.mak.in" ;;
|
||||||
"scripts/makedbh") CONFIG_FILES="$CONFIG_FILES scripts/makedbh:scripts/makedbh.in" ;;
|
"scripts/makedbh") CONFIG_FILES="$CONFIG_FILES scripts/makedbh:scripts/makedbh.in" ;;
|
||||||
|
"rules.mak") CONFIG_FILES="$CONFIG_FILES rules.mak:rules.mak" ;;
|
||||||
|
|
||||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
||||||
esac
|
esac
|
||||||
|
|
|
||||||
|
|
@ -1982,6 +1982,10 @@ dnl build directory (config.status' CWD): defs.mak at the build top, makedbh
|
||||||
dnl under build/scripts/ (matching ${SCRIPTS}/makedbh = ${MAGICDIR}/scripts).
|
dnl under build/scripts/ (matching ${SCRIPTS}/makedbh = ${MAGICDIR}/scripts).
|
||||||
AC_CONFIG_FILES([defs.mak:scripts/defs.mak.in])
|
AC_CONFIG_FILES([defs.mak:scripts/defs.mak.in])
|
||||||
AC_CONFIG_FILES([scripts/makedbh:scripts/makedbh.in], [chmod +x scripts/makedbh])
|
AC_CONFIG_FILES([scripts/makedbh:scripts/makedbh.in], [chmod +x scripts/makedbh])
|
||||||
|
dnl Copy rules.mak into the build top (it has no @...@ substitutions; this just
|
||||||
|
dnl places it next to the generated defs.mak so a single ${MAGICDIR} resolves
|
||||||
|
dnl both `include`s in every subdir Makefile out-of-tree).
|
||||||
|
AC_CONFIG_FILES([rules.mak:rules.mak])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,27 @@
|
||||||
|
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
|
|
||||||
|
# --- out-of-tree (VPATH) support ------------------------------------------
|
||||||
|
# MAGICDIR is set by each subdir Makefile to the relative path back to the
|
||||||
|
# *build* top (that is where the generated defs.mak / rules.mak live, and where
|
||||||
|
# the generated database/database.h is written). MAGICSRC is the absolute path
|
||||||
|
# to the *source* top. For an in-tree build the two trees coincide.
|
||||||
|
MAGICSRC = @abs_top_srcdir@
|
||||||
|
|
||||||
|
# Derive this module's source directory (and VPATH) from where make is running
|
||||||
|
# (CURDIR, a build directory) relative to the build top (abspath of MAGICDIR):
|
||||||
|
# build top = $(abspath $(MAGICDIR))
|
||||||
|
# subpath = "/tiles", or "" at the top
|
||||||
|
# srcdir = $(MAGICSRC)$(subpath)
|
||||||
|
BUILD_TOP := $(abspath $(MAGICDIR))
|
||||||
|
# Anchored prefix strip (patsubst matches the whole word, so BUILD_TOP must be a
|
||||||
|
# leading prefix): "" at the build top, "/tiles" in a subdir. Unlike $(subst …)
|
||||||
|
# this cannot mis-fire if BUILD_TOP happens to recur later in the path.
|
||||||
|
MODULE_SUBPATH := $(patsubst $(BUILD_TOP)%,%,$(CURDIR))
|
||||||
|
srcdir := $(MAGICSRC)$(MODULE_SUBPATH)
|
||||||
|
VPATH := $(srcdir)
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
|
|
@ -79,9 +100,9 @@ LIB_SPECS_GRNULL = @LIB_SPECS_GRNULL@
|
||||||
WISH_EXE = @WISH_EXE@
|
WISH_EXE = @WISH_EXE@
|
||||||
TCL_LIB_DIR = @TCL_LIB_DIR@
|
TCL_LIB_DIR = @TCL_LIB_DIR@
|
||||||
|
|
||||||
MAGIC_VERSION ?= $(shell cat ${MAGICDIR}/VERSION | cut -d. -f1-2)
|
MAGIC_VERSION ?= $(shell cat ${MAGICSRC}/VERSION | cut -d. -f1-2)
|
||||||
MAGIC_REVISION ?= $(shell cat ${MAGICDIR}/VERSION | cut -d. -f3)
|
MAGIC_REVISION ?= $(shell cat ${MAGICSRC}/VERSION | cut -d. -f3)
|
||||||
MAGIC_COMMIT ?= $(shell git rev-parse HEAD)
|
MAGIC_COMMIT ?= $(shell git -C ${MAGICSRC} rev-parse HEAD)
|
||||||
MAGIC_BUILDDATE ?= $(shell date | tr -d '\r\n')
|
MAGIC_BUILDDATE ?= $(shell date | tr -d '\r\n')
|
||||||
|
|
||||||
# This allow inheritence of the values from toplevel Makefile
|
# This allow inheritence of the values from toplevel Makefile
|
||||||
|
|
@ -111,7 +132,10 @@ CXX = @CXX@
|
||||||
### Status: NOT-STABILITY-AFFECTING (if your binary links you are good to continue)
|
### Status: NOT-STABILITY-AFFECTING (if your binary links you are good to continue)
|
||||||
#FEATURE_FLAGS += -DSUPPORT_REMOVE_MALLOC_LEGACY
|
#FEATURE_FLAGS += -DSUPPORT_REMOVE_MALLOC_LEGACY
|
||||||
|
|
||||||
CPPFLAGS = -I${MAGICDIR} @CPPFLAGS@
|
# -I${MAGICDIR}: build top, for the generated database/database.h
|
||||||
|
# -I${MAGICSRC}: source top, for "<module>/<header>.h" includes
|
||||||
|
# -I${srcdir}: this module's source dir, for same-directory headers
|
||||||
|
CPPFLAGS = -I${MAGICDIR} -I${MAGICSRC} -I${srcdir} @CPPFLAGS@
|
||||||
CXXFLAGS = @CXXFLAGS@
|
CXXFLAGS = @CXXFLAGS@
|
||||||
DFLAGS_MAGICVERSION = -DMAGIC_VERSION=\"${MAGIC_VERSION}\" -DMAGIC_REVISION=\"${MAGIC_REVISION}\" -DMAGIC_COMMIT=\"${MAGIC_COMMIT}\" "-DMAGIC_BUILDDATE=\"${MAGIC_BUILDDATE}\""
|
DFLAGS_MAGICVERSION = -DMAGIC_VERSION=\"${MAGIC_VERSION}\" -DMAGIC_REVISION=\"${MAGIC_REVISION}\" -DMAGIC_COMMIT=\"${MAGIC_COMMIT}\" "-DMAGIC_BUILDDATE=\"${MAGIC_BUILDDATE}\""
|
||||||
DFLAGS = @extra_defs@ @stub_defs@ @DEFS@ ${DFLAGS_MAGICVERSION} -DGCORE=\"@GCORE@\"
|
DFLAGS = @extra_defs@ @stub_defs@ @DEFS@ ${DFLAGS_MAGICVERSION} -DGCORE=\"@GCORE@\"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue