aboutsummaryrefslogtreecommitdiff
path: root/share/mk
diff options
context:
space:
mode:
Diffstat (limited to 'share/mk')
-rw-r--r--share/mk/Makefile7
-rw-r--r--share/mk/atf.test.mk48
-rw-r--r--share/mk/auto.obj.mk1
-rw-r--r--share/mk/bsd.README16
-rw-r--r--share/mk/bsd.clang-analyze.mk1
-rw-r--r--share/mk/bsd.compat.mk146
-rw-r--r--share/mk/bsd.compat.pre.mk13
-rw-r--r--share/mk/bsd.compiler.mk11
-rw-r--r--share/mk/bsd.confs.mk3
-rw-r--r--share/mk/bsd.cpu.mk129
-rw-r--r--share/mk/bsd.crunchgen.mk6
-rw-r--r--share/mk/bsd.dep.mk1
-rw-r--r--share/mk/bsd.dirs.mk1
-rw-r--r--share/mk/bsd.doc.mk3
-rw-r--r--share/mk/bsd.dtb.mk1
-rw-r--r--share/mk/bsd.endian.mk1
-rw-r--r--share/mk/bsd.files.mk5
-rw-r--r--share/mk/bsd.incs.mk1
-rw-r--r--share/mk/bsd.info.mk1
-rw-r--r--share/mk/bsd.init.mk1
-rw-r--r--share/mk/bsd.kmod.mk3
-rw-r--r--share/mk/bsd.lib.mk69
-rw-r--r--share/mk/bsd.libnames.mk10
-rw-r--r--share/mk/bsd.linker.mk5
-rw-r--r--share/mk/bsd.links.mk15
-rw-r--r--share/mk/bsd.man.mk41
-rw-r--r--share/mk/bsd.mkopt.mk52
-rw-r--r--share/mk/bsd.nls.mk1
-rw-r--r--share/mk/bsd.obj.mk1
-rw-r--r--share/mk/bsd.opts.mk44
-rw-r--r--share/mk/bsd.own.mk11
-rw-r--r--share/mk/bsd.port.mk5
-rw-r--r--share/mk/bsd.port.options.mk1
-rw-r--r--share/mk/bsd.port.post.mk1
-rw-r--r--share/mk/bsd.port.pre.mk1
-rw-r--r--share/mk/bsd.port.subdir.mk5
-rw-r--r--share/mk/bsd.prog.mk35
-rw-r--r--share/mk/bsd.progs.mk14
-rw-r--r--share/mk/bsd.sanitizer.mk2
-rw-r--r--share/mk/bsd.snmpmod.mk1
-rw-r--r--share/mk/bsd.subdir.mk17
-rw-r--r--share/mk/bsd.suffixes-posix.mk1
-rw-r--r--share/mk/bsd.suffixes.mk3
-rw-r--r--share/mk/bsd.symver.mk5
-rw-r--r--share/mk/bsd.sys.mk81
-rw-r--r--share/mk/bsd.sysdir.mk3
-rw-r--r--share/mk/bsd.test.mk1
-rw-r--r--share/mk/dirdeps-options.mk11
-rw-r--r--share/mk/dirdeps-targets.mk17
-rw-r--r--share/mk/dirdeps.mk129
-rw-r--r--share/mk/gendirdeps.mk45
-rw-r--r--share/mk/googletest.test.inc.mk14
-rw-r--r--share/mk/googletest.test.mk1
-rw-r--r--share/mk/host-target.mk45
-rw-r--r--share/mk/install-new.mk1
-rw-r--r--share/mk/jobs.mk105
-rw-r--r--share/mk/kmod.opts.mk1
-rw-r--r--share/mk/local.autodep.mk16
-rw-r--r--share/mk/local.dirdeps-options.mk3
-rw-r--r--share/mk/local.dirdeps-targets.mk1
-rw-r--r--share/mk/local.dirdeps.mk67
-rw-r--r--share/mk/local.gendirdeps.mk22
-rw-r--r--share/mk/local.init.mk13
-rw-r--r--share/mk/local.meta.sys.env.mk20
-rw-r--r--share/mk/local.meta.sys.mk260
-rw-r--r--share/mk/local.sys.dirdeps.env.mk67
-rw-r--r--share/mk/local.sys.dirdeps.mk150
-rw-r--r--share/mk/local.sys.env.mk10
-rw-r--r--share/mk/local.sys.machine.mk24
-rw-r--r--share/mk/local.sys.mk21
-rw-r--r--share/mk/meta.autodep.mk28
-rw-r--r--share/mk/meta.stage.mk27
-rw-r--r--share/mk/meta.subdir.mk7
-rw-r--r--share/mk/meta.sys.mk83
-rwxr-xr-xshare/mk/meta2deps.py63
-rwxr-xr-xshare/mk/meta2deps.sh52
-rw-r--r--share/mk/netbsd-tests.test.mk1
-rw-r--r--share/mk/plain.test.mk1
-rw-r--r--share/mk/src.init.linux.mk18
-rw-r--r--share/mk/src.init.mk28
-rw-r--r--share/mk/src.libnames.mk235
-rw-r--r--share/mk/src.lua.mk1
-rw-r--r--share/mk/src.opts.mk112
-rw-r--r--share/mk/src.sys.env.mk5
-rw-r--r--share/mk/src.sys.mk4
-rw-r--r--share/mk/src.sys.obj.mk6
-rw-r--r--share/mk/src.tools.mk1
-rwxr-xr-xshare/mk/stage-install.sh1
-rw-r--r--share/mk/suite.test.mk1
-rw-r--r--share/mk/sys.dependfile.mk18
-rw-r--r--share/mk/sys.dirdeps.mk205
-rw-r--r--share/mk/sys.mk33
-rw-r--r--share/mk/tap.test.mk1
-rw-r--r--share/mk/version_gen.awk3
94 files changed, 1863 insertions, 938 deletions
diff --git a/share/mk/Makefile b/share/mk/Makefile
index ea6b58b5b65a..096dc2ede002 100644
--- a/share/mk/Makefile
+++ b/share/mk/Makefile
@@ -1,5 +1,3 @@
-# $FreeBSD$
-# @(#)Makefile 8.1 (Berkeley) 6/8/93
# Only parse this if executing make in this directory, not in other places
# in src that lack a Makefile, such as sys/dev/*. Otherwise the MAKESYSPATH
@@ -20,6 +18,7 @@ FILES= \
bsd.clang-analyze.mk \
bsd.compiler.mk \
bsd.compat.mk \
+ bsd.compat.pre.mk \
bsd.confs.mk \
bsd.cpu.mk \
bsd.crunchgen.mk \
@@ -60,8 +59,11 @@ FILES= \
bsd.test.mk \
dirdeps.mk \
dirdeps-options.mk \
+ dirdeps-targets.mk \
gendirdeps.mk \
+ host-target.mk \
install-new.mk \
+ jobs.mk \
meta.autodep.mk \
meta.stage.mk \
meta.subdir.mk \
@@ -70,6 +72,7 @@ FILES= \
stage-install.sh \
sys.mk \
sys.dependfile.mk \
+ sys.dirdeps.mk \
version_gen.awk
FILESDIR= ${BINDIR}/mk
diff --git a/share/mk/atf.test.mk b/share/mk/atf.test.mk
index e7a8c82b7a8f..f7696641ffb0 100644
--- a/share/mk/atf.test.mk
+++ b/share/mk/atf.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# You must include bsd.test.mk instead of this file from your Makefile.
#
@@ -22,6 +21,7 @@ ATF_TESTS_C?=
ATF_TESTS_CXX?=
ATF_TESTS_SH?=
ATF_TESTS_KSH93?=
+ATF_TESTS_PYTEST?=
.if !empty(ATF_TESTS_C)
PROGS+= ${ATF_TESTS_C}
@@ -109,3 +109,49 @@ ${_T}: ${ATF_TESTS_KSH93_SRC_${_T}}
mv ${.TARGET}.tmp ${.TARGET}
.endfor
.endif
+
+.if !empty(ATF_TESTS_PYTEST)
+# bsd.prog.mk SCRIPTS interface removes file extension unless
+# SCRIPTSNAME is set, which is not possible to do here.
+# Workaround this by appending another extension (.xtmp) to the
+# file name. Use separate loop to avoid dealing with explicitly
+# stating expansion for each and every variable.
+#
+# ATF_TESTS_PYTEST -> contains list of files as is (test_something.py ..)
+# _ATF_TESTS_PYTEST -> (test_something.py.xtmp ..)
+#
+# Former array is iterated to construct Kyuafile, where original file
+# names need to be written.
+# Latter array is iterated to enable bsd.prog.mk scripts framework -
+# namely, installing scripts without .xtmp prefix. Note: this allows to
+# not bother about the fact that make target needs to be different from
+# the source file.
+_TESTS+= ${ATF_TESTS_PYTEST}
+_ATF_TESTS_PYTEST=
+.for _T in ${ATF_TESTS_PYTEST}
+_ATF_TESTS_PYTEST += ${_T}.xtmp
+TEST_INTERFACE.${_T}= atf
+TEST_METADATA.${_T}+= required_programs="pytest"
+.endfor
+
+SCRIPTS+= ${_ATF_TESTS_PYTEST}
+.for _T in ${_ATF_TESTS_PYTEST}
+SCRIPTSDIR_${_T}= ${TESTSDIR}
+CLEANFILES+= ${_T} ${_T}.tmp
+# TODO(jmmv): It seems to me that this SED and SRC functionality should
+# exist in bsd.prog.mk along the support for SCRIPTS. Move it there if
+# this proves to be useful within the tests.
+ATF_TESTS_PYTEST_SED_${_T}?= # empty
+ATF_TESTS_PYTEST_SRC_${_T}?= ${.CURDIR}/${_T:S,.xtmp$,,}
+${_T}: ${_T:S/.xtmp//}
+ echo "#! /usr/libexec/atf_pytest_wrapper -P ${TESTSBASE}" > ${.TARGET}.tmp
+.if empty(ATF_TESTS_PYTEST_SED_${_T})
+ cat ${ATF_TESTS_PYTEST_SRC_${_T}} >>${.TARGET}.tmp
+.else
+ cat ${ATF_TESTS_PYTEST_SRC_${_T}} \
+ | sed ${ATF_TESTS_PYTEST_SED_${_T}} >>${.TARGET}.tmp
+.endif
+ chmod +x ${.TARGET}.tmp
+ mv ${.TARGET}.tmp ${.TARGET}
+.endfor
+.endif
diff --git a/share/mk/auto.obj.mk b/share/mk/auto.obj.mk
index 7f903ee7efb8..21aa8e4a40d0 100644
--- a/share/mk/auto.obj.mk
+++ b/share/mk/auto.obj.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# $Id: auto.obj.mk,v 1.12 2015/12/16 01:57:06 sjg Exp $
#
# @(#) Copyright (c) 2004, Simon J. Gerraty
diff --git a/share/mk/bsd.README b/share/mk/bsd.README
index 5175ad10df24..70d489a9f59f 100644
--- a/share/mk/bsd.README
+++ b/share/mk/bsd.README
@@ -1,5 +1,3 @@
-# @(#)bsd.README 8.2 (Berkeley) 4/2/94
-# $FreeBSD$
This is the README file for the "include" files for the FreeBSD
source tree. The files are installed in /usr/share/mk, and are by
@@ -126,15 +124,15 @@ The following variables are common:
AFLAGS.${SRC}
Flags dependent on source file name.
-AFLAGS.${TARGET}
+AFLAGS.${.TARGET:T}
Flags dependent on output file name.
ACFLAGS.${SRC}
Flags dependent on source file name.
-ACFLAGS.${TARGET}
+ACFLAGS.${.TARGET:T}
Flags dependent on output file name.
CFLAGS.${SRC}
Flags dependent on source file name.
-CFLAGS.${TARGET}
+CFLAGS.${.TARGET:T}
Flags dependent on output file name.
CFLAGS.${COMPILER_TYPE}
Flags dependent on compiler added to CFLAGS.
@@ -149,7 +147,7 @@ CXXFLAGS.${MACHINE_ARCH}
Architectural flags added to CXXFLAGS.
CXXFLAGS.${SRC}
Flags dependent on source file name.
-CXXFLAGS.${TARGET}
+CXXFLAGS.${.TARGET:T}
Flags dependent on output file name.
COMPILER_FEATURES
A list of features that the compiler supports. Zero or
@@ -345,21 +343,21 @@ LDADD Additional loader objects. Usually used for libraries.
LDADD=-lutil -lcompat
-LDADD.${TARGET}
+LDADD.${.TARGET:T}
Loader objects dependent on output file name.
LDFLAGS Additional loader flags. Passed to the loader via CC,
since that's used to link programs as well, so loader
specific flags need to be prefixed with -Wl, to work.
-LDFLAGS.${TARGET}
+LDFLAGS.${.TARGET:T}
Flags dependent on output file name.
LIBADD Additional libraries. This is for base system libraries
and is only valid inside of the /usr/src tree.
Use LIBADD=name instead of LDADD=-lname.
-LIBADD.${TARGET}
+LIBADD.${.TARGET:T}
Libraries dependent on output file name.
LINKS The list of binary links; should be full pathnames, the
diff --git a/share/mk/bsd.clang-analyze.mk b/share/mk/bsd.clang-analyze.mk
index 5dee8d24fa81..474d2d1e8166 100644
--- a/share/mk/bsd.clang-analyze.mk
+++ b/share/mk/bsd.clang-analyze.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Support Clang static analyzer on SRCS.
#
diff --git a/share/mk/bsd.compat.mk b/share/mk/bsd.compat.mk
index e99281775b84..c41cfda5f01c 100644
--- a/share/mk/bsd.compat.mk
+++ b/share/mk/bsd.compat.mk
@@ -1,11 +1,14 @@
-# $FreeBSD$
.if !targets(__<${_this:T}>__)
__<${_this:T}>__:
-.if defined(_LIBCOMPAT)
+.include <bsd.compat.pre.mk>
+
+.if defined(_LIBCOMPATS)
COMPAT_ARCH?= ${TARGET_ARCH}
-COMPAT_CPUTYPE?= ${CPUTYPE_${_LIBCOMPAT}}
+.for _LIBCOMPAT in ${_ALL_LIBCOMPATS}
+LIB${_LIBCOMPAT}CPUTYPE?= ${CPUTYPE_${_LIBCOMPAT}}
+.endfor
.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
(defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
COMPAT_COMPILER_TYPE= gcc
@@ -14,58 +17,71 @@ COMPAT_COMPILER_TYPE= clang
.endif
.else
COMPAT_ARCH= ${MACHINE_ARCH}
-COMPAT_CPUTYPE= ${CPUTYPE}
-.include <bsd.compiler.mk>
-COMPAT_COMPILER_TYPE=${COMPILER_TYPE}
+.for _LIBCOMPAT in ${_ALL_LIBCOMPATS}
+LIB${_LIBCOMPAT}CPUTYPE= ${CPUTYPE}
+.endfor
.endif
# -------------------------------------------------------------------
# 32 bit world
.if ${COMPAT_ARCH} == "amd64"
-HAS_COMPAT=32
-.if empty(COMPAT_CPUTYPE)
+HAS_COMPAT+= 32
+.if empty(LIB32CPUTYPE)
LIB32CPUFLAGS= -march=i686 -mmmx -msse -msse2
.else
-LIB32CPUFLAGS= -march=${COMPAT_CPUTYPE}
-.endif
-.if ${COMPAT_COMPILER_TYPE} == gcc
-.else
-LIB32CPUFLAGS+= -target x86_64-unknown-freebsd${OS_REVISION}
+LIB32CPUFLAGS= -march=${LIB32CPUTYPE}
.endif
+LIB32CPUFLAGS.clang+= -target x86_64-unknown-freebsd${OS_REVISION}
LIB32CPUFLAGS+= -m32
LIB32_MACHINE= i386
LIB32_MACHINE_ARCH= i386
LIB32WMAKEENV= MACHINE_CPU="i686 mmx sse sse2"
LIB32WMAKEFLAGS= \
- AS="${XAS} --32" \
LD="${XLD} -m elf_i386_fbsd"
.elif ${COMPAT_ARCH} == "powerpc64"
-HAS_COMPAT=32
-.if empty(COMPAT_CPUTYPE)
+HAS_COMPAT+= 32
+.if empty(LIB32CPUTYPE)
LIB32CPUFLAGS= -mcpu=powerpc
.else
-LIB32CPUFLAGS= -mcpu=${COMPAT_CPUTYPE}
+LIB32CPUFLAGS= -mcpu=${LIB32CPUTYPE}
.endif
-.if ${COMPAT_COMPILER_TYPE} == "gcc"
-LIB32CPUFLAGS+= -m32
-.else
-LIB32CPUFLAGS+= -target powerpc-unknown-freebsd${OS_REVISION}
-.endif
+LIB32CPUFLAGS.gcc+= -m32
+LIB32CPUFLAGS.clang+= -target powerpc-unknown-freebsd${OS_REVISION}
LIB32_MACHINE= powerpc
LIB32_MACHINE_ARCH= powerpc
LIB32WMAKEFLAGS= \
LD="${XLD} -m elf32ppc_fbsd"
+
+.elif ${COMPAT_ARCH} == "aarch64"
+HAS_COMPAT+= 32
+.if empty(LIB32CPUTYPE)
+LIB32CPUFLAGS= -march=armv7
+.else
+LIB32CPUFLAGS= -mcpu=${LIB32CPUTYPE}
+.endif
+
+LIB32CPUFLAGS+= -m32
+LIB32CPUFLAGS.clang+= -target armv7-unknown-freebsd${OS_REVISION}-gnueabihf
+
+LIB32_MACHINE= arm
+LIB32_MACHINE_ARCH= armv7
+LIB32WMAKEFLAGS= \
+ LD="${XLD} -m armelf_fbsd"
.endif
LIB32WMAKEFLAGS+= NM="${XNM}"
LIB32WMAKEFLAGS+= OBJCOPY="${XOBJCOPY}"
-LIB32CFLAGS= -DCOMPAT_32BIT
LIB32DTRACE= ${DTRACE} -32
-LIB32WMAKEFLAGS+= -DCOMPAT_32BIT
+LIB32_MACHINE_ABI= ${MACHINE_ABI:N*64} long32 ptr32
+.if ${COMPAT_ARCH} == "amd64"
+LIB32_MACHINE_ABI+= time32
+.else
+LIB32_MACHINE_ABI+= time64
+.endif
# -------------------------------------------------------------------
# In the program linking case, select LIBCOMPAT
@@ -84,49 +100,83 @@ WANT_COMPAT:= ${NEED_COMPAT}
.if defined(HAS_COMPAT) && defined(WANT_COMPAT)
.if ${WANT_COMPAT} == "any"
-_LIBCOMPAT:= ${HAS_COMPAT:[1]}
+USE_COMPAT:= ${HAS_COMPAT:[1]}
.else
-_LIBCOMPAT:= ${WANT_COMPAT}
+USE_COMPAT:= ${WANT_COMPAT}
.endif
+
+_LIBCOMPATS= ${USE_COMPAT}
.endif
-# -------------------------------------------------------------------
-# Generic code for each type.
-# Set defaults based on type.
-libcompat= ${_LIBCOMPAT:tl}
-_LIBCOMPAT_MAKEVARS= _OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS LDFLAGS \
- _MACHINE _MACHINE_ARCH WMAKEENV WMAKEFLAGS WMAKE
+libcompats= ${_LIBCOMPATS:tl}
+
+# Update MACHINE and MACHINE_ARCH so they can be used in bsd.opts.mk via
+# bsd.compiler.mk
+.if defined(USE_COMPAT)
+_LIBCOMPAT_MAKEVARS= _MACHINE _MACHINE_ARCH
.for _var in ${_LIBCOMPAT_MAKEVARS}
-.if !empty(LIB${_LIBCOMPAT}${_var})
-LIBCOMPAT${_var}?= ${LIB${_LIBCOMPAT}${_var}}
+.if !empty(LIB${USE_COMPAT}${_var})
+LIBCOMPAT${_var}?= ${LIB${USE_COMPAT}${_var}}
.endif
.endfor
+MACHINE= ${LIBCOMPAT_MACHINE}
+MACHINE_ARCH= ${LIBCOMPAT_MACHINE_ARCH}
+.endif
+
+.if !defined(COMPAT_COMPILER_TYPE)
+.include <bsd.compiler.mk>
+COMPAT_COMPILER_TYPE=${COMPILER_TYPE}
+.endif
+
+# -------------------------------------------------------------------
+# Generic code for each type.
+# Set defaults based on type.
+.for _LIBCOMPAT _libcompat in ${_LIBCOMPATS:@v@${v} ${v:tl}@}
+WORLDTMP?= ${SYSROOT}
+
# Shared flags
-LIBCOMPAT_OBJTOP?= ${OBJTOP}/obj-lib${libcompat}
-LIBCOMPATTMP?= ${LIBCOMPAT_OBJTOP}/tmp
+LIB${_LIBCOMPAT}_OBJTOP?= ${OBJTOP}/obj-lib${_libcompat}
+
+LIB${_LIBCOMPAT}CFLAGS+= ${LIB${_LIBCOMPAT}CPUFLAGS} \
+ ${LIB${_LIBCOMPAT}CPUFLAGS.${COMPAT_COMPILER_TYPE}} \
+ -DCOMPAT_LIBCOMPAT=\"${_LIBCOMPAT}\" \
+ -DCOMPAT_libcompat=\"${_libcompat}\" \
+ -DCOMPAT_LIB${_LIBCOMPAT} \
+ --sysroot=${WORLDTMP} \
+ ${BFLAGS}
-LIBCOMPATCFLAGS+= ${LIBCOMPATCPUFLAGS} \
- --sysroot=${LIBCOMPATTMP} \
- ${BFLAGS}
+LIB${_LIBCOMPAT}LDFLAGS+= -L${WORLDTMP}/usr/lib${_libcompat}
-LIBCOMPATLDFLAGS+= -L${LIBCOMPATTMP}/usr/lib${libcompat}
+LIB${_LIBCOMPAT}WMAKEFLAGS+= COMPAT_LIBCOMPAT=${_LIBCOMPAT} \
+ COMPAT_libcompat=${_libcompat}
-LIBCOMPATWMAKEENV+= MACHINE=${LIBCOMPAT_MACHINE}
-LIBCOMPATWMAKEENV+= MACHINE_ARCH=${LIBCOMPAT_MACHINE_ARCH}
+LIB${_LIBCOMPAT}WMAKEENV+= MACHINE=${LIB${_LIBCOMPAT}_MACHINE}
+LIB${_LIBCOMPAT}WMAKEENV+= MACHINE_ARCH=${LIB${_LIBCOMPAT}_MACHINE_ARCH}
# -B is needed to find /usr/lib32/crti.o for gcc.
-LIBCOMPATCFLAGS+= -B${LIBCOMPATTMP}/usr/lib${libcompat}
+LIB${_LIBCOMPAT}CFLAGS+= -B${WORLDTMP}/usr/lib${_libcompat}
+.endfor
+
+.if defined(USE_COMPAT)
+LIB${USE_COMPAT}CPUFLAGS+= ${LIB${USE_COMPAT}CPUFLAGS.${COMPAT_COMPILER_TYPE}}
+
+libcompat= ${USE_COMPAT:tl}
+
+_LIBCOMPAT_MAKEVARS= _OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS LDFLAGS \
+ _MACHINE_ABI \
+ WMAKEENV WMAKEFLAGS WMAKE WORLDTMP
+.for _var in ${_LIBCOMPAT_MAKEVARS}
+.if !empty(LIB${USE_COMPAT}${_var})
+LIBCOMPAT${_var}?= ${LIB${USE_COMPAT}${_var}}
+.endif
+.endfor
-.if defined(WANT_COMPAT)
LIBDIR_BASE:= /usr/lib${libcompat}
+LIBDATADIR:= /usr/lib${libcompat}
_LIB_OBJTOP= ${LIBCOMPAT_OBJTOP}
-LIBDESTDIR:= ${LIBCOMPATTMP}
-SYSROOT:= ${LIBCOMPATTMP}
CFLAGS+= ${LIBCOMPATCFLAGS}
LDFLAGS+= ${CFLAGS} ${LIBCOMPATLDFLAGS}
-MACHINE= ${LIBCOMPAT_MACHINE}
-MACHINE_ARCH= ${LIBCOMPAT_MACHINE_ARCH}
.endif
.endif
diff --git a/share/mk/bsd.compat.pre.mk b/share/mk/bsd.compat.pre.mk
new file mode 100644
index 000000000000..05bdcb8a9f45
--- /dev/null
+++ b/share/mk/bsd.compat.pre.mk
@@ -0,0 +1,13 @@
+.if !targets(__<${_this:T}>__)
+__<${_this:T}>__:
+
+_ALL_LIBCOMPATS:= 32
+
+_ALL_libcompats:= ${_ALL_LIBCOMPATS:tl}
+
+# List of LIBCOMPAT libcompat pairs to avoid repeating this ugly expression.
+# Can be used as: .for LIBCOMPAT libcompat in ${_ALL_LIBCOMPATS_libcompats}
+_ALL_LIBCOMPATS_libcompats:= \
+ ${_ALL_LIBCOMPATS:range:@i@${_ALL_LIBCOMPATS:[$i]} ${_ALL_libcompats:[$i]}@}
+
+.endif
diff --git a/share/mk/bsd.compiler.mk b/share/mk/bsd.compiler.mk
index c8fb9e1ba4a8..fd236b2e6b8f 100644
--- a/share/mk/bsd.compiler.mk
+++ b/share/mk/bsd.compiler.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# Setup variables for the compiler
#
@@ -235,8 +234,16 @@ ${X_}COMPILER_FEATURES+= c++11 c++14
(${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 70000)
${X_}COMPILER_FEATURES+= c++17
.endif
+.if (${${X_}COMPILER_TYPE} == "clang" && ${${X_}COMPILER_VERSION} >= 100000) || \
+ (${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 100100)
+${X_}COMPILER_FEATURES+= c++20
+.endif
+.if ${${X_}COMPILER_TYPE} == "clang" || \
+ (${${X_}COMPILER_TYPE} == "gcc" && ${${X_}COMPILER_VERSION} >= 120000)
+${X_}COMPILER_FEATURES+= init-all
+.endif
.if ${${X_}COMPILER_TYPE} == "clang"
-${X_}COMPILER_FEATURES+= retpoline init-all
+${X_}COMPILER_FEATURES+= retpoline
# PR257638 lld fails with BE compressed debug. Fixed in main but external tool
# chains will initially not have the fix. For now limit the feature to LE
# targets.
diff --git a/share/mk/bsd.confs.mk b/share/mk/bsd.confs.mk
index eb87ba49caa9..c4fb62782b75 100644
--- a/share/mk/bsd.confs.mk
+++ b/share/mk/bsd.confs.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<bsd.init.mk>__)
. error bsd.conf.mk cannot be included directly.
@@ -135,8 +134,10 @@ _${group}INS_${cnf:T}: ${cnf}
.if ${MK_STAGING} != "no"
. if !empty(STAGE_SETS)
buildconfig: stage_files
+stage_files:
. if !empty(STAGE_AS_SETS)
buildconfig: stage_as
+stage_as:
. endif
. endif
.endif
diff --git a/share/mk/bsd.cpu.mk b/share/mk/bsd.cpu.mk
index 610f45969b4d..730e4b4aa152 100644
--- a/share/mk/bsd.cpu.mk
+++ b/share/mk/bsd.cpu.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# Set default CPU compile flags and baseline CPUTYPE for each arch. The
# compile flags must support the minimum CPU type for each architecture but
@@ -14,8 +13,12 @@ MACHINE_CPU = amd64 sse2 sse mmx
MACHINE_CPU = arm
. elif ${MACHINE_CPUARCH} == "i386"
MACHINE_CPU = i486
-. elif ${MACHINE_CPUARCH} == "powerpc"
+. elif ${MACHINE_ARCH} == "powerpc"
MACHINE_CPU = aim
+. elif ${MACHINE_ARCH} == "powerpc64"
+MACHINE_CPU = aim altivec
+. elif ${MACHINE_ARCH} == "powerpc64le"
+MACHINE_CPU = aim altivec vsx vsx2
. elif ${MACHINE_CPUARCH} == "riscv"
MACHINE_CPU = riscv
. endif
@@ -103,9 +106,9 @@ _CPUCFLAGS = -march=armv5te -D__XSCALE__
_CPUCFLAGS = -mfloat-abi=softfp
. elif ${CPUTYPE} == "cortexa"
_CPUCFLAGS = -march=armv7 -mfpu=vfp
-. elif ${CPUTYPE:Marmv[4567]*} != ""
+. elif ${CPUTYPE:Marmv[67]*} != ""
# Handle all the armvX types that FreeBSD runs:
-# armv4, armv4t, armv5, armv5te, armv6, armv6t2, armv7, armv7-a, armv7ve
+# armv6, armv6t2, armv7, armv7-a, armv7ve
# they require -march=. All the others require -mcpu=.
_CPUCFLAGS = -march=${CPUTYPE}
. else
@@ -125,7 +128,7 @@ _CPUCFLAGS = -mcpu=${CPUTYPE}
. if ${CPUTYPE} == "e500"
_CPUCFLAGS = -Wa,-me500 -msoft-float
. else
-_CPUCFLAGS = -mcpu=${CPUTYPE} -mno-powerpc64
+_CPUCFLAGS = -mcpu=${CPUTYPE}
. endif
. elif ${MACHINE_ARCH:Mpowerpc64*} != ""
_CPUCFLAGS = -mcpu=${CPUTYPE}
@@ -145,16 +148,19 @@ _CPUCFLAGS = -mcpu=${CPUTYPE}
########## i386
. if ${MACHINE_CPUARCH} == "i386"
-. if ${CPUTYPE} == "znver3" || ${CPUTYPE} == "znver2" || \
+. if ${CPUTYPE} == "znver4"
+MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586 f16c
+. elif ${CPUTYPE} == "znver3" || ${CPUTYPE} == "znver2" || \
${CPUTYPE} == "znver1"
-MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586
+MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586 f16c
. elif ${CPUTYPE} == "bdver4"
-MACHINE_CPU = xop avx2 avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586
-. elif ${CPUTYPE} == "bdver3" || ${CPUTYPE} == "bdver2" || \
- ${CPUTYPE} == "bdver1"
+MACHINE_CPU = xop avx2 avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586 f16c
+. elif ${CPUTYPE} == "bdver3" || ${CPUTYPE} == "bdver2"
+MACHINE_CPU = xop avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586 f16c
+. elif ${CPUTYPE} == "bdver1"
MACHINE_CPU = xop avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586
. elif ${CPUTYPE} == "btver2"
-MACHINE_CPU = avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586
+MACHINE_CPU = avx sse42 sse41 ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586 f16c
. elif ${CPUTYPE} == "btver1"
MACHINE_CPU = ssse3 sse4a sse3 sse2 sse mmx k6 k5 i586
. elif ${CPUTYPE} == "amdfam10"
@@ -181,12 +187,14 @@ MACHINE_CPU = k5 i586
${CPUTYPE} == "cannonlake" || ${CPUTYPE} == "knm" || \
${CPUTYPE} == "skylake-avx512" || ${CPUTYPE} == "knl" || \
${CPUTYPE} == "x86-64-v4"
-MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586
+MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586 f16c
. elif ${CPUTYPE} == "alderlake" || ${CPUTYPE} == "skylake" || \
${CPUTYPE} == "broadwell" || ${CPUTYPE} == "haswell" || \
${CPUTYPE} == "x86-64-v3"
-MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586
-. elif ${CPUTYPE} == "ivybridge" || ${CPUTYPE} == "sandybridge"
+MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586 f16c
+. elif ${CPUTYPE} == "ivybridge"
+MACHINE_CPU = avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586 f16c
+. elif ${CPUTYPE} == "sandybridge"
MACHINE_CPU = avx sse42 sse41 ssse3 sse3 sse2 sse i686 mmx i586
. elif ${CPUTYPE} == "tremont" || ${CPUTYPE} == "goldmont-plus" || \
${CPUTYPE} == "goldmont" || ${CPUTYPE} == "westmere" || \
@@ -226,16 +234,19 @@ MACHINE_CPU = mmx
MACHINE_CPU += i486
########## amd64
. elif ${MACHINE_CPUARCH} == "amd64"
-. if ${CPUTYPE} == "znver3" || ${CPUTYPE} == "znver2" || \
+. if ${CPUTYPE} == "znver4"
+MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse4a sse3 f16c
+. elif ${CPUTYPE} == "znver3" || ${CPUTYPE} == "znver2" || \
${CPUTYPE} == "znver1"
-MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse4a sse3
+MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse4a sse3 f16c
. elif ${CPUTYPE} == "bdver4"
-MACHINE_CPU = xop avx2 avx sse42 sse41 ssse3 sse4a sse3
-. elif ${CPUTYPE} == "bdver3" || ${CPUTYPE} == "bdver2" || \
- ${CPUTYPE} == "bdver1"
+MACHINE_CPU = xop avx2 avx sse42 sse41 ssse3 sse4a sse3 f16c
+. elif ${CPUTYPE} == "bdver3" || ${CPUTYPE} == "bdver2"
+MACHINE_CPU = xop avx sse42 sse41 ssse3 sse4a sse3 f16c
+. elif ${CPUTYPE} == "bdver1"
MACHINE_CPU = xop avx sse42 sse41 ssse3 sse4a sse3
. elif ${CPUTYPE} == "btver2"
-MACHINE_CPU = avx sse42 sse41 ssse3 sse4a sse3
+MACHINE_CPU = avx sse42 sse41 ssse3 sse4a sse3 f16c
. elif ${CPUTYPE} == "btver1"
MACHINE_CPU = ssse3 sse4a sse3
. elif ${CPUTYPE} == "amdfam10"
@@ -252,12 +263,14 @@ MACHINE_CPU = k8 3dnow
${CPUTYPE} == "cannonlake" || ${CPUTYPE} == "knm" || \
${CPUTYPE} == "skylake-avx512" || ${CPUTYPE} == "knl" || \
${CPUTYPE} == "x86-64-v4"
-MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse3
+MACHINE_CPU = avx512 avx2 avx sse42 sse41 ssse3 sse3 f16c
. elif ${CPUTYPE} == "alderlake" || ${CPUTYPE} == "skylake" || \
${CPUTYPE} == "broadwell" || ${CPUTYPE} == "haswell" || \
${CPUTYPE} == "x86-64-v3"
-MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3
-. elif ${CPUTYPE} == "ivybridge" || ${CPUTYPE} == "sandybridge"
+MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3 f16c
+. elif ${CPUTYPE} == "ivybridge"
+MACHINE_CPU = avx sse42 sse41 ssse3 sse3 f16c
+. elif ${CPUTYPE} == "sandybridge"
MACHINE_CPU = avx sse42 sse41 ssse3 sse3
. elif ${CPUTYPE} == "tremont" || ${CPUTYPE} == "goldmont-plus" || \
${CPUTYPE} == "goldmont" || ${CPUTYPE} == "westmere" || \
@@ -276,6 +289,27 @@ MACHINE_CPU += amd64 sse2 sse mmx
. elif ${MACHINE_ARCH} == "powerpc"
. if ${CPUTYPE} == "e500"
MACHINE_CPU = booke softfp
+. elif ${CPUTYPE} == "g4"
+MACHINE_CPU = aim altivec
+. else
+MACHINE_CPU= aim
+. endif
+. elif ${MACHINE_ARCH} == "powerpc64"
+. if ${CPUTYPE} == "e5500"
+MACHINE_CPU = booke
+. elif ${CPUTYPE} == power7
+MACHINE_CPU = altivec vsx
+. elif ${CPUTYPE} == power8
+MACHINE_CPU = altivec vsx vsx2
+. elif ${CPUTYPE} == power9
+MACHINE_CPU = altivec vsx vsx2 vsx3
+. else
+MACHINE_CPU = aim altivec
+. endif
+. elif ${MACHINE_ARCH} == "powerpc64le"
+MACHINE_CPU = aim altivec vsx vsx2
+. if ${CPUTYPE} == power9
+MACHINE_CPU += vsx3
. endif
########## riscv
. elif ${MACHINE_CPUARCH} == "riscv"
@@ -292,17 +326,11 @@ MACHINE_CPU += armv6
. if ${MACHINE_ARCH:Marmv7*} != ""
MACHINE_CPU += armv7
. endif
-# armv6 and armv7 are a hybrid. It can use the softfp ABI, but doesn't emulate
-# floating point in the general case, so don't define softfp for it at this
-# time. arm is pure softfp, so define it for them.
-. if ${MACHINE_ARCH:Marmv[67]*} == ""
-MACHINE_CPU += softfp
-. endif
# Normally armv6 and armv7 are hard float ABI from FreeBSD 11 onwards. However
# when CPUTYPE has 'soft' in it, we use the soft-float ABI to allow building of
# soft-float ABI libraries. In this case, we have to add the -mfloat-abi=softfp
# to force that.
-. if ${MACHINE_ARCH:Marmv[67]*} && defined(CPUTYPE) && ${CPUTYPE:M*soft*} != ""
+. if defined(CPUTYPE) && ${CPUTYPE:M*soft*} != ""
# Needs to be CFLAGS not _CPUCFLAGS because it's needed for the ABI
# not a nice optimization. Please note: softfp ABI uses hardware floating
# instructions, but passes arguments to function calls in integer regsiters.
@@ -323,12 +351,8 @@ CFLAGS.gcc+= -mabi=spe -mfloat-gprs=double -Wa,-me500
.endif
.if ${MACHINE_CPUARCH} == "riscv"
-.if ${MACHINE_ARCH:Mriscv*sf}
-CFLAGS += -march=rv64imac -mabi=lp64
-.else
CFLAGS += -march=rv64imafdc -mabi=lp64d
.endif
-.endif
# NB: COPTFLAGS is handled in /usr/src/sys/conf/kern.pre.mk
@@ -362,3 +386,40 @@ CFLAGS_NO_SIMD += ${CFLAGS_NO_SIMD.${COMPILER_TYPE}}
CFLAGS += ${CFLAGS.${MACHINE_ARCH}}
CXXFLAGS += ${CXXFLAGS.${MACHINE_ARCH}}
+#
+# MACHINE_ABI is a list of properties about the ABI used for MACHINE_ARCH.
+# The following properties are indicated with one of the follow values:
+#
+# Byte order: big-endian, little-endian
+# Floating point ABI: soft-float, hard-float
+# Size of long (size_t, etc): long32, long64
+# Pointer type: ptr32, ptr64
+# Size of time_t: time32, time64
+#
+.if (${MACHINE} == "arm" && (defined(CPUTYPE) && ${CPUTYPE:M*soft*})) || \
+ (${MACHINE_ARCH} == "powerpc" && (defined(CPUTYPE) && ${CPUTYPE} == "e500"))
+MACHINE_ABI+= soft-float
+.else
+MACHINE_ABI+= hard-float
+.endif
+# Currently all 64-bit architectures include 64 in their name (see arch(7)).
+.if ${MACHINE_ARCH:M*64*}
+MACHINE_ABI+= long64
+.else
+MACHINE_ABI+= long32
+.endif
+.if ${MACHINE_ABI:Mlong64}
+MACHINE_ABI+= ptr64
+.else
+MACHINE_ABI+= ptr32
+.endif
+.if ${MACHINE_ARCH} == "i386"
+MACHINE_ABI+= time32
+.else
+MACHINE_ABI+= time64
+.endif
+.if ${MACHINE_ARCH:Mpowerpc*} && !${MACHINE_ARCH:M*le}
+MACHINE_ABI+= big-endian
+.else
+MACHINE_ABI+= little-endian
+.endif
diff --git a/share/mk/bsd.crunchgen.mk b/share/mk/bsd.crunchgen.mk
index 6d775ce9af05..bdbb6c5a22b0 100644
--- a/share/mk/bsd.crunchgen.mk
+++ b/share/mk/bsd.crunchgen.mk
@@ -18,6 +18,7 @@
# CRUNCH_SRCDIR_${P}: base source directory for program ${P}
# CRUNCH_BUILDOPTS_${P}: additional build options for ${P}
# CRUNCH_ALIAS_${P}: additional names to be used for ${P}
+# CRUNCH_KEEP_${P}: additional symbols to keep for ${P}
#
# By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P}
# will be used to generate a hard link to the resulting binary.
@@ -27,8 +28,6 @@
# If CRUNCH_GENERATE_LINKS is set to no, no links will be generated.
#
-# $FreeBSD$
-
##################################################################
# The following is pretty nearly a generic crunchgen-handling makefile
#
@@ -103,6 +102,9 @@ ${CONF}: Makefile
.ifdef CRUNCH_LIBS_${P}
echo special ${P} lib ${CRUNCH_LIBS_${P}} >>${.TARGET}
.endif
+.ifdef CRUNCH_KEEP_${P}
+ echo special ${P} keep ${CRUNCH_KEEP_${P}} >>${.TARGET}
+.endif
.for A in ${CRUNCH_ALIAS_${P}}
echo ln ${P} ${A} >>${.TARGET}
.endfor
diff --git a/share/mk/bsd.dep.mk b/share/mk/bsd.dep.mk
index 105a724ebd5b..4f182eff78b8 100644
--- a/share/mk/bsd.dep.mk
+++ b/share/mk/bsd.dep.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <bsd.dep.mk> handles Makefile dependencies.
#
diff --git a/share/mk/bsd.dirs.mk b/share/mk/bsd.dirs.mk
index fc51bf5fb711..8e090d3f2cbd 100644
--- a/share/mk/bsd.dirs.mk
+++ b/share/mk/bsd.dirs.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Directory permissions management.
diff --git a/share/mk/bsd.doc.mk b/share/mk/bsd.doc.mk
index 725b8033444c..ea8c68e87d50 100644
--- a/share/mk/bsd.doc.mk
+++ b/share/mk/bsd.doc.mk
@@ -1,6 +1,3 @@
-# from: @(#)bsd.doc.mk 5.3 (Berkeley) 1/2/91
-# $FreeBSD$
-#
# The include file <bsd.doc.mk> handles installing BSD troff documents.
#
#
diff --git a/share/mk/bsd.dtb.mk b/share/mk/bsd.dtb.mk
index 69f65015201e..cfaf2e20c046 100644
--- a/share/mk/bsd.dtb.mk
+++ b/share/mk/bsd.dtb.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.include <bsd.sysdir.mk>
.include "${SYSDIR}/conf/dtb.mk"
diff --git a/share/mk/bsd.endian.mk b/share/mk/bsd.endian.mk
index e6151eebfa8f..ba662ffc7439 100644
--- a/share/mk/bsd.endian.mk
+++ b/share/mk/bsd.endian.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if ${MACHINE_CPUARCH} == "aarch64" || \
${MACHINE_CPUARCH} == "arm" || \
diff --git a/share/mk/bsd.files.mk b/share/mk/bsd.files.mk
index a327d142662c..517ecd44f2f3 100644
--- a/share/mk/bsd.files.mk
+++ b/share/mk/bsd.files.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<bsd.init.mk>__)
.error bsd.files.mk cannot be included directly.
@@ -39,7 +38,7 @@ ${group}DIR?= BINDIR
STAGE_SETS+= ${group:C,[/*],_,g}
.if ${group} == "FILES"
-FILESPACKAGE= ${PACKAGE:Uutilities}
+FILESPACKAGE?= ${PACKAGE:Uutilities}
.endif
.if defined(NO_ROOT)
@@ -116,7 +115,7 @@ stage_as.${${_${group}DIR_${file}}:C,[/*],_,g}: ${file}
installfiles-${group}: _${group}INS_${file}
_${group}INS_${file}: ${file} installdirs-${_${group}DIR_${file}}
- ${INSTALL} ${${group}TAG_ARGS} -o ${${group}OWN_${file}} \
+ ${INSTALL} -C ${${group}TAG_ARGS} -o ${${group}OWN_${file}} \
-g ${${group}GRP_${file}} -m ${${group}MODE_${file}} \
${.ALLSRC:Ninstalldirs-*} ${${group}PREFIX_${file}}/${${group}NAME_${file}}
.endfor # file in ${${group}}
diff --git a/share/mk/bsd.incs.mk b/share/mk/bsd.incs.mk
index 1492c07ca6be..df4cf4641141 100644
--- a/share/mk/bsd.incs.mk
+++ b/share/mk/bsd.incs.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<bsd.init.mk>__)
.error bsd.incs.mk cannot be included directly.
diff --git a/share/mk/bsd.info.mk b/share/mk/bsd.info.mk
index eeb0da32362b..819c8cf4d864 100644
--- a/share/mk/bsd.info.mk
+++ b/share/mk/bsd.info.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <bsd.info.mk> handles installing GNU (tech)info files.
# Texinfo is a documentation system that uses a single source
diff --git a/share/mk/bsd.init.mk b/share/mk/bsd.init.mk
index 30eeb0b2a15b..64fdd23ce7ad 100644
--- a/share/mk/bsd.init.mk
+++ b/share/mk/bsd.init.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# The include file <bsd.init.mk> includes <bsd.opts.mk>,
# ../Makefile.inc and <bsd.own.mk>; this is used at the
diff --git a/share/mk/bsd.kmod.mk b/share/mk/bsd.kmod.mk
index 683967749e75..0acf07c54b15 100644
--- a/share/mk/bsd.kmod.mk
+++ b/share/mk/bsd.kmod.mk
@@ -1,4 +1,5 @@
-# $FreeBSD$
+
+.-include <local.kmod.mk>
.include <bsd.sysdir.mk>
.include "${SYSDIR}/conf/kmod.mk"
diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk
index 5c7b73c5a8a9..575b521bea55 100644
--- a/share/mk/bsd.lib.mk
+++ b/share/mk/bsd.lib.mk
@@ -1,10 +1,8 @@
-# from: @(#)bsd.lib.mk 5.26 (Berkeley) 5/2/91
-# $FreeBSD$
-#
.include <bsd.init.mk>
.include <bsd.compiler.mk>
.include <bsd.linker.mk>
+.include <bsd.compat.pre.mk>
__<bsd.lib.mk>__:
@@ -64,9 +62,11 @@ CTFFLAGS+= -g
STRIP?= -s
.endif
-.if ${SHLIBDIR:M*lib32*}
-TAGS+= lib32
+.for _libcompat in ${_ALL_libcompats}
+.if ${SHLIBDIR:M*/lib${_libcompat}} || ${SHLIBDIR:M*/lib${_libcompat}/*}
+TAGS+= lib${_libcompat}
.endif
+.endfor
.if defined(NO_ROOT)
.if !defined(TAGS) || ! ${TAGS:Mpackage=*}
@@ -79,6 +79,13 @@ TAG_ARGS= -T ${TAGS:[*]:S/ /,/g}
.if ${MK_BIND_NOW} != "no"
LDFLAGS+= -Wl,-znow
.endif
+.if ${LINKER_TYPE} != "mac"
+.if ${MK_RELRO} == "no"
+LDFLAGS+= -Wl,-znorelro
+.else
+LDFLAGS+= -Wl,-zrelro
+.endif
+.endif
.if ${MK_RETPOLINE} != "no"
.if ${COMPILER_FEATURES:Mretpoline} && ${LINKER_FEATURES:Mretpoline}
CFLAGS+= -mretpoline
@@ -88,23 +95,26 @@ LDFLAGS+= -Wl,-zretpolineplt
.warning Retpoline requested but not supported by compiler or linker
.endif
.endif
+# LLD sensibly defaults to -znoexecstack, so do the same for BFD
+LDFLAGS.bfd+= -Wl,-znoexecstack
+.if ${MK_BRANCH_PROTECTION} != "no"
+CFLAGS+= -mbranch-protection=standard
+.if ${MACHINE_ARCH} == "aarch64" && defined(BTI_REPORT_ERROR)
+LDFLAGS+= -Wl,-zbti-report=error
+.endif
+.endif
# Initialize stack variables on function entry
-.if ${MK_INIT_ALL_ZERO} == "yes"
+.if ${OPT_INIT_ALL} != "none"
.if ${COMPILER_FEATURES:Minit-all}
-CFLAGS+= -ftrivial-auto-var-init=zero \
- -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
-CXXFLAGS+= -ftrivial-auto-var-init=zero \
- -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
-.else
-.warning InitAll (zeros) requested but not support by compiler
+CFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL}
+CXXFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL}
+.if ${OPT_INIT_ALL} == "zero" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 160000
+CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
+CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
.endif
-.elif ${MK_INIT_ALL_PATTERN} == "yes"
-.if ${COMPILER_FEATURES:Minit-all}
-CFLAGS+= -ftrivial-auto-var-init=pattern
-CXXFLAGS+= -ftrivial-auto-var-init=pattern
.else
-.warning InitAll (pattern) requested but not support by compiler
+.warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler
.endif
.endif
@@ -183,7 +193,7 @@ PO_FLAG=-pg
${CTFCONVERT_CMD}
.s.po .s.pico .s.nossppico .s.pieo:
- ${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
+ ${CC:N${CCACHE_BIN}} -x assembler ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
${CTFCONVERT_CMD}
.asm.po:
@@ -255,6 +265,15 @@ SHLIB_NAME_FULL=${SHLIB_NAME}
.if !empty(VERSION_MAP)
${SHLIB_NAME_FULL}: ${VERSION_MAP}
LDFLAGS+= -Wl,--version-script=${VERSION_MAP}
+
+# Ideally we'd always enable --no-undefined-version (default for lld >= 16),
+# but we have several symbols in our version maps that may or may not exist,
+# depending on compile-time defines and that needs to be handled first.
+.if ${MK_UNDEFINED_VERSION} == "no"
+LDFLAGS+= -Wl,--no-undefined-version
+.else
+LDFLAGS+= -Wl,--undefined-version
+.endif
.endif
.if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME)
@@ -364,7 +383,7 @@ ${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL}
.endif
.endif #defined(SHLIB_NAME)
-.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
+.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
_LIBS+= lib${LIB_PRIVATE}${LIB}_pic.a
lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS}
@@ -423,6 +442,7 @@ _EXTRADEPEND:
.if !target(install)
+INSTALLFLAGS+= -C
.if defined(PRECIOUSLIB)
.if !defined(NO_FSCHG)
SHLINSTALLFLAGS+= -fschg
@@ -463,7 +483,7 @@ installpcfiles: installpcfiles-${pcfile}
installpcfiles-${pcfile}: ${pcfile}
${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} \
- ${.ALLSRC} ${DESTDIR}${LIBDATADIR}/pkgconfig
+ ${.ALLSRC} ${DESTDIR}${LIBDATADIR}/pkgconfig/
.endfor
.endif
installpcfiles: .PHONY
@@ -473,10 +493,10 @@ realinstall: _libinstall installpcfiles
.ORDER: beforeinstall _libinstall
_libinstall:
.if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no"
- ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
+ ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}${_STATICLIB_SUFFIX}.a ${DESTDIR}${_LIBDIR}/
.if ${MK_PROFILE} != "no"
- ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
+ ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}_p.a ${DESTDIR}${_LIBDIR}/
.endif
.endif
@@ -494,7 +514,7 @@ _libinstall:
.endif
.if defined(SHLIB_LINK)
.if commands(${SHLIB_LINK:R}.ld)
- ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
+ ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -S -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} ${SHLIB_LINK:R}.ld \
${DESTDIR}${_LIBDIR}/${SHLIB_LINK}
.for _SHLIB_LINK_LINK in ${SHLIB_LDSCRIPT_LINKS}
@@ -526,7 +546,7 @@ _libinstall:
.endif # SHLIB_LDSCRIPT
.endif # SHLIB_LINK
.endif # SHIB_NAME
-.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
+.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
${INSTALL} ${TAG_ARGS:D${TAG_ARGS},dev} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR}/
.endif
@@ -547,6 +567,7 @@ LINKGRP?= ${LIBGRP}
LINKMODE?= ${LIBMODE}
SYMLINKOWN?= ${LIBOWN}
SYMLINKGRP?= ${LIBGRP}
+LINKTAGS= dev
.include <bsd.links.mk>
.if ${MK_MAN} != "no" && !defined(LIBRARIES_ONLY)
diff --git a/share/mk/bsd.libnames.mk b/share/mk/bsd.libnames.mk
index 45710b203ddc..4177a1ef0e4e 100644
--- a/share/mk/bsd.libnames.mk
+++ b/share/mk/bsd.libnames.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# The include file <bsd.libnames.mk> define library names.
# Other include files (e.g. bsd.prog.mk, bsd.lib.mk) include this
@@ -27,6 +26,7 @@ LIBAVL?= ${LIBDESTDIR}${LIBDIR_BASE}/libavl.a
LIBBE?= ${LIBDESTDIR}${LIBDIR_BASE}/libbe.a
LIBBEGEMOT?= ${LIBDESTDIR}${LIBDIR_BASE}/libbegemot.a
LIBBLACKLIST?= ${LIBDESTDIR}${LIBDIR_BASE}/libblacklist.a
+LIBBLOCKSRUNTIME?= ${LIBDESTDIR}${LIBDIR_BASE}/libBlocksRuntime.a
LIBBLUETOOTH?= ${LIBDESTDIR}${LIBDIR_BASE}/libbluetooth.a
LIBBSDXML?= ${LIBDESTDIR}${LIBDIR_BASE}/libbsdxml.a
LIBBSM?= ${LIBDESTDIR}${LIBDIR_BASE}/libbsm.a
@@ -83,6 +83,7 @@ LIBIBVERBS?= ${LIBDESTDIR}${LIBDIR_BASE}/libibverbs.a
LIBICP?= ${LIBDESTDIR}${LIBDIR_BASE}/libicp.a
LIBIPSEC?= ${LIBDESTDIR}${LIBDIR_BASE}/libipsec.a
LIBIPT?= ${LIBDESTDIR}${LIBDIR_BASE}/libipt.a
+LIBIRDMA?= ${LIBDESTDIR}${LIBDIR_BASE}/libirdma.a
LIBISCSIUTIL?= ${LIBDESTDIR}${LIBDIR_BASE}/libiscsiutil.a
LIBJAIL?= ${LIBDESTDIR}${LIBDIR_BASE}/libjail.a
LIBKADM5CLNT?= ${LIBDESTDIR}${LIBDIR_BASE}/libkadm5clnt.a
@@ -115,7 +116,6 @@ LIBNV?= ${LIBDESTDIR}${LIBDIR_BASE}/libnv.a
LIBNVPAIR?= ${LIBDESTDIR}${LIBDIR_BASE}/libnvpair.a
LIBOPENCSD?= ${LIBDESTDIR}${LIBDIR_BASE}/libopencsd.a
LIBOPENSM?= ${LIBDESTDIR}${LIBDIR_BASE}/libopensm.a
-LIBOPIE?= ${LIBDESTDIR}${LIBDIR_BASE}/libopie.a
LIBOSMCOMP?= ${LIBDESTDIR}${LIBDIR_BASE}/libosmcomp.a
LIBOSMVENDOR?= ${LIBDESTDIR}${LIBDIR_BASE}/libosmvendor.a
LIBPAM?= ${LIBDESTDIR}${LIBDIR_BASE}/libpam.a
@@ -167,13 +167,14 @@ LIBXPG4?= ${LIBDESTDIR}${LIBDIR_BASE}/libxpg4.a
LIBY?= ${LIBDESTDIR}${LIBDIR_BASE}/liby.a
LIBYPCLNT?= ${LIBDESTDIR}${LIBDIR_BASE}/libypclnt.a
LIBZ?= ${LIBDESTDIR}${LIBDIR_BASE}/libz.a
+LIBZDB?= ${LIBDESTDIR}${LIBDIR_BASE}/libzdb.a
LIBZFS?= ${LIBDESTDIR}${LIBDIR_BASE}/libzfs.a
LIBZFS_CORE?= ${LIBDESTDIR}${LIBDIR_BASE}/libzfs_core.a
LIBZFSBOOTENV?= ${LIBDESTDIR}${LIBDIR_BASE}/libzfsbootenv.a
LIBZPOOL?= ${LIBDESTDIR}${LIBDIR_BASE}/libzpool.a
LIBZUTIL?= ${LIBDESTDIR}${LIBDIR_BASE}/libzutil.a
-# enforce the 2 -lpthread and -lc to always be the last in that exact order
+# enforce -lpthread, -lc, and -lsys to always be the last in that exact order
.if defined(LDADD)
.if ${LDADD:M-lpthread}
LDADD:= ${LDADD:N-lpthread} -lpthread
@@ -181,6 +182,9 @@ LDADD:= ${LDADD:N-lpthread} -lpthread
.if ${LDADD:M-lc}
LDADD:= ${LDADD:N-lc} -lc
.endif
+.if ${LDADD:M-lsys}
+LDADD:= ${LDADD:N-lsys} -lsys
+.endif
.endif
# Only do this for src builds.
diff --git a/share/mk/bsd.linker.mk b/share/mk/bsd.linker.mk
index 81275281be34..0e9477284ea3 100644
--- a/share/mk/bsd.linker.mk
+++ b/share/mk/bsd.linker.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# Setup variables for the linker.
#
@@ -79,10 +78,10 @@ ${X_}LINKER_FREEBSD_VERSION:= ${_ld_version:[4]:C/.*-([^-]*)\)/\1/}
.else
${X_}LINKER_FREEBSD_VERSION= 0
.endif
-.elif ${_ld_version:[1]} == "@(\#)PROGRAM:ld"
+.elif ${_ld_version:[1]:S/-classic$//} == "@(\#)PROGRAM:ld"
# bootstrap linker on MacOS
${X_}LINKER_TYPE= mac
-_v= ${_ld_version:[2]:S/PROJECT:ld64-//}
+_v= ${_ld_version:[2]:C/PROJECT:(ld64|dyld)-//}
# Convert version 409.12 to 409.12.0 so that the echo + awk below works
.if empty(_v:M[1-9]*.[0-9]*.[0-9]*) && !empty(_v:M[1-9]*.[0-9]*)
_v:=${_v}.0
diff --git a/share/mk/bsd.links.mk b/share/mk/bsd.links.mk
index fbae4c0f6420..437ffd0d3b34 100644
--- a/share/mk/bsd.links.mk
+++ b/share/mk/bsd.links.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<bsd.init.mk>__)
.error bsd.links.mk cannot be included directly.
@@ -15,8 +14,22 @@ afterinstall: _installlinks
.ORDER: realinstall _installlinks
_installlinks:
.for s t in ${LINKS}
+# On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x.
+.if ${.MAKE.OS} != "Darwin" || ${s:tu} != ${t:tu}
+.if defined(LINKTAGS)
+ ${INSTALL_LINK} ${TAG_ARGS:D${TAG_ARGS},${LINKTAGS}} ${DESTDIR}${s} ${DESTDIR}${t}
+.else
${INSTALL_LINK} ${TAG_ARGS} ${DESTDIR}${s} ${DESTDIR}${t}
+.endif
+.endif
.endfor
.for s t in ${SYMLINKS}
+# On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x.
+.if ${.MAKE.OS} != "Darwin" || ${s:tu} != ${t:tu}
+.if defined(LINKTAGS)
+ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},${LINKTAGS}} ${s} ${DESTDIR}${t}
+.else
${INSTALL_SYMLINK} ${TAG_ARGS} ${s} ${DESTDIR}${t}
+.endif
+.endif
.endfor
diff --git a/share/mk/bsd.man.mk b/share/mk/bsd.man.mk
index 21c5fe4f2424..2845d0c1fc1c 100644
--- a/share/mk/bsd.man.mk
+++ b/share/mk/bsd.man.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <bsd.man.mk> handles installing manual pages and
# their links.
@@ -131,22 +130,6 @@ all-man: ${MAN}
ZEXT= ${MCOMPRESS_EXT}
.if defined(MAN) && !empty(MAN)
-.if ${MK_STAGING_MAN} == "yes"
-STAGE_TARGETS+= stage_files
-_mansets:= ${MAN:E:O:u:M*[1-9]:@s@man$s@}
-STAGE_SETS+= ${_mansets}
-.for _page in ${MAN}
-stage_files.man${_page:T:E}: ${_page}
-STAGE_DIR.man${_page:T:E}?= ${STAGE_OBJTOP}${MANDIR}${_page:T:E}${MANSUBDIR}
-.endfor
-.if !empty(MLINKS)
-STAGE_SETS+= mlinks
-STAGE_TARGETS+= stage_links
-STAGE_LINKS.mlinks:= ${MLINKS:@f@${f:S,^,${MANDIR}${f:E}${MANSUBDIR}/,}@}
-stage_links.mlinks: ${_mansets:@s@stage_files.$s@}
-.endif
-.endif
-
CLEANFILES+= ${MAN:T:S/$/${MCOMPRESS_EXT}/g}
CLEANFILES+= ${MAN:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g}
.for __page in ${MAN}
@@ -186,6 +169,27 @@ _MANLINKS+= ${CATDIR}${_osect}${MANSUBDIR}/${_oname} \
.endfor
.endif
+.if defined(MAN) && !empty(MAN)
+.if ${MK_STAGING_MAN} == "yes"
+STAGE_TARGETS+= stage_files
+_mansets:= ${MAN:E:O:u:M*[1-9]:@s@man$s@}
+STAGE_SETS+= ${_mansets}
+.for _page in ${MAN}
+stage_files.man${_page:T:E}: ${_page}
+.if target(${_page}${MCOMPRESS_EXT})
+stage_files.man${_page:T:E}: ${_page}${MCOMPRESS_EXT}
+.endif
+STAGE_DIR.man${_page:T:E}?= ${STAGE_OBJTOP}${MANDIR}${_page:T:E}${MANSUBDIR}
+.endfor
+.if !defined(NO_MLINKS) && !empty(MLINKS)
+STAGE_SETS+= mlinks
+STAGE_TARGETS+= stage_links
+STAGE_LINKS.mlinks:= ${MLINKS:M*.[1-9]:@f@${f:S,^,${MANDIR}${f:E}${MANSUBDIR}/,}@}
+stage_links.mlinks: ${_mansets:@s@stage_files.$s@}
+.endif
+.endif
+.endif
+
maninstall:
.if defined(MAN) && !empty(MAN)
maninstall: ${MAN}
@@ -230,6 +234,8 @@ maninstall: ${MAN}
.endif # ${MK_MANCOMPRESS} == "no"
.endif
.for l t in ${_MANLINKS}
+# On MacOS, assume case folding FS, and don't install links from foo.x to FOO.x.
+.if ${.MAKE.OS} != "Darwin" || ${l:tu} != ${t:tu}
.if ${MK_MANSPLITPKG} == "no"
rm -f ${DESTDIR}${t} ${DESTDIR}${t}${MCOMPRESS_EXT}; \
${INSTALL_MANLINK} ${TAG_ARGS} ${DESTDIR}${l}${ZEXT} ${DESTDIR}${t}${ZEXT}
@@ -237,6 +243,7 @@ maninstall: ${MAN}
rm -f ${DESTDIR}${t} ${DESTDIR}${t}${MCOMPRESS_EXT}; \
${INSTALL_MANLINK} ${TAG_ARGS:D${TAG_ARGS},man} ${DESTDIR}${l}${ZEXT} ${DESTDIR}${t}${ZEXT}
.endif
+.endif
.endfor
manlint:
diff --git a/share/mk/bsd.mkopt.mk b/share/mk/bsd.mkopt.mk
index 3c6675b402cc..043a41212064 100644
--- a/share/mk/bsd.mkopt.mk
+++ b/share/mk/bsd.mkopt.mk
@@ -1,13 +1,14 @@
#
-# $FreeBSD$
#
# Generic mechanism to deal with WITH and WITHOUT options and turn
-# them into MK_ options.
+# them into MK_ options. Also turn group options into OPT_ options.
#
# For each option FOO in __DEFAULT_YES_OPTIONS, MK_FOO is set to
# "yes", unless WITHOUT_FOO is defined, in which case it is set to
# "no".
#
+# For each option FOO in __REQUIRED_OPTIONS, MK_FOO is set to "yes".
+#
# For each option FOO in __DEFAULT_NO_OPTIONS, MK_FOO is set to "no",
# unless WITH_FOO is defined, in which case it is set to "yes".
#
@@ -30,6 +31,15 @@
# system should use MK_FOO={yes,no} when it needs to override the
# user's desires or default behavior.
#
+# For each option in __SINGLE_OPTIONS, OPT_FOO is set to FOO if
+# defined and __FOO_DEFAULT if not. Valid values for FOO are specified
+# by __FOO_OPTIONS.
+#
+# Other parts of the build system will set BROKEN_SINGLE_OPTIONS to a
+# list of 3-tuples of the form: "OPTION broken_value replacment_value".
+# This will not be unset before returning. Clients are expected to
+# always += this variable.
+#
#
# MK_* options which default to "yes".
@@ -53,6 +63,17 @@ MK_${var}:= yes
.undef __DEFAULT_YES_OPTIONS
#
+# MK_* options which are always yes, typically as a transitional
+# step towards removing the options entirely.
+#
+.for var in ${__REQUIRED_OPTIONS}
+.if defined(WITHOUT_${var})
+.warning WITHOUT_${var} option ignored: it is no longer supported
+.endif
+MK_${var}:= yes
+.endfor
+
+#
# MK_* options which default to "no".
#
.for var in ${__DEFAULT_NO_OPTIONS}
@@ -81,6 +102,33 @@ MK_${var}:= no
MK_${var}:= no
.endfor
+#
+# Group options set an OPT_FOO variable for each option.
+#
+.for opt in ${__SINGLE_OPTIONS}
+.if !defined(__${opt}_OPTIONS) || empty(__${opt}_OPTIONS)
+.error __${opt}_OPTIONS undefined or empty
+.endif
+.if !defined(__${opt}_DEFAULT) || empty(__${opt}_DEFAULT)
+.error __${opt}_DEFAULT undefined or empty
+.endif
+.if defined(${opt})
+OPT_${opt}:= ${${opt}}
+.else
+OPT_${opt}:= ${__${opt}_DEFAULT}
+.endif
+.if empty(OPT_${opt}) || ${__${opt}_OPTIONS:M${OPT_${opt}}} != ${OPT_${opt}}
+.error Invalid option OPT_${opt} (${OPT_${opt}}), must be one of: ${__${opt}_OPTIONS}
+.endif
+.endfor
+.undef __SINGLE_OPTIONS
+
+.for opt val rep in ${BROKEN_SINGLE_OPTIONS}
+.if ${OPT_${opt}} == ${val}
+OPT_${opt}:= ${rep}
+.endif
+.endfor
+
.for vv in ${__DEFAULT_DEPENDENT_OPTIONS}
.if defined(WITH_${vv:H}) && defined(WITHOUT_${vv:H})
MK_${vv:H}?= no
diff --git a/share/mk/bsd.nls.mk b/share/mk/bsd.nls.mk
index 684394b53889..bd13fe56679d 100644
--- a/share/mk/bsd.nls.mk
+++ b/share/mk/bsd.nls.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# This include file <bsd.nls.mk> handles building and installing Native
# Language Support (NLS) catalogs
diff --git a/share/mk/bsd.obj.mk b/share/mk/bsd.obj.mk
index 816571970b64..578423914c6b 100644
--- a/share/mk/bsd.obj.mk
+++ b/share/mk/bsd.obj.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <bsd.obj.mk> handles creating the 'obj' directory
# and cleaning up object files, etc.
diff --git a/share/mk/bsd.opts.mk b/share/mk/bsd.opts.mk
index 7e5c985957f0..18098c93605c 100644
--- a/share/mk/bsd.opts.mk
+++ b/share/mk/bsd.opts.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Option file for bmake builds. These options are available to all users of
# bmake (including the source tree userland and kernel builds). They generally
@@ -61,9 +60,11 @@ __DEFAULT_YES_OPTIONS = \
MAKE_CHECK_USE_SANDBOX \
MAN \
MANCOMPRESS \
+ MANSPLITPKG \
NIS \
NLS \
OPENSSH \
+ RELRO \
SSP \
TESTS \
TOOLCHAIN \
@@ -73,16 +74,15 @@ __DEFAULT_YES_OPTIONS = \
__DEFAULT_NO_OPTIONS = \
ASAN \
BIND_NOW \
+ BRANCH_PROTECTION \
CCACHE_BUILD \
CTF \
- INIT_ALL_PATTERN \
- INIT_ALL_ZERO \
INSTALL_AS_USER \
- MANSPLITPKG \
PROFILE \
RETPOLINE \
STALE_STAGED \
- UBSAN
+ UBSAN \
+ UNDEFINED_VERSION
__DEFAULT_DEPENDENT_OPTIONS = \
MAKE_CHECK_USE_SANDBOX/TESTS \
@@ -103,31 +103,19 @@ __DEFAULT_NO_OPTIONS+= PIE
__DEFAULT_YES_OPTIONS+=PIE
.endif
-.include <bsd.mkopt.mk>
-
-.if ${MK_INIT_ALL_PATTERN} == "yes" && ${MK_INIT_ALL_ZERO} == "yes"
-.warning WITH_INIT_ALL_PATTERN and WITH_INIT_ALL_ZERO are mutually exclusive.
+.if ${MACHINE_CPUARCH} != "aarch64"
+BROKEN_OPTIONS+= BRANCH_PROTECTION
.endif
-#
-# Supported NO_* options (if defined, MK_* will be forced to "no",
-# regardless of user's setting).
-#
-# These are transitional and will disappaer in the FreeBSD 12.
-#
-.for var in \
- CTF \
- DEBUG_FILES \
- INSTALLLIB \
- MAN \
- PROFILE \
- WARNS \
- WERROR
-.if defined(NO_${var})
-.error NO_${var} is defined, but deprecated. Please use MK_${var}=no instead.
-MK_${var}:=no
-.endif
-.endfor
+__SINGLE_OPTIONS = \
+ INIT_ALL
+
+__INIT_ALL_OPTIONS= none pattern zero
+__INIT_ALL_DEFAULT= none
+
+.-include <local.opts.mk>
+
+.include <bsd.mkopt.mk>
.include <bsd.cpu.mk>
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index 09d7dfbd25c8..bc53f3679e77 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <bsd.own.mk> set common variables for owner,
# group, mode, and directories. Defaults are in brackets.
@@ -155,10 +154,8 @@ __<bsd.own.mk>__:
.if ${MK_CTF} != "no"
CTFCONVERT_CMD= ${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
-.elif defined(.PARSEDIR) || (defined(MAKE_VERSION) && ${MAKE_VERSION} >= 5201111300)
-CTFCONVERT_CMD=
.else
-CTFCONVERT_CMD= @:
+CTFCONVERT_CMD=
.endif
.endif # !_WITHOUT_SRCCONF
@@ -172,7 +169,7 @@ NOBINMODE?= 444
KMODDIR?= /boot/modules
KMODOWN?= ${BINOWN}
KMODGRP?= ${BINGRP}
-KMODMODE?= ${BINMODE}
+KMODMODE?= ${NOBINMODE}
DTBDIR?= /boot/dtb
DTBODIR?= /boot/dtb/overlays
DTBOWN?= root
@@ -248,7 +245,7 @@ _LINKMODE?= ${LINKMODE:U${NOBINMODE}}
_SYMLINKOWN?= ${SYMLINKOWN:U${BINOWN}}
_SYMLINKGRP?= ${SYMLINKGRP:U${BINGRP}}
_SYMLINKMODE?= ${SYMLINKMODE:U755}
-HRDLINK?= -l h -o ${_LINKOWN} -g ${_LINKGRP} -m ${_LINKMODE}
+HRDLINK?= -l mr -o ${_LINKOWN} -g ${_LINKGRP} -m ${_LINKMODE}
MANHRDLINK?= -l h -o ${MANOWN} -g ${MANGRP} -m ${MANMODE}
SYMLINK?= -l s -o ${_SYMLINKOWN} -g ${_SYMLINKGRP} -m ${_SYMLINKMODE}
LSYMLINK?= -l s -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE}
@@ -265,6 +262,8 @@ INSTALL_RSYMLINK?= ${INSTALL} ${RSYMLINK}
STRIP?= -s
.endif
+TAR_CMD?= tar
+
COMPRESS_CMD?= gzip -cn
COMPRESS_EXT?= .gz
diff --git a/share/mk/bsd.port.mk b/share/mk/bsd.port.mk
index 8c0e72e5bebe..2a011ba93152 100644
--- a/share/mk/bsd.port.mk
+++ b/share/mk/bsd.port.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !defined(PORTSDIR)
# Autodetect if the command is being run in a ports tree that's not rooted
@@ -10,11 +9,7 @@ _PORTSDIR= ${.CURDIR}/${RELPATH}
.endif
.endfor
_PORTSDIR?= /usr/ports
-.if defined(.PARSEDIR)
PORTSDIR= ${_PORTSDIR:tA}
-.else # fmake doesn't have :tA
-PORTSDIR!= realpath ${_PORTSDIR}
-.endif
.endif
BSDPORTMK?= ${PORTSDIR}/Mk/bsd.port.mk
diff --git a/share/mk/bsd.port.options.mk b/share/mk/bsd.port.options.mk
index e043cc2cb49a..bf37579df217 100644
--- a/share/mk/bsd.port.options.mk
+++ b/share/mk/bsd.port.options.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
USEOPTIONSMK= yes
INOPTIONSMK= yes
diff --git a/share/mk/bsd.port.post.mk b/share/mk/bsd.port.post.mk
index d64dc1276b44..cf333d03bbd6 100644
--- a/share/mk/bsd.port.post.mk
+++ b/share/mk/bsd.port.post.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
AFTERPORTMK= yes
diff --git a/share/mk/bsd.port.pre.mk b/share/mk/bsd.port.pre.mk
index dff464ec32da..704f376a0cc0 100644
--- a/share/mk/bsd.port.pre.mk
+++ b/share/mk/bsd.port.pre.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
BEFOREPORTMK= yes
diff --git a/share/mk/bsd.port.subdir.mk b/share/mk/bsd.port.subdir.mk
index 380983db4f4b..14c0857f04b2 100644
--- a/share/mk/bsd.port.subdir.mk
+++ b/share/mk/bsd.port.subdir.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !defined(PORTSDIR)
# Autodetect if the command is being run in a ports tree that's not rooted
@@ -10,11 +9,7 @@ _PORTSDIR= ${.CURDIR}/${RELPATH}
.endif
.endfor
_PORTSDIR?= /usr/ports
-.if defined(.PARSEDIR)
PORTSDIR= ${_PORTSDIR:tA}
-.else # fmake doesn't have :tA
-PORTSDIR!= realpath ${_PORTSDIR}
-.endif
.endif
BSDPORTSUBDIRMK?= ${PORTSDIR}/Mk/bsd.port.subdir.mk
diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk
index 6b8da09edaf0..74a653057bda 100644
--- a/share/mk/bsd.prog.mk
+++ b/share/mk/bsd.prog.mk
@@ -1,5 +1,4 @@
# from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91
-# $FreeBSD$
.include <bsd.init.mk>
.include <bsd.compiler.mk>
@@ -41,6 +40,13 @@ MK_DEBUG_FILES= no
.if ${MK_BIND_NOW} != "no"
LDFLAGS+= -Wl,-znow
.endif
+.if ${LINKER_TYPE} != "mac"
+.if ${MK_RELRO} == "no"
+LDFLAGS+= -Wl,-znorelro
+.else
+LDFLAGS+= -Wl,-zrelro
+.endif
+.endif
.if ${MK_PIE} != "no"
# Static PIE is not yet supported/tested.
.if !defined(NO_SHARED) || ${NO_SHARED:tl} == "no"
@@ -61,23 +67,26 @@ LDFLAGS+= -Wl,-zretpolineplt
.warning Retpoline requested but not supported by compiler or linker
.endif
.endif
+# LLD sensibly defaults to -znoexecstack, so do the same for BFD
+LDFLAGS.bfd+= -Wl,-znoexecstack
+.if ${MK_BRANCH_PROTECTION} != "no"
+CFLAGS+= -mbranch-protection=standard
+.if ${MACHINE_ARCH} == "aarch64" && defined(BTI_REPORT_ERROR)
+LDFLAGS+= -Wl,-zbti-report=error
+.endif
+.endif
# Initialize stack variables on function entry
-.if ${MK_INIT_ALL_ZERO} == "yes"
+.if ${OPT_INIT_ALL} != "none"
.if ${COMPILER_FEATURES:Minit-all}
-CFLAGS+= -ftrivial-auto-var-init=zero \
- -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
-CXXFLAGS+= -ftrivial-auto-var-init=zero \
- -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
-.else
-.warning InitAll (zeros) requested but not support by compiler
+CFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL}
+CXXFLAGS+= -ftrivial-auto-var-init=${OPT_INIT_ALL}
+.if ${OPT_INIT_ALL} == "zero" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 160000
+CFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
+CXXFLAGS+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
.endif
-.elif ${MK_INIT_ALL_PATTERN} == "yes"
-.if ${COMPILER_FEATURES:Minit-all}
-CFLAGS+= -ftrivial-auto-var-init=pattern
-CXXFLAGS+= -ftrivial-auto-var-init=pattern
.else
-.warning InitAll (pattern) requested but not support by compiler
+.warning INIT_ALL (${OPT_INIT_ALL}) requested but not supported by compiler
.endif
.endif
diff --git a/share/mk/bsd.progs.mk b/share/mk/bsd.progs.mk
index 79397f595688..1551516dd6ea 100644
--- a/share/mk/bsd.progs.mk
+++ b/share/mk/bsd.progs.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $
#
# @(#) Copyright (c) 2006, Simon J. Gerraty
@@ -23,9 +22,9 @@ PROGS += ${PROGS_CXX}
.if defined(PROG)
# just one of many
PROG_OVERRIDE_VARS += BINDIR BINGRP BINOWN BINMODE CSTD CXXSTD DPSRCS MAN \
- NO_SHARED MK_WERROR PROGNAME SRCS STRIP WARNS MK_ASAN MK_UBSAN
-PROG_VARS += CFLAGS CXXFLAGS DEBUG_FLAGS DPADD INTERNALPROG LDADD LIBADD \
- LINKS LDFLAGS MLINKS ${PROG_OVERRIDE_VARS}
+ NO_SHARED MK_WERROR PROGNAME STRIP WARNS MK_ASAN MK_UBSAN
+PROG_VARS += SRCS CFLAGS CXXFLAGS DEBUG_FLAGS DPADD INTERNALPROG LDADD \
+ LIBADD LINKS LDFLAGS MLINKS ${PROG_OVERRIDE_VARS}
.for v in ${PROG_VARS:O:u}
.if empty(${PROG_OVERRIDE_VARS:M$v})
.if defined(${v}.${PROG})
@@ -65,6 +64,8 @@ all: ${PROGS}
.endif
META_XTRAS+= ${cat ${PROGS:S/$/*.meta_files/} 2>/dev/null || true:L:sh}
+# the above does no use unless we pass it on to gendirdeps.mk
+GENDIRDEPS_ENV += META_XTRAS='${META_XTRAS}'
.if ${MK_STAGING} != "no" && !empty(PROGS)
# Stage from parent while respecting PROGNAME and BINDIR overrides.
@@ -89,15 +90,14 @@ $v =
.endfor
.endif
-# handle being called [bsd.]progs.mk
.include <bsd.prog.mk>
.if !defined(_SKIP_BUILD)
# Find common sources among the PROGS to depend on them before building
# anything. This allows parallelization without them each fighting over
# the same objects.
-_PROGS_COMMON_SRCS= ${DPSRCS}
-_PROGS_ALL_SRCS=
+_PROGS_COMMON_SRCS= ${DPSRCS} ${SRCS}
+_PROGS_ALL_SRCS= ${SRCS}
.for p in ${PROGS}
.for s in ${SRCS.${p}}
.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}}
diff --git a/share/mk/bsd.sanitizer.mk b/share/mk/bsd.sanitizer.mk
index 31aecd9e578e..0f2fb7f9e71a 100644
--- a/share/mk/bsd.sanitizer.mk
+++ b/share/mk/bsd.sanitizer.mk
@@ -29,7 +29,7 @@ _use_sanitizers= yes
# For libraries we only instrument the shared and PIE libraries by setting
# SHARED_CFLAGS instead of CFLAGS. We do this since static executables are not
-# compatible with the santizers (interceptors do not work).
+# compatible with the sanitizers (interceptors do not work).
.if ${_use_sanitizers} != "no"
.include "../../lib/libclang_rt/compiler-rt-vars.mk"
.if target(__<bsd.lib.mk>__)
diff --git a/share/mk/bsd.snmpmod.mk b/share/mk/bsd.snmpmod.mk
index 7956b89382b5..e4004ed5383c 100644
--- a/share/mk/bsd.snmpmod.mk
+++ b/share/mk/bsd.snmpmod.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
INCSDIR= ${INCLUDEDIR}/bsnmp
diff --git a/share/mk/bsd.subdir.mk b/share/mk/bsd.subdir.mk
index fb686a101322..565af41602c0 100644
--- a/share/mk/bsd.subdir.mk
+++ b/share/mk/bsd.subdir.mk
@@ -1,6 +1,3 @@
-# from: @(#)bsd.subdir.mk 5.9 (Berkeley) 2/1/91
-# $FreeBSD$
-#
# The include file <bsd.subdir.mk> contains the default targets
# for building subdirectories.
#
@@ -57,13 +54,13 @@ STANDALONE_SUBDIR_TARGETS+= \
installconfig installdirs installincludes installfiles print-dir \
maninstall manlint obj objlink
-# It is safe to install in parallel when staging.
-.if defined(NO_ROOT) || !empty(SYSROOT)
-STANDALONE_SUBDIR_TARGETS+= realinstall
-.endif
-
.include <bsd.init.mk>
+.if ${MK_META_MODE} == "yes"
+.MAKE.JOB.PREFIX=
+ECHODIR= :
+.endif
+
.if make(print-dir)
NEED_SUBDIR= 1
ECHODIR= :
@@ -128,8 +125,8 @@ SUBDIR:=${SUBDIR:u}
.endif
.if defined(SUBDIR.)
-.error ${.CURDIR}: Found variable SUBDIR. with value "${SUBDIR.}". This was \
- probably caused by using SUBDIR.$${MK_FOO} without including \
+.error ${.CURDIR}: Found variable 'SUBDIR.' with value "${SUBDIR.}". This was\
+ probably caused by using SUBDIR.$${MK_FOO} without including\
<src.opts.mk> or by using an invalid $${MK_FOO} option.
.endif
diff --git a/share/mk/bsd.suffixes-posix.mk b/share/mk/bsd.suffixes-posix.mk
index 90aec1d2f257..4be4b50b8143 100644
--- a/share/mk/bsd.suffixes-posix.mk
+++ b/share/mk/bsd.suffixes-posix.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# Posix 1003.2 mandated rules
#
diff --git a/share/mk/bsd.suffixes.mk b/share/mk/bsd.suffixes.mk
index 5396bae05087..5bdfc8630f62 100644
--- a/share/mk/bsd.suffixes.mk
+++ b/share/mk/bsd.suffixes.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.sh:
cp -f ${.IMPSRC} ${.TARGET}
@@ -55,7 +54,7 @@
${CTFCONVERT_CMD}
.s.o:
- ${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
+ ${CC:N${CCACHE_BIN}} -x assembler ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET}
${CTFCONVERT_CMD}
# XXX not -j safe
diff --git a/share/mk/bsd.symver.mk b/share/mk/bsd.symver.mk
index a7bffad5ceae..a1c6e62fba76 100644
--- a/share/mk/bsd.symver.mk
+++ b/share/mk/bsd.symver.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<bsd.symver.mk>__)
__<bsd.symver.mk>__:
@@ -14,6 +13,9 @@ VERSION_MAP?= Version.map
CLEANFILES+= ${VERSION_MAP}
+.if ${MAKE_VERSION} >= 20230123
+_mpath= ${.SYSPATH}
+.else
# Compute the make's -m path.
_mpath=
_oarg=
@@ -24,6 +26,7 @@ _mpath+= ${_arg}
_oarg= ${_arg}
.endfor
_mpath+= /usr/share/mk
+.endif
# Look up ${VERSION_GEN} in ${_mpath}.
_vgen=
diff --git a/share/mk/bsd.sys.mk b/share/mk/bsd.sys.mk
index 221e8b028479..52c3d07746c7 100644
--- a/share/mk/bsd.sys.mk
+++ b/share/mk/bsd.sys.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# This file contains common settings used for building FreeBSD
# sources.
@@ -49,8 +48,11 @@ CWARNFLAGS+= -Werror
CWARNFLAGS+= -Wall -Wno-format-y2k
.endif # WARNS >= 2
.if ${WARNS} >= 3
-CWARNFLAGS+= -W -Wno-unused-parameter -Wstrict-prototypes\
- -Wmissing-prototypes -Wpointer-arith
+CWARNFLAGS+= -W -Wno-unused-parameter
+.if ${COMPILER_TYPE} == "clang"
+CWARNFLAGS+= -Wstrict-prototypes
+.endif
+CWARNFLAGS+= -Wmissing-prototypes -Wpointer-arith
.endif # WARNS >= 3
.if ${WARNS} >= 4
CWARNFLAGS+= -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow\
@@ -75,13 +77,16 @@ CWARNFLAGS.clang+= -Wthread-safety
CWARNFLAGS+= -Wno-uninitialized
.endif # WARNS >=2 && WARNS <= 4
CWARNFLAGS+= -Wno-pointer-sign
+.if !defined(NO_WDATE_TIME)
+CWARNFLAGS+= -Wdate-time
+.endif # NO_WDATE_TIME
# Clang has more warnings enabled by default, and when using -Wall, so if WARNS
# is set to low values, these have to be disabled explicitly.
.if ${WARNS} <= 6
CWARNFLAGS.clang+= -Wno-empty-body -Wno-string-plus-int
CWARNFLAGS.clang+= -Wno-unused-const-variable
-.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 130000
-CWARNFLAGS.clang+= -Wno-error=unused-but-set-variable
+.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 150000
+CWARNFLAGS.clang+= -Wno-error=unused-but-set-parameter
.endif
.endif # WARNS <= 6
.if ${WARNS} <= 3
@@ -92,10 +97,6 @@ CWARNFLAGS.clang+= -Wno-address-of-packed-member
.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 90100
CWARNFLAGS.gcc+= -Wno-address-of-packed-member
.endif
-.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 70000 && \
- ${MACHINE_CPUARCH} == "arm" && !${MACHINE_ARCH:Marmv[67]*}
-CWARNFLAGS.clang+= -Wno-atomic-alignment
-.endif
.endif # WARNS <= 3
.if ${WARNS} <= 2
CWARNFLAGS.clang+= -Wno-switch -Wno-switch-enum -Wno-knr-promoted-parameter
@@ -111,9 +112,30 @@ CWARNFLAGS.clang+= -Wno-array-bounds
${COMPILER_TYPE} == "gcc")
CWARNFLAGS+= -Wno-misleading-indentation
.endif # NO_WMISLEADING_INDENTATION
+.if ${COMPILER_VERSION} >= 130000
+NO_WUNUSED_BUT_SET_VARIABLE= -Wno-unused-but-set-variable
+.endif
.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 140000
NO_WBITWISE_INSTEAD_OF_LOGICAL= -Wno-bitwise-instead-of-logical
.endif
+.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 150000
+NO_WARRAY_PARAMETER= -Wno-array-parameter
+NO_WSTRICT_PROTOTYPES= -Wno-strict-prototypes
+NO_WDEPRECATED_NON_PROTOTYPE=-Wno-deprecated-non-prototype
+.endif
+.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 50200
+NO_WUNUSED_BUT_SET_VARIABLE=-Wno-unused-but-set-variable
+.endif
+.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 100100
+NO_WZERO_LENGTH_BOUNDS= -Wno-zero-length-bounds
+.endif
+.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 110100
+NO_WARRAY_PARAMETER= -Wno-array-parameter
+.endif
+.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 120100
+NO_WUSE_AFTER_FREE= -Wno-use-after-free
+NO_WDANGLING_POINTER= -Wno-dangling-pointer
+.endif
.endif # WARNS
.if defined(FORMAT_AUDIT)
@@ -123,7 +145,7 @@ WFORMAT= 1
.if ${WFORMAT} > 0
#CWARNFLAGS+= -Wformat-nonliteral -Wformat-security -Wno-format-extra-args
CWARNFLAGS+= -Wformat=2 -Wno-format-extra-args
-.if ${WARNS} <= 3
+.if ${WARNS:U0} <= 3
CWARNFLAGS.clang+= -Wno-format-nonliteral
.endif # WARNS <= 3
.if ${MK_WERROR} != "no" && ${MK_WERROR.${COMPILER_TYPE}:Uyes} != "no"
@@ -156,7 +178,6 @@ CWARNFLAGS+= -Wno-error=address \
-Wno-error=logical-not-parentheses \
-Wno-error=strict-aliasing \
-Wno-error=uninitialized \
- -Wno-error=unused-but-set-variable \
-Wno-error=unused-function \
-Wno-error=unused-value
.endif
@@ -205,6 +226,21 @@ CWARNFLAGS+= -Wno-error=overflow
.endif
.endif
+# GCC 12.1.0
+.if ${COMPILER_VERSION} >= 120100
+# These warnings are raised by headers in libc++ so are disabled
+# globally for all C++
+CXXWARNFLAGS+= -Wno-literal-suffix \
+ -Wno-error=unknown-pragmas
+.endif
+
+# GCC 13.1.0
+.if ${COMPILER_VERSION} >= 130100
+# These warnings are raised by headers in libc++ so are disabled
+# globally for all C++
+CXXWARNFLAGS+= -Wno-dangling-reference
+.endif
+
# GCC produces false positives for functions that switch on an
# enum (GCC bug 87950)
CWARNFLAGS+= -Wno-return-type
@@ -216,7 +252,8 @@ CWARNFLAGS+= -Wno-system-headers
.endif # gcc
# How to handle FreeBSD custom printf format specifiers.
-.if ${COMPILER_TYPE} == "clang"
+.if ${COMPILER_TYPE} == "clang" || \
+ (${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 120100)
FORMAT_EXTENSIONS= -D__printf__=__freebsd_kprintf__
.else
FORMAT_EXTENSIONS= -fformat-extensions
@@ -257,11 +294,18 @@ CFLAGS.clang+= -Qunused-arguments
# but not yet.
CXXFLAGS.clang+= -Wno-c++11-extensions
+# XXX This should be defaulted to 2 when WITH_SSP is in use after further
+# testing and soak time.
+FORTIFY_SOURCE?= 0
.if ${MK_SSP} != "no"
# Don't use -Wstack-protector as it breaks world with -Werror.
SSP_CFLAGS?= -fstack-protector-strong
CFLAGS+= ${SSP_CFLAGS}
.endif # SSP
+.if ${FORTIFY_SOURCE} > 0
+CFLAGS+= -D_FORTIFY_SOURCE=${FORTIFY_SOURCE}
+CXXFLAGS+= -D_FORTIFY_SOURCE=${FORTIFY_SOURCE}
+.endif
# Additional flags passed in CFLAGS and CXXFLAGS when MK_DEBUG_FILES is
# enabled.
@@ -402,6 +446,14 @@ STAGE_AS_${SHLIB_LINK:R}.ld:= ${SHLIB_LINK}
NO_SHLIB_LINKS=
.endif
+.if defined(STATIC_LDSCRIPT) && target(lib${LIB}.ald)
+STAGE_AS_SETS+= ald
+STAGE_DIR.ald = ${STAGE_LIBDIR}
+STAGE_AS.ald+= lib${LIB}.ald
+STAGE_AS_lib${LIB}.ald = lib${LIB}.a
+stage_as.ald: lib${LIB}.ald
+.endif
+
.if target(stage_files.shlib)
stage_libs: ${_LIBS}
.if defined(DEBUG_FLAGS) && target(${SHLIB_NAME}.symbols)
@@ -463,3 +515,8 @@ ${_tgt}: ${META_DEPS}
.endif
.endfor
.endif
+
+# we are generally the last makefile read
+CFLAGS+= ${CFLAGS_LAST}
+CXXFLAGS+= ${CXXFLAGS_LAST}
+LDFLAGS+= ${LDFLAGS_LAST}
diff --git a/share/mk/bsd.sysdir.mk b/share/mk/bsd.sysdir.mk
index 665905e1d537..52b841a51fea 100644
--- a/share/mk/bsd.sysdir.mk
+++ b/share/mk/bsd.sysdir.mk
@@ -1,4 +1,5 @@
-# $FreeBSD$
+
+.-include <local.sysdir.mk>
# Search for kernel source tree in standard places.
.if !defined(SYSDIR)
diff --git a/share/mk/bsd.test.mk b/share/mk/bsd.test.mk
index 588cfbcb45ed..ea7bda0da559 100644
--- a/share/mk/bsd.test.mk
+++ b/share/mk/bsd.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Generic build infrastructure for test programs.
#
diff --git a/share/mk/dirdeps-options.mk b/share/mk/dirdeps-options.mk
index b31d2033ae98..e12dcec40ac7 100644
--- a/share/mk/dirdeps-options.mk
+++ b/share/mk/dirdeps-options.mk
@@ -1,4 +1,6 @@
-# $Id: dirdeps-options.mk,v 1.20 2022/03/17 20:11:36 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: dirdeps-options.mk,v 1.22 2024/02/17 17:26:57 sjg Exp $
#
# @(#) Copyright (c) 2018-2022, Simon J. Gerraty
#
@@ -42,6 +44,13 @@
# so we qualify MK_FOO with .${TARGET_SPEC} and each component
# TARGET_SPEC_VAR (in reverse order) before using MK_FOO.
#
+# Because Makefile.depend.options are processed at both level 0 (when
+# computing DIRDEPS to build) and higher (when updating
+# Makefile.depend* after successful build), it is important that
+# all references to TARGET_SPEC_VARs should use the syntax
+# ${DEP_${TARGET_SPEC_VAR}:U${TARGET_SPEC_VAR}} to ensure correct
+# behavior.
+#
# This should have been set by Makefile.depend.options
# before including us
diff --git a/share/mk/dirdeps-targets.mk b/share/mk/dirdeps-targets.mk
index cd1bcdb65250..9e3fb814fada 100644
--- a/share/mk/dirdeps-targets.mk
+++ b/share/mk/dirdeps-targets.mk
@@ -1,6 +1,7 @@
-# $FreeBSD$
+# SPDX-License-Identifier: BSD-2-Clause
+#
# RCSid:
-# $Id: dirdeps-targets.mk,v 1.24 2020/12/11 18:15:43 sjg Exp $
+# $Id: dirdeps-targets.mk,v 1.27 2024/02/25 19:12:13 sjg Exp $
#
# @(#) Copyright (c) 2019-2020 Simon J. Gerraty
#
@@ -41,6 +42,9 @@
# pickup customizations
.-include <local.dirdeps-targets.mk>
+# this is what we are here for
+.MAIN: dirdeps
+
# for DIRDEPS_BUILD this is how we prime the pump
# include . to allow any directory to work as a target
DIRDEPS_TARGETS_DIRS ?= targets targets/pseudo
@@ -114,16 +118,17 @@ tqtdeps := ${DIRDEPS_TARGETS_MACHINE_LIST:@m@${tdeps:M*.$m,*}@:S,/${.MAKE.DEPEND
.endif
# now work out what we want in DIRDEPS
+DIRDEPS = ${ptdeps}
.if empty(REQUESTED_MACHINE)
# we want them all just as found
-DIRDEPS = ${ptdeps} ${mqtdeps} ${tqtdeps}
+DIRDEPS += ${mqtdeps} ${tqtdeps}
.else
# we only want those that match REQUESTED_MACHINE/REQUESTED_TARGET_SPEC
# or REQUESTED_TARGET_SPEC (TARGET_SPEC)
-DIRDEPS = \
- ${ptdeps:@d@$d.${REQUESTED_TARGET_SPEC:U${TARGET_SPEC:U${REQUESTED_MACHINE}}}@} \
+DIRDEPS += \
${mqtdeps:M*.${REQUESTED_MACHINE}} \
- ${tqtdeps:M*.${REQUESTED_TARGET_SPEC:U${TARGET_SPEC}}}
+ ${tqtdeps:M*.${REQUESTED_TARGET_SPEC:U${TARGET_SPEC}}} \
+
.endif
# clean up
DIRDEPS := ${DIRDEPS:O:u}
diff --git a/share/mk/dirdeps.mk b/share/mk/dirdeps.mk
index ee31e47c76c5..b3b34145e8e9 100644
--- a/share/mk/dirdeps.mk
+++ b/share/mk/dirdeps.mk
@@ -1,6 +1,8 @@
-# $Id: dirdeps.mk,v 1.151 2022/01/28 01:13:14 sjg Exp $
+# $Id: dirdeps.mk,v 1.166 2024/01/05 23:16:34 sjg Exp $
-# Copyright (c) 2010-2022, Simon J. Gerraty
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2010-2023, Simon J. Gerraty
# Copyright (c) 2010-2018, Juniper Networks, Inc.
# All rights reserved.
#
@@ -153,7 +155,7 @@
# if any test fails, but without the risk of introducing
# circular dependencies.
-now_utc ?= ${%s:L:gmtime}
+now_utc ?= ${%s:L:localtime}
.if !defined(start_utc)
start_utc := ${now_utc}
.endif
@@ -179,7 +181,7 @@ _DIRDEP_USE_LEVEL?= 0
_CURDIR ?= ${.CURDIR}
_OBJDIR ?= ${.OBJDIR}
-.if ${MAKEFILE:T} == ${.PARSEFILE} && empty(DIRDEPS) && ${.TARGETS:Uall:M*/*} != ""
+.if ${MAKEFILE:T} == ${.PARSEFILE} && empty(DIRDEPS) && ${.TARGETS:Uall:M*[/.]*} != ""
# This little trick let's us do
#
# mk -f dirdeps.mk some/dir.${TARGET_SPEC}
@@ -210,12 +212,16 @@ _DEP_TARGET_SPEC =
# it should be set by sys.mk or similar by now.
# TARGET_SPEC must not contain any '.'s.
TARGET_SPEC_VARS ?= MACHINE
+# we allow for this to be a subset
+TARGET_SPEC_VARS.host ?= MACHINE
+TARGET_SPEC_VARS.host32 = ${TARGET_SPEC_VARS.host}
# this is what we started with
TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
# this is what we mostly use below
-DEP_TARGET_SPEC = ${TARGET_SPEC_VARS:S,^,DEP_,:@v@${$v:U}@:ts,}
+DEP_TARGET_SPEC_VARS = ${TARGET_SPEC_VARS.${DEP_MACHINE}:U${TARGET_SPEC_VARS}}
+DEP_TARGET_SPEC = ${DEP_TARGET_SPEC_VARS:S,^,DEP_,:@v@${$v:U}@:ts,}
# make sure we have defaults
-.for v in ${TARGET_SPEC_VARS}
+.for v in ${DEP_TARGET_SPEC_VARS}
DEP_$v ?= ${$v}
.endfor
@@ -225,12 +231,7 @@ DEP_$v ?= ${$v}
# we compute below are fully qualified wrt DEP_TARGET_SPEC.
# The makefiles may only partially specify (eg. MACHINE only),
# so we need to construct a set of modifiers to fill in the gaps.
-.if ${MAKE_VERSION} >= 20170130
-_tspec_x := ${TARGET_SPEC_VARS:range}
-.else
-# do it the hard way
-_tspec_x := ${TARGET_SPEC_VARS:[#]:@x@i=1;while [ $$i -le $x ]; do echo $$i; i=$$((i + 1)); done;@:sh}
-.endif
+_tspec_x := ${TARGET_SPEC_VARS:${M_RANGE:Urange}}
# this handles unqualified entries
M_dep_qual_fixes = C;(/[^/.,]+)$$;\1.$${DEP_TARGET_SPEC};
# there needs to be at least one item missing for these to make sense
@@ -240,10 +241,27 @@ _tspec_a$i := ,${TARGET_SPEC_VARS:[$i..-1]:@v@$$$${DEP_$v}@:ts,}
M_dep_qual_fixes += C;(\.${_tspec_m$i})$$;\1${_tspec_a$i};
.endfor
TARGET_SPEC_VARSr := ${TARGET_SPEC_VARS:[-1..1]}
+.if ${TARGET_SPEC_VARS.host} == ${TARGET_SPEC_VARS}
+M_dep_qual_fixes.host = ${M_dep_qual_fixes}
+.elif ${TARGET_SPEC_VARS.host:[#]} > 1
+_htspec_x := ${TARGET_SPEC_VARS.host:${M_RANGE:Urange}}
+# this handles unqualified entries
+M_dep_qual_fixes.host = C;(/[^/.,]+)$$;\1.$${DEP_TARGET_SPEC};
+# there needs to be at least one item missing for these to make sense
+.for i in ${_htspec_x:[2..-1]}
+_htspec_m$i := ${TARGET_SPEC_VARS.host:[2..$i]:@w@[^,]+@:ts,}
+_htspec_a$i := ,${TARGET_SPEC_VARS.host:[$i..-1]:@v@$$$${DEP_$v}@:ts,}
+M_dep_qual_fixes.host += C;(\.${_htspec_m$i})$$;\1${_htspec_a$i};
+.endfor
+.else
+M_dep_qual_fixes.host = U
+.endif
.else
# A harmless? default.
M_dep_qual_fixes = U
.endif
+M_dep_qual_fixes.host ?= ${M_dep_qual_fixes}
+M_dep_qual_fixes.host32 = ${M_dep_qual_fixes.host}
.if !defined(.MAKE.DEPENDFILE_PREFERENCE)
# .MAKE.DEPENDFILE_PREFERENCE makes the logic below neater?
@@ -271,6 +289,10 @@ _machine_dependfiles := ${.MAKE.DEPENDFILE_PREFERENCE:T:M*${MACHINE}*}
.endif
.endif
+# turn a list into a set of :N modifiers
+# NskipFoo = ${Foo:${M_ListToSkip}}
+M_ListToSkip ?= O:u:S,^,N,:ts:
+
# this is how we identify non-machine specific dependfiles
N_notmachine := ${.MAKE.DEPENDFILE_PREFERENCE:E:N*${MACHINE}*:${M_ListToSkip}}
@@ -322,7 +344,7 @@ _tspec := ${_DEP_TARGET_SPEC:S/,/ /g}
.for i in ${_tspec_x}
DEP_${TARGET_SPEC_VARS:[$i]} := ${_tspec:[$i]}
.endfor
-.for v in ${TARGET_SPEC_VARS:O:u}
+.for v in ${DEP_TARGET_SPEC_VARS:O:u}
.if empty(DEP_$v)
.undef DEP_$v
.endif
@@ -347,6 +369,10 @@ BUILD_DIRDEPS ?= yes
DIRDEPS_CACHE ?= ${_OBJDIR:tA}/dirdeps.cache${_TARGETS:U${.TARGETS}:Nall:O:u:ts-:S,/,_,g:S,^,.,:N.}
.endif
+# sanity check: Makefile.depend.options should *not* include us
+.if ${.INCLUDEDFROMFILE:U:M${.MAKE.DEPENDFILE_PREFIX}.options} != ""
+.error ${DEP_RELDIR}/${.MAKE.DEPENDFILE_PREFIX}.options: should include dirdeps-options.mk
+.endif
# pickup customizations
# as below you can use !target(_DIRDEP_USE) to protect things
@@ -389,6 +415,8 @@ DIRDEPS_FILTER += M${_DEP_RELDIR}
# this is what we run below
DIRDEP_MAKE ?= ${.MAKE}
DIRDEP_DIR ?= ${.TARGET:R}
+# we normally want the default target
+DIRDEP_TARGETS ?=
# if you want us to report load averages during build
# DIRDEP_USE_PRELUDE += ${DIRDEP_LOADAVG_REPORT};
@@ -401,7 +429,7 @@ DIRDEP_LOADAVG_LAST = 0
# Note: expr(1) will exit 1 if the expression evaluates to 0
# hence the || true
DIRDEP_LOADAVG_REPORT = \
- test -z "${"${expr ${now_utc} - ${DIRDEP_LOADAVG_INTEVAL:U60} - ${DIRDEP_LOADAVG_LAST} || true:L:sh:N-*}":?yes${DIRDEP_LOADAVG_LAST::=${now_utc}}:}" || \
+ test -z "${"${expr ${now_utc} - ${DIRDEP_LOADAVG_INTERVAL:U60} - ${DIRDEP_LOADAVG_LAST} || true:L:sh:N-*}":?yes${DIRDEP_LOADAVG_LAST::=${now_utc}}:}" || \
echo "${TRACER}`${DIRDEP_LOADAVG_CMD}`"
# we suppress SUBDIR when visiting the leaves
@@ -416,7 +444,7 @@ _DIRDEP_USE: .USE .MAKE
MACHINE_ARCH= NO_SUBDIR=1 ${DIRDEP_USE_ENV} \
TARGET_SPEC=${.TARGET:E} \
MACHINE=${.TARGET:E} \
- ${DIRDEP_MAKE} -C ${DIRDEP_DIR} || exit 1; \
+ ${DIRDEP_MAKE} -C ${DIRDEP_DIR} ${DIRDEP_TARGETS} || exit 1; \
break; \
done
@@ -577,7 +605,7 @@ ${DIRDEPS_CACHE}: .META .NOMETA_CMP
${"${DEBUG_DIRDEPS:Nno}":?DEBUG_DIRDEPS='${DEBUG_DIRDEPS}':} \
${.MAKEFLAGS:tW:S,-D ,-D,g:tw:M*WITH*} \
${.MAKEFLAGS:tW:S,-d ,-d,g:tw:M-d*} \
- 3>&1 1>&2 | sed 's,${SRCTOP},_{SRCTOP},g;s,_{,$${,g' >> ${.TARGET}.new && \
+ 3>&1 1>&2 | sed 's,${SRCTOP},_{SRCTOP},g;s,_{SRCTOP}/_{SRCTOP},_{SRCTOP},g;s,_{,$${,g' >> ${.TARGET}.new && \
mv ${.TARGET}.new ${.TARGET}
.endif
@@ -633,28 +661,28 @@ _machines += host
_machines := ${_machines:O:u}
.endif
-.if ${TARGET_SPEC_VARS:[#]} > 1
+.if ${DEP_TARGET_SPEC_VARS:[#]} > 1
# we need to tweak _machines
_dm := ${DEP_MACHINE}
# apply the same filtering that we do when qualifying DIRDEPS.
# M_dep_qual_fixes expects .${MACHINE}* so add (and remove) '.'
# Again we expect that any already qualified machines are fully qualified.
-_machines := ${_machines:M*,*} ${_machines:N*,*:@DEP_MACHINE@${DEP_TARGET_SPEC}@:S,^,.,:${M_dep_qual_fixes:ts:}:O:u:S,^.,,}
+_machines := ${_machines:M*,*} ${_machines:N*,*:@DEP_MACHINE@${DEP_TARGET_SPEC}@:S,^,.,:S,^.,,}
DEP_MACHINE := ${_dm}
-_machines := ${_machines:O:u}
+_machines := ${_machines:${M_dep_qual_fixes.${DEP_MACHINE}:U${M_dep_qual_fixes}:ts:}:O:u}
.endif
# reset each time through
_build_dirs =
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+.if ${DEP_RELDIR} == ${_DEP_RELDIR} && ${_CURDIR} != ${SRCTOP}
# pickup other machines for this dir if necessary
_build_dirs += ${_machines:@m@${_CURDIR}.$m@}
.endif
.if ${_debug_reldir}
.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: nDIRDEPS=${DIRDEPS:[#]}
-.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: DIRDEPS='${DIRDEPS}'
+.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: DIRDEPS=${DIRDEPS:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: _machines='${_machines}'
.endif
@@ -686,9 +714,9 @@ __qual_depdirs += ${__hostdpadd}
.if ${_debug_reldir}
.info DEP_DIRDEPS_FILTER=${DEP_DIRDEPS_FILTER:ts:}
-.info depdirs=${__depdirs:S,^${SRCTOP}/,,}
-.info qualified=${__qual_depdirs:S,^${SRCTOP}/,,}
-.info unqualified=${__unqual_depdirs:S,^${SRCTOP}/,,}
+.info depdirs=${__depdirs:S,^${SRCTOP}/,,:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
+.info qualified=${__qual_depdirs:S,^${SRCTOP}/,,:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
+.info unqualified=${__unqual_depdirs:S,^${SRCTOP}/,,:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
.endif
# _build_dirs is what we will feed to _DIRDEP_USE
@@ -699,7 +727,16 @@ _build_dirs += \
${_machines:Nhost*:@m@${__unqual_depdirs:@d@$d.$m@}@}
# qualify everything now
-_build_dirs := ${_build_dirs:${M_dep_qual_fixes:ts:}:O:u}
+.if ${_debug_reldir}
+.info _build_dirs=${_build_dirs:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
+.endif
+# make sure we do not mess with qualifying "host" entries
+_build_dirs := ${_build_dirs:M*.host*:${M_dep_qual_fixes.host:ts:}} \
+ ${_build_dirs:N*.host*:${M_dep_qual_fixes:ts:}}
+_build_dirs := ${_build_dirs:O:u}
+.if ${_debug_reldir}
+.info _build_dirs=${_build_dirs:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
+.endif
.endif # empty DIRDEPS
@@ -717,7 +754,6 @@ _cache_script = echo '\# ${DEP_RELDIR}.${DEP_TARGET_SPEC}';
# guard against _new_dirdeps being too big for a single command line
_new_dirdeps := ${_build_all_dirs:@x@${target($x):?:$x}@:S,^${SRCTOP}/,,}
_cache_xtra_deps := ${_build_xtra_dirs:S,^${SRCTOP}/,,}
-.export _cache_xtra_deps _new_dirdeps
.if !empty(DIRDEPS_EXPORT_VARS) || !empty(DEP_EXPORT_VARS)
# Discouraged, but there are always exceptions.
# Handle it here rather than explain how.
@@ -732,7 +768,7 @@ dirdeps: ${_build_all_dirs}
${_build_all_dirs}: _DIRDEP_USE
.if ${_debug_reldir}
-.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: needs: ${_build_dirs:S,^${SRCTOP}/,,}
+.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: needs: ${_build_dirs:S,^${SRCTOP}/,,:${DEBUG_DIRDEPS_LIST_FILTER:U:N/:ts:}}
.endif
.if !empty(DIRDEPS_EXPORT_VARS) || !empty(DEP_EXPORT_VARS)
@@ -749,9 +785,10 @@ _cache_script += echo; echo 'DIRDEPS.${_this_dir}.$m = \';
.endif
# it would be nice to do :N${.TARGET}
.if !empty(__qual_depdirs)
-.for q in ${__qual_depdirs:${M_dep_qual_fixes:ts:}:E:O:u:N$m}
+.for q in ${__qual_depdirs:M*.host*:${M_dep_qual_fixes.host:ts:}:E:O:u:N$m} \
+ ${__qual_depdirs:N*.host*:${M_dep_qual_fixes:ts:}:E:O:u:N$m}
.if ${_debug_reldir} || ${DEBUG_DIRDEPS:@x@${${DEP_RELDIR}.$m:L:M$x}${${DEP_RELDIR}.$q:L:M$x}@} != ""
-.info ${DEP_RELDIR}.$m: graph: ${_build_dirs:M*.$q:S,^${SRCTOP}/,,}
+.info ${DEP_RELDIR}.$m: q=$q graph: ${_build_dirs:M*.$q:S,^${SRCTOP}/,,}
.endif
.if ${BUILD_DIRDEPS_CACHE} == "yes"
_cache_deps += ${_build_dirs:M*.$q:S,^${SRCTOP}/,,}
@@ -766,15 +803,27 @@ ${_this_dir}.$m: ${_build_dirs:M*.$q}
.if ${BUILD_DIRDEPS_CACHE} == "yes"
.if !empty(_build_dirs)
_cache_deps += ${_build_dirs:M*.$m:N${_this_dir}.$m:S,^${SRCTOP}/,,}
+# anything in _{build,env}_xtra_dirs is hooked to dirdeps: only
+.if ${MAKE_VERSION} < 20240105
.if !empty(_cache_deps)
.export _cache_deps
_cache_script += for x in $$_cache_deps; do echo " _{SRCTOP}/$$x \\"; done;
.endif
-# anything in _{build,env}_xtra_dirs is hooked to dirdeps: only
+.export _cache_xtra_deps _new_dirdeps
x!= echo; { echo; ${_cache_script} echo; echo '${_this_dir}.$m: $${DIRDEPS.${_this_dir}.$m}'; \
echo; echo 'dirdeps: ${_this_dir}.$m \'; \
for x in $$_cache_xtra_deps; do echo " _{SRCTOP}/$$x \\"; done; \
echo; for x in $$_new_dirdeps; do echo "_{SRCTOP}/$$x: _DIRDEP_USE"; done; } >&3
+.else
+# we do not have the same limits on command lines
+.if !empty(_cache_deps)
+_cache_script += for x in ${_cache_deps}; do echo " _{SRCTOP}/$$x \\"; done;
+.endif
+x!= echo; { echo; ${_cache_script} echo; echo '${_this_dir}.$m: $${DIRDEPS.${_this_dir}.$m}'; \
+ echo; echo 'dirdeps: ${_this_dir}.$m \'; \
+ for x in ${_cache_xtra_deps}; do echo " _{SRCTOP}/$$x \\"; done; \
+ echo; for x in ${_new_dirdeps}; do echo "_{SRCTOP}/$$x: _DIRDEP_USE"; done; } >&3
+.endif
.endif
.else
${_this_dir}.$m: ${_build_dirs:M*.$m:N${_this_dir}.$m}
@@ -788,8 +837,9 @@ ${_this_dir}.$m: ${_build_dirs:M*.$m:N${_this_dir}.$m}
.if !target(_dirdeps_checked.$d)
# once only
_dirdeps_checked.$d:
+_dr := ${d:S,^${SRCTOP}/,,}
.if ${_debug_search}
-.info checking ${d:S,^${SRCTOP}/,,}
+.info checking ${_dr}
.endif
# Note: _build_all_dirs is fully qualifed so d:R is always the directory
.if exists(${d:R})
@@ -797,14 +847,13 @@ _dirdeps_checked.$d:
_DEP_TARGET_SPEC := ${d:E}
# some makefiles may still look at this
_DEP_MACHINE := ${d:E:C/,.*//}
+DEP_MACHINE := ${_DEP_MACHINE}
# set these too in case Makefile.depend* uses them
-.if ${TARGET_SPEC_VARS:[#]} > 1
+.if ${DEP_TARGET_SPEC_VARS:[#]} > 1
_dtspec := ${_DEP_TARGET_SPEC:S/,/ /g}
.for i in ${_tspec_x}
-DEP_${TARGET_SPEC_VARS:[$i]} := ${_dtspec:[$i]}
+DEP_${DEP_TARGET_SPEC_VARS:[$i]} := ${_dtspec:[$i]}
.endfor
-.else
-DEP_MACHINE := ${_DEP_MACHINE}
.endif
# Warning: there is an assumption here that MACHINE is always
# the first entry in TARGET_SPEC_VARS.
@@ -812,7 +861,7 @@ DEP_MACHINE := ${_DEP_MACHINE}
_m := ${.MAKE.DEPENDFILE_PREFERENCE:T:S;${TARGET_SPEC}$;${d:E};:C;${MACHINE}((,.+)?)$;${d:E:C/,.*//}\1;:@m@${exists(${d:R}/$m):?${d:R}/$m:}@:[1]}
.if !empty(_m)
# M_dep_qual_fixes isn't geared to Makefile.depend
-_qm := ${_m:C;(\.depend)$;\1.${d:E};:${M_dep_qual_fixes:ts:}}
+_qm := ${_m:C;(\.depend)$;\1.${d:E};:${M_dep_qual_fixes.${d:E}:U${M_dep_qual_fixes}:ts:}}
.if ${_debug_search}
.info Looking for ${_qm}
.endif
@@ -822,10 +871,16 @@ DEP_RELDIR := ${_m:H:S,^${SRCTOP}/,,}
# and reset this
DIRDEPS =
.if ${_debug_reldir} && ${_qm} != ${_m}
-.info loading ${_m} for ${d:E}
+.info loading ${_m:S,${SRCTOP}/,,} for ${_dr}
.endif
.include <${_m}>
.else
+# set these as if we found Makefile.depend*
+DEP_RELDIR := ${_dr:R}
+DIRDEPS =
+.if ${_debug_reldir}
+.info loading local.dirdeps-missing.mk for ${_dr}
+.endif
.-include <local.dirdeps-missing.mk>
.endif
.endif
diff --git a/share/mk/gendirdeps.mk b/share/mk/gendirdeps.mk
index 6d26b3d308b1..5d54aa232152 100644
--- a/share/mk/gendirdeps.mk
+++ b/share/mk/gendirdeps.mk
@@ -1,6 +1,7 @@
-# $FreeBSD$
-# $Id: gendirdeps.mk,v 1.46 2020/08/19 17:51:53 sjg Exp $
+# $Id: gendirdeps.mk,v 1.50 2023/11/04 16:47:34 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
# Copyright (c) 2011-2020, Simon J. Gerraty
# Copyright (c) 2010-2018, Juniper Networks, Inc.
# All rights reserved.
@@ -42,6 +43,37 @@
# symlink to another filesystem.
# _objroot must be a prefix match for _objtop
+# If any of GENDIRDEPS_FILTER, GENDIRDEPS_FILTER_DIR_VARS
+# or GENDIRDEPS_FILTER_VARS are set, we use them to filter the
+# output from filemon(4).
+# Any references to variables that dirdeps.mk will set
+# such as DEP_MACHINE, DEP_RELDIR etc, should use that form.
+# Thus we want ${DEP_MACHINE} not ${MACHINE} used in DIRDEPS.
+#
+# If any manually maintained Makefile.depend files will use any
+# DEP_* variables in conditionals, precautions are needed to avoid
+# errors when Makefile.depend is read at level 1+ (ie not via
+# dirdeps.mk)
+# Using MACHINE as an example; such makefiles can do:
+#
+# DEP_MACHINE ?= ${MACHINE}
+# .if ${DEP_MACHINE} == "xyz"
+#
+# or:
+#
+# .if ${DEP_MACHINE:U${MACHINE}} == "xyz"
+#
+# but it might be safer to set GENDIRDEPS_FILTER_DIR_VARS and
+# GENDIRDEPS_FILTER_VARS via local.meta.sys.mk rather than
+# local.gendirdeps.mk and then:
+#
+# .if ${.MAKE.LEVEL} > 0
+# .for V in ${GENDIRDEPS_FILTER_DIR_VARS:MDEP_*} \
+# ${GENDIRDEPS_FILTER_VARS:MDEP_*}
+# $V ?= ${${V:S,DEP_,,}}
+# .endfor
+# .endif
+#
.MAIN: all
# keep this simple
@@ -70,6 +102,10 @@ _DEPENDFILE := ${_CURDIR}/${.MAKE.DEPENDFILE:T}
# caller should have set this
META_FILES ?= ${.MAKE.META.FILES}
+# this sometimes needs to be passed separately
+.if !empty(META_XTRAS)
+META_FILES += ${META_XTRAS:N\*.meta}
+.endif
.if !empty(META_FILES)
@@ -89,7 +125,7 @@ META_FILES := ${META_FILES:T:O:u}
# they should all be absolute paths
SKIP_GENDIRDEPS ?=
.if !empty(SKIP_GENDIRDEPS)
-_skip_gendirdeps = egrep -v '^(${SKIP_GENDIRDEPS:O:u:ts|})' |
+_skip_gendirdeps = ${EGREP:Uegrep} -v '^(${SKIP_GENDIRDEPS:O:u:ts|})' |
.else
_skip_gendirdeps =
.endif
@@ -340,6 +376,8 @@ CAT_DEPEND ?= .depend
.PHONY: ${_DEPENDFILE}
.endif
+# set this to 'no' and we will not capture any
+# local depends
LOCAL_DEPENDS_GUARD ?= _{.MAKE.LEVEL} > 0
# 'cat .depend' should suffice, but if we are mixing build modes
@@ -352,6 +390,7 @@ ${_DEPENDFILE}: .NOMETA ${CAT_DEPEND:M.depend} ${META_FILES:O:u:@m@${exists($m):
echo '${DIRDEPS:@d@ $d \\${.newline}@}'; echo; \
${_include_src_dirdeps} \
echo '.include <dirdeps.mk>'; \
+ [ "${LOCAL_DEPENDS_GUARD:[1]:tl}" != no ] || exit 0; \
echo; \
echo '.if ${LOCAL_DEPENDS_GUARD}'; \
echo '# local dependencies - needed for -jN in clean tree'; \
diff --git a/share/mk/googletest.test.inc.mk b/share/mk/googletest.test.inc.mk
index 1f35e11894d3..05415775448b 100644
--- a/share/mk/googletest.test.inc.mk
+++ b/share/mk/googletest.test.inc.mk
@@ -1,5 +1,3 @@
-# $FreeBSD$
-
GTESTS_CXXFLAGS+= -DGTEST_HAS_POSIX_RE=1
GTESTS_CXXFLAGS+= -DGTEST_HAS_PTHREAD=1
GTESTS_CXXFLAGS+= -DGTEST_HAS_STREAM_REDIRECTION=1
@@ -7,20 +5,10 @@ GTESTS_CXXFLAGS+= -frtti
.include <bsd.compiler.mk>
-.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 100000
-# Required until googletest is upgraded to a more recent version (after
-# upstream commit efecb0bfa687cf87836494f5d62868485c00fb66).
-GTESTS_CXXFLAGS+= -Wno-deprecated-copy
-
-# Required until googletest is upgraded to a more recent version (after
-# upstream commit d44b137fd104dfffdcdea103f7de11b9eccc45c2).
-GTESTS_CXXFLAGS+= -Wno-signed-unsigned-wchar
-.endif
-
# XXX: src.libnames.mk should handle adding this directory for libgtest's,
# libgmock's, etc, headers.
CXXFLAGS+= -I${DESTDIR}${INCLUDEDIR}/private
-CXXSTD?= c++11
+CXXSTD?= c++14
NO_WTHREAD_SAFETY=
diff --git a/share/mk/googletest.test.mk b/share/mk/googletest.test.mk
index b2e57e8d6e0a..026f6dcacce3 100644
--- a/share/mk/googletest.test.mk
+++ b/share/mk/googletest.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# You must include bsd.test.mk instead of this file from your Makefile.
#
diff --git a/share/mk/host-target.mk b/share/mk/host-target.mk
index ef8cc80d658d..d8abea17fdac 100644
--- a/share/mk/host-target.mk
+++ b/share/mk/host-target.mk
@@ -1,33 +1,40 @@
-# $FreeBSD$
# RCSid:
-# $Id: host-target.mk,v 1.11 2015/10/25 00:07:20 sjg Exp $
+# $Id: host-target.mk,v 1.19 2023/09/21 06:44:53 sjg Exp $
# Host platform information; may be overridden
+.if !target(__${.PARSEFILE}__)
+__${.PARSEFILE}__: .NOTMAIN
+
.if !defined(_HOST_OSNAME)
-_HOST_OSNAME != uname -s
+# use .MAKE.OS if available
+_HOST_OSNAME := ${.MAKE.OS:U${uname -s:L:sh}}
.export _HOST_OSNAME
.endif
.if !defined(_HOST_OSREL)
_HOST_OSREL != uname -r
.export _HOST_OSREL
.endif
-.if !defined(_HOST_MACHINE)
-_HOST_MACHINE != uname -m
-.export _HOST_MACHINE
-.endif
.if !defined(_HOST_ARCH)
-# for NetBSD prefer $MACHINE (amd64 rather than x86_64)
-.if ${_HOST_OSNAME:NNetBSD} == ""
-_HOST_ARCH := ${_HOST_MACHINE}
-.else
_HOST_ARCH != uname -p 2> /dev/null || uname -m
# uname -p may produce garbage on linux
.if ${_HOST_ARCH:[\#]} > 1 || ${_HOST_ARCH:Nunknown} == ""
-_HOST_ARCH := ${_HOST_MACHINE}
-.endif
+_HOST_ARCH = ${_HOST_MACHINE}
+.elif ${_HOST_OSNAME:NDarwin} == "" && ${_HOST_ARCH:Narm:Ni386} == ""
+# _HOST_MACHINE is more explicit/useful
+_HOST_ARCH = ${_HOST_MACHINE}
.endif
.export _HOST_ARCH
.endif
+.if !defined(_HOST_MACHINE)
+_HOST_MACHINE != uname -m
+# just in case
+_HOST_ARCH := ${_HOST_ARCH}
+# uname -m may produce garbage on darwin ppc
+.if ${_HOST_MACHINE:[\#]} > 1
+_HOST_MACHINE := ${_HOST_ARCH}
+.endif
+.export _HOST_MACHINE
+.endif
.if !defined(HOST_MACHINE)
HOST_MACHINE := ${_HOST_MACHINE}
.export HOST_MACHINE
@@ -38,8 +45,20 @@ HOST_OSTYPE := ${_HOST_OSNAME:S,/,,g}-${_HOST_OSREL:C/\([^\)]*\)//}-${_HOST_ARC
HOST_OS := ${_HOST_OSNAME}
host_os := ${_HOST_OSNAME:tl}
HOST_TARGET := ${host_os:S,/,,g}${HOST_OSMAJOR}-${_HOST_ARCH}
+# sometimes we want HOST_TARGET32
+MACHINE32.amd64 = i386
+MACHINE32.x86_64 = i386
+.if !defined(_HOST_ARCH32)
+_HOST_ARCH32 := ${MACHINE32.${_HOST_ARCH}:U${_HOST_ARCH:S,64$,,}}
+.export _HOST_ARCH32
+.endif
+HOST_TARGET32 := ${host_os:S,/,,g}${HOST_OSMAJOR}-${_HOST_ARCH32}
+
+.export HOST_TARGET HOST_TARGET32
# tr is insanely non-portable, accommodate the lowest common denominator
TR ?= tr
toLower = ${TR} 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
toUpper = ${TR} 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+.endif
diff --git a/share/mk/install-new.mk b/share/mk/install-new.mk
index 5e95c99be242..19a2b2a10061 100644
--- a/share/mk/install-new.mk
+++ b/share/mk/install-new.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# $Id: install-new.mk,v 1.3 2012/03/24 18:25:49 sjg Exp $
#
# @(#) Copyright (c) 2009, Simon J. Gerraty
diff --git a/share/mk/jobs.mk b/share/mk/jobs.mk
new file mode 100644
index 000000000000..0643e6481082
--- /dev/null
+++ b/share/mk/jobs.mk
@@ -0,0 +1,105 @@
+# $Id: jobs.mk,v 1.14 2023/09/11 16:52:44 sjg Exp $
+#
+# @(#) Copyright (c) 2012-2023, Simon J. Gerraty
+#
+# This file is provided in the hope that it will
+# be of use. There is absolutely NO WARRANTY.
+# Permission to copy, redistribute or otherwise
+# use this file is hereby granted provided that
+# the above copyright notice and this notice are
+# left intact.
+#
+# Please send copies of changes and bug-fixes to:
+# sjg@crufty.net
+#
+
+# This makefile is used by top-level makefile.
+# With the following:
+#
+# .if make(*-jobs)
+# .include <jobs.mk>
+# .endif
+#
+#
+# Then if you do:
+#
+# mk target-jobs
+#
+# We will run:
+#
+# ${MAKE} -j${JOB_MAX} target > ${JOB_LOGDIR}/target.log 2>&1
+#
+# JOB_MAX should be something like 1.2 - 1.5 times the number of
+# available CPUs.
+# If bmake sets .MAKE.JOBS.C=yes we can use -jC and
+# JOB_MAX defaults to JOB_MAX_C (default 1.33C).
+# Otherwise we use 8.
+#
+
+now_utc ?= ${%s:L:localtime}
+.if !defined(start_utc)
+start_utc := ${now_utc}
+.endif
+
+.if make(*-jobs)
+.info ${.newline}${TIME_STAMP} Start ${.TARGETS}
+
+JOB_LOGDIR ?= ${SRCTOP:H}
+JOB_LOG = ${JOB_LOGDIR}/${.TARGET:S,-jobs,,:S,/,_,g}.log
+JOB_LOG_GENS ?= 4
+# we like to rotate logs
+.if empty(NEWLOG_SH)
+.for d in ${.SYSPATH:U${.PARSEDIR}:@x@$x $x/scripts@}
+.if exists($d/newlog.sh)
+NEWLOG_SH := $d/newlog.sh
+.if ${MAKE_VERSION} > 20220924
+.break
+.endif
+.endif
+.endfor
+.if empty(NEWLOG_SH)
+.ifdef M_whence
+NEWLOG_SH := ${newlog.sh:L:${M_whence}}
+.else
+NEWLOG_SH := ${(type newlog.sh) 2> /dev/null:L:sh:M/*}
+.endif
+.endif
+.endif
+.if !empty(NEWLOG_SH) && exists(${NEWLOG_SH})
+NEWLOG := sh ${NEWLOG_SH}
+JOB_NEWLOG_ARGS ?= -S -n ${JOB_LOG_GENS}
+.else
+NEWLOG = :
+.endif
+
+.if ${.MAKE.JOBS:U0} > 0
+JOB_MAX = ${.MAKE.JOBS}
+.else
+# This should be derrived from number of cpu's
+.if ${.MAKE.JOBS.C:Uno} == "yes"
+# 1.2 - 1.5 times nCPU works well on most machines that support -jC
+JOB_MAX_C ?= 1.33C
+JOB_MAX ?= ${JOB_MAX_C}
+.endif
+JOB_MAX ?= 8
+JOB_ARGS += -j${JOB_MAX}
+.endif
+
+# we need to reset .MAKE.LEVEL to 0 so that
+# build orchestration works as expected (DIRDEPS_BUILD)
+${.TARGETS:M*-jobs}:
+ @${NEWLOG} ${JOB_NEWLOG_ARGS} ${JOB_LOG}
+ @echo "${TIME_STAMP} Start ${.TARGET:S,-jobs,,} ${JOB_ARGS} ${JOB_LOG_START} log=${JOB_LOG}" | tee ${JOB_LOG}
+ @cd ${.CURDIR} && env MAKELEVEL=0 \
+ ${.MAKE} ${JOB_ARGS} _TARGETS=${.TARGET:S,-jobs,,} ${.TARGET:S,-jobs,,} >> ${JOB_LOG} 2>&1
+
+.endif
+
+.END: _build_finish
+.ERROR: _build_failed
+
+_build_finish: .NOMETA
+ @echo "${TIME_STAMP} Finished ${.TARGETS} seconds=`expr ${now_utc} - ${start_utc}`"
+
+_build_failed: .NOMETA
+ @echo "${TIME_STAMP} Failed ${.TARGETS} seconds=`expr ${now_utc} - ${start_utc}`"
diff --git a/share/mk/kmod.opts.mk b/share/mk/kmod.opts.mk
index 172526adc2bb..64cafce5fcf5 100644
--- a/share/mk/kmod.opts.mk
+++ b/share/mk/kmod.opts.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.include <bsd.sysdir.mk>
.include "${SYSDIR}/conf/kmod.opts.mk"
diff --git a/share/mk/local.autodep.mk b/share/mk/local.autodep.mk
index 0e14d844fcff..f36fe6b11655 100644
--- a/share/mk/local.autodep.mk
+++ b/share/mk/local.autodep.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if ${.MAKE.DEPENDFILE:M*.${MACHINE}} == ""
# by default only MACHINE0 does updates
@@ -8,14 +7,6 @@ UPDATE_DEPENDFILE= no
.endif
.endif
-NOSSPPICO?= .nossppico
-PIEO?= .pieo
-OBJ_EXTENSIONS+= ${NOSSPPICO} ${PIEO}
-
-CFLAGS+= ${CFLAGS_LAST}
-CXXFLAGS+= ${CXXFLAGS_LAST}
-LDFLAGS+= ${LDFLAGS_LAST}
-
CLEANFILES+= .depend
# handy for debugging
@@ -27,3 +18,10 @@ CLEANFILES+= .depend
.cc.cpp-out: .NOMETA
@${CXX} -E ${CXXFLAGS} ${.IMPSRC} | grep -v '^[[:space:]]*$$'
+
+.-include <site.autodep.mk>
+
+.ifdef _RECURSING_CRUNCH
+# crunchgen does not want to see our stats
+_reldir_finish: .NOTMAIN
+.endif
diff --git a/share/mk/local.dirdeps-options.mk b/share/mk/local.dirdeps-options.mk
index 9ad08a78cb19..4eef5311375e 100644
--- a/share/mk/local.dirdeps-options.mk
+++ b/share/mk/local.dirdeps-options.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# avoid duplication
DIRDEPS.AUDIT.yes= lib/libbsm
@@ -25,4 +24,6 @@ DIRDEPS.OPENSSL.no+= lib/libmd
DIRDEPS.PAM_SUPPORT.yes+= lib/libpam/libpam
DIRDEPS.TCP_WRAPPERS.yes+= lib/libwrap
+MK_FDT.${DEP_MACHINE} ?= yes
+.-include <site.dirdeps-options.mk>
diff --git a/share/mk/local.dirdeps-targets.mk b/share/mk/local.dirdeps-targets.mk
new file mode 100644
index 000000000000..f07708c2c551
--- /dev/null
+++ b/share/mk/local.dirdeps-targets.mk
@@ -0,0 +1 @@
+.-include <${.PARSEFILE:S/local/site/}>
diff --git a/share/mk/local.dirdeps.mk b/share/mk/local.dirdeps.mk
index 16c9ee5a55ec..2a92eea7455e 100644
--- a/share/mk/local.dirdeps.mk
+++ b/share/mk/local.dirdeps.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(_DIRDEP_USE)
# we are the 1st makefile
@@ -6,6 +5,10 @@
.include "${SRCTOP}/share/mk/src.opts.mk"
.endif
+# Machine-specific MK settings needed for Makefile.dirdeps.options usage
+MK_FDT.i386 = no
+MK_FDT.amd64 = no
+
# making universe is special
.if defined(UNIVERSE_GUARD)
# these should be done by now
@@ -13,35 +16,47 @@ DIRDEPS_FILTER+= N*.host
.endif
# pseudo machines get no qualification
-.for m in host common
+.for m in ${PSEUDO_MACHINE_LIST:Nhost*}
M_dep_qual_fixes += C;($m),[^/.,]*$$;\1;
.endfor
#.info M_dep_qual_fixes=${M_dep_qual_fixes}
+# Some things we never want to build for host
+DIRDEPS_FILTER.host = \
+ Ninclude* \
+ Nlib/csu* \
+ Nlib/libc \
+ Nlib/libcompiler_rt \
+ Nlib/[mn]* \
+ Nlib/lib[t]* \
+ Ngnu/lib/lib[a-r]* \
+ Nsecure/lib* \
+ Nusr.bin/xinstall* \
+
+.if ${.MAKE.OS} == "FreeBSD"
+# Host libraries should mostly be excluded from the build so the
+# host version in /usr/lib is used.
+# Internal libraries need to be allowed to be built though
+# since they are never installed.
+
# Cheat for including src.libnames.mk
__<bsd.init.mk>__:
# Pull in _INTERNALLIBS
.include <src.libnames.mk>
-# Host libraries should mostly be excluded from the build so the
-# host version in /usr/lib is used. Internal libraries need to be
-# allowed to be built though since they are never installed.
_need_host_libs=
.for lib in ${_INTERNALLIBS}
_need_host_libs+= ${LIB${lib:tu}DIR:S,^${OBJTOP}/,,}
.endfor
+.if ${MK_host_egacy} == "yes"
+_need_host_libs+= lib/libmd
+.endif
N_host_libs:= ${cd ${SRCTOP} && echo lib/lib*:L:sh:${_need_host_libs:${M_ListToSkip}}:${M_ListToSkip}}
-DIRDEPS_FILTER.host = \
- ${N_host_libs} \
- Ninclude* \
- Nlib/csu* \
- Nlib/libc \
- Nlib/[mn]* \
- Ngnu/lib/lib[a-r]* \
- Nsecure/lib* \
- Nusr.bin/xinstall* \
+DIRDEPS_FILTER.host+= ${N_host_libs}
+.endif
+DIRDEPS_FILTER.host32 = ${DIRDEPS_FILTER.host}
DIRDEPS_FILTER+= \
Nbin/cat.host \
@@ -60,7 +75,15 @@ cleanup_worldtmp: .PHONY .NOMETA
rm -rf ${OBJTOP}/tmp
beforedirdeps: cleanup_worldtmp
.endif
-.endif
+
+# pseudo option for building host tools on old or non-FreeBSD host
+# allows us to leverage Makefile.depend.options with
+# DIRDEPS_OPTIONS = host_egacy
+# dirdeps-options.mk will qualify with ${DEP_MACHINE} (and others)
+# before looking at the bare option.
+MK_host_egacy.host= ${MK_host_egacy}
+
+.endif # !target(_DIRDEP_USE)
# reset this each time
DIRDEPS_FILTER.xtras=
@@ -68,7 +91,12 @@ DIRDEPS_FILTER.xtras=
DIRDEPS_FILTER.xtras+= Nusr.bin/clang/clang.host
.endif
-.if ${DEP_MACHINE} != "host"
+.if ${DEP_MACHINE:Nhost*} == ""
+.if ${MK_host_egacy} == "yes" && ${DEP_RELDIR:Ntools/build:Ntargets/*:N*/stage} != ""
+DIRDEPS += tools/build
+.endif
+.else
+MK_host_egacy.${DEP_MACHINE}= no
# this is how we can handle optional dependencies
.if ${DEP_RELDIR} == "lib/libc"
@@ -87,6 +115,7 @@ DIRDEPS += \
cddl/usr.bin/ctfmerge.host
.endif
+.if ${DEP_MACHINE:Nhost*} != ""
# Add in proper libgcc (gnu or LLVM) if not building libcc and libc is needed.
# Add both gcc_s and gcc_eh as dependencies as the decision to build
# -static or not is not known here.
@@ -95,6 +124,7 @@ DIRDEPS+= \
lib/libgcc_eh \
lib/libgcc_s
.endif
+.endif
# Bootstrap support. Give hints to DIRDEPS if there is no Makefile.depend*
# generated yet. This can be based on things such as SRC files and LIBADD.
@@ -207,13 +237,16 @@ DIRDEPS+= ${_lib${_lib}reldir}
.if ${MK_STAGING} == "yes"
# we need targets/pseudo/stage to prep the stage tree
-.if ${DEP_RELDIR} != "targets/pseudo/stage"
+.if ${DEP_RELDIR:N.:N${SRCTOP}:N*pseudo/stage} != ""
DIRDEPS += targets/pseudo/stage
.endif
.endif
DEP_MACHINE_ARCH = ${MACHINE_ARCH.${DEP_MACHINE}}
+DEP_MACHINE_CPUARCH = ${DEP_MACHINE_ARCH:${__TO_CPUARCH}}
CSU_DIR.${DEP_MACHINE_ARCH} ?= csu/${DEP_MACHINE_ARCH}
CSU_DIR := ${CSU_DIR.${DEP_MACHINE_ARCH}}
BOOT_MACHINE_DIR:= ${BOOT_MACHINE_DIR.${DEP_MACHINE}}
KERNEL_NAME:= ${KERNEL_NAME.${DEP_MACHINE}}
+
+.-include <site.dirdeps.mk>
diff --git a/share/mk/local.gendirdeps.mk b/share/mk/local.gendirdeps.mk
index 3ec2be4cc865..fcfbb24f7311 100644
--- a/share/mk/local.gendirdeps.mk
+++ b/share/mk/local.gendirdeps.mk
@@ -1,7 +1,3 @@
-# $FreeBSD$
-
-# we need a keyword, this noise is to prevent it being expanded
-GENDIRDEPS_HEADER= echo '\# ${FreeBSD:L:@v@$$$v$$ @:M*F*}';
# suppress optional/auto dependencies
# local.dirdeps.mk will put them in if necessary
@@ -53,20 +49,10 @@ GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_HOST_TOOLS}
GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER.${MACHINE}:U}
# gendirdeps.mk will turn _{VAR} into ${VAR} which keeps this simple
-# order of this list matters!
-GENDIRDEPS_FILTER_DIR_VARS+= \
- CSU_DIR \
- BOOT_MACHINE_DIR
-
-# order of this list matters!
-GENDIRDEPS_FILTER_VARS+= \
- KERNEL_NAME \
- MACHINE_CPUARCH \
- MACHINE_ARCH \
- MACHINE
-
-GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_DIR_VARS:@v@S,${$v},_{${v}},@}
-GENDIRDEPS_FILTER+= ${GENDIRDEPS_FILTER_VARS:@v@S,/${$v}/,/_{${v}}/,@:NS,//,*:u}
+# see local.meta.sys.mk for GENDIRDEPS_FILTER_DIR_VARS and
+# GENDIRDEPS_FILTER_VARS
# avoid churn for now
LOCAL_DEPENDS_GUARD= _{DEP_RELDIR} == _{_DEP_RELDIR}
+
+.-include <site.gendirdeps.mk>
diff --git a/share/mk/local.init.mk b/share/mk/local.init.mk
index 29a951a6aac0..758a3604d73a 100644
--- a/share/mk/local.init.mk
+++ b/share/mk/local.init.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__${_this}__)
__${_this}__:
@@ -14,12 +13,15 @@ __${_this}__:
# XXX: This should be combined with external compiler support in Makefile.inc1
# and local.meta.sys.mk (CROSS_TARGET_FLAGS)
-.if ${MK_SYSROOT} == "yes" && !empty(SYSROOT) && ${MACHINE} != "host"
+.if ${MK_SYSROOT} == "yes" && !empty(SYSROOT) && ${MACHINE:Nhost*} != ""
CFLAGS_LAST+= --sysroot=${SYSROOT}
CXXFLAGS_LAST+= --sysroot=${SYSROOT}
LDADD+= --sysroot=${SYSROOT}
.elif ${MK_STAGING} == "yes"
-CFLAGS+= -isystem ${STAGE_INCLUDEDIR}
+ISYSTEM?= ${STAGE_INCLUDEDIR}
+# no space after -isystem makes it easier to
+# grep the flag out of command lines (in meta files) to see its value.
+CFLAGS+= -isystem${ISYSTEM}
# XXX: May be needed for GCC to build with libc++ rather than libstdc++. See Makefile.inc1
#CXXFLAGS+= -std=gnu++11
#LDADD+= -L${STAGE_LIBDIR}/libc++
@@ -27,8 +29,8 @@ CFLAGS+= -isystem ${STAGE_INCLUDEDIR}
LDADD+= -L${STAGE_LIBDIR}
.endif
-.if ${MACHINE} == "host"
-.if ${.MAKE.DEPENDFILE:E} != "host"
+.if ${MACHINE:Nhost*} == ""
+.if ${.MAKE.DEPENDFILE:E:Nhost*} != ""
UPDATE_DEPENDFILE?= no
.endif
HOST_CFLAGS+= -DHOSTPROG
@@ -36,5 +38,6 @@ CFLAGS+= ${HOST_CFLAGS}
.endif
.-include "src.init.mk"
+.-include <site.init.mk>
.-include "${.CURDIR}/local.init.mk"
.endif
diff --git a/share/mk/local.meta.sys.env.mk b/share/mk/local.meta.sys.env.mk
new file mode 100644
index 000000000000..2011d521ff0b
--- /dev/null
+++ b/share/mk/local.meta.sys.env.mk
@@ -0,0 +1,20 @@
+
+# local configuration specific to meta mode
+
+.-include <site.meta.sys.env.mk>
+
+.if !defined(NO_META_MISSING)
+META_MODE+= missing-meta=yes
+.endif
+# silent will hide command output if a .meta file is created.
+.if !defined(NO_SILENT)
+META_MODE+= silent=yes
+.endif
+.if empty(META_MODE:Mnofilemon)
+META_MODE+= missing-filemon=yes
+.endif
+
+.if make(showconfig)
+# this does not need/want filemon
+UPDATE_DEPENDFILE= NO
+.endif
diff --git a/share/mk/local.meta.sys.mk b/share/mk/local.meta.sys.mk
deleted file mode 100644
index 075a84fb67de..000000000000
--- a/share/mk/local.meta.sys.mk
+++ /dev/null
@@ -1,260 +0,0 @@
-# $FreeBSD$
-
-# local configuration specific to meta mode
-# XXX some of this should be in meta.sys.mk
-# we assume that MK_DIRDEPS_BUILD=yes
-
-# we need this until there is an alternative
-MK_INSTALL_AS_USER= yes
-
-.if !defined(HOST_TARGET) || !defined(HOST_MACHINE)
-# we need HOST_TARGET etc below.
-.include <host-target.mk>
-.export HOST_TARGET
-.endif
-
-# from src/Makefile (for universe)
-TARGET_ARCHES_arm?= arm armv6 armv7
-TARGET_ARCHES_arm64?= aarch64
-TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpc64le powerpcspe
-TARGET_ARCHES_riscv?= riscv64 riscv64sf
-
-# some corner cases
-BOOT_MACHINE_DIR.amd64 = boot/i386
-MACHINE_ARCH.host = ${_HOST_ARCH}
-
-# the list of machines we support
-ALL_MACHINE_LIST?= amd64 arm arm64 i386 powerpc riscv
-.for m in ${ALL_MACHINE_LIST:O:u}
-MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m}
-MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]}
-BOOT_MACHINE_DIR.$m ?= boot/$m
-.endfor
-
-.ifndef _TARGET_SPEC
-.if empty(MACHINE_ARCH)
-.if !empty(TARGET_ARCH)
-MACHINE_ARCH= ${TARGET_ARCH}
-.else
-MACHINE_ARCH= ${MACHINE_ARCH.${MACHINE}}
-.endif
-.endif
-MACHINE_ARCH?= ${MACHINE_ARCH.${MACHINE}}
-MACHINE_ARCH:= ${MACHINE_ARCH}
-.else
-# we got here via dirdeps
-MACHINE_ARCH:= ${MACHINE_ARCH.${MACHINE}}
-.endif
-
-# now because for universe we want to potentially
-# build for multiple MACHINE_ARCH per MACHINE
-# we need more than MACHINE in TARGET_SPEC
-TARGET_SPEC_VARS= MACHINE MACHINE_ARCH
-# see dirdeps.mk
-.if ${TARGET_SPEC:Uno:M*,*} != ""
-_tspec := ${TARGET_SPEC:S/,/ /g}
-MACHINE := ${_tspec:[1]}
-MACHINE_ARCH := ${_tspec:[2]}
-# etc.
-# We need to stop that TARGET_SPEC affecting any submakes
-# and deal with MACHINE=${TARGET_SPEC} in the environment.
-TARGET_SPEC=
-# export but do not track
-.export-env TARGET_SPEC
-.export ${TARGET_SPEC_VARS}
-.for v in ${TARGET_SPEC_VARS:O:u}
-.if empty($v)
-.undef $v
-.endif
-.endfor
-.endif
-# make sure we know what TARGET_SPEC is
-# as we may need it to find Makefile.depend*
-TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
-
-# to be consistent with src/Makefile just concatenate with '.'s
-TARGET_OBJ_SPEC:= ${TARGET_SPEC:S;,;.;g}
-OBJTOP:= ${OBJROOT}${TARGET_OBJ_SPEC}
-
-.if defined(MAKEOBJDIR)
-.if ${MAKEOBJDIR:M/*} == ""
-.error Cannot use MAKEOBJDIR=${MAKEOBJDIR}${.newline}Unset MAKEOBJDIR to get default: MAKEOBJDIR='${_default_makeobjdir}'
-.endif
-.endif
-
-HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
-
-.if ${OBJTOP} == ${HOST_OBJTOP} || ${REQUESTED_MACHINE:U${MACHINE}} == "host"
-MACHINE= host
-.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
-# not what we want
-TARGET_MACHINE= host
-.endif
-.endif
-.if ${MACHINE} == "host"
-OBJTOP := ${HOST_OBJTOP}
-.endif
-
-.if ${.MAKE.LEVEL} == 0 || empty(PYTHON)
-PYTHON ?= /usr/local/bin/python
-.export PYTHON
-# _SKIP_BUILD is not 100% as it requires wrapping all 'all:' targets to avoid
-# building in MAKELEVEL0. Just prohibit 'all' entirely in this case to avoid
-# problems.
-.if ${MK_DIRDEPS_BUILD} == "yes" && ${.MAKE.LEVEL} == 0
-.MAIN: dirdeps
-.if make(all)
-.error DIRDEPS_BUILD: Please run '${MAKE}' instead of '${MAKE} all'.
-.endif
-.endif
-.endif
-
-# we want to end up with a singe stage tree for all machines
-.if ${MK_STAGING} == "yes"
-.if empty(STAGE_ROOT)
-STAGE_ROOT?= ${OBJROOT}stage
-.export STAGE_ROOT
-.endif
-.endif
-
-.if ${MK_STAGING} == "yes"
-.if ${MACHINE} == "host"
-STAGE_MACHINE= ${HOST_TARGET}
-.else
-STAGE_MACHINE:= ${TARGET_OBJ_SPEC}
-.endif
-STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE}
-STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common
-STAGE_TARGET_OBJTOP:= ${STAGE_ROOT}/${TARGET_OBJ_SPEC}
-STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET}
-# These are exported for hooking in out-of-tree builds. They will always
-# be overridden in sub-makes above when building in-tree.
-.if ${.MAKE.LEVEL} > 0
-.export STAGE_OBJTOP STAGE_TARGET_OBJTOP STAGE_HOST_OBJTOP
-.endif
-
-# Use tools/install.sh which can avoid the need for xinstall for simple cases.
-INSTALL?= sh ${SRCTOP}/tools/install.sh
-# This is for stage-install to pickup from the environment.
-REAL_INSTALL:= ${INSTALL}
-.export REAL_INSTALL
-STAGE_INSTALL= sh ${.PARSEDIR:tA}/stage-install.sh OBJDIR=${.OBJDIR:tA}
-
-STAGE_LIBDIR= ${STAGE_OBJTOP}${_LIBDIR:U${LIBDIR:U/lib}}
-STAGE_INCLUDEDIR= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include}
-# this is not the same as INCLUDEDIR
-STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
-# the target is usually an absolute path
-STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
-
-#LDFLAGS_LAST+= -Wl,-rpath-link,${STAGE_LIBDIR}
-.if ${MK_SYSROOT} == "yes"
-SYSROOT?= ${STAGE_OBJTOP}
-.else
-LDFLAGS_LAST+= -L${STAGE_LIBDIR}
-.endif
-
-.endif # MK_STAGING
-
-.-include "local.toolchain.mk"
-
-# this is sufficient for most of the tree.
-.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
-
-# but if we have a machine qualified file it should be used in preference
-.MAKE.DEPENDFILE_PREFERENCE = \
- ${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
- ${.MAKE.DEPENDFILE_PREFIX}
-
-.undef .MAKE.DEPENDFILE
-
-.include "sys.dependfile.mk"
-
-.if ${.MAKE.LEVEL} > 0 && ${MACHINE} == "host" && ${.MAKE.DEPENDFILE:E} != "host"
-# we can use this but should not update it.
-UPDATE_DEPENDFILE= NO
-.endif
-# Don't require filemon for makeman.
-.if make(showconfig)
-UPDATE_DEPENDFILE= NO
-.endif
-
-# define the list of places that contain files we are responsible for
-.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
-
-CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
-CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
-
-.if !empty(TIME_STAMP)
-TRACER= ${TIME_STAMP} ${:U}
-.endif
-.if !defined(_RECURSING_PROGS) && !defined(_RECURSING_CRUNCH) && \
- !make(print-dir)
-WITH_META_STATS= t
-.endif
-
-# toolchains can be a pain - especially bootstrappping them
-.if ${MACHINE} == "host"
-MK_SHARED_TOOLCHAIN= no
-.endif
-TOOLCHAIN_VARS= AS AR CC CLANG_TBLGEN CXX CPP LD NM OBJCOPY RANLIB \
- STRINGS SIZE LLVM_TBLGEN
-_toolchain_bin_CLANG_TBLGEN= /usr/bin/clang-tblgen
-_toolchain_bin_LLVM_TBLGEN= /usr/bin/llvm-tblgen
-_toolchain_bin_CXX= /usr/bin/c++
-.ifdef WITH_TOOLSDIR
-TOOLSDIR?= ${HOST_OBJTOP}/tools
-.elif defined(STAGE_HOST_OBJTOP)
-TOOLSDIR?= ${STAGE_HOST_OBJTOP}
-.endif
-# Only define if it exists in case user didn't run bootstrap-tools. Otherwise
-# the tool will be built during the build. Building it assumes it is
-# TARGET==MACHINE.
-.if exists(${HOST_OBJTOP}/tools${.CURDIR})
-BTOOLSPATH= ${HOST_OBJTOP}/tools${.CURDIR}
-.endif
-
-# Don't use the bootstrap tools logic on itself.
-.if ${.TARGETS:Mbootstrap-tools} == "" && \
- !make(test-system-*) && !make(showconfig) && !make(print-dir) && \
- !defined(BOOTSTRAPPING_TOOLS) && !empty(TOOLSDIR) && ${.MAKE.LEVEL} == 0
-.for dir in /sbin /bin /usr/sbin /usr/bin
-PATH:= ${TOOLSDIR}${dir}:${PATH}
-.endfor
-.export PATH
-# Prefer the TOOLSDIR version of the toolchain if present vs the host version.
-.for var in ${TOOLCHAIN_VARS}
-_toolchain_bin.${var}= ${TOOLSDIR}${_toolchain_bin_${var}:U/usr/bin/${var:tl}}
-.if exists(${_toolchain_bin.${var}})
-HOST_${var}?= ${_toolchain_bin.${var}}
-.export HOST_${var}
-.endif
-.endfor
-.endif
-
-.for var in ${TOOLCHAIN_VARS}
-HOST_${var}?= ${_toolchain_bin_${var}:U/usr/bin/${var:tl}}
-.endfor
-
-.if ${MACHINE} == "host"
-.for var in ${TOOLCHAIN_VARS}
-${var}= ${HOST_${var}}
-.endfor
-.endif
-
-.if ${MACHINE:Nhost:Ncommon} != "" && ${MACHINE} != ${HOST_MACHINE}
-# cross-building
-.if !defined(FREEBSD_REVISION)
-FREEBSD_REVISION!= sed -n '/^REVISION=/{s,.*=,,;s,",,g;p; }' ${SRCTOP}/sys/conf/newvers.sh
-.export FREEBSD_REVISION
-.endif
-CROSS_TARGET_FLAGS= -target ${MACHINE_ARCH}-unknown-freebsd${FREEBSD_REVISION}
-CFLAGS+= ${CROSS_TARGET_FLAGS}
-ACFLAGS+= ${CROSS_TARGET_FLAGS}
-LDFLAGS+= -Wl,-m -Wl,elf_${MACHINE_ARCH}_fbsd
-.endif
-
-META_MODE+= missing-meta=yes
-.if empty(META_MODE:Mnofilemon)
-META_MODE+= missing-filemon=yes
-.endif
diff --git a/share/mk/local.sys.dirdeps.env.mk b/share/mk/local.sys.dirdeps.env.mk
new file mode 100644
index 000000000000..fdcb25b67e31
--- /dev/null
+++ b/share/mk/local.sys.dirdeps.env.mk
@@ -0,0 +1,67 @@
+
+# For universe we want to potentially
+# build for multiple MACHINE_ARCH per MACHINE
+# so we need more than MACHINE in TARGET_SPEC
+TARGET_SPEC_VARS?= MACHINE MACHINE_ARCH
+
+# this is sufficient for most of the tree.
+.MAKE.DEPENDFILE_DEFAULT = ${.MAKE.DEPENDFILE_PREFIX}
+
+# but if we have a machine qualified file it should be used in preference
+.MAKE.DEPENDFILE_PREFERENCE = \
+ ${.MAKE.DEPENDFILE_PREFIX}.${MACHINE} \
+ ${.MAKE.DEPENDFILE_PREFIX}
+
+# some corner cases
+BOOT_MACHINE_DIR.amd64 = stand/i386
+
+.-include <site.sys.dirdeps.env.mk>
+
+ALL_MACHINE_LIST?= ${TARGET_MACHINE_LIST}
+
+.for m in ${ALL_MACHINE_LIST:O:u}
+BOOT_MACHINE_DIR.$m ?= stand/$m
+.endfor
+
+HOST_OBJTOP ?= ${OBJROOT}${HOST_TARGET}
+HOST_OBJTOP32 ?= ${OBJROOT}${HOST_TARGET32}
+
+.if ${.MAKE.LEVEL} == 0
+.if ${REQUESTED_MACHINE:U${MACHINE}} == "host"
+MACHINE= host
+.if ${TARGET_MACHINE:Uno} == ${HOST_TARGET}
+# not what we want
+TARGET_MACHINE= host
+.endif
+.elif ${REQUESTED_MACHINE:U${MACHINE}} == "host32"
+MACHINE= host32
+.endif
+.endif
+
+.if ${MACHINE:Nhost*} == ""
+MACHINE_ARCH= ${MACHINE_ARCH_${MACHINE}}
+.if ${MACHINE} == "host32"
+.MAKE.DEPENDFILE_PREFERENCE= \
+ ${.CURDIR}/${.MAKE.DEPENDFILE_PREFIX}.host32 \
+ ${.CURDIR}/${.MAKE.DEPENDFILE_PREFIX}.host \
+ ${.CURDIR}/${.MAKE.DEPENDFILE_PREFIX}
+.endif
+.endif
+
+
+.if ${.MAKE.LEVEL} == 0 || empty(PYTHON)
+PYTHON ?= /usr/local/bin/python
+.export PYTHON
+
+# _SKIP_BUILD is not 100% as it requires wrapping all 'all:' targets to avoid
+# building in MAKELEVEL0. Just prohibit 'all' entirely in this case to avoid
+# problems.
+.if make(all)
+.error DIRDEPS_BUILD: Please run '${MAKE}' instead of '${MAKE} all'.
+.endif
+.endif
+
+.if ${.MAKE.OS} != "FreeBSD" || ${_HOST_OSREL:R} < ${OS_REVISION:R}
+# a pseudo option to indicate we need libegacy for host
+MK_host_egacy= yes
+.endif
diff --git a/share/mk/local.sys.dirdeps.mk b/share/mk/local.sys.dirdeps.mk
new file mode 100644
index 000000000000..357b6e2aa5ff
--- /dev/null
+++ b/share/mk/local.sys.dirdeps.mk
@@ -0,0 +1,150 @@
+
+# local configuration specific to meta mode
+# we assume that MK_DIRDEPS_BUILD=yes
+
+# we need this until there is an alternative
+MK_INSTALL_AS_USER= yes
+
+.-include <site.sys.dirdeps.mk>
+# previously only included for DIRDEPS_BUILD anyway
+.-include <site.meta.sys.mk>
+
+.if ${MK_STAGING} == "yes"
+
+STAGE_TARGET_OBJTOP:= ${STAGE_ROOT}/${TARGET_OBJ_SPEC}
+# These are exported for hooking in out-of-tree builds. They will always
+# be overridden in sub-makes above when building in-tree.
+.if ${.MAKE.LEVEL} > 0
+.export STAGE_OBJTOP STAGE_TARGET_OBJTOP STAGE_HOST_OBJTOP
+.endif
+
+# Use tools/install.sh which can avoid the need for xinstall for simple cases.
+INSTALL?= sh ${SRCTOP}/tools/install.sh
+# This is for stage-install to pickup from the environment.
+REAL_INSTALL:= ${INSTALL}
+.export REAL_INSTALL
+STAGE_INSTALL= sh ${.PARSEDIR:tA}/stage-install.sh OBJDIR=${.OBJDIR:tA}
+
+STAGE_LIBDIR= ${STAGE_OBJTOP}${_LIBDIR:U${LIBDIR:U/lib}}
+STAGE_INCLUDEDIR= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include}
+# this is not the same as INCLUDEDIR
+STAGE_INCSDIR= ${STAGE_OBJTOP}${INCSDIR:U/include}
+# the target is usually an absolute path
+STAGE_SYMLINKS_DIR= ${STAGE_OBJTOP}
+
+#LDFLAGS_LAST+= -Wl,-rpath-link,${STAGE_LIBDIR}
+.if ${MK_SYSROOT} == "yes"
+SYSROOT?= ${STAGE_OBJTOP}
+.else
+LDFLAGS_LAST+= -L${STAGE_LIBDIR}
+.endif
+
+.endif # MK_STAGING
+
+.-include "local.toolchain.mk"
+
+.if ${.MAKE.LEVEL} > 0 && ${MACHINE:Nhost*} == "" && ${.MAKE.DEPENDFILE:E} != "${MACHINE}"
+# we can use this but should not update it.
+UPDATE_DEPENDFILE?= NO
+.endif
+
+# define the list of places that contain files we are responsible for
+.MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT}
+
+CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH}
+CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}}
+
+.if !empty(TIME_STAMP)
+TRACER= ${TIME_STAMP} ${:U}
+.endif
+.if !defined(_RECURSING_PROGS) && !defined(_RECURSING_CRUNCH) && \
+ !make(print-dir)
+WITH_META_STATS= t
+.endif
+
+# toolchains can be a pain - especially bootstrappping them
+TOOLCHAIN_VARS= AS AR CC CLANG_TBLGEN CXX CPP LD NM OBJCOPY RANLIB \
+ STRINGS SIZE LLVM_TBLGEN
+_toolchain_bin_CLANG_TBLGEN= /usr/bin/clang-tblgen
+_toolchain_bin_LLVM_TBLGEN= /usr/bin/llvm-tblgen
+_toolchain_bin_CXX= /usr/bin/c++
+.ifdef WITH_TOOLSDIR
+TOOLSDIR?= ${HOST_OBJTOP}/tools
+.elif defined(STAGE_HOST_OBJTOP)
+TOOLSDIR?= ${STAGE_HOST_OBJTOP}
+.endif
+.if ${MK_DIRDEPS_BUILD} == "yes" && ${MACHINE} != "host"
+# ideally tools needed by makefiles like sh,csh,tinfo
+# would be built in their own directories but for now
+# this works well enough.
+BTOOLSPATH= ${HOST_OBJTOP}/${RELDIR}
+.else
+# Only define if it exists in case user didn't run bootstrap-tools. Otherwise
+# the tool will be built during the build. Building it assumes it is
+# TARGET==MACHINE.
+.if exists(${HOST_OBJTOP}/tools${.CURDIR})
+BTOOLSPATH= ${HOST_OBJTOP}/tools${.CURDIR}
+.endif
+.endif
+
+# Don't use the bootstrap tools logic on itself.
+.if ${.TARGETS:Mbootstrap-tools} == "" && \
+ !make(test-system-*) && !make(showconfig) && !make(print-dir) && \
+ !defined(BOOTSTRAPPING_TOOLS) && !empty(TOOLSDIR) && ${.MAKE.LEVEL} == 0
+.for dir in /sbin /bin /usr/sbin /usr/bin
+PATH:= ${TOOLSDIR}${dir}:${PATH}
+.endfor
+.export PATH
+# Prefer the TOOLSDIR version of the toolchain if present vs the host version.
+.for var in ${TOOLCHAIN_VARS}
+_toolchain_bin.${var}= ${TOOLSDIR}${_toolchain_bin_${var}:U/usr/bin/${var:tl}}
+.if exists(${_toolchain_bin.${var}})
+HOST_${var}?= ${_toolchain_bin.${var}}
+.export HOST_${var}
+.endif
+.endfor
+.endif
+
+.for var in ${TOOLCHAIN_VARS}
+HOST_${var}?= ${_toolchain_bin_${var}:U/usr/bin/${var:tl}}
+.endfor
+
+.if ${MACHINE} == "host"
+.for var in ${TOOLCHAIN_VARS}
+${var}= ${HOST_${var}}
+.endfor
+.endif
+
+.if !defined(FREEBSD_REVISION)
+FREEBSD_REVISION!= sed -n '/^REVISION=/{s,.*=,,;s,",,g;p; }' ${SRCTOP}/sys/conf/newvers.sh
+.export FREEBSD_REVISION
+.endif
+
+# we set these here, rather than local.gendirdeps.mk
+# so we can ensure any DEP_* values that might be used in
+# conditionals do not cause syntax errors when Makefile.depend
+# is included at level 1+
+
+# order of this list matters!
+GENDIRDEPS_FILTER_DIR_VARS+= \
+ CSU_DIR \
+ BOOT_MACHINE_DIR
+
+# order of this list matters!
+GENDIRDEPS_FILTER_VARS+= \
+ KERNEL_NAME \
+ DEP_MACHINE_CPUARCH \
+ DEP_MACHINE_ARCH \
+ DEP_MACHINE
+
+.if ${.MAKE.LEVEL} > 0
+.for V in ${GENDIRDEPS_FILTER_DIR_VARS:MDEP_*:O:u} \
+ ${GENDIRDEPS_FILTER_VARS:MDEP_*:O:u}
+$V?= ${${V:S,DEP_,,}}
+.endfor
+.endif
+
+.if ${MACHINE:Nhost*} == "" && ${.MAKE.OS} != "FreeBSD"
+# some makefiles expect this
+BOOTSTRAPPING= 0
+.endif
diff --git a/share/mk/local.sys.env.mk b/share/mk/local.sys.env.mk
index 2187104e83fa..71a46f122bf4 100644
--- a/share/mk/local.sys.env.mk
+++ b/share/mk/local.sys.env.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# This makefile is for customizations that should be done early
@@ -49,3 +48,12 @@ ECHO_TRACE?= true
.endif
.include "src.sys.env.mk"
+.-include <site.sys.env.mk>
+
+.if !defined(HOST_TARGET) || !defined(HOST_MACHINE)
+# we need HOST_TARGET etc below.
+.include <host-target.mk>
+.export HOST_TARGET
+.endif
+
+.include <local.sys.machine.mk>
diff --git a/share/mk/local.sys.machine.mk b/share/mk/local.sys.machine.mk
new file mode 100644
index 000000000000..5e40dfe805f9
--- /dev/null
+++ b/share/mk/local.sys.machine.mk
@@ -0,0 +1,24 @@
+
+.-include <site.sys.machine.mk>
+
+PSEUDO_MACHINE_LIST?= common host host32
+TARGET_MACHINE_LIST?= amd64 arm arm64 i386 powerpc riscv
+
+MACHINE_ARCH_host?= ${_HOST_ARCH}
+MACHINE_ARCH_host32?= ${_HOST_ARCH32}
+
+MACHINE_ARCH_LIST_arm?= armv7 ${EXTRA_ARCHES_arm}
+MACHINE_ARCH_LIST_arm64?= aarch64
+MACHINE_ARCH_LIST_powerpc?= powerpc powerpc64 powerpc64le ${EXTRA_ARCHES_powerpc}
+MACHINE_ARCH_LIST_riscv?= riscv64
+
+.for m in ${TARGET_MACHINE_LIST}
+MACHINE_ARCH_LIST_$m?= $m
+MACHINE_ARCH_$m?= ${MACHINE_ARCH_LIST_$m:[1]}
+# for backwards comatability
+MACHINE_ARCH.$m?= ${MACHINE_ARCH_$m}
+.endfor
+
+.if empty(MACHINE_ARCH)
+MACHINE_ARCH:= ${MACHINE_ARCH_${MACHINE}}
+.endif
diff --git a/share/mk/local.sys.mk b/share/mk/local.sys.mk
index a4b7b0561f15..d5d3ff75a3c4 100644
--- a/share/mk/local.sys.mk
+++ b/share/mk/local.sys.mk
@@ -1,4 +1,6 @@
-# $FreeBSD$
+
+.if !target(_${_this}_)
+_${_this}_: .NOTMAIN
.if ${MK_DIRDEPS_BUILD} == "yes" || ${MK_META_MODE} == "yes"
@@ -21,10 +23,12 @@ MAKE_PRINT_VAR_ON_ERROR+= \
.MAKE \
.OBJDIR \
.TARGETS \
+ CPUTYPE \
DESTDIR \
LD_LIBRARY_PATH \
MACHINE \
MACHINE_ARCH \
+ MACHINE_CPUARCH \
MAKEOBJDIRPREFIX \
MAKESYSPATH \
MAKE_VERSION \
@@ -52,6 +56,10 @@ _PREMK_LIBDIR:= ${LIBDIR}
.endif
.include "src.sys.mk"
+.-include <site.sys.mk>
+
+# this will be set via local.meta.sys.env.mk if appropriate
+MK_host_egacy?= no
.if ${.MAKE.MODE:Mmeta*} != ""
# we can afford to use cookies to prevent some targets
@@ -86,3 +94,14 @@ META_NOPHONY?=
META_COOKIE_RM?=
META_COOKIE_TOUCH?=
META_DEPS+= ${META_NOPHONY}
+
+.if ${MK_DIRDEPS_BUILD} == "yes"
+.if ${MACHINE:Nhost*:Ncommon} != "" && ${MACHINE} != ${HOST_MACHINE}
+# cross-building
+CROSS_TARGET_FLAGS?= -target ${MACHINE_ARCH}-unknown-freebsd${FREEBSD_REVISION}
+CFLAGS+= ${CROSS_TARGET_FLAGS}
+ACFLAGS+= ${CROSS_TARGET_FLAGS}
+.endif
+.endif
+
+.endif
diff --git a/share/mk/meta.autodep.mk b/share/mk/meta.autodep.mk
index 842554beea45..55f2d66e56aa 100644
--- a/share/mk/meta.autodep.mk
+++ b/share/mk/meta.autodep.mk
@@ -1,5 +1,6 @@
-# $FreeBSD$
-# $Id: meta.autodep.mk,v 1.55 2021/12/13 08:12:01 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: meta.autodep.mk,v 1.63 2024/04/24 18:56:41 sjg Exp $
#
# @(#) Copyright (c) 2010, Simon J. Gerraty
@@ -25,16 +26,16 @@ PICO?= .pico
.if defined(SRCS)
.if ${MAKE_VERSION:U0} >= 20211212
-OBJ_EXTENSIONS += ${.SUFFIXES:M*o}
+OBJ_SUFFIXES += ${.SUFFIXES:M*o}
.else
# it would be nice to be able to query .SUFFIXES
-OBJ_EXTENSIONS += .o .po .lo ${PICO}
+OBJ_SUFFIXES += .o .po .lo ${PICO}
.endif
# explicit dependencies help short-circuit .SUFFIX searches
SRCS_DEP_FILTER+= N*.[hly]
.for s in ${SRCS:${SRCS_DEP_FILTER:O:u:ts:}}
-.for e in ${OBJ_EXTENSIONS:O:u}
+.for e in ${OBJ_SUFFIXES:O:u}
.if !target(${s:T:R}$e)
${s:T:R}$e: $s
.endif
@@ -140,6 +141,10 @@ FORCE_DPADD += ${_nonlibs:@x@${DPADD:M*/$x}@}
.END: gendirdeps
.endif
+.if ${LOCAL_DEPENDS_GUARD:U} == "no"
+.depend:
+.endif
+
# if we don't have OBJS, then .depend isn't useful
.if !target(.depend) && (!empty(OBJS) || ${.ALLTARGETS:M*.o} != "")
# some makefiles and/or targets contain
@@ -175,7 +180,7 @@ DEPEND_SUFFIXES += .c .h .cpp .hpp .cxx .hxx .cc .hh
.endif
.depend: .NOMETA $${.MAKE.META.CREATED} ${_this}
@echo "Updating $@: ${.OODATE:T:[1..8]}"
- @egrep -i '^R .*\.(${DEPEND_SUFFIXES:tl:O:u:S,^.,,:ts|})$$' /dev/null ${.MAKE.META.FILES:T:O:u:${META_FILE_FILTER:ts:}:M*o.meta} | \
+ @${EGREP:Uegrep} -i '^R .*\.(${DEPEND_SUFFIXES:tl:O:u:S,^.,,:ts|})$$' /dev/null ${.MAKE.META.FILES:T:O:u:${META_FILE_FILTER:ts:}:M*o.meta} | \
sed -e 's, \./, ,${OBJDIR_REFS:O:u:@d@;s, $d/, ,@};/\//d' \
-e 's,^\([^/][^/]*\).meta...[0-9]* ,\1: ,' | \
sort -u | \
@@ -187,7 +192,7 @@ DEPEND_SUFFIXES += .c .h .cpp .hpp .cxx .hxx .cc .hh
@case "${.MAKE.META.FILES:T:M*.po.*}" in \
*.po.*) mv $@.${.MAKE.PID} $@;; \
*) { cat $@.${.MAKE.PID}; \
- sed ${OBJ_EXTENSIONS:N.o:N.po:@o@-e 's,\$o:,.o:,'@} \
+ sed ${OBJ_SUFFIXES:N.o:N.po:@o@-e 's,\$o:,.o:,'@} \
-e 's,\.o:,.po:,' $@.${.MAKE.PID}; } | sort -u > $@; \
rm -f $@.${.MAKE.PID};; \
esac
@@ -207,7 +212,8 @@ _depend =
.endif
.if ${UPDATE_DEPENDFILE} == "yes"
-gendirdeps: ${_DEPENDFILE}
+gendirdeps: beforegendirdeps .WAIT ${_DEPENDFILE}
+beforegendirdeps:
.endif
.if !target(${_DEPENDFILE})
@@ -301,8 +307,10 @@ ${_DEPENDFILE}: .PRECIOUS
CLEANFILES += *.meta filemon.* *.db
# these make it easy to gather some stats
-now_utc = ${%s:L:gmtime}
+now_utc ?= ${%s:L:localtime}
+.if !defined(start_utc)
start_utc := ${now_utc}
+.endif
meta_stats= meta=${empty(.MAKE.META.FILES):?0:${.MAKE.META.FILES:[#]}} \
created=${empty(.MAKE.META.CREATED):?0:${.MAKE.META.CREATED:[#]}}
@@ -327,4 +335,6 @@ _reldir_failed: .NOMETA
.ERROR: _reldir_failed
.endif
+.-include <ccm.dep.mk>
+
.endif
diff --git a/share/mk/meta.stage.mk b/share/mk/meta.stage.mk
index c362f0b590ad..345df6aae16b 100644
--- a/share/mk/meta.stage.mk
+++ b/share/mk/meta.stage.mk
@@ -1,5 +1,6 @@
-# $FreeBSD$
-# $Id: meta.stage.mk,v 1.60 2020/08/19 17:51:53 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: meta.stage.mk,v 1.69 2024/02/17 17:26:57 sjg Exp $
#
# @(#) Copyright (c) 2011-2017, Simon J. Gerraty
#
@@ -31,8 +32,11 @@ _dirdep ?= ${RELDIR}
CLEANFILES+= .dirdep
# this allows us to trace dependencies back to their src dir
-.dirdep: .NOPATH
+.dirdep: .NOPATH
+.if !commands(.dirdep)
+.dirdep:
@echo '${_dirdep}' > $@
+.endif
.if defined(NO_POSIX_SHELL) || ${type printf:L:sh:Mbuiltin} == ""
_stage_file_basename = `basename $$f`
@@ -52,7 +56,7 @@ _objroot ?= ${_OBJROOT:tA}
# make sure this is global
_STAGED_DIRS ?=
.export _STAGED_DIRS
-# add each dir we stage to to _STAGED_DIRS
+# add each dir we stage to _STAGED_DIRS
# and make sure we have absolute paths so that bmake
# will match against .MAKE.META.BAILIWICK
STAGE_DIR_FILTER = tA:@d@$${_STAGED_DIRS::+=$$d}$$d@
@@ -64,7 +68,7 @@ GENDIRDEPS_FILTER += Nnot-empty-is-important \
LN_CP_SCRIPT = LnCp() { \
rm -f $$2 2> /dev/null; \
{ [ -z "$$mode" ] && ${LN:Uln} $$1 $$2 2> /dev/null; } || \
- cp -p $$1 $$2; }
+ cp -p $$1 $$2 2> /dev/null || cp $$1 $$2; }
# a staging conflict should cause an error
# a warning is handy when bootstapping different options.
@@ -171,7 +175,7 @@ stage_libs: .dirdep
.if !defined(NO_SHLIB_LINKS)
.if !empty(SHLIB_LINKS)
@${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} \
- ${SHLIB_LINKS:@t@${STAGE_LIBS:T:M$t.*} $t@}
+ ${SHLIB_LINKS:@t@${STAGE_LIBS:T:M$t.*:${STAGE_SHLIB_LINKS_FILTER:U}} $t@}
.elif !empty(SHLIB_LINK) && !empty(SHLIB_NAME)
@${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} ${SHLIB_NAME} ${SHLIB_LINK}
.endif
@@ -210,7 +214,7 @@ stage_files.$s: .dirdep
STAGE_FILES ?= ${.ALLSRC:N.dirdep:Nstage_*}
stage_files: .dirdep
.endif
- @${STAGE_FILE_SCRIPT}; StageFiles ${FLAGS.$@} ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_FILES.$s:O}
+ @${STAGE_FILE_SCRIPT}; StageFiles ${FLAGS.$@:U} ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_FILES.$s:O}
@touch $@
.endif
.endif
@@ -262,7 +266,8 @@ CLEANFILES += ${STAGE_AS_SETS:@s@stage*$s@}
# sometimes things need to be renamed as they are staged
# each ${file} will be staged as ${STAGE_AS_${file:T}}
# one could achieve the same with SYMLINKS
-# stage_as_and_symlink makes the original name a symlink to the new name
+# stage_as_and_symlink makes the original name (or ${STAGE_LINK_AS_${name}})
+# a symlink to the new name
# it is the same as using stage_as and stage_symlinks but ensures
# both operations happen together
.for s in ${STAGE_AS_SETS:O:u}
@@ -292,7 +297,7 @@ STAGE_AS_AND_SYMLINK.$s ?= ${.ALLSRC:N.dirdep:Nstage_*}
stage_as_and_symlink: stage_as_and_symlink.$s
stage_as_and_symlink.$s: .dirdep
@${STAGE_AS_SCRIPT}; StageAs ${FLAGS.$@} ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_AS_AND_SYMLINK.$s:O:@f@$f ${STAGE_AS_${f:tA}:U${STAGE_AS_${f:T}:U${f:T}}}@}
- @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_AS_AND_SYMLINK.$s:O:@f@${STAGE_AS_${f:tA}:U${STAGE_AS_${f:T}:U${f:T}}} $f@}
+ @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_AS_AND_SYMLINK.$s:O:@f@${STAGE_AS_${f:tA}:U${STAGE_AS_${f:T}:U${f:T}}} ${STAGE_LINK_AS_${f}:U$f}@}
@touch $@
.endif
.endif
@@ -304,7 +309,7 @@ CLEANFILES += ${STAGE_TARGETS} stage_incs stage_includes
# this lot also only makes sense the first time...
.if !target(__${.PARSEFILE}__)
-__${.PARSEFILE}__:
+__${.PARSEFILE}__: .NOTMAIN
# stage_*links usually needs to follow any others.
# for non-jobs mode the order here matters
@@ -351,7 +356,7 @@ all: stale_staged
# get a list of paths that we have previously staged to those same dirs
# anything in the 2nd list but not the first is stale - remove it.
stale_staged: staging .NOMETA
- @egrep '^[WL] .*${STAGE_OBJTOP}' /dev/null ${.MAKE.META.FILES:M*stage_*} | \
+ @${EGREP:Uegrep} '^[WL] .*${STAGE_OBJTOP}' /dev/null ${.MAKE.META.FILES:M*stage_*} | \
sed "/\.dirdep/d;s,.* '*\(${STAGE_OBJTOP}/[^ '][^ ']*\).*,\1," | \
sort > ${.TARGET}.staged1
@grep -l '${_dirdep}' /dev/null ${_STAGED_DIRS:M${STAGE_OBJTOP}*:O:u:@d@$d/*.dirdep@} | \
diff --git a/share/mk/meta.subdir.mk b/share/mk/meta.subdir.mk
index 781a52856b64..e2ece24515a4 100644
--- a/share/mk/meta.subdir.mk
+++ b/share/mk/meta.subdir.mk
@@ -1,5 +1,6 @@
-# $FreeBSD$
-# $Id: meta.subdir.mk,v 1.12 2020/08/19 17:51:53 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: meta.subdir.mk,v 1.14 2024/02/17 17:26:57 sjg Exp $
#
# @(#) Copyright (c) 2010, Simon J. Gerraty
@@ -18,7 +19,7 @@
.if !defined(NO_SUBDIR) && !empty(SUBDIR)
.if make(destroy*) || make(clean*)
.MAKE.MODE = compat
-.if !commands(destroy)
+.if !commands(obj)
.-include <bsd.obj.mk>
.endif
.elif ${.MAKE.LEVEL} == 0
diff --git a/share/mk/meta.sys.mk b/share/mk/meta.sys.mk
index cccab7ca952d..6e4216ab5383 100644
--- a/share/mk/meta.sys.mk
+++ b/share/mk/meta.sys.mk
@@ -1,8 +1,9 @@
-# $FreeBSD$
-# $Id: meta.sys.mk,v 1.42 2021/12/13 05:50:55 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: meta.sys.mk,v 1.54 2024/03/10 15:53:51 sjg Exp $
#
-# @(#) Copyright (c) 2010-2021, Simon J. Gerraty
+# @(#) Copyright (c) 2010-2023, Simon J. Gerraty
#
# This file is provided in the hope that it will
# be of use. There is absolutely NO WARRANTY.
@@ -18,19 +19,21 @@
# include this if you want to enable meta mode
# for maximum benefit, requires filemon(4) driver.
-.if ${MAKE_VERSION:U0} > 20100901
-.if !target(.ERROR)
-
-.-include <local.meta.sys.mk>
-
# absolute path to what we are reading.
-_PARSEDIR = ${.PARSEDIR:tA}
+_PARSEDIR ?= ${.PARSEDIR:tA}
+
+.-include <local.meta.sys.env.mk>
.if !defined(SYS_MK_DIR)
SYS_MK_DIR := ${_PARSEDIR}
.endif
-META_MODE += meta verbose
+.if !target(.ERROR)
+
+META_MODE += meta
+.if empty(.MAKEFLAGS:M-s)
+META_MODE += verbose
+.endif
.if ${MAKE_VERSION:U0} > 20130323 && empty(.MAKE.PATH_FILEMON)
# we do not support filemon
META_MODE += nofilemon
@@ -66,19 +69,7 @@ META_MODE += silent=yes
.endif
.endif
-# we use the pseudo machine "host" for the build host.
-# this should be taken care of before we get here
-.if ${OBJTOP:Ua} == ${HOST_OBJTOP:Ub}
-MACHINE = host
-.endif
-
-.if !defined(MACHINE0)
-# it can be handy to know which MACHINE kicked off the build
-# for example, if using Makefild.depend for multiple machines,
-# allowing only MACHINE0 to update can keep things simple.
-MACHINE0 := ${MACHINE}
-.export MACHINE0
-.endif
+.if ${MK_DIRDEPS_BUILD:Uno} == "yes"
.if !defined(META2DEPS)
.if defined(PYTHON) && exists(${PYTHON})
@@ -93,42 +84,42 @@ META2DEPS := ${META2DEPS}
MAKE_PRINT_VAR_ON_ERROR += \
.ERROR_TARGET \
+ .ERROR_EXIT \
.ERROR_META_FILE \
.MAKE.LEVEL \
MAKEFILE \
.MAKE.MODE
+MK_META_ERROR_TARGET = yes
+.endif
+
+.if ${MK_META_ERROR_TARGET:Uno} == "yes"
+
.if !defined(SB) && defined(SRCTOP)
SB = ${SRCTOP:H}
.endif
ERROR_LOGDIR ?= ${SB}/error
meta_error_log = ${ERROR_LOGDIR}/meta-${.MAKE.PID}.log
-# we are not interested in make telling us a failure happened elsewhere
.ERROR: _metaError
+# We are interested here in the target(s) that caused the build to fail.
+# We want to ignore targets that were "aborted" due to failure
+# elsewhere per the message below or a sub-make may just exit 6.
_metaError: .NOMETA .NOTMAIN
- -@[ "${.ERROR_META_FILE}" ] && { \
+ -@[ ${.ERROR_EXIT:U0} = 6 ] && exit 0; \
+ [ "${.ERROR_META_FILE}" ] && { \
grep -q 'failure has been detected in another branch' ${.ERROR_META_FILE} && exit 0; \
mkdir -p ${meta_error_log:H}; \
cp ${.ERROR_META_FILE} ${meta_error_log}; \
echo "ERROR: log ${meta_error_log}" >&2; }; :
.endif
+.endif
# Are we, after all, in meta mode?
.if ${.MAKE.MODE:Uno:Mmeta*} != ""
MKDEP_MK ?= meta.autodep.mk
-.if ${.MAKE.MAKEFILES:M*sys.dependfile.mk} == ""
-# this does all the smarts of setting .MAKE.DEPENDFILE
-.-include <sys.dependfile.mk>
-# check if we got anything sane
-.if ${.MAKE.DEPENDFILE} == ".depend"
-.undef .MAKE.DEPENDFILE
-.endif
-.MAKE.DEPENDFILE ?= Makefile.depend
-.endif
-
# we can afford to use cookies to prevent some targets
# re-running needlessly
META_COOKIE_TOUCH?= touch ${COOKIE.${.TARGET}:U${.OBJDIR}/${.TARGET:T}}
@@ -156,25 +147,13 @@ UPDATE_DEPENDFILE= NO
.endif
.endif
-.if ${.MAKE.LEVEL} == 0
-.if ${MK_DIRDEPS_BUILD:Uyes} == "yes"
-# make sure dirdeps target exists and do it first
-all: dirdeps .WAIT
-dirdeps:
-.NOPATH: dirdeps
-
-.if defined(ALL_MACHINES)
-# the first .MAIN: is what counts
-# by default dirdeps is all we want at level0
-.MAIN: dirdeps
-.endif
-.endif
+.else # in meta mode?
-.endif
-.else
META_COOKIE_TOUCH=
# some targets need to be .PHONY in non-meta mode
META_NOPHONY= .PHONY
META_NOECHO= echo
-.endif
-.endif
+
+.endif # in meta mode?
+
+.-include <local.meta.sys.mk>
diff --git a/share/mk/meta2deps.py b/share/mk/meta2deps.py
index 1bcf1baedaaa..f188d0f01de8 100755
--- a/share/mk/meta2deps.py
+++ b/share/mk/meta2deps.py
@@ -36,9 +36,10 @@ We only pay attention to a subset of the information in the
"""
"""
+SPDX-License-Identifier: BSD-2-Clause
+
RCSid:
- $FreeBSD$
- $Id: meta2deps.py,v 1.40 2021/12/13 19:32:46 sjg Exp $
+ $Id: meta2deps.py,v 1.47 2024/02/17 17:26:57 sjg Exp $
Copyright (c) 2011-2020, Simon J. Gerraty
Copyright (c) 2011-2017, Juniper Networks, Inc.
@@ -67,13 +68,18 @@ RCSid:
"""
-import os, re, sys
+import os
+import re
+import sys
+import stat
def resolve(path, cwd, last_dir=None, debug=0, debug_out=sys.stderr):
"""
Return an absolute path, resolving via cwd or last_dir if needed.
+
+ Cleanup any leading ``./`` and trailing ``/.``
"""
- if path.endswith('/.'):
+ while path.endswith('/.'):
path = path[0:-2]
if len(path) > 0 and path[0] == '/':
if os.path.exists(path):
@@ -84,7 +90,9 @@ def resolve(path, cwd, last_dir=None, debug=0, debug_out=sys.stderr):
if path == '.':
return cwd
if path.startswith('./'):
- return cwd + path[1:]
+ while path.startswith('./'):
+ path = path[1:]
+ return cwd + path
if last_dir == cwd:
last_dir = None
for d in [last_dir, cwd]:
@@ -142,6 +150,7 @@ def abspath(path, cwd, last_dir=None, debug=0, debug_out=sys.stderr):
return None
if (path.find('/') < 0 or
path.find('./') > 0 or
+ path.find('/../') > 0 or
path.endswith('/..')):
path = cleanpath(path)
return path
@@ -245,6 +254,7 @@ class MetaFile:
self.curdir = conf.get('CURDIR')
self.reldir = conf.get('RELDIR')
self.dpdeps = conf.get('DPDEPS')
+ self.pids = {}
self.line = 0
if not self.conf:
@@ -445,12 +455,13 @@ class MetaFile:
pid_cwd = {}
pid_last_dir = {}
last_pid = 0
+ eof_token = False
self.line = 0
if self.curdir:
self.seenit(self.curdir) # we ignore this
- interesting = 'CEFLRV'
+ interesting = '#CEFLRVX'
for line in f:
self.line += 1
# ignore anything we don't care about
@@ -477,6 +488,12 @@ class MetaFile:
print("%s: CWD=%s" % (self.name, cwd), file=self.debug_out)
continue
+ if w[0] == '#':
+ # check the file has not been truncated
+ if line.find('Bye') > 0:
+ eof_token = True
+ continue
+
pid = int(w[1])
if pid != last_pid:
if last_pid:
@@ -506,6 +523,13 @@ class MetaFile:
print("cwd=", cwd, file=self.debug_out)
continue
+ if w[0] == 'X':
+ try:
+ del self.pids[pid]
+ except KeyError:
+ pass
+ continue
+
if w[2] in self.seen:
if self.debug > 2:
print("seen:", w[2], file=self.debug_out)
@@ -519,11 +543,34 @@ class MetaFile:
continue
elif w[0] in 'ERWS':
path = w[2]
- if path == '.':
+ if w[0] == 'E':
+ self.pids[pid] = path
+ elif path == '.':
continue
self.parse_path(path, cwd, w[0], w)
- assert(version > 0)
+ if version == 0:
+ raise AssertionError('missing filemon data')
+ if not eof_token:
+ raise AssertionError('truncated filemon data')
+
+ setid_pids = []
+ # self.pids should be empty!
+ for pid,path in self.pids.items():
+ try:
+ # no guarantee that path is still valid
+ if os.stat(path).st_mode & (stat.S_ISUID|stat.S_ISGID):
+ # we do not expect anything after Exec
+ setid_pids.append(pid)
+ continue
+ except:
+ # we do not care why the above fails,
+ # we do not want to miss the ERROR below.
+ pass
+ print("ERROR: missing eXit for {} pid {}".format(path, pid))
+ for pid in setid_pids:
+ del self.pids[pid]
+ assert(len(self.pids) == 0)
if not file:
f.close()
diff --git a/share/mk/meta2deps.sh b/share/mk/meta2deps.sh
index 4767b83f4343..4c1b674f7b63 100755
--- a/share/mk/meta2deps.sh
+++ b/share/mk/meta2deps.sh
@@ -75,9 +75,10 @@
# RCSid:
-# $FreeBSD$
-# $Id: meta2deps.sh,v 1.14 2020/10/02 03:11:17 sjg Exp $
+# $Id: meta2deps.sh,v 1.21 2024/02/17 17:26:57 sjg Exp $
+# SPDX-License-Identifier: BSD-2-Clause
+#
# Copyright (c) 2010-2013, Juniper Networks, Inc.
# All rights reserved.
#
@@ -138,6 +139,13 @@ add_list() {
eval "$name=\"$list\""
}
+# some Linux systems have deprecated egrep in favor of grep -E
+# but not everyone supports that
+case "`echo bmake | egrep 'a|b' 2>&1`" in
+bmake) ;;
+*) egrep() { grep -E "$@"; }
+esac
+
_excludes_f() {
egrep -v "$EXCLUDES"
}
@@ -240,8 +248,8 @@ meta2deps() {
;;
*) cat /dev/null "$@";;
esac 2> /dev/null |
- sed -e 's,^CWD,C C,;/^[CREFLMV] /!d' -e "s,',,g" |
- $_excludes | ( version=no
+ sed -e 's,^CWD,C C,;/^[#CREFLMVX] /!d' -e "s,',,g" |
+ $_excludes | ( version=no epids= xpids= eof_token=no
while read op pid path junk
do
: op=$op pid=$pid path=$path
@@ -259,10 +267,15 @@ meta2deps() {
*) ;;
esac
version=0
+ case "$eof_token" in
+ no) ;; # ignore
+ 0) error "truncated filemon data";;
+ esac
+ eof_token=0
continue
;;
$pid,$pid) ;;
- *)
+ [1-9]*)
case "$lpid" in
"") ;;
*) eval ldir_$lpid=$ldir;;
@@ -272,8 +285,9 @@ meta2deps() {
;;
esac
+ : op=$op path=$path
case "$op,$path" in
- V,*) version=$path; continue;;
+ V,*) version=$pid; continue;;
W,*srcrel|*.dirdep) continue;;
C,*)
case "$path" in
@@ -289,7 +303,18 @@ meta2deps() {
eval cwd_$path=$cwd ldir_$path=$ldir
continue
;;
+ \#,bye) eof_token=1; continue;;
+ \#*) continue;;
*) dir=${path%/*}
+ case "$op" in
+ E) # setid apps get no tracing so we won't see eXit
+ case `'ls' -l $path 2> /dev/null | sed 's, .*,,'` in
+ *s*) ;;
+ *) epids="$epids $pid";;
+ esac
+ ;;
+ X) xpids="$xpids $pid"; continue;;
+ esac
case "$path" in
$src_re|$obj_re) ;;
/*/stage/*) ;;
@@ -379,9 +404,22 @@ meta2deps() {
echo $dir;;
esac
done > $tf.dirdep
+ : version=$version
case "$version" in
0) error "no filemon data";;
- esac ) || exit 1
+ esac
+ : eof_token=$eof_token
+ case "$eof_token" in
+ 0) error "truncated filemon data";;
+ esac
+ for p in $epids
+ do
+ : p=$p
+ case " $xpids " in
+ *" $p "*) ;;
+ *) error "missing eXit for pid $p";;
+ esac
+ done ) || exit 1
_nl=echo
for f in $tf.dirdep $tf.qual $tf.srcdep
do
diff --git a/share/mk/netbsd-tests.test.mk b/share/mk/netbsd-tests.test.mk
index bbcbe7d4e652..4f222faca2ab 100644
--- a/share/mk/netbsd-tests.test.mk
+++ b/share/mk/netbsd-tests.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__netbsd_tests.test.mk__)
__netbsd_tests.test.mk__:
diff --git a/share/mk/plain.test.mk b/share/mk/plain.test.mk
index 7e7aef77d6c6..cc6d268185da 100644
--- a/share/mk/plain.test.mk
+++ b/share/mk/plain.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# You must include bsd.test.mk instead of this file from your Makefile.
#
diff --git a/share/mk/src.init.linux.mk b/share/mk/src.init.linux.mk
new file mode 100644
index 000000000000..536f32853d3c
--- /dev/null
+++ b/share/mk/src.init.linux.mk
@@ -0,0 +1,18 @@
+# We want to build some host tools (eg makefs, mkimg) for Linux
+# This only gets included during DIRDEPS_BUILD when MACHINE is "host"
+# or "host32"
+
+CFLAGS+= -I${SRCTOP}/tools/build/cross-build/include/linux
+
+WARNS= 0
+
+.ifdef PROG
+LOCAL_LIBRARIES+= bsd egacy
+LIBADD+= egacy m
+.endif
+
+# Bring in the full GNU namespace
+CFLAGS+= -D_GNU_SOURCE
+
+# for sane staging behavior
+LN= ln -L
diff --git a/share/mk/src.init.mk b/share/mk/src.init.mk
index 2067dcdbbabc..e35d615d0e1a 100644
--- a/share/mk/src.init.mk
+++ b/share/mk/src.init.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
.if !target(__<src.init.mk>__)
__<src.init.mk>__:
@@ -8,4 +7,31 @@ buildenv: .PHONY
${_+_}@env BUILDENV_DIR=${.CURDIR} ${MAKE} -C ${SRCTOP} buildenv
.endif
+.if ${MACHINE:Nhost*} == ""
+.if ${.MAKE.OS} != "FreeBSD"
+# these won't work anyway - see tools/build/mk/Makefile.boot.pre
+MK_DEBUG_FILES= no
+MK_MAN= no
+MK_PIE= no
+MK_RETPOLINE= no
+NO_SHARED= no
+MK_TESTS= no
+
+.-include <src.init.${.MAKE.OS:tl}.mk>
+
+CFLAGS+= \
+ -DHAVE_NBTOOL_CONFIG_H=1 \
+ -I${SRCTOP}/tools/build/cross-build/include/common \
+
+.endif
+
+.if ${MK_host_egacy} == "yes"
+.ifdef PROG
+LOCAL_LIBRARIES+= egacy
+LIBADD+= egacy
+.endif
+.endif
+
+.endif
+
.endif # !target(__<src.init.mk>__)
diff --git a/share/mk/src.libnames.mk b/share/mk/src.libnames.mk
index d97166e4b0e0..0bde68ea443b 100644
--- a/share/mk/src.libnames.mk
+++ b/share/mk/src.libnames.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# The include file <src.libnames.mk> define library names suitable
# for INTERNALLIB and PRIVATELIB definition
@@ -44,7 +43,9 @@ _INTERNALLIBS= \
bsnmptools \
c_nossp_pic \
cron \
+ diff \
elftc \
+ fdt \
fifolog \
ifconfig \
ipf \
@@ -55,6 +56,7 @@ _INTERNALLIBS= \
netbsd \
ntp \
ntpevent \
+ nvmf \
openbsd \
opts \
parse \
@@ -97,6 +99,7 @@ _LIBRARIES= \
archive \
asn1 \
avl \
+ BlocksRuntime \
be \
begemot \
bluetooth \
@@ -175,7 +178,6 @@ _LIBRARIES= \
nv \
nvpair \
opencsd \
- opie \
pam \
panel \
panelw \
@@ -203,6 +205,7 @@ _LIBRARIES= \
stats \
stdthreads \
supcplusplus \
+ sys \
sysdecode \
tacplus \
termcapw \
@@ -223,6 +226,7 @@ _LIBRARIES= \
y \
ypclnt \
z \
+ zdb \
zfs_core \
zfs \
zfsbootenv \
@@ -243,6 +247,7 @@ _LIBRARIES+= \
ibnetdisc \
ibumad \
ibverbs \
+ irdma \
mlx4 \
mlx5 \
rdmacm \
@@ -270,13 +275,17 @@ LIBVERIEXEC?= ${LIBVERIEXECDIR}/libveriexec.a
# 2nd+ order consumers. Auto-generating this would be better.
_DP_80211= sbuf bsdxml
_DP_9p= sbuf
+.if ${MK_CASPER} != "no"
+_DP_9p+= casper cap_pwd cap_grp
+.endif
+
# XXX: Not bootstrapped so uses host version on non-FreeBSD, so don't use a
# FreeBSD-specific dependency list
.if ${.MAKE.OS} == "FreeBSD" || !defined(BOOTSTRAPPING)
_DP_archive= z bz2 lzma bsdxml zstd
.endif
_DP_avl= spl
-_DP_bsddialog= formw ncursesw tinfow
+_DP_bsddialog= ncursesw tinfow
_DP_zstd= pthread
.if ${MK_BLACKLIST} != "no"
_DP_blacklist+= pthread
@@ -314,7 +323,6 @@ _DP_cap_syslog= nv
_DP_pcap= ibverbs mlx5
.endif
_DP_pjdlog= util
-_DP_opie= md
_DP_usb= pthread
_DP_unbound= ssl crypto pthread
_DP_rt= pthread
@@ -325,13 +333,11 @@ _DP_radius= crypto
.endif
_DP_rtld_db= elf procstat
_DP_procstat= kvm util elf
-.if ${MK_CXX} == "yes"
_DP_proc= cxxrt
-.endif
.if ${MK_CDDL} != "no"
_DP_proc+= ctf
.endif
-_DP_proc+= elf procstat rtld_db util
+_DP_proc+= elf procstat rtld_db util z
_DP_mp= crypto
_DP_memstat= kvm
_DP_magic= z
@@ -355,7 +361,7 @@ _DP_gmock= gtest
_DP_gmock_main= gmock
_DP_gtest_main= gtest
_DP_devstat= kvm
-_DP_pam= radius tacplus opie md util
+_DP_pam= radius tacplus md util
.if ${MK_KERBEROS} != "no"
_DP_pam+= krb5
.endif
@@ -386,12 +392,12 @@ _DP_ucl= m
_DP_vmmapi= util
_DP_opencsd= cxxrt
_DP_ctf= spl z
-_DP_dtrace= ctf elf proc pthread rtld_db
+_DP_dtrace= ctf elf proc pthread rtld_db xo
_DP_xo= util
_DP_ztest= geom m nvpair umem zpool pthread avl zfs_core spl zutil zfs uutil icp
# The libc dependencies are not strictly needed but are defined to make the
# assert happy.
-_DP_c= compiler_rt
+_DP_c= compiler_rt sys
# Use libssp_nonshared only on i386 and power*. Other archs emit direct calls
# to __stack_chk_fail, not __stack_chk_fail_local provided by libssp_nonshared.
.if ${MK_SSP} != "no" && \
@@ -400,7 +406,18 @@ _DP_c+= ssp_nonshared
.endif
_DP_stats= sbuf pthread
_DP_stdthreads= pthread
-_DP_tacplus= md
+_DP_sys= compiler_rt
+# Use libssp_nonshared only on i386 and power*. Other archs emit direct calls
+# to __stack_chk_fail, not __stack_chk_fail_local provided by libssp_nonshared.
+.if ${MK_SSP} != "no" && \
+ (${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH:Mpower*} != "")
+_DP_sys+= ssp_nonshared
+.endif
+.if !defined(BOOTSTRAPPING)
+_DP_thr= c sys
+_DP_pthread= ${_DP_thr}
+.endif
+_DP_tacplus= md pam
_DP_ncursesw= tinfow
_DP_formw= ncursesw
_DP_nvpair= spl
@@ -412,7 +429,7 @@ _DP_fifolog= z
_DP_ipf= kvm
_DP_tpool= spl
_DP_uutil= avl spl
-_DP_zfs= md pthread umem util uutil m avl bsdxml crypto geom nvpair \
+_DP_zfs= md pthread rt umem util uutil m avl bsdxml crypto geom nvpair \
z zfs_core zutil
_DP_zfsbootenv= zfs nvpair
_DP_zfs_core= nvpair spl zutil
@@ -431,6 +448,7 @@ _DP_ibmad= ibumad
_DP_ibnetdisc= osmcomp ibmad ibumad
_DP_ibumad=
_DP_ibverbs=
+_DP_irdma= ibverbs pthread
_DP_mlx4= ibverbs pthread
_DP_mlx5= ibverbs pthread
_DP_rdmacm= ibverbs
@@ -528,9 +546,15 @@ LDADD+= ${LDADD_${_l}}
_LIB_OBJTOP?= ${OBJTOP}
# INTERNALLIB definitions.
+LIBDIFFDIR= ${_LIB_OBJTOP}/lib/libdiff
+LIBDIFF?= ${LIBDIFFDIR}/libdiff${PIE_SUFFIX}.a
+
LIBELFTCDIR= ${_LIB_OBJTOP}/lib/libelftc
LIBELFTC?= ${LIBELFTCDIR}/libelftc${PIE_SUFFIX}.a
+LIBFDTDIR= ${_LIB_OBJTOP}/lib/libfdt
+LIBFDT?= ${LIBFDTDIR}/libfdt${PIE_SUFFIX}.a
+
LIBLUADIR= ${_LIB_OBJTOP}/lib/liblua
LIBLUA?= ${LIBLUADIR}/liblua${PIE_SUFFIX}.a
@@ -552,6 +576,9 @@ LIBSMDB?= ${LIBSMDBDIR}/libsmdb${PIE_SUFFIX}.a
LIBSMUTILDIR= ${_LIB_OBJTOP}/lib/libsmutil
LIBSMUTIL?= ${LIBSMUTILDIR}/libsmutil${PIE_SUFFIX}.a
+LIBSYSDIR= ${_LIB_OBJTOP}/lib/libsys
+LIBSYS?= ${LIBSYSDIR}/libsys${PIE_SUFFIX}.a
+
LIBNETBSDDIR?= ${_LIB_OBJTOP}/lib/libnetbsd
LIBNETBSD?= ${LIBNETBSDDIR}/libnetbsd${PIE_SUFFIX}.a
@@ -567,9 +594,15 @@ LIBIFCONFIG?= ${LIBIFCONFIGDIR}/libifconfig${PIE_SUFFIX}.a
LIBIPFDIR= ${_LIB_OBJTOP}/sbin/ipf/libipf
LIBIPF?= ${LIBIPFDIR}/libipf${PIE_SUFFIX}.a
+LIBNVDIR= ${_LIB_OBJTOP}/lib/libnv
+LIBNV?= ${LIBNVDIR}/libnv${PIE_SUFFIX}.a
+
LIBISCSIUTILDIR= ${_LIB_OBJTOP}/lib/libiscsiutil
LIBISCSIUTIL?= ${LIBISCSIUTILDIR}/libiscsiutil${PIE_SUFFIX}.a
+LIBNVMFDIR= ${_LIB_OBJTOP}/lib/libnvmf
+LIBNVMF?= ${LIBNVMFDIR}/libnvmf${PIE_SUFFIX}.a
+
LIBTELNETDIR= ${_LIB_OBJTOP}/lib/libtelnet
LIBTELNET?= ${LIBTELNETDIR}/libtelnet${PIE_SUFFIX}.a
@@ -588,7 +621,7 @@ LIBOPTS?= ${LIBOPTSDIR}/libopts${PIE_SUFFIX}.a
LIBPARSEDIR= ${_LIB_OBJTOP}/usr.sbin/ntp/libparse
LIBPARSE?= ${LIBPARSEDIR}/libparse${PIE_SUFFIX}.a
-LIBPFCTL= ${_LIB_OBJTOP}/lib/libpfctl
+LIBPFCTLDIR= ${_LIB_OBJTOP}/lib/libpfctl
LIBPFCTL?= ${LIBPFCTLDIR}/libpfctl${PIE_SUFFIX}.a
LIBLPRDIR= ${_LIB_OBJTOP}/usr.sbin/lpr/common_source
@@ -656,92 +689,106 @@ LIBC_NOSSP_PIC?= ${LIBC_NOSSP_PICDIR}/libc_nossp_pic.a
# Define a directory for each library. This is useful for adding -L in when
# not using a --sysroot or for meta mode bootstrapping when there is no
# Makefile.depend. These are sorted by directory.
-LIBAVLDIR= ${OBJTOP}/cddl/lib/libavl
-LIBCTFDIR= ${OBJTOP}/cddl/lib/libctf
-LIBDTRACEDIR= ${OBJTOP}/cddl/lib/libdtrace
-LIBICPDIR= ${OBJTOP}/cddl/lib/libicp
-LIBNVPAIRDIR= ${OBJTOP}/cddl/lib/libnvpair
-LIBUMEMDIR= ${OBJTOP}/cddl/lib/libumem
-LIBUUTILDIR= ${OBJTOP}/cddl/lib/libuutil
-LIBZFSDIR= ${OBJTOP}/cddl/lib/libzfs
-LIBZFS_COREDIR= ${OBJTOP}/cddl/lib/libzfs_core
-LIBZFSBOOTENVDIR= ${OBJTOP}/cddl/lib/libzfsbootenv
-LIBZPOOLDIR= ${OBJTOP}/cddl/lib/libzpool
-LIBZUTILDIR= ${OBJTOP}/cddl/lib/libzutil
-LIBTPOOLDIR= ${OBJTOP}/cddl/lib/libtpool
+LIBAVLDIR= ${_LIB_OBJTOP}/cddl/lib/libavl
+LIBCTFDIR= ${_LIB_OBJTOP}/cddl/lib/libctf
+LIBDTRACEDIR= ${_LIB_OBJTOP}/cddl/lib/libdtrace
+LIBICPDIR= ${_LIB_OBJTOP}/cddl/lib/libicp
+LIBICP?= ${LIBICPDIR}/libicp${PIE_SUFFIX}.a
+LIBICP_RESCUEDIR= ${_LIB_OBJTOP}/cddl/lib/libicp_rescue
+LIBICP_RESCUE?= ${LIBICP_RESCUEDIR}/libicp_rescue${PIE_SUFFIX}.a
+LIBNVPAIRDIR= ${_LIB_OBJTOP}/cddl/lib/libnvpair
+LIBNVPAIR?= ${LIBNVPAIRDIR}/libnvpair${PIE_SUFFIX}.a
+LIBUMEMDIR= ${_LIB_OBJTOP}/cddl/lib/libumem
+LIBUUTILDIR= ${_LIB_OBJTOP}/cddl/lib/libuutil
+LIBZDBDIR= ${_LIB_OBJTOP}/cddl/lib/libzdb
+LIBZDB?= ${LIBZDBDIR}/libzdb${PIE_SUFFIX}.a
+LIBZFSDIR= ${_LIB_OBJTOP}/cddl/lib/libzfs
+LIBZFS?= ${LIBZFSDIR}/libzfs${PIE_SUFFIX}.a
+LIBZFS_COREDIR= ${_LIB_OBJTOP}/cddl/lib/libzfs_core
+LIBZFS_CORE?= ${LIBZFS_COREDIR}/libzfs_core${PIE_SUFFIX}.a
+LIBZFSBOOTENVDIR= ${_LIB_OBJTOP}/cddl/lib/libzfsbootenv
+LIBZFSBOOTENV?= ${LIBZFSBOOTENVDIR}/libzfsbootenv${PIE_SUFFIX}.a
+LIBZPOOLDIR= ${_LIB_OBJTOP}/cddl/lib/libzpool
+LIBZPOOL?= ${LIBZPOOLDIR}/libzpool${PIE_SUFFIX}.a
+LIBZUTILDIR= ${_LIB_OBJTOP}/cddl/lib/libzutil
+LIBZUTIL?= ${LIBZUTILDIR}/libzutil${PIE_SUFFIX}.a
+LIBTPOOLDIR= ${_LIB_OBJTOP}/cddl/lib/libtpool
# OFED support
-LIBCXGB4DIR= ${OBJTOP}/lib/ofed/libcxgb4
-LIBIBCMDIR= ${OBJTOP}/lib/ofed/libibcm
-LIBIBMADDIR= ${OBJTOP}/lib/ofed/libibmad
-LIBIBNETDISCDIR=${OBJTOP}/lib/ofed/libibnetdisc
-LIBIBUMADDIR= ${OBJTOP}/lib/ofed/libibumad
-LIBIBVERBSDIR= ${OBJTOP}/lib/ofed/libibverbs
-LIBMLX4DIR= ${OBJTOP}/lib/ofed/libmlx4
-LIBMLX5DIR= ${OBJTOP}/lib/ofed/libmlx5
-LIBRDMACMDIR= ${OBJTOP}/lib/ofed/librdmacm
-LIBOSMCOMPDIR= ${OBJTOP}/lib/ofed/complib
-LIBOPENSMDIR= ${OBJTOP}/lib/ofed/libopensm
-LIBOSMVENDORDIR=${OBJTOP}/lib/ofed/libvendor
-
-LIBDIALOGDIR= ${OBJTOP}/gnu/lib/libdialog
-LIBSSPDIR= ${OBJTOP}/lib/libssp
-LIBSSP_NONSHAREDDIR= ${OBJTOP}/lib/libssp_nonshared
-LIBASN1DIR= ${OBJTOP}/kerberos5/lib/libasn1
-LIBGSSAPI_KRB5DIR= ${OBJTOP}/kerberos5/lib/libgssapi_krb5
-LIBGSSAPI_NTLMDIR= ${OBJTOP}/kerberos5/lib/libgssapi_ntlm
-LIBGSSAPI_SPNEGODIR= ${OBJTOP}/kerberos5/lib/libgssapi_spnego
-LIBHDBDIR= ${OBJTOP}/kerberos5/lib/libhdb
-LIBHEIMBASEDIR= ${OBJTOP}/kerberos5/lib/libheimbase
-LIBHEIMIPCCDIR= ${OBJTOP}/kerberos5/lib/libheimipcc
-LIBHEIMIPCSDIR= ${OBJTOP}/kerberos5/lib/libheimipcs
-LIBHEIMNTLMDIR= ${OBJTOP}/kerberos5/lib/libheimntlm
-LIBHX509DIR= ${OBJTOP}/kerberos5/lib/libhx509
-LIBKADM5CLNTDIR= ${OBJTOP}/kerberos5/lib/libkadm5clnt
-LIBKADM5SRVDIR= ${OBJTOP}/kerberos5/lib/libkadm5srv
-LIBKAFS5DIR= ${OBJTOP}/kerberos5/lib/libkafs5
-LIBKDCDIR= ${OBJTOP}/kerberos5/lib/libkdc
-LIBKRB5DIR= ${OBJTOP}/kerberos5/lib/libkrb5
-LIBROKENDIR= ${OBJTOP}/kerberos5/lib/libroken
-LIBWINDDIR= ${OBJTOP}/kerberos5/lib/libwind
-LIBATF_CDIR= ${OBJTOP}/lib/atf/libatf-c
-LIBATF_CXXDIR= ${OBJTOP}/lib/atf/libatf-c++
-LIBGMOCKDIR= ${OBJTOP}/lib/googletest/gmock
-LIBGMOCK_MAINDIR= ${OBJTOP}/lib/googletest/gmock_main
-LIBGTESTDIR= ${OBJTOP}/lib/googletest/gtest
-LIBGTEST_MAINDIR= ${OBJTOP}/lib/googletest/gtest_main
-LIBALIASDIR= ${OBJTOP}/lib/libalias/libalias
-LIBBLACKLISTDIR= ${OBJTOP}/lib/libblacklist
-LIBBLOCKSRUNTIMEDIR= ${OBJTOP}/lib/libblocksruntime
-LIBBSNMPDIR= ${OBJTOP}/lib/libbsnmp/libbsnmp
-LIBCASPERDIR= ${OBJTOP}/lib/libcasper/libcasper
-LIBCAP_DNSDIR= ${OBJTOP}/lib/libcasper/services/cap_dns
-LIBCAP_GRPDIR= ${OBJTOP}/lib/libcasper/services/cap_grp
-LIBCAP_NETDIR= ${OBJTOP}/lib/libcasper/services/cap_net
-LIBCAP_PWDDIR= ${OBJTOP}/lib/libcasper/services/cap_pwd
-LIBCAP_SYSCTLDIR= ${OBJTOP}/lib/libcasper/services/cap_sysctl
-LIBCAP_SYSLOGDIR= ${OBJTOP}/lib/libcasper/services/cap_syslog
-LIBCBORDIR= ${OBJTOP}/lib/libcbor
-LIBBSDXMLDIR= ${OBJTOP}/lib/libexpat
-LIBFIDO2DIR= ${OBJTOP}/lib/libfido2
-LIBKVMDIR= ${OBJTOP}/lib/libkvm
-LIBPTHREADDIR= ${OBJTOP}/lib/libthr
-LIBMDIR= ${OBJTOP}/lib/msun
-LIBFORMWDIR= ${OBJTOP}/lib/ncurses/form
-LIBMENUWDIR= ${OBJTOP}/lib/ncurses/menu
-LIBNCURSESWDIR= ${OBJTOP}/lib/ncurses/ncurses
-LIBTINFOWDIR= ${OBJTOP}/lib/ncurses/tinfo
-LIBPANELWDIR= ${OBJTOP}/lib/ncurses/panel
-LIBCRYPTODIR= ${OBJTOP}/secure/lib/libcrypto
-LIBSPLDIR= ${OBJTOP}/cddl/lib/libspl
-LIBSSHDIR= ${OBJTOP}/secure/lib/libssh
-LIBSSLDIR= ${OBJTOP}/secure/lib/libssl
-LIBTEKENDIR= ${OBJTOP}/sys/teken/libteken
-LIBEGACYDIR= ${OBJTOP}/tools/build
-LIBLNDIR= ${OBJTOP}/usr.bin/lex/lib
+LIBCXGB4DIR= ${_LIB_OBJTOP}/lib/ofed/libcxgb4
+LIBIBCMDIR= ${_LIB_OBJTOP}/lib/ofed/libibcm
+LIBIBMADDIR= ${_LIB_OBJTOP}/lib/ofed/libibmad
+LIBIBNETDISCDIR=${_LIB_OBJTOP}/lib/ofed/libibnetdisc
+LIBIBUMADDIR= ${_LIB_OBJTOP}/lib/ofed/libibumad
+LIBIBVERBSDIR= ${_LIB_OBJTOP}/lib/ofed/libibverbs
+LIBIRDMADIR= ${_LIB_OBJTOP}/lib/ofed/libirdma
+LIBMLX4DIR= ${_LIB_OBJTOP}/lib/ofed/libmlx4
+LIBMLX5DIR= ${_LIB_OBJTOP}/lib/ofed/libmlx5
+LIBRDMACMDIR= ${_LIB_OBJTOP}/lib/ofed/librdmacm
+LIBOSMCOMPDIR= ${_LIB_OBJTOP}/lib/ofed/complib
+LIBOPENSMDIR= ${_LIB_OBJTOP}/lib/ofed/libopensm
+LIBOSMVENDORDIR=${_LIB_OBJTOP}/lib/ofed/libvendor
+
+LIBDIALOGDIR= ${_LIB_OBJTOP}/gnu/lib/libdialog
+LIBSSPDIR= ${_LIB_OBJTOP}/lib/libssp
+LIBSSP_NONSHAREDDIR= ${_LIB_OBJTOP}/lib/libssp_nonshared
+LIBASN1DIR= ${_LIB_OBJTOP}/kerberos5/lib/libasn1
+LIBGSSAPI_KRB5DIR= ${_LIB_OBJTOP}/kerberos5/lib/libgssapi_krb5
+LIBGSSAPI_NTLMDIR= ${_LIB_OBJTOP}/kerberos5/lib/libgssapi_ntlm
+LIBGSSAPI_SPNEGODIR= ${_LIB_OBJTOP}/kerberos5/lib/libgssapi_spnego
+LIBHDBDIR= ${_LIB_OBJTOP}/kerberos5/lib/libhdb
+LIBHEIMBASEDIR= ${_LIB_OBJTOP}/kerberos5/lib/libheimbase
+LIBHEIMIPCCDIR= ${_LIB_OBJTOP}/kerberos5/lib/libheimipcc
+LIBHEIMIPCSDIR= ${_LIB_OBJTOP}/kerberos5/lib/libheimipcs
+LIBHEIMNTLMDIR= ${_LIB_OBJTOP}/kerberos5/lib/libheimntlm
+LIBHX509DIR= ${_LIB_OBJTOP}/kerberos5/lib/libhx509
+LIBKADM5CLNTDIR= ${_LIB_OBJTOP}/kerberos5/lib/libkadm5clnt
+LIBKADM5SRVDIR= ${_LIB_OBJTOP}/kerberos5/lib/libkadm5srv
+LIBKAFS5DIR= ${_LIB_OBJTOP}/kerberos5/lib/libkafs5
+LIBKDCDIR= ${_LIB_OBJTOP}/kerberos5/lib/libkdc
+LIBKRB5DIR= ${_LIB_OBJTOP}/kerberos5/lib/libkrb5
+LIBROKENDIR= ${_LIB_OBJTOP}/kerberos5/lib/libroken
+LIBWINDDIR= ${_LIB_OBJTOP}/kerberos5/lib/libwind
+LIBATF_CDIR= ${_LIB_OBJTOP}/lib/atf/libatf-c
+LIBATF_CXXDIR= ${_LIB_OBJTOP}/lib/atf/libatf-c++
+LIBGMOCKDIR= ${_LIB_OBJTOP}/lib/googletest/gmock
+LIBGMOCK_MAINDIR= ${_LIB_OBJTOP}/lib/googletest/gmock_main
+LIBGTESTDIR= ${_LIB_OBJTOP}/lib/googletest/gtest
+LIBGTEST_MAINDIR= ${_LIB_OBJTOP}/lib/googletest/gtest_main
+LIBALIASDIR= ${_LIB_OBJTOP}/lib/libalias/libalias
+LIBBLACKLISTDIR= ${_LIB_OBJTOP}/lib/libblacklist
+LIBBLOCKSRUNTIMEDIR= ${_LIB_OBJTOP}/lib/libblocksruntime
+LIBBSNMPDIR= ${_LIB_OBJTOP}/lib/libbsnmp/libbsnmp
+LIBCASPERDIR= ${_LIB_OBJTOP}/lib/libcasper/libcasper
+LIBCAP_DNSDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_dns
+LIBCAP_GRPDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_grp
+LIBCAP_NETDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_net
+LIBCAP_PWDDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_pwd
+LIBCAP_SYSCTLDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_sysctl
+LIBCAP_SYSLOGDIR= ${_LIB_OBJTOP}/lib/libcasper/services/cap_syslog
+LIBCBORDIR= ${_LIB_OBJTOP}/lib/libcbor
+LIBBSDXMLDIR= ${_LIB_OBJTOP}/lib/libexpat
+LIBFIDO2DIR= ${_LIB_OBJTOP}/lib/libfido2
+LIBKVMDIR= ${_LIB_OBJTOP}/lib/libkvm
+LIBPTHREADDIR= ${_LIB_OBJTOP}/lib/libthr
+LIBMDIR= ${_LIB_OBJTOP}/lib/msun
+LIBFORMWDIR= ${_LIB_OBJTOP}/lib/ncurses/form
+LIBMENUWDIR= ${_LIB_OBJTOP}/lib/ncurses/menu
+LIBNCURSESWDIR= ${_LIB_OBJTOP}/lib/ncurses/ncurses
+LIBTINFOWDIR= ${_LIB_OBJTOP}/lib/ncurses/tinfo
+LIBPANELWDIR= ${_LIB_OBJTOP}/lib/ncurses/panel
+LIBCRYPTODIR= ${_LIB_OBJTOP}/secure/lib/libcrypto
+LIBSPLDIR= ${_LIB_OBJTOP}/cddl/lib/libspl
+LIBSSHDIR= ${_LIB_OBJTOP}/secure/lib/libssh
+LIBSSLDIR= ${_LIB_OBJTOP}/secure/lib/libssl
+LIBTEKENDIR= ${_LIB_OBJTOP}/sys/teken/libteken
+LIBEGACYDIR= ${_LIB_OBJTOP}/tools/build
+LIBLNDIR= ${_LIB_OBJTOP}/usr.bin/lex/lib
LIBTERMCAPWDIR= ${LIBTINFOWDIR}
+.-include <site.src.libnames.mk>
+
# Default other library directories to lib/libNAME.
.for lib in ${_LIBRARIES}
LIB${lib:tu}DIR?= ${OBJTOP}/lib/lib${lib}
diff --git a/share/mk/src.lua.mk b/share/mk/src.lua.mk
index 215e12f01c62..7d8bc05fdfcf 100644
--- a/share/mk/src.lua.mk
+++ b/share/mk/src.lua.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Lua helper file for FreeBSD /usr/src builds.
#
diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
index a7e414fd0432..501df88cd776 100644
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Option file for FreeBSD /usr/src builds, at least the userland and boot loader
# portions of the tree. These options generally chose what parts of the tree to
@@ -53,13 +52,15 @@ __<src.opts.mk>__:
# BROKEN was selected as the least imperfect one considered at the
# time. Options are added to BROKEN_OPTIONS list on a per-arch basis.
# At this time, there's no provision for mutually incompatible options.
+# Options listed in 'REQUIRED_OPTIONS' will be hard-wired to 'yes'; this
+# is intended as a transitional measure while options are in the process
+# of being removed.
__DEFAULT_YES_OPTIONS = \
ACCT \
ACPI \
APM \
AT \
- ATM \
AUDIT \
AUTHPF \
AUTOFS \
@@ -74,30 +75,25 @@ __DEFAULT_YES_OPTIONS = \
BSNMP \
BZIP2 \
CALENDAR \
- CAPSICUM \
CAROOT \
- CASPER \
CCD \
CDDL \
CLANG \
CLANG_BOOTSTRAP \
- CLANG_IS_CC \
CLEAN \
CPP \
CROSS_COMPILER \
CRYPT \
CUSE \
- CXX \
CXGBETOOL \
- DIALOG \
DICT \
DMAGENT \
+ DTRACE \
DYNAMICROOT \
EE \
EFI \
ELFTOOLCHAIN_BOOTSTRAP \
EXAMPLES \
- FDT \
FILE \
FINGER \
FLOPPY \
@@ -128,7 +124,6 @@ __DEFAULT_YES_OPTIONS = \
LEGACY_CONSOLE \
LLD \
LLD_BOOTSTRAP \
- LLD_IS_LD \
LLVM_ASSERTIONS \
LLVM_COV \
LLVM_CXXFILT \
@@ -141,25 +136,27 @@ __DEFAULT_YES_OPTIONS = \
LOCATE \
LPR \
LS_COLORS \
+ MACHDEP_OPTIMIZATIONS \
MAIL \
MAILWRAPPER \
MAKE \
MLX5TOOL \
- NDIS \
NETCAT \
NETGRAPH \
+ NETLINK \
+ NETLINK_SUPPORT \
NLS_CATALOGS \
NS_CACHING \
NTP \
- NVME \
+ NUAGEINIT \
OFED \
OPENSSL \
PAM \
PF \
PKGBOOTSTRAP \
PMC \
- PORTSNAP \
PPP \
+ PTHREADS_ASSERTIONS \
QUOTAS \
RADIUS_SUPPORT \
RBOOTD \
@@ -168,7 +165,6 @@ __DEFAULT_YES_OPTIONS = \
SENDMAIL \
SERVICESDB \
SETUID_LOGIN \
- SHARED_TOOLCHAIN \
SHAREDOCS \
SOURCELESS \
SOURCELESS_HOST \
@@ -199,14 +195,18 @@ __DEFAULT_NO_OPTIONS = \
BHYVE_SNAPSHOT \
CLANG_EXTRAS \
CLANG_FORMAT \
+ DIALOG \
DETECT_TZ_CHANGES \
+ DISK_IMAGE_TOOLS_BOOTSTRAP \
+ DTRACE_ASAN \
DTRACE_TESTS \
EXPERIMENTAL \
HESIOD \
- LOADER_FIREWIRE \
+ LOADER_BIOS_TEXTONLY \
LOADER_VERBOSE \
LOADER_VERIEXEC_PASS_MANIFEST \
LLVM_BINUTILS \
+ LLVM_FULL_DEBUGINFO \
MALLOC_PRODUCTION \
OFED_EXTRA \
OPENLDAP \
@@ -215,6 +215,9 @@ __DEFAULT_NO_OPTIONS = \
SORT_THREADS \
ZONEINFO_LEAPSECONDS_SUPPORT \
+__REQUIRED_OPTIONS = \
+ CASPER
+
# LEFT/RIGHT. Left options which default to "yes" unless their corresponding
# RIGHT option is disabled.
__DEFAULT_DEPENDENT_OPTIONS= \
@@ -225,6 +228,12 @@ __DEFAULT_DEPENDENT_OPTIONS= \
LOADER_VERIEXEC_VECTX/LOADER_VERIEXEC \
VERIEXEC/BEARSSL \
+__SINGLE_OPTIONS = \
+ LIBC_MALLOC
+
+__LIBC_MALLOC_OPTIONS= jemalloc
+__LIBC_MALLOC_DEFAULT= jemalloc
+
# MK_*_SUPPORT options which default to "yes" unless their corresponding
# MK_* variable is set to "no".
#
@@ -264,7 +273,7 @@ __LLVM_TARGETS= \
powerpc \
riscv \
x86
-__LLVM_TARGET_FILT= C/(amd64|i386)/x86/:C/powerpc.*/powerpc/:C/armv[67]/arm/:C/riscv.*/riscv/:C/mips.*/mips/
+__LLVM_TARGET_FILT= C/(amd64|i386)/x86/:C/powerpc.*/powerpc/:C/armv[67]/arm/:C/riscv.*/riscv/
.for __llt in ${__LLVM_TARGETS}
# Default enable the given TARGET's LLVM_TARGET support
.if ${__T:${__LLVM_TARGET_FILT}} == ${__llt}
@@ -282,27 +291,37 @@ __DEFAULT_NO_OPTIONS+=LLVM_TARGET_BPF LLVM_TARGET_MIPS
.include <bsd.compiler.mk>
+.if ${__T} == "i386" || ${__T} == "amd64"
+__DEFAULT_NO_OPTIONS += FDT
+.else
+__DEFAULT_YES_OPTIONS += FDT
+.endif
+
.if ${__T:Marm*} == "" && ${__T:Mriscv64*} == ""
__DEFAULT_YES_OPTIONS+=LLDB
.else
__DEFAULT_NO_OPTIONS+=LLDB
.endif
-# LIB32 is supported on amd64 and powerpc64
-.if (${__T} == "amd64" || ${__T} == "powerpc64")
+# LIB32 is not supported on all 64-bit architectures.
+.if (${__T:Maarch64*} != "" && ((defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} != "gcc") || (!defined(X_COMPILER_TYPE) && ${COMPILER_TYPE} != "gcc"))) || ${__T} == "amd64" || ${__T} == "powerpc64"
__DEFAULT_YES_OPTIONS+=LIB32
.else
BROKEN_OPTIONS+=LIB32
.endif
-# EFI doesn't exist on powerpc (well, officially)
-.if ${__T:Mpowerpc*}
+# EFI doesn't exist on powerpc (well, officially) and doesn't work on i386
+.if ${__T:Mpowerpc*} || ${__T} == "i386"
BROKEN_OPTIONS+=EFI
.endif
+# Bad coupling for libsecure stuff with bearssl and efi, so broken on EFI
+.if ${__T:Mpowerpc*}
+BROKEN_OPTIONS+=BEARSSL # bearssl brings in secure efi stuff xxx
+.endif
# OFW is only for powerpc, exclude others
.if ${__T:Mpowerpc*} == ""
BROKEN_OPTIONS+=LOADER_OFW
.endif
-# KBOOT is only for powerpc64 (powerpc64le broken) and kinda for amd64
-.if ${__T} != "powerpc64" && ${__T} != "amd64"
+# KBOOT is only for powerpc64 (powerpc64le broken) amd64 and aarch64
+.if ${__T} != "powerpc64" && ${__T} != "amd64" && ${__T} != "aarch64"
BROKEN_OPTIONS+=LOADER_KBOOT
.endif
# UBOOT is only for arm, and big-endian powerpc
@@ -317,8 +336,8 @@ BROKEN_OPTIONS+=LOADER_UBOOT
BROKEN_OPTIONS+=LOADER_GELI LOADER_LUA
.endif
-# Kernel TLS is enabled by default on amd64 and aarch64
-.if ${__T} == "aarch64" || ${__T} == "amd64"
+# Kernel TLS is enabled by default on amd64, aarch64 and powerpc64*
+.if ${__T} == "aarch64" || ${__T} == "amd64" || ${__T:Mpowerpc64*} != ""
__DEFAULT_YES_OPTIONS+=OPENSSL_KTLS
.else
__DEFAULT_NO_OPTIONS+=OPENSSL_KTLS
@@ -330,17 +349,10 @@ BROKEN_OPTIONS+=CXGBETOOL
BROKEN_OPTIONS+=MLX5TOOL
.endif
-# HyperV is currently x86-only
-.if ${__T} != "amd64" && ${__T} != "i386"
+.if ${__T} != "amd64" && ${__T} != "i386" && ${__T} != "aarch64"
BROKEN_OPTIONS+=HYPERV
.endif
-# NVME is only aarch64, x86 and powerpc64*
-.if ${__T} != "aarch64" && ${__T} != "amd64" && ${__T} != "i386" && \
- ${__T:Mpowerpc64*} == ""
-BROKEN_OPTIONS+=NVME
-.endif
-
.if ${__T} == "aarch64" || ${__T} == "amd64" || ${__T} == "i386" || \
${__T:Mpowerpc64*} != "" || ${__T:Mriscv64*} != ""
__DEFAULT_YES_OPTIONS+=OPENMP
@@ -348,25 +360,35 @@ __DEFAULT_YES_OPTIONS+=OPENMP
__DEFAULT_NO_OPTIONS+=OPENMP
.endif
+# Broken on 32-bit arm, kernel module compile errors
+.if ${__T:Marm*} != ""
+BROKEN_OPTIONS+= OFED
+.endif
+
+# MK_host_egacy is set by local.sys.mk so is valid here
+.if ${MACHINE:Nhost*} == "" && ${MK_host_egacy} == "yes"
+# we cannot expect tests to work
+BROKEN_OPTIONS+= TESTS
+.endif
+
+.-include <site.src.opts.mk>
+
.include <bsd.mkopt.mk>
#
# Force some options off if their dependencies are off.
# Order is somewhat important.
#
-.if ${MK_CAPSICUM} == "no"
-MK_CASPER:= no
-.endif
-
.if ${MK_SOURCELESS} == "no"
MK_SOURCELESS_HOST:= no
MK_SOURCELESS_UCODE:= no
.endif
.if ${MK_CDDL} == "no"
-MK_ZFS:= no
-MK_LOADER_ZFS:= no
MK_CTF:= no
+MK_DTRACE:= no
+MK_LOADER_ZFS:= no
+MK_ZFS:= no
.endif
.if ${MK_CRYPT} == "no"
@@ -376,17 +398,8 @@ MK_KERBEROS:= no
MK_KERBEROS_SUPPORT:= no
.endif
-.if ${MK_CXX} == "no"
-MK_CLANG:= no
-MK_GOOGLETEST:= no
-MK_OFED:= no
-MK_OPENMP:= no
-MK_PMC:= no
-MK_TESTS:= no
-.endif
-
-.if ${MK_DIALOG} == "no"
-MK_BSDINSTALL:= no
+.if ${MK_DTRACE} == "no"
+MK_CTF:= no
.endif
.if ${MK_MAIL} == "no"
@@ -396,7 +409,6 @@ MK_DMAGENT:= no
.endif
.if ${MK_NETGRAPH} == "no"
-MK_ATM:= no
MK_BLUETOOTH:= no
.endif
@@ -412,6 +424,7 @@ MK_KERBEROS:= no
MK_KERBEROS_SUPPORT:= no
MK_LDNS:= no
MK_PKGBOOTSTRAP:= no
+MK_LOADER_ZFS:= no
MK_ZFS:= no
.endif
@@ -448,7 +461,6 @@ MK_LLD_BOOTSTRAP:= no
.if ${MK_TOOLCHAIN} == "no"
MK_CLANG:= no
-MK_INCLUDES:= no
MK_LLD:= no
MK_LLDB:= no
MK_LLVM_BINUTILS:= no
diff --git a/share/mk/src.sys.env.mk b/share/mk/src.sys.env.mk
index 86f739414230..634606c0e061 100644
--- a/share/mk/src.sys.env.mk
+++ b/share/mk/src.sys.env.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# early setup only see also src.sys.mk
@@ -42,6 +41,8 @@ _undefMAKEOBJDIRPREFIX= t
.endif
.endif
+.-include <site.src.sys.env.mk>
+
SRC_ENV_CONF?= /etc/src-env.conf
.if !empty(SRC_ENV_CONF) && !target(_src_env_conf_included_)
.-include "${SRC_ENV_CONF}"
@@ -89,6 +90,6 @@ MAKESYSPATH:= ${.PARSEDIR:tA}
.endif
.if ${RELDIR:U} == "." && ${.MAKE.LEVEL} == 0
-.sinclude "${.CURDIR}/Makefile.sys.inc"
+.-include "${.CURDIR}/Makefile.sys.inc"
.endif
.include <src.sys.obj.mk>
diff --git a/share/mk/src.sys.mk b/share/mk/src.sys.mk
index 2a6bfadee009..d5c2af0c559d 100644
--- a/share/mk/src.sys.mk
+++ b/share/mk/src.sys.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
# Note: This file is also duplicated in the sys/conf/kern.pre.mk so
# it will always grab SRCCONF, even if it isn't being built in-tree
@@ -39,6 +38,9 @@ __postrcconf_${var}:= ${MK_${var}:U-}${WITHOUT_${var}:Uno:Dyes}${WITH_${var}:Uno
# default over to -fno-common, making this redundant.
CFCOMMONFLAG?= -fno-common
CFLAGS+= ${CFCOMMONFLAG}
+.if defined(PACKAGE_BUILDING)
+CFLAGS+= -fmacro-prefix-map=${SRCTOP}=/usr/src -fdebug-prefix-map=${SRCTOP}=/usr/src
+.endif
DEFAULTWARNS= 6
diff --git a/share/mk/src.sys.obj.mk b/share/mk/src.sys.obj.mk
index 3b48fc3c5514..708559edcdb8 100644
--- a/share/mk/src.sys.obj.mk
+++ b/share/mk/src.sys.obj.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# Early setup of MAKEOBJDIR
#
@@ -220,11 +219,6 @@ OBJROOT= ${SRCTOP}/
.endif
.endif # defined(NO_OBJ)
-.if !defined(HOST_TARGET)
-# we need HOST_TARGET etc below.
-.include <host-target.mk>
-.export HOST_TARGET
-.endif
HOST_OBJTOP?= ${OBJROOT}${HOST_TARGET}
.endif # ${MK_DIRDEPS_BUILD} == "no"
diff --git a/share/mk/src.tools.mk b/share/mk/src.tools.mk
index 5e3b7048409b..23012593222b 100644
--- a/share/mk/src.tools.mk
+++ b/share/mk/src.tools.mk
@@ -11,7 +11,6 @@
# targets survive with MYTOOL_CMD=false, then MYTOOL_CMD probably
# does not belong here. Stick it somewhere else, thank you very much!
#
-# $FreeBSD$
.if !target(__<src.tools.mk>__)
diff --git a/share/mk/stage-install.sh b/share/mk/stage-install.sh
index 20b1ebb25fd2..64d044fa048c 100755
--- a/share/mk/stage-install.sh
+++ b/share/mk/stage-install.sh
@@ -33,7 +33,6 @@
#
# RCSid:
-# $FreeBSD$
# $Id: stage-install.sh,v 1.5 2013/04/19 16:32:24 sjg Exp $
#
# @(#) Copyright (c) 2013, Simon J. Gerraty
diff --git a/share/mk/suite.test.mk b/share/mk/suite.test.mk
index 345aef554424..eb741a4d5d91 100644
--- a/share/mk/suite.test.mk
+++ b/share/mk/suite.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# You must include bsd.test.mk instead of this file from your Makefile.
#
diff --git a/share/mk/sys.dependfile.mk b/share/mk/sys.dependfile.mk
index 745873f6bfeb..49232646d569 100644
--- a/share/mk/sys.dependfile.mk
+++ b/share/mk/sys.dependfile.mk
@@ -1,20 +1,22 @@
-# $FreeBSD$
-# $Id: sys.dependfile.mk,v 1.7 2016/02/20 01:57:39 sjg Exp $
+# $Id: sys.dependfile.mk,v 1.10 2023/05/10 19:23:26 sjg Exp $
#
-# @(#) Copyright (c) 2012, Simon J. Gerraty
+# @(#) Copyright (c) 2012-2023, Simon J. Gerraty
#
# This file is provided in the hope that it will
# be of use. There is absolutely NO WARRANTY.
# Permission to copy, redistribute or otherwise
-# use this file is hereby granted provided that
+# use this file is hereby granted provided that
# the above copyright notice and this notice are
-# left intact.
-#
+# left intact.
+#
# Please send copies of changes and bug-fixes to:
# sjg@crufty.net
#
-# This only makes sense in meta mode.
+.if !target(__${.PARSEFILE}__)
+__${.PARSEFILE}__: .NOTMAIN
+
+# This only makes sense for DIRDEPS_BUILD.
# This allows a mixture of auto generated as well as manually edited
# dependency files, which can be differentiated by their names.
# As per dirdeps.mk we only require:
@@ -58,3 +60,5 @@ MACHINE := ${_m}
.endif
.endif
.MAKE.DEPENDFILE ?= ${.MAKE.DEPENDFILE_DEFAULT}
+
+.endif
diff --git a/share/mk/sys.dirdeps.mk b/share/mk/sys.dirdeps.mk
new file mode 100644
index 000000000000..4d2dfa8416fa
--- /dev/null
+++ b/share/mk/sys.dirdeps.mk
@@ -0,0 +1,205 @@
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# $Id: sys.dirdeps.mk,v 1.15 2024/04/18 17:18:31 sjg Exp $
+#
+# @(#) Copyright (c) 2012-2023, Simon J. Gerraty
+#
+# This file is provided in the hope that it will
+# be of use. There is absolutely NO WARRANTY.
+# Permission to copy, redistribute or otherwise
+# use this file is hereby granted provided that
+# the above copyright notice and this notice are
+# left intact.
+#
+# Please send copies of changes and bug-fixes to:
+# sjg@crufty.net
+#
+
+# Originally DIRDEPS_BUILD and META_MODE were the same thing.
+# So, much of this was done in *meta.sys.mk and local*mk
+# but properly belongs here.
+
+# Include from [local.]sys.mk - if doing DIRDEPS_BUILD
+# we should not be here otherwise
+MK_DIRDEPS_BUILD ?= yes
+# these are all implied
+MK_AUTO_OBJ ?= yes
+MK_META_MODE ?= yes
+MK_STAGING ?= yes
+
+_PARSEDIR ?= ${.PARSEDIR:tA}
+
+.-include <local.sys.dirdeps.env.mk>
+
+.if ${.MAKE.LEVEL} == 0
+# make sure dirdeps target exists and do it first
+# init.mk will set .MAIN to 'dirdeps' if appropriate
+# as will dirdeps-targets.mk for top-level builds.
+# This allows a Makefile to have more control.
+dirdeps:
+.NOPATH: dirdeps
+all: dirdeps .WAIT
+.endif
+
+.if empty(SRCTOP)
+# fallback assumes share/mk!
+SRCTOP := ${SB_SRC:U${.PARSEDIR:tA:H:H}}
+.export SRCTOP
+.endif
+
+# fake SB if not using mk wrapper
+# SB documented at http://www.crufty.net/sjg/docs/sb-tools.htm
+.if !defined(SB)
+SB := ${SRCTOP:H}
+.export SB
+.endif
+
+.if empty(OBJROOT)
+OBJROOT := ${SB_OBJROOT:U${MAKEOBJDIRPREFIX:U${SB}/obj}/}
+.export OBJROOT
+.endif
+# we expect OBJROOT to end with / (- can work too)
+.if ${OBJROOT:M*[/-]} == ""
+OBJROOT := ${OBJROOT}/
+.endif
+
+.if empty(STAGE_ROOT)
+STAGE_ROOT ?= ${OBJROOT}stage
+.export STAGE_ROOT
+.endif
+
+# We should be included before meta.sys.mk
+# If TARGET_SPEC_VARS is other than just MACHINE
+# it should be set by now.
+# TARGET_SPEC must not contain any '.'s.
+TARGET_SPEC_VARS ?= MACHINE
+
+.if ${TARGET_SPEC:Uno:M*,*} != ""
+# deal with TARGET_SPEC from env
+_tspec := ${TARGET_SPEC:S/,/ /g}
+.for i in ${TARGET_SPEC_VARS:${M_RANGE:Urange}}
+${TARGET_SPEC_VARS:[$i]} := ${_tspec:[$i]}
+.endfor
+# We need to stop that TARGET_SPEC affecting any submakes
+TARGET_SPEC=
+# so export but do not track
+.export-env TARGET_SPEC
+.export ${TARGET_SPEC_VARS}
+.for v in ${TARGET_SPEC_VARS:O:u}
+.if empty($v)
+.undef $v
+.endif
+.endfor
+.endif
+
+# Now make sure we know what TARGET_SPEC is
+# as we may need it to find Makefile.depend*
+.if ${MACHINE:Mhost*} != ""
+# host is special
+TARGET_SPEC = ${MACHINE}
+.else
+TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
+.endif
+
+.if ${TARGET_SPEC_VARS:[#]} > 1
+TARGET_SPEC_VARSr := ${TARGET_SPEC_VARS:[-1..1]}
+# alternatives might be
+# TARGET_OBJ_SPEC = ${TARGET_SPEC_VARSr:@v@${$v:U}@:ts/}
+# TARGET_OBJ_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts/}
+TARGET_OBJ_SPEC ?= ${TARGET_SPEC_VARS:@v@${$v:U}@:ts.}
+.else
+TARGET_OBJ_SPEC ?= ${MACHINE}
+.endif
+
+MAKE_PRINT_VAR_ON_ERROR += ${TARGET_SPEC_VARS}
+
+.if !defined(MACHINE0)
+# it can be handy to know which MACHINE kicked off the build
+# for example, if using Makefild.depend for multiple machines,
+# allowing only MACHINE0 to update can keep things simple.
+MACHINE0 := ${MACHINE}
+.export MACHINE0
+.endif
+
+MACHINE_OBJ.host = ${HOST_TARGET}
+MACHINE_OBJ.host32 = ${HOST_TARGET32}
+MACHINE_OBJ.${MACHINE} ?= ${TARGET_OBJ_SPEC}
+MACHINE_OBJDIR = ${MACHINE_OBJ.${MACHINE}}
+
+# we likely want to override env for OBJTOP
+.if ${MACHINE} == "host"
+OBJTOP = ${HOST_OBJTOP}
+.elif ${MACHINE} == "host32"
+OBJTOP = ${HOST_OBJTOP32}
+.else
+OBJTOP = ${OBJROOT}${MACHINE_OBJDIR}
+.endif
+.if ${.MAKE.LEVEL} > 0
+# should not change from level 1 onwards
+# this only matters for cases like bmake/unit-tests
+# where we do ${MAKE} -r
+.export OBJTOP
+.endif
+
+.if ${MAKEOBJDIR:U:M*/*} == ""
+# we do not use MAKEOBJDIRPREFIX
+# though we may have used it above to initialize OBJROOT
+.undef MAKEOBJDIRPREFIX
+# this is what we expected in env
+MAKEOBJDIR = $${.CURDIR:S,^$${SRCTOP},$${OBJTOP},}
+# export that but do not track
+.export-env MAKEOBJDIR
+# this what we need here
+MAKEOBJDIR = ${.CURDIR:S,${SRCTOP},${OBJTOP},}
+.endif
+
+STAGE_MACHINE ?= ${MACHINE_OBJDIR}
+STAGE_OBJTOP ?= ${STAGE_ROOT}/${STAGE_MACHINE}
+STAGE_COMMON_OBJTOP ?= ${STAGE_ROOT}/common
+STAGE_HOST_OBJTOP ?= ${STAGE_ROOT}/${HOST_TARGET}
+STAGE_HOST_OBJTOP32 ?= ${STAGE_ROOT}/${HOST_TARGET32}
+
+STAGE_INCLUDEDIR ?= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include}
+STAGE_LIBDIR ?= ${STAGE_OBJTOP}${LIBDIR:U/lib}
+
+TIME_STAMP_FMT ?= @ %s [%Y-%m-%d %T] ${:U}
+DATE_TIME_STAMP ?= `date '+${TIME_STAMP_FMT}'`
+TIME_STAMP ?= ${TIME_STAMP_FMT:localtime}
+
+.if ${MK_TIME_STAMPS:Uyes} == "yes"
+TRACER = ${TIME_STAMP}
+ECHO_DIR = echo ${TIME_STAMP}
+ECHO_TRACE = echo ${TIME_STAMP}
+.endif
+
+.if ${.CURDIR} == ${SRCTOP}
+RELDIR= .
+RELTOP= .
+.elif ${.CURDIR:M${SRCTOP}/*}
+RELDIR:= ${.CURDIR:S,${SRCTOP}/,,}
+.else
+RELDIR:= ${.OBJDIR:S,${OBJTOP}/,,}
+.endif
+RELTOP?= ${RELDIR:C,[^/]+,..,g}
+RELOBJTOP?= ${RELTOP}
+RELSRCTOP?= ${RELTOP}
+
+# this does all the smarts of setting .MAKE.DEPENDFILE
+.-include <sys.dependfile.mk>
+
+.-include <local.sys.dirdeps.mk>
+
+# check if we got anything sane
+.if ${.MAKE.DEPENDFILE} == ".depend"
+.undef .MAKE.DEPENDFILE
+.endif
+# just in case
+.MAKE.DEPENDFILE ?= Makefile.depend
+
+# Makefile.depend* often refer to DEP_MACHINE etc,
+# we need defaults for both first include in a leaf dir
+# and when level > 0
+# so ensure DEP_* for TARGET_SPEC_VARS and RELDIR are set
+.for V in ${TARGET_SPEC_VARS} RELDIR
+DEP_$V ?= ${$V}
+.endfor
diff --git a/share/mk/sys.mk b/share/mk/sys.mk
index cddbb0da584c..44db9266784f 100644
--- a/share/mk/sys.mk
+++ b/share/mk/sys.mk
@@ -1,5 +1,3 @@
-# from: @(#)sys.mk 8.2 (Berkeley) 3/21/94
-# $FreeBSD$
unix ?= We run FreeBSD, not UNIX.
.FreeBSD ?= true
@@ -13,7 +11,7 @@ unix ?= We run FreeBSD, not UNIX.
# and/or endian. This is called MACHINE_CPU in NetBSD, but that's used
# for something different in FreeBSD.
#
-__TO_CPUARCH=C/arm(v[67])?/arm/:C/powerpc(64|64le|spe)/powerpc/:C/riscv64(sf)?/riscv/
+__TO_CPUARCH=C/arm(v[67])?/arm/:C/powerpc(64|64le|spe)/powerpc/:C/riscv64/riscv/
MACHINE_CPUARCH=${MACHINE_ARCH:${__TO_CPUARCH}}
.endif
@@ -33,6 +31,7 @@ __DEFAULT_NO_OPTIONS= \
__DEFAULT_DEPENDENT_OPTIONS= \
AUTO_OBJ/DIRDEPS_BUILD \
+ META_ERROR_TARGET/DIRDEPS_BUILD \
META_MODE/DIRDEPS_BUILD \
STAGING/DIRDEPS_BUILD \
SYSROOT/DIRDEPS_BUILD
@@ -44,9 +43,6 @@ __ENV_ONLY_OPTIONS:= \
# early include for customization
# see local.sys.mk below
-# Not included when building in fmake compatibility mode (still needed
-# for older system support)
-.if defined(.PARSEDIR)
.sinclude <local.sys.env.mk>
.include <bsd.mkopt.mk>
@@ -57,27 +53,13 @@ MK_META_MODE= no
.endif
.if ${MK_DIRDEPS_BUILD} == "yes"
-.sinclude <meta.sys.mk>
-.elif ${MK_META_MODE} == "yes"
-META_MODE+= meta
-.if empty(.MAKEFLAGS:M-s)
-# verbose will show .MAKE.META.PREFIX for each target.
-META_MODE+= verbose
-.endif
-.if !defined(NO_META_MISSING)
-META_MODE+= missing-meta=yes
-.endif
-# silent will hide command output if a .meta file is created.
-.if !defined(NO_SILENT)
-META_MODE+= silent=yes
+.-include <sys.dirdeps.mk>
.endif
+.if ${MK_META_MODE} == "yes"
.if !exists(/dev/filemon) || defined(NO_FILEMON)
META_MODE+= nofilemon
.endif
-# Require filemon data with bmake
-.if empty(META_MODE:Mnofilemon)
-META_MODE+= missing-filemon=yes
-.endif
+.-include <meta.sys.mk>
.endif
META_MODE?= normal
.export META_MODE
@@ -123,9 +105,6 @@ NO_META_IGNORE_HOST_HEADERS= 1
.sinclude <auto.obj.mk>
.endif
.endif # ${MK_AUTO_OBJ} == "yes"
-.else # bmake
-.include <bsd.mkopt.mk>
-.endif
# If the special target .POSIX appears (without prerequisites or
# commands) before the first noncomment line in the makefile, make shall
@@ -174,6 +153,8 @@ CFLAGS += -fno-strict-aliasing
IR_CFLAGS ?= ${STATIC_CFLAGS:N-O*} ${CFLAGS:N-O*}
PO_CFLAGS ?= ${CFLAGS}
+HOST_CC ?= ${CC}
+
# cp(1) is used to copy source files to ${.OBJDIR}, make sure it can handle
# read-only files as non-root by passing -f.
CP ?= cp -f
diff --git a/share/mk/tap.test.mk b/share/mk/tap.test.mk
index d511da379a3e..2cda52fa7da6 100644
--- a/share/mk/tap.test.mk
+++ b/share/mk/tap.test.mk
@@ -1,4 +1,3 @@
-# $FreeBSD$
#
# You must include bsd.test.mk instead of this file from your Makefile.
#
diff --git a/share/mk/version_gen.awk b/share/mk/version_gen.awk
index b9747cefd56e..0b4a2532352e 100644
--- a/share/mk/version_gen.awk
+++ b/share/mk/version_gen.awk
@@ -1,5 +1,5 @@
#
-# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (C) 2006 Daniel M. Eischen. All rights reserved.
#
@@ -24,7 +24,6 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
-# $FreeBSD$
#
#