summaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
Diffstat (limited to 'build')
-rw-r--r--build/auto.mk54
-rw-r--r--build/config.mk21
-rw-r--r--build/exports.mk5
-rw-r--r--build/flags.mk61
-rw-r--r--build/header.mk4
-rw-r--r--build/pkgs.mk4
6 files changed, 93 insertions, 56 deletions
diff --git a/build/auto.mk b/build/auto.mk
new file mode 100644
index 0000000..9cdf9e3
--- /dev/null
+++ b/build/auto.mk
@@ -0,0 +1,54 @@
+# Copyright © Tavian Barnes <tavianator@tavianator.com>
+# SPDX-License-Identifier: 0BSD
+
+# Makefile that generates gen/auto.mk
+
+include build/prelude.mk
+include gen/vars.mk
+include gen/early.mk
+include gen/late.mk
+include build/exports.mk
+
+# Auto-detected flags
+AUTO_FLAGS := \
+ gen/flags/std.mk \
+ gen/flags/bind-now.mk \
+ gen/flags/deps.mk \
+ gen/flags/pthread.mk \
+ gen/flags/Wformat.mk \
+ gen/flags/Wimplicit-fallthrough.mk \
+ gen/flags/Wimplicit.mk \
+ gen/flags/Wmissing-decls.mk \
+ gen/flags/Wmissing-var-decls.mk \
+ gen/flags/Wshadow.mk \
+ gen/flags/Wsign-compare.mk \
+ gen/flags/Wstrict-prototypes.mk \
+ gen/flags/Wundef-prefix.mk
+
+gen/auto.mk: ${AUTO_FLAGS}
+ ${MSG} "[ GEN] $@"
+ @printf '# %s\n' "$@" >$@
+ @cat $^ >>$@
+ @cat ${^:%=%.log} >gen/flags.log
+ ${VCAT} $@
+.PHONY: gen/auto.mk
+
+# Check that the C compiler works at all
+cc::
+ @build/cc.sh -q build/empty.c -o gen/.cc.out; \
+ ret=$$?; \
+ build/msg-if.sh "[ CC ] build/empty.c" test $$ret -eq 0; \
+ exit $$ret
+
+# The short name of the config test
+SLUG = ${@:gen/%.mk=%}
+# The source file to build
+CSRC = build/${SLUG}.c
+# The hidden output file name
+OUT = ${SLUG:flags/%=gen/flags/.%.out}
+
+${AUTO_FLAGS}: cc
+ @${MKDIR} ${@D}
+ @build/flags-if.sh ${CSRC} -o ${OUT} >$@ 2>$@.log; \
+ build/msg-if.sh "[ CC ] ${SLUG}.c" test $$? -eq 0
+.PHONY: ${AUTO_FLAGS}
diff --git a/build/config.mk b/build/config.mk
index 663926c..be57678 100644
--- a/build/config.mk
+++ b/build/config.mk
@@ -10,8 +10,16 @@ include build/exports.mk
config: gen/config.mk gen/config.h
.PHONY: config
+# All the generated makefile fragments
+MKS := \
+ gen/vars.mk \
+ gen/early.mk \
+ gen/auto.mk \
+ gen/pkgs.mk \
+ gen/late.mk
+
# The main configuration file, which includes the others
-gen/config.mk: gen/vars.mk gen/flags.mk gen/pkgs.mk
+gen/config.mk: ${MKS}
${MSG} "[ GEN] $@"
@printf '# %s\n' "$@" >$@
@printf 'include %s\n' $^ >>$@
@@ -36,16 +44,17 @@ gen/vars.mk::
# Sets the build flags. This depends on vars.mk and uses a recursive make so
# that the default flags can depend on variables like ${OS}.
-gen/flags.mk: gen/vars.mk
+gen/early.mk gen/late.mk: gen/vars.mk
@+XMAKEFLAGS="$$MAKEFLAGS" ${MAKE} -sf build/flags.mk $@
-.PHONY: gen/flags.mk
+
+# Auto-detected build flags
+gen/auto.mk: gen/early.mk gen/late.mk
+ @+XMAKEFLAGS="$$MAKEFLAGS" ${MAKE} -sf build/auto.mk $@
# Auto-detect dependencies and their build flags
-gen/pkgs.mk: gen/flags.mk
+gen/pkgs.mk: gen/auto.mk
@+XMAKEFLAGS="$$MAKEFLAGS" ${MAKE} -sf build/pkgs.mk $@
-.PHONY: gen/pkgs.mk
# Compile-time feature detection
gen/config.h: gen/pkgs.mk
@+XMAKEFLAGS="$$MAKEFLAGS" ${MAKE} -sf build/header.mk $@
-.PHONY: gen/config.h
diff --git a/build/exports.mk b/build/exports.mk
index 913a1aa..a616c59 100644
--- a/build/exports.mk
+++ b/build/exports.mk
@@ -17,4 +17,9 @@ export XCFLAGS=${_CFLAGS}
export XLDFLAGS=${_LDFLAGS}
export XLDLIBS=${_LDLIBS}
+export CONF_CPPFLAGS=${CPPFLAGS} ${EXTRA_CPPFLAGS}
+export CONF_CFLAGS=${CFLAGS} ${EXTRA_CFLAGS}
+export CONF_LDFLAGS=${LDFLAGS} ${EXTRA_LDFLAGS}
+export CONF_LDLIBS=${LDLIBS} ${EXTRA_LDLIBS}
+
export XNOLIBS=${NOLIBS}
diff --git a/build/flags.mk b/build/flags.mk
index 00876d1..c64a80b 100644
--- a/build/flags.mk
+++ b/build/flags.mk
@@ -1,7 +1,7 @@
# Copyright © Tavian Barnes <tavianator@tavianator.com>
# SPDX-License-Identifier: 0BSD
-# Makefile that generates gen/flags.mk
+# Makefile that generates gen/{early,late}.mk
include build/prelude.mk
include gen/vars.mk
@@ -79,32 +79,10 @@ _CFLAGS += ${LTO_CFLAGS,${_LTO}}
# Configurable flags
CFLAGS ?= -g -Wall
-# Add the configurable flags last so they can override ours
-_CPPFLAGS += ${CPPFLAGS} ${EXTRA_CPPFLAGS}
-_CFLAGS += ${CFLAGS} ${EXTRA_CFLAGS}
-_LDFLAGS += ${LDFLAGS} ${EXTRA_LDFLAGS}
-# (except LDLIBS, as earlier libs override later ones)
-_LDLIBS := ${LDLIBS} ${EXTRA_LDLIBS} ${_LDLIBS}
-
include build/exports.mk
-# Conditionally-supported flags
-AUTO_FLAGS := \
- gen/flags/std.mk \
- gen/flags/bind-now.mk \
- gen/flags/deps.mk \
- gen/flags/pthread.mk \
- gen/flags/Wformat.mk \
- gen/flags/Wimplicit-fallthrough.mk \
- gen/flags/Wimplicit.mk \
- gen/flags/Wmissing-decls.mk \
- gen/flags/Wmissing-var-decls.mk \
- gen/flags/Wshadow.mk \
- gen/flags/Wsign-compare.mk \
- gen/flags/Wstrict-prototypes.mk \
- gen/flags/Wundef-prefix.mk
-
-gen/flags.mk: ${AUTO_FLAGS}
+# Saves the internal flags
+gen/early.mk::
${MSG} "[ GEN] $@"
@printf '# %s\n' "$@" >$@
@printf '_CPPFLAGS := %s\n' "$$XCPPFLAGS" >>$@
@@ -113,27 +91,14 @@ gen/flags.mk: ${AUTO_FLAGS}
@printf '_LDLIBS := %s\n' "$$XLDLIBS" >>$@
@printf 'NOLIBS := %s\n' "$$XNOLIBS" >>$@
@test "${OS}-${SAN}" != FreeBSD-y || printf 'POSTLINK = elfctl -e +noaslr $$@\n' >>$@
- @cat $^ >>$@
- @cat ${^:%=%.log} >gen/flags.log
${VCAT} $@
-.PHONY: gen/flags.mk
-
-# Check that the C compiler works at all
-cc::
- @build/cc.sh -q build/empty.c -o gen/.cc.out; \
- ret=$$?; \
- build/msg-if.sh "[ CC ] build/empty.c" test $$ret -eq 0; \
- exit $$ret
-
-# The short name of the config test
-SLUG = ${@:gen/%.mk=%}
-# The source file to build
-CSRC = build/${SLUG}.c
-# The hidden output file name
-OUT = ${SLUG:flags/%=gen/flags/.%.out}
-
-${AUTO_FLAGS}: cc
- @${MKDIR} ${@D}
- @build/flags-if.sh ${CSRC} -o ${OUT} >$@ 2>$@.log; \
- build/msg-if.sh "[ CC ] ${SLUG}.c" test $$? -eq 0
-.PHONY: ${AUTO_FLAGS}
+
+# Save explicit flags from ./configure separately so they can override the rest
+gen/late.mk::
+ ${MSG} "[ GEN] $@"
+ @printf '# %s\n' "$@" >$@
+ @printf '_CPPFLAGS += %s\n' "$$CONF_CPPFLAGS" >>$@
+ @printf '_CFLAGS += %s\n' "$$CONF_CFLAGS" >>$@
+ @printf '_LDFLAGS += %s\n' "$$CONF_LDFLAGS" >>$@
+ @printf '_LDLIBS := %s $${_LDLIBS}\n' "$$CONF_LDLIBS" >>$@
+ ${VCAT} $@
diff --git a/build/header.mk b/build/header.mk
index 723922e..ae52c12 100644
--- a/build/header.mk
+++ b/build/header.mk
@@ -5,8 +5,10 @@
include build/prelude.mk
include gen/vars.mk
-include gen/flags.mk
+include gen/early.mk
+include gen/auto.mk
include gen/pkgs.mk
+include gen/late.mk
include build/exports.mk
# All header fragments we generate
diff --git a/build/pkgs.mk b/build/pkgs.mk
index f45c357..bed17be 100644
--- a/build/pkgs.mk
+++ b/build/pkgs.mk
@@ -5,7 +5,9 @@
include build/prelude.mk
include gen/vars.mk
-include gen/flags.mk
+include gen/early.mk
+include gen/auto.mk
+include gen/late.mk
include build/exports.mk
HEADERS := ${ALL_PKGS:%=gen/with/%.h}