xref: /freebsd-14.2/Makefile.inc1 (revision 1e8db1f7)
111fb97daSJohn Birrell#
211fb97daSJohn Birrell#
311fb97daSJohn Birrell# Make command line options:
4f45a5bbdSRuslan Ermilov#	-DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
5f45a5bbdSRuslan Ermilov#	-DNO_CLEAN do not clean at all
64a63ae11SBrooks Davis#	-DDB_FROM_SRC use the user/group databases in src/etc instead of
74a63ae11SBrooks Davis#	    the system database when installing.
86495335eSRuslan Ermilov#	-DNO_SHARE do not go into share subdir
9497e8091SBryan Drewery#	-DKERNFAST define NO_KERNEL{CONFIG,CLEAN,OBJ}
1059bb1d9cSBrian Somers#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
116d84d742SPeter Wemm#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
1262012822SWarner Losh#	-DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel
134a63ae11SBrooks Davis#	-DNO_ROOT install without using root privilege
1496267df3SWarner Losh#	-DWITHOUT_CTF do not run the DTrace CTF conversion tools on built objects
1511fb97daSJohn Birrell#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
16a0e6a013SBryan Drewery#	LOCAL_ITOOLS="list of tools" to add additional tools to the ITOOLS list
175814131aSBrooks Davis#	LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
1829f5a35cSBrooks Davis#	LOCAL_MTREE="list of mtree files" to process to allow local directories
1929f5a35cSBrooks Davis#	    to be created before files are installed
2080cedb80SBryan Drewery#	LOCAL_LEGACY_DIRS="list of dirs" to add additional dirs to the legacy
2180cedb80SBryan Drewery#	    target
2280cedb80SBryan Drewery#	LOCAL_BSTOOL_DIRS="list of dirs" to add additional dirs to the
2380cedb80SBryan Drewery#	    bootstrap-tools target
249b428cfaSAdrian Chadd#	LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools
2580cedb80SBryan Drewery#	    target
264143850bSBryan Drewery#	LOCAL_XTOOL_DIRS="list of dirs" to add additional dirs to the
274143850bSBryan Drewery#	    cross-tools target
284a63ae11SBrooks Davis#	METALOG="path to metadata log" to write permission and ownership
298da6fc4dSJohn-Mark Gurney#	    when NO_ROOT is set.  (default: ${DESTDIR}/${DISTDIR}/METALOG,
308da6fc4dSJohn-Mark Gurney#           check /etc/make.conf for DISTDIR)
31e6cb78fbSRuslan Ermilov#	TARGET="machine" to crossbuild world for a different machine type
32f672e5fbSWarner Losh#	TARGET_ARCH= may be required when a TARGET supports multiple endians
33e4fa4fafSBryan Drewery#	BUILDENV_SHELL= shell to launch for the buildenv target (def:${SHELL})
34de17cbccSHiroki Sato#	WORLD_FLAGS= additional flags to pass to make(1) during buildworld
35de17cbccSHiroki Sato#	KERNEL_FLAGS= additional flags to pass to make(1) during buildkernel
367f1636b7SBryan Drewery#	SUBDIR_OVERRIDE="list of dirs" to build rather than everything.
377f1636b7SBryan Drewery#	    All libraries and includes, and some build tools will still build.
3811fb97daSJohn Birrell
3911fb97daSJohn Birrell#
4011fb97daSJohn Birrell# The intended user-driven targets are:
4111fb97daSJohn Birrell# buildworld  - rebuild *everything*, including glue to help do upgrades
4211fb97daSJohn Birrell# installworld- install everything built by "buildworld"
4371b7fa12SEnji Cooper# checkworld  - run test suite on installed world
44becc5c62SAlexander Leidinger# doxygen     - build API documentation of the kernel
4511fb97daSJohn Birrell#
4611fb97daSJohn Birrell# Standard targets (not defined here) are documented in the makefiles in
4711fb97daSJohn Birrell# /usr/share/mk.  These include:
4811fb97daSJohn Birrell#		obj depend all install clean cleandepend cleanobj
4911fb97daSJohn Birrell
50fbd0c280SWarner Losh.if !defined(TARGET) || !defined(TARGET_ARCH)
516f6fbfa3SEd Maste.error Both TARGET and TARGET_ARCH must be defined.
52fbd0c280SWarner Losh.endif
53fbd0c280SWarner Losh
546e6be2bbSBryan Drewery.if make(showconfig) || make(test-system-*)
556e6be2bbSBryan Drewery_MKSHOWCONFIG=	t
566e6be2bbSBryan Drewery.endif
576e6be2bbSBryan Drewery
586120aabdSBryan DrewerySRCDIR?=	${.CURDIR}
594a2a740eSEnji CooperLOCALBASE?=	/usr/local
6099feb137SWolfram SchneiderTIME_ENV ?= time env
61bcffa935SDavid E. O'Brien
62a8b8edb2SMaxim Sobolev.include "share/mk/src.tools.mk"
63a8b8edb2SMaxim Sobolev
64e5ff3aadSWarner Losh# Cross toolchain changes must be in effect before bsd.compiler.mk
65e5ff3aadSWarner Losh# so that gets the right CC, and pass CROSS_TOOLCHAIN to submakes.
66e5ff3aadSWarner Losh.if defined(CROSS_TOOLCHAIN)
670df651d7SBrooks Davis.if exists(${LOCALBASE}/share/toolchains/${CROSS_TOOLCHAIN}.mk)
68e5ff3aadSWarner Losh.include "${LOCALBASE}/share/toolchains/${CROSS_TOOLCHAIN}.mk"
690df651d7SBrooks Davis.elif exists(${CROSS_TOOLCHAIN})
700df651d7SBrooks Davis.include "${CROSS_TOOLCHAIN}"
710df651d7SBrooks Davis.else
722f513483SBrooks Davis.error CROSS_TOOLCHAIN ${CROSS_TOOLCHAIN} not found
730df651d7SBrooks Davis.endif
74e5ff3aadSWarner LoshCROSSENV+=CROSS_TOOLCHAIN="${CROSS_TOOLCHAIN}"
751c024976SJohn Baldwin.elif defined(UNIVERSE_TOOLCHAIN)
761c024976SJohn BaldwinUNIVERSE_TOOLCHAIN_PATH?=${HOST_OBJTOP}/tmp/usr/bin
771c024976SJohn BaldwinXCC?="${UNIVERSE_TOOLCHAIN_PATH}/cc"
781c024976SJohn BaldwinXCXX?="${UNIVERSE_TOOLCHAIN_PATH}/c++"
791c024976SJohn BaldwinXCPP?="${UNIVERSE_TOOLCHAIN_PATH}/cpp"
801c024976SJohn BaldwinXLD?="${UNIVERSE_TOOLCHAIN_PATH}/ld"
81e5ff3aadSWarner Losh.endif
8234fb4407SBryan Drewery.if defined(CROSS_TOOLCHAIN_PREFIX)
8334fb4407SBryan DreweryCROSS_COMPILER_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
8434fb4407SBryan Drewery.endif
8534fb4407SBryan Drewery
8634fb4407SBryan DreweryXCOMPILERS=	CC CXX CPP
8734fb4407SBryan Drewery.for COMPILER in ${XCOMPILERS}
8834fb4407SBryan Drewery.if defined(CROSS_COMPILER_PREFIX)
8934fb4407SBryan DreweryX${COMPILER}?=	${CROSS_COMPILER_PREFIX}${${COMPILER}}
9034fb4407SBryan Drewery.else
9134fb4407SBryan DreweryX${COMPILER}?=	${${COMPILER}}
9234fb4407SBryan Drewery.endif
9334fb4407SBryan Drewery.endfor
94c1b9d002SBryan Drewery# If a full path to an external cross compiler is given, don't build
95c1b9d002SBryan Drewery# a cross compiler.
96c1b9d002SBryan Drewery.if ${XCC:N${CCACHE_BIN}:M/*}
9773371266SBryan DreweryMK_CLANG_BOOTSTRAP=	no
98ab3a1809SJessica Clarke# Make sure sub-makes see the option as disabled so the hack in bsd.sys.mk to
99ab3a1809SJessica Clarke# work around incompatible headers in Clang's resource directory is enabled.
100ab3a1809SJessica Clarke.MAKEOVERRIDES+=	MK_CLANG_BOOTSTRAP
101c1b9d002SBryan Drewery.endif
102c1b9d002SBryan Drewery
103848d5e92SBryan Drewery# Pull in compiler metadata from buildworld/toolchain if possible to avoid
104848d5e92SBryan Drewery# running CC from bsd.compiler.mk.
105d20bd9e4SBryan Drewery.if make(installworld) || make(install) || make(distributeworld) || \
106d20bd9e4SBryan Drewery    make(stageworld)
107cb623f63SEd Maste.-include "${OBJTOP}/toolchain-metadata.mk"
108cb623f63SEd Maste.if !defined(_LOADED_TOOLCHAIN_METADATA)
1094e3db1e0SBryan Drewery.error A build is required first.  You may have the wrong MAKEOBJDIRPREFIX set.
1104e3db1e0SBryan Drewery.endif
111848d5e92SBryan Drewery.endif
112848d5e92SBryan Drewery
113207efdb3SWarner Losh# Pull in COMPILER_TYPE and COMPILER_FREEBSD_VERSION early. Pull it from the
114207efdb3SWarner Losh# tree to be friendlier to foreign OS builds. It's safe to do so unconditionally
115207efdb3SWarner Losh# here since we will always have the right make, unlike in src/Makefile
116a7d84af8SBryan Drewery# Don't include bsd.linker.mk yet until XBINUTILS is handled (after src.opts.mk)
117a7d84af8SBryan Drewery_NO_INCLUDE_LINKERMK=	t
11874f65486SAlex Richardson# We also want the X_COMPILER* variables if we are using an external toolchain.
11974f65486SAlex Richardson_WANT_TOOLCHAIN_CROSS_VARS=	t
120207efdb3SWarner Losh.include "share/mk/bsd.compiler.mk"
121a7d84af8SBryan Drewery.undef _NO_INCLUDE_LINKERMK
12274f65486SAlex Richardson.undef _WANT_TOOLCHAIN_CROSS_VARS
123a7d84af8SBryan Drewery# src.opts.mk depends on COMPILER_FEATURES
1245091e3dfSGarance A Drosehn.include "share/mk/src.opts.mk"
12511fb97daSJohn Birrell
1262d2aba18SBryan Drewery.if ${TARGET} == ${MACHINE}
1272d2aba18SBryan DreweryTARGET_CPUTYPE?=${CPUTYPE}
1282d2aba18SBryan Drewery.else
1292d2aba18SBryan DreweryTARGET_CPUTYPE?=
1302d2aba18SBryan Drewery.endif
1312d2aba18SBryan Drewery.if !empty(TARGET_CPUTYPE)
1322d2aba18SBryan Drewery_TARGET_CPUTYPE=${TARGET_CPUTYPE}
1332d2aba18SBryan Drewery.else
1342d2aba18SBryan Drewery_TARGET_CPUTYPE=dummy
1352d2aba18SBryan Drewery.endif
1362d2aba18SBryan Drewery.if ${TARGET} == "arm"
1372726978bSWarner Losh.if ${TARGET_CPUTYPE:M*soft*} == ""
13877becb93SBrooks DavisTARGET_TRIPLE_ABI=	gnueabihf
1392d2aba18SBryan Drewery.else
14077becb93SBrooks DavisTARGET_TRIPLE_ABI=	gnueabi
1412d2aba18SBryan Drewery.endif
1422d2aba18SBryan Drewery.endif
14377becb93SBrooks DavisMACHINE_TRIPLE_ABI?=	unknown
14410172ce3SJohn BaldwinMACHINE_TRIPLE?=${MACHINE_ARCH:S/amd64/x86_64/}-${MACHINE_TRIPLE_ABI}-freebsd${OS_REVISION}
14577becb93SBrooks DavisTARGET_TRIPLE_ABI?=	unknown
14610172ce3SJohn BaldwinTARGET_TRIPLE?=	${TARGET_ARCH:S/amd64/x86_64/}-${TARGET_TRIPLE_ABI}-freebsd${OS_REVISION}
1478706983fSBryan DreweryKNOWN_ARCHES?=	aarch64/arm64 \
1488706983fSBryan Drewery		amd64 \
1498706983fSBryan Drewery		armv6/arm \
1508706983fSBryan Drewery		armv7/arm \
1518706983fSBryan Drewery		i386 \
1528706983fSBryan Drewery		powerpc \
1538706983fSBryan Drewery		powerpc64/powerpc \
154b75abea4SBrandon Bergren		powerpc64le/powerpc \
1558706983fSBryan Drewery		powerpcspe/powerpc \
1561ca12bd9SJohn Baldwin		riscv64/riscv
1578706983fSBryan Drewery
1588706983fSBryan Drewery.if ${TARGET} == ${TARGET_ARCH}
1598706983fSBryan Drewery_t=		${TARGET}
1608706983fSBryan Drewery.else
1618706983fSBryan Drewery_t=		${TARGET_ARCH}/${TARGET}
1628706983fSBryan Drewery.endif
1638706983fSBryan Drewery.for _t in ${_t}
1648706983fSBryan Drewery.if empty(KNOWN_ARCHES:M${_t})
1658706983fSBryan Drewery.error Unknown target ${TARGET_ARCH}:${TARGET}.
1668706983fSBryan Drewery.endif
1678706983fSBryan Drewery.endfor
1682d2aba18SBryan Drewery
16981250b9cSMike Karels.if ${TARGET_ARCH} == "amd64"
17081250b9cSMike KarelsLIBCOMPAT_INCLUDE_DIRS+= i386
171a1b67573SMike Karels.elif ${TARGET_ARCH} == "aarch64"
172a1b67573SMike KarelsLIBCOMPAT_INCLUDE_DIRS+= arm
17381250b9cSMike Karels.endif
17481250b9cSMike Karels
1755bb9250eSAlex Richardson.if ${.MAKE.OS} != "FreeBSD"
1765bb9250eSAlex RichardsonCROSSBUILD_HOST=${.MAKE.OS}
1775bb9250eSAlex Richardson.if ${.MAKE.OS} != "Linux" && ${.MAKE.OS} != "Darwin"
1786f6fbfa3SEd Maste.warning Unsupported crossbuild system: ${.MAKE.OS}. Build will probably fail!
1795bb9250eSAlex Richardson.endif
1805bb9250eSAlex Richardson# We need to force NO_ROOT/DB_FROM_SRC builds when building on other operating
1815bb9250eSAlex Richardson# systems since the BSD.foo.dist specs contain users and groups that do not
1825bb9250eSAlex Richardson# exist by default on a Linux/MacOS system.
1835bb9250eSAlex RichardsonNO_ROOT:=	1
1845bb9250eSAlex RichardsonDB_FROM_SRC:=	1
1855bb9250eSAlex Richardson.export NO_ROOT
1865bb9250eSAlex Richardson.endif
1875bb9250eSAlex Richardson
188631e709fSBryan Drewery# If all targets are disabled for system llvm then don't expect it to work
189631e709fSBryan Drewery# for cross-builds.
19052b7824bSBryan Drewery.if !defined(TOOLS_PREFIX) && ${MK_LLVM_TARGET_ALL} == "no" && \
191631e709fSBryan Drewery    ${MACHINE} != ${TARGET} && ${MACHINE_ARCH} != ${TARGET_ARCH} && \
192631e709fSBryan Drewery    !make(showconfig)
193631e709fSBryan DreweryMK_SYSTEM_COMPILER=	no
194631e709fSBryan DreweryMK_SYSTEM_LINKER=	no
195631e709fSBryan Drewery.endif
196631e709fSBryan Drewery
1977e1b3c5eSBryan Drewery# Handle external binutils.
1987e1b3c5eSBryan Drewery.if defined(CROSS_TOOLCHAIN_PREFIX)
1997e1b3c5eSBryan DreweryCROSS_BINUTILS_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
2007e1b3c5eSBryan Drewery.endif
201c6081deaSMarcin WojtasXBINUTILS=	AS AR ELFCTL LD NM OBJCOPY RANLIB SIZE STRINGS STRIPBIN
2027e1b3c5eSBryan Drewery.for BINUTIL in ${XBINUTILS}
2037e1b3c5eSBryan Drewery.if defined(CROSS_BINUTILS_PREFIX) && \
2044d64cb78SBryan Drewery    exists(${CROSS_BINUTILS_PREFIX}/${${BINUTIL}})
2054d64cb78SBryan DreweryX${BINUTIL}?=	${CROSS_BINUTILS_PREFIX:C,/*$,,}/${${BINUTIL}}
2067e1b3c5eSBryan Drewery.else
2077e1b3c5eSBryan DreweryX${BINUTIL}?=	${${BINUTIL}}
2087e1b3c5eSBryan Drewery.endif
2097e1b3c5eSBryan Drewery.endfor
2107e1b3c5eSBryan Drewery
211cf43faaaSBryan Drewery# If a full path to an external linker is given, don't build lld.
212cf43faaaSBryan Drewery.if ${XLD:M/*}
213cf43faaaSBryan DreweryMK_LLD_BOOTSTRAP=	no
214cf43faaaSBryan Drewery.endif
2156120aabdSBryan Drewery
21674f65486SAlex Richardson# We also want the X_LINKER* variables if we are using an external toolchain.
21774f65486SAlex Richardson_WANT_TOOLCHAIN_CROSS_VARS=	t
218a7d84af8SBryan Drewery.include "share/mk/bsd.linker.mk"
21974f65486SAlex Richardson.undef _WANT_TOOLCHAIN_CROSS_VARS
220a7d84af8SBryan Drewery
221a7d84af8SBryan Drewery# Begin WITH_SYSTEM_COMPILER / WITH_SYSTEM_LD
222a7d84af8SBryan Drewery
223a7d84af8SBryan Drewery# WITH_SYSTEM_COMPILER - Pull in needed values and make a decision.
224a7d84af8SBryan Drewery
225a7d84af8SBryan Drewery# Check if there is a local compiler that can satisfy as an external compiler.
226a7d84af8SBryan Drewery# Which compiler is expected to be used?
227a7d84af8SBryan Drewery.if ${MK_CLANG_BOOTSTRAP} == "yes"
228a7d84af8SBryan DreweryWANT_COMPILER_TYPE=	clang
229a7d84af8SBryan Drewery.else
230a7d84af8SBryan DreweryWANT_COMPILER_TYPE=
231a7d84af8SBryan Drewery.endif
232a7d84af8SBryan Drewery
2336e6be2bbSBryan Drewery.if !defined(WANT_COMPILER_FREEBSD_VERSION) && !make(showconfig) && \
2346e6be2bbSBryan Drewery    !make(test-system-linker)
235a7d84af8SBryan Drewery.if ${WANT_COMPILER_TYPE} == "clang"
236a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION_FILE= lib/clang/freebsd_cc_version.h
237a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION!= \
238a7d84af8SBryan Drewery	awk '$$2 == "FREEBSD_CC_VERSION" {printf("%d\n", $$3)}' \
239a7d84af8SBryan Drewery	${SRCDIR}/${WANT_COMPILER_FREEBSD_VERSION_FILE} || echo unknown
240a7d84af8SBryan DreweryWANT_COMPILER_VERSION_FILE= lib/clang/include/clang/Basic/Version.inc
241a7d84af8SBryan DreweryWANT_COMPILER_VERSION!= \
242a7d84af8SBryan Drewery	awk '$$2 == "CLANG_VERSION" {split($$3, a, "."); print a[1] * 10000 + a[2] * 100 + a[3]}' \
243a7d84af8SBryan Drewery	${SRCDIR}/${WANT_COMPILER_VERSION_FILE} || echo unknown
244a7d84af8SBryan Drewery.endif
245a7d84af8SBryan Drewery.export WANT_COMPILER_FREEBSD_VERSION WANT_COMPILER_VERSION
246a7d84af8SBryan Drewery.endif	# !defined(WANT_COMPILER_FREEBSD_VERSION)
247a7d84af8SBryan Drewery
248a7d84af8SBryan Drewery# It needs to be the same revision as we would build for the bootstrap.
249a7d84af8SBryan Drewery# If the expected vs CC is different then we can't skip.
250a7d84af8SBryan Drewery# GCC cannot be used for cross-arch yet.  For clang we pass -target later if
251a7d84af8SBryan Drewery# TARGET_ARCH!=MACHINE_ARCH.
252a7d84af8SBryan Drewery.if ${MK_SYSTEM_COMPILER} == "yes" && \
2536e6be2bbSBryan Drewery    defined(WANT_COMPILER_FREEBSD_VERSION) && \
25457f80467SEd Maste    ${MK_CLANG_BOOTSTRAP} == "yes" && \
2556e6be2bbSBryan Drewery    !make(xdev*) && \
256a7d84af8SBryan Drewery    ${X_COMPILER_TYPE} == ${WANT_COMPILER_TYPE} && \
257a7d84af8SBryan Drewery    (${X_COMPILER_TYPE} == "clang" || ${TARGET_ARCH} == ${MACHINE_ARCH}) && \
258a7d84af8SBryan Drewery    ${X_COMPILER_VERSION} == ${WANT_COMPILER_VERSION} && \
259a7d84af8SBryan Drewery    ${X_COMPILER_FREEBSD_VERSION} == ${WANT_COMPILER_FREEBSD_VERSION}
260a7d84af8SBryan Drewery# Everything matches, disable the bootstrap compiler.
261a7d84af8SBryan DreweryMK_CLANG_BOOTSTRAP=	no
262a7d84af8SBryan DreweryUSING_SYSTEM_COMPILER=	yes
263a7d84af8SBryan Drewery.endif	# ${WANT_COMPILER_TYPE} == ${COMPILER_TYPE}
264a7d84af8SBryan Drewery
265a7d84af8SBryan Drewery# WITH_SYSTEM_LD - Pull in needed values and make a decision.
266a7d84af8SBryan Drewery
267a7d84af8SBryan Drewery# Check if there is a local linker that can satisfy as an external linker.
268a7d84af8SBryan Drewery# Which linker is expected to be used?
269a7d84af8SBryan Drewery.if ${MK_LLD_BOOTSTRAP} == "yes"
270a7d84af8SBryan DreweryWANT_LINKER_TYPE=		lld
271a7d84af8SBryan Drewery.else
272a7d84af8SBryan DreweryWANT_LINKER_TYPE=
273a7d84af8SBryan Drewery.endif
274a7d84af8SBryan Drewery
2756e6be2bbSBryan Drewery.if !defined(WANT_LINKER_FREEBSD_VERSION) && !make(showconfig) && \
2766e6be2bbSBryan Drewery    !make(test-system-compiler)
277a7d84af8SBryan Drewery.if ${WANT_LINKER_TYPE} == "lld"
2781838bd0fSDimitry AndricWANT_LINKER_FREEBSD_VERSION_FILE= lib/clang/include/lld/Common/Version.inc
2791838bd0fSDimitry AndricWANT_LINKER_FREEBSD_VERSION!= \
2801838bd0fSDimitry Andric	awk '$$2 == "LLD_FREEBSD_VERSION" {print $$3}' \
281a7d84af8SBryan Drewery	${SRCDIR}/${WANT_LINKER_FREEBSD_VERSION_FILE} || echo unknown
282a7d84af8SBryan DreweryWANT_LINKER_VERSION_FILE= lib/clang/include/lld/Common/Version.inc
283a7d84af8SBryan DreweryWANT_LINKER_VERSION!= \
284530134d2SBjoern A. Zeeb	awk '$$2 == "LLD_VERSION_STRING" {gsub("\"", "", $$3); split($$3, a, "."); print a[1] * 10000 + a[2] * 100 + a[3]}' \
285a7d84af8SBryan Drewery	${SRCDIR}/${WANT_LINKER_VERSION_FILE} || echo unknown
286a7d84af8SBryan Drewery.else
287a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION_FILE=
288a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION=
289a7d84af8SBryan Drewery.endif
290a7d84af8SBryan Drewery.export WANT_LINKER_FREEBSD_VERSION WANT_LINKER_VERSION
291a7d84af8SBryan Drewery.endif	# !defined(WANT_LINKER_FREEBSD_VERSION)
292a7d84af8SBryan Drewery
293a7d84af8SBryan Drewery.if ${MK_SYSTEM_LINKER} == "yes" && \
2946e6be2bbSBryan Drewery    defined(WANT_LINKER_FREEBSD_VERSION) && \
295a7d84af8SBryan Drewery    (${MK_LLD_BOOTSTRAP} == "yes") && \
2966e6be2bbSBryan Drewery    !make(xdev*) && \
297a7d84af8SBryan Drewery    ${X_LINKER_TYPE} == ${WANT_LINKER_TYPE} && \
298a7d84af8SBryan Drewery    ${X_LINKER_VERSION} == ${WANT_LINKER_VERSION} && \
299a7d84af8SBryan Drewery    ${X_LINKER_FREEBSD_VERSION} == ${WANT_LINKER_FREEBSD_VERSION}
300a7d84af8SBryan Drewery# Everything matches, disable the bootstrap linker.
301a7d84af8SBryan DreweryMK_LLD_BOOTSTRAP=	no
302a7d84af8SBryan DreweryUSING_SYSTEM_LINKER=	yes
303a7d84af8SBryan Drewery.endif	# ${WANT_LINKER_TYPE} == ${LINKER_TYPE}
304a7d84af8SBryan Drewery
305a7d84af8SBryan Drewery# WITH_SYSTEM_COMPILER / WITH_SYSTEM_LINKER - Handle defaults and debug.
306a7d84af8SBryan DreweryUSING_SYSTEM_COMPILER?=	no
307a7d84af8SBryan DreweryUSING_SYSTEM_LINKER?=	no
308a7d84af8SBryan Drewery
309a7d84af8SBryan DreweryTEST_SYSTEM_COMPILER_VARS= \
310a7d84af8SBryan Drewery	USING_SYSTEM_COMPILER MK_SYSTEM_COMPILER \
31157f80467SEd Maste	MK_CROSS_COMPILER MK_CLANG_BOOTSTRAP \
312a7d84af8SBryan Drewery	WANT_COMPILER_TYPE WANT_COMPILER_VERSION WANT_COMPILER_VERSION_FILE \
313a7d84af8SBryan Drewery	WANT_COMPILER_FREEBSD_VERSION WANT_COMPILER_FREEBSD_VERSION_FILE \
314a7d84af8SBryan Drewery	CC COMPILER_TYPE COMPILER_FEATURES COMPILER_VERSION \
315a7d84af8SBryan Drewery	COMPILER_FREEBSD_VERSION \
316a7d84af8SBryan Drewery	XCC X_COMPILER_TYPE X_COMPILER_FEATURES X_COMPILER_VERSION \
317a7d84af8SBryan Drewery	X_COMPILER_FREEBSD_VERSION
318a7d84af8SBryan DreweryTEST_SYSTEM_LINKER_VARS= \
319a7d84af8SBryan Drewery	USING_SYSTEM_LINKER MK_SYSTEM_LINKER \
32074e8d41eSEd Maste	MK_LLD_BOOTSTRAP \
321a7d84af8SBryan Drewery	WANT_LINKER_TYPE WANT_LINKER_VERSION WANT_LINKER_VERSION_FILE \
322a7d84af8SBryan Drewery	WANT_LINKER_FREEBSD_VERSION WANT_LINKER_FREEBSD_VERSION_FILE \
323a7d84af8SBryan Drewery	LD LINKER_TYPE LINKER_FEATURES LINKER_VERSION \
324a7d84af8SBryan Drewery	LINKER_FREEBSD_VERSION \
325a7d84af8SBryan Drewery	XLD X_LINKER_TYPE X_LINKER_FEATURES X_LINKER_VERSION \
326a7d84af8SBryan Drewery	X_LINKER_FREEBSD_VERSION
327a7d84af8SBryan Drewery
328a7d84af8SBryan Drewery.for _t in compiler linker
329a7d84af8SBryan Drewerytest-system-${_t}: .PHONY
330a7d84af8SBryan Drewery.for v in ${TEST_SYSTEM_${_t:tu}_VARS}
331a7d84af8SBryan Drewery	${_+_}@printf "%-35s= %s\n" "${v}" "${${v}}"
332a7d84af8SBryan Drewery.endfor
333a7d84af8SBryan Drewery.endfor
334a7d84af8SBryan Drewery.if (make(buildworld) || make(buildkernel) || make(kernel-toolchain) || \
335a7d84af8SBryan Drewery    make(toolchain) || make(_cross-tools))
336a7d84af8SBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes"
337a7d84af8SBryan Drewery.info SYSTEM_COMPILER: Determined that CC=${CC} matches the source tree.  Not bootstrapping a cross-compiler.
338a7d84af8SBryan Drewery.elif ${MK_CLANG_BOOTSTRAP} == "yes"
339a7d84af8SBryan Drewery.info SYSTEM_COMPILER: libclang will be built for bootstrapping a cross-compiler.
340a7d84af8SBryan Drewery.endif
341a7d84af8SBryan Drewery.if ${USING_SYSTEM_LINKER} == "yes"
342a7d84af8SBryan Drewery.info SYSTEM_LINKER: Determined that LD=${LD} matches the source tree.  Not bootstrapping a cross-linker.
343a7d84af8SBryan Drewery.elif ${MK_LLD_BOOTSTRAP} == "yes"
344a7d84af8SBryan Drewery.info SYSTEM_LINKER: libclang will be built for bootstrapping a cross-linker.
345a7d84af8SBryan Drewery.endif
346a7d84af8SBryan Drewery.endif
347a7d84af8SBryan Drewery
348a7d84af8SBryan Drewery# End WITH_SYSTEM_COMPILER / WITH_SYSTEM_LD
349a7d84af8SBryan Drewery
350a7d84af8SBryan Drewery# Store some compiler metadata for use in installworld where we don't
351a7d84af8SBryan Drewery# want to invoke CC at all.
352cb623f63SEd Maste_TOOLCHAIN_METADATA_VARS=	COMPILER_VERSION \
353a7d84af8SBryan Drewery				COMPILER_TYPE \
354a7d84af8SBryan Drewery				COMPILER_FEATURES \
355a7d84af8SBryan Drewery				COMPILER_FREEBSD_VERSION \
356f382bac4SBrooks Davis				COMPILER_RESOURCE_DIR \
357a7d84af8SBryan Drewery				LINKER_VERSION \
358a7d84af8SBryan Drewery				LINKER_FEATURES \
359a7d84af8SBryan Drewery				LINKER_TYPE \
360a7d84af8SBryan Drewery				LINKER_FREEBSD_VERSION
361cb623f63SEd Mastetoolchain-metadata.mk: .PHONY .META
362a7d84af8SBryan Drewery	@: > ${.TARGET}
363cb623f63SEd Maste	@echo ".info Using cached toolchain metadata from build at $$(hostname) on $$(date)" \
364a7d84af8SBryan Drewery	    > ${.TARGET}
365cb623f63SEd Maste	@echo "_LOADED_TOOLCHAIN_METADATA=t" >> ${.TARGET}
366cb623f63SEd Maste.for v in ${_TOOLCHAIN_METADATA_VARS}
367a7d84af8SBryan Drewery	@echo "${v}=${${v}}" >> ${.TARGET}
368a7d84af8SBryan Drewery	@echo "X_${v}=${X_${v}}" >> ${.TARGET}
369a7d84af8SBryan Drewery.endfor
370cb623f63SEd Maste	@echo ".export ${_TOOLCHAIN_METADATA_VARS}" >> ${.TARGET}
371cb623f63SEd Maste	@echo ".export ${_TOOLCHAIN_METADATA_VARS:C,^,X_,}" >> ${.TARGET}
372a7d84af8SBryan Drewery
373a7d84af8SBryan Drewery
3747e81b832SBryan Drewery# We must do lib/ and libexec/ before bin/ in case of a mid-install error to
3757e81b832SBryan Drewery# keep the users system reasonably usable.  For static->dynamic root upgrades,
3767e81b832SBryan Drewery# we don't want to install a dynamic binary without rtld and the needed
3777e81b832SBryan Drewery# libraries.  More commonly, for dynamic root, we don't want to install a
3787e81b832SBryan Drewery# binary that requires a newer library version that hasn't been installed yet.
3797e81b832SBryan Drewery# This ordering is not a guarantee though.  The only guarantee of a working
3807e81b832SBryan Drewery# system here would require fine-grained ordering of all components based
3817e81b832SBryan Drewery# on their dependencies.
3827f1636b7SBryan Drewery.if !empty(SUBDIR_OVERRIDE)
383f26a777cSBenno RiceSUBDIR=	${SUBDIR_OVERRIDE}
384f26a777cSBenno Rice.else
38564e55c39SBaptiste DaroussinSUBDIR=	lib libexec
3862a821fd9SIan Lepore# Add LOCAL_LIB_DIRS, but only if they will not be picked up as a SUBDIR
3872a821fd9SIan Lepore# of a LOCAL_DIRS directory.  This allows LOCAL_DIRS=foo and
3882a821fd9SIan Lepore# LOCAL_LIB_DIRS=foo/lib to behave as expected.
3892a821fd9SIan Lepore.for _DIR in ${LOCAL_DIRS:M*/} ${LOCAL_DIRS:N*/:S|$|/|}
3902a821fd9SIan Lepore_REDUNDANT_LIB_DIRS+=    ${LOCAL_LIB_DIRS:M${_DIR}*}
3912a821fd9SIan Lepore.endfor
3922a821fd9SIan Lepore.for _DIR in ${LOCAL_LIB_DIRS}
3932a821fd9SIan Lepore.if ${_DIR} == ".WAIT" || (empty(_REDUNDANT_LIB_DIRS:M${_DIR}) && exists(${.CURDIR}/${_DIR}/Makefile))
3942a821fd9SIan LeporeSUBDIR+=	${_DIR}
3952a821fd9SIan Lepore.endif
3962a821fd9SIan Lepore.endfor
3977cd7d126SBryan Drewery.if !defined(NO_ROOT) && (make(installworld) || make(install))
398fb84a99eSBryan Drewery# Ensure libraries are installed before progressing.
399fb84a99eSBryan DrewerySUBDIR+=.WAIT
400fb84a99eSBryan Drewery.endif
40187b8c12dSRuslan ErmilovSUBDIR+=bin
402ceef0c31SPawel Jakub Dawidek.if ${MK_CDDL} != "no"
403ceef0c31SPawel Jakub DawidekSUBDIR+=cddl
404ceef0c31SPawel Jakub Dawidek.endif
40587b8c12dSRuslan ErmilovSUBDIR+=gnu include
406e1fe3dbaSRuslan Ermilov.if ${MK_KERBEROS} != "no"
407d092560cSMark MurraySUBDIR+=kerberos5
408d092560cSMark Murray.endif
409e1fe3dbaSRuslan Ermilov.if ${MK_RESCUE} != "no"
4103cc95654SRuslan ErmilovSUBDIR+=rescue
4113cc95654SRuslan Ermilov.endif
41211fb97daSJohn BirrellSUBDIR+=sbin
413e1fe3dbaSRuslan Ermilov.if ${MK_CRYPT} != "no"
414b69cb634SJohn BaldwinSUBDIR+=secure
415b69cb634SJohn Baldwin.endif
4166495335eSRuslan Ermilov.if !defined(NO_SHARE)
41711fb97daSJohn BirrellSUBDIR+=share
41811fb97daSJohn Birrell.endif
419ca987d46SWarner Losh.if ${MK_BOOT} != "no"
420ca987d46SWarner LoshSUBDIR+=stand
421ca987d46SWarner Losh.endif
42287b8c12dSRuslan ErmilovSUBDIR+=sys usr.bin usr.sbin
423e2197f80SRui Paulo.if ${MK_TESTS} != "no"
424e2197f80SRui PauloSUBDIR+=	tests
425e2197f80SRui Paulo.endif
426d6e61d98SRuslan Ermilov
427e93e5bb0SIan Lepore# Local directories are built in parallel with the base system directories.
428e93e5bb0SIan Lepore# Users may insert a .WAIT directive at the beginning or elsewhere within
429e93e5bb0SIan Lepore# the LOCAL_DIRS and LOCAL_LIB_DIRS lists as needed.
4300e97688fSBrooks Davis.for _DIR in ${LOCAL_DIRS}
431e93e5bb0SIan Lepore.if ${_DIR} == ".WAIT" || exists(${.CURDIR}/${_DIR}/Makefile)
43211fb97daSJohn BirrellSUBDIR+=	${_DIR}
43311fb97daSJohn Birrell.endif
43411fb97daSJohn Birrell.endfor
4356bde859fSRuslan Ermilov
43623ffbc10SBryan Drewery# We must do etc/ last as it hooks into building the man whatis file
43723ffbc10SBryan Drewery# by calling 'makedb' in share/man.  This is only relevant for
43823ffbc10SBryan Drewery# install/distribute so they build the whatis file after every manpage is
43923ffbc10SBryan Drewery# installed.
4407cd7d126SBryan Drewery.if make(installworld) || make(install)
441fb84a99eSBryan DrewerySUBDIR+=.WAIT
44211fb97daSJohn Birrell.endif
44323ffbc10SBryan DrewerySUBDIR+=etc
44423ffbc10SBryan Drewery
4457f1636b7SBryan Drewery.endif	# !empty(SUBDIR_OVERRIDE)
44611fb97daSJohn Birrell
44730d7f067SDavid E. O'Brien.if defined(NOCLEAN)
44875766799SEd Maste.warning The src.conf WITHOUT_CLEAN option can now be used instead of NOCLEAN.
44975766799SEd MasteMK_CLEAN:=	no
45075766799SEd Maste.endif
45175766799SEd Maste.if defined(NO_CLEAN)
45275766799SEd Maste.info The src.conf WITHOUT_CLEAN option can now be used instead of NO_CLEAN.
45375766799SEd MasteMK_CLEAN:=	no
45430d7f067SDavid E. O'Brien.endif
455f45a5bbdSRuslan Ermilov.if defined(NO_CLEANDIR)
45611fb97daSJohn BirrellCLEANDIR=	clean cleandepend
45711fb97daSJohn Birrell.else
45811fb97daSJohn BirrellCLEANDIR=	cleandir
45911fb97daSJohn Birrell.endif
46011fb97daSJohn Birrell
46116892c77SBryan Drewery.if defined(WORLDFAST)
46275766799SEd MasteMK_CLEAN:=	no
4632abeba9dSBryan DreweryNO_OBJWALK=	t
46416892c77SBryan Drewery.endif
46516892c77SBryan Drewery
466473fda75SBryan Drewery.if ${MK_META_MODE} == "yes"
467473fda75SBryan Drewery# If filemon is used then we can rely on the build being incremental-safe.
468473fda75SBryan Drewery# The .meta files will also track the build command and rebuild should
469473fda75SBryan Drewery# it change.
470473fda75SBryan Drewery.if empty(.MAKE.MODE:Mnofilemon)
47175766799SEd MasteMK_CLEAN:=	no
472473fda75SBryan Drewery.endif
473473fda75SBryan Drewery.endif
4742abeba9dSBryan Drewery.if defined(NO_OBJWALK) || ${MK_AUTO_OBJ} == "yes"
4752abeba9dSBryan DreweryNO_OBJWALK=	t
4766d75a7a8SBryan DreweryNO_KERNELOBJ=	t
4776d75a7a8SBryan Drewery.endif
4782abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
4796d75a7a8SBryan Drewery_obj=		obj
4806d75a7a8SBryan Drewery.endif
481473fda75SBryan Drewery
4820d9f40f2SAdrian ChaddLOCAL_TOOL_DIRS?=
4830a63717cSBryan DreweryPACKAGEDIR?=	${DESTDIR}/${DISTDIR}
4849b428cfaSAdrian Chadd
48537ded2a7SBryan Drewery.if empty(SHELL:M*csh*)
486e4fa4fafSBryan DreweryBUILDENV_SHELL?=${SHELL}
48737ded2a7SBryan Drewery.else
4885db254adSWarner LoshBUILDENV_SHELL?=/bin/sh
48937ded2a7SBryan Drewery.endif
4905db254adSWarner Losh
4916e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG)
49255927f28SBryan Drewery.if !defined(VCS_REVISION) || empty(VCS_REVISION)
49355927f28SBryan Drewery.if !defined(SVNVERSION_CMD) || empty(SVNVERSION_CMD)
49449a1108aSBryan Drewery. for _D in ${PATH:S,:, ,g}
49549a1108aSBryan Drewery.  if exists(${_D}/svnversion)
49649a1108aSBryan DrewerySVNVERSION_CMD?=${_D}/svnversion
49749a1108aSBryan Drewery.  endif
49849a1108aSBryan Drewery.  if exists(${_D}/svnliteversion)
49949a1108aSBryan DrewerySVNVERSION_CMD?=${_D}/svnliteversion
50049a1108aSBryan Drewery.  endif
50149a1108aSBryan Drewery. endfor
50249a1108aSBryan Drewery.endif
503aaa4cd7fSJuraj Lutter.if defined(SVNVERSION_CMD) && !empty(SVNVERSION_CMD)
504ebd2eeb3SGlen Barber_VCS_REVISION?=	$$(eval ${SVNVERSION_CMD} ${SRCDIR})
505ebd2eeb3SGlen Barber. if !empty(_VCS_REVISION)
506ebd2eeb3SGlen BarberVCS_REVISION=	$$(echo r${_VCS_REVISION})
507c0d9f07dSBryan Drewery.export VCS_REVISION
508ebd2eeb3SGlen Barber. endif
509aaa4cd7fSJuraj Lutter.endif
510aaa4cd7fSJuraj Lutter.endif
51111fb97daSJohn Birrell
51240056899SGlen Barber.if !defined(GIT_CMD) || empty(GIT_CMD)
51340056899SGlen Barber. for _P in /usr/bin /usr/local/bin
51440056899SGlen Barber.  if exists(${_P}/git)
51540056899SGlen BarberGIT_CMD=   ${_P}/git
51640056899SGlen Barber.  endif
51740056899SGlen Barber. endfor
51840056899SGlen Barber.export GIT_CMD
51940056899SGlen Barber.endif
52040056899SGlen Barber
52122bd4d16SWarner Losh.if !defined(OSRELDATE)
522b21d83f1SWarner Losh.if exists(/usr/include/osreldate.h)
52350da533cSRuslan ErmilovOSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
52450da533cSRuslan Ermilov		/usr/include/osreldate.h
525b21d83f1SWarner Losh.else
526c3754771SWarner LoshOSRELDATE=	0
527b21d83f1SWarner Losh.endif
528470c2b3aSBryan Drewery.export OSRELDATE
52922bd4d16SWarner Losh.endif
530e6cb78fbSRuslan Ermilov
531a378087dSBryan Drewery# Set VERSION for CTFMERGE to use via the default CTFFLAGS=-L VERSION.
532ea9a92d2SEd Maste.for _V in BRANCH REVISION TYPE
53344b8b2a0SBryan Drewery.if !defined(_${_V})
53444b8b2a0SBryan Drewery_${_V}!=	eval $$(awk '/^${_V}=/{print}' ${SRCTOP}/sys/conf/newvers.sh); echo $$${_V}
53544b8b2a0SBryan Drewery.export _${_V}
53675a6cb4fSBryan Drewery.endif
53744b8b2a0SBryan Drewery.endfor
53875a6cb4fSBryan Drewery.if !defined(SRCRELDATE)
53957bd24ceSGlen BarberSRCRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
54057bd24ceSGlen Barber		${SRCDIR}/sys/sys/param.h
54175a6cb4fSBryan Drewery.export SRCRELDATE
54275a6cb4fSBryan Drewery.endif
54375a6cb4fSBryan Drewery.if !defined(VERSION)
54475a6cb4fSBryan DreweryVERSION=	FreeBSD ${_REVISION}-${_BRANCH:C/-p[0-9]+$//} ${TARGET_ARCH} ${SRCRELDATE}
545a378087dSBryan Drewery.export VERSION
54651062e59SJohn Birrell.endif
547a1e3fb8fSEugene M. KimMAJOR_REVISION=	${_REVISION:R}
54851062e59SJohn Birrell
549183a8eadSBaptiste Daroussin.if !defined(PKG_VERSION)
550da7e9601SDoug Rabson_PKG_REVISION=	${_REVISION}
551613fe532SEmmanuel Vadot_STRTIMENOW=	%Y%m%d%H%M%S
552613fe532SEmmanuel Vadot_TIMENOW=	${_STRTIMENOW:gmtime}
553d45717e4SSiva MahadevanBRANCH_EXT=
554613fe532SEmmanuel Vadot.if ${_BRANCH:MCURRENT*} || ${_BRANCH:MSTABLE*} || ${_BRANCH:MPRERELEASE*}
555da7e9601SDoug Rabson_PKG_REVISION=	${MAJOR_REVISION}
556d45717e4SSiva MahadevanBRANCH_EXT=	snap
557d45717e4SSiva MahadevanEXTRA_REVISION=	.${BRANCH_EXT}${_TIMENOW}
558aef76961SEmmanuel Vadot.elif ${_BRANCH:MALPHA*}
559d45717e4SSiva MahadevanBRANCH_EXT=	a${_BRANCH:C/ALPHA([0-9]+).*/\1/}
560d45717e4SSiva MahadevanEXTRA_REVISION=	.${BRANCH_EXT}.${_TIMENOW}
561aef76961SEmmanuel Vadot.elif ${_BRANCH:MBETA*}
562d45717e4SSiva MahadevanBRANCH_EXT=	b${_BRANCH:C/BETA([0-9]+).*/\1/}
563d45717e4SSiva MahadevanEXTRA_REVISION=	.${BRANCH_EXT}.${_TIMENOW}
564aef76961SEmmanuel Vadot.elif ${_BRANCH:MRC*}
565d45717e4SSiva MahadevanBRANCH_EXT=	rc${_BRANCH:C/RC([0-9]+).*/\1/}
566d45717e4SSiva MahadevanEXTRA_REVISION=	.${BRANCH_EXT}.${_TIMENOW}
5670026fec5SRene Ladan.elif ${_BRANCH:M*-p*}
568d45717e4SSiva MahadevanBRANCH_EXT=	p${_BRANCH:C/.*-p([0-9]+$)/\1/}
569d45717e4SSiva MahadevanEXTRA_REVISION=	${BRANCH_EXT}
570183a8eadSBaptiste Daroussin.endif
571da7e9601SDoug RabsonPKG_VERSION:=	${_PKG_REVISION}${EXTRA_REVISION:C/[[:space:]]//g}
572183a8eadSBaptiste Daroussin.endif
5730026fec5SRene Ladan.endif	# !defined(PKG_VERSION)
574183a8eadSBaptiste Daroussin
575d0327929SEmmanuel Vadot.if !defined(PKG_TIMESTAMP)
576d0327929SEmmanuel VadotTIMEEPOCHNOW=		%s
577d0327929SEmmanuel VadotSOURCE_DATE_EPOCH=	${TIMEEPOCHNOW:gmtime}
578d0327929SEmmanuel Vadot.else
579d0327929SEmmanuel VadotSOURCE_DATE_EPOCH=	${PKG_TIMESTAMP}
580d0327929SEmmanuel Vadot.endif
581d0327929SEmmanuel Vadot
58282087d4bSEmmanuel VadotPKG_NAME_PREFIX?=	FreeBSD
58382087d4bSEmmanuel VadotPKG_MAINTAINER?=	re@FreeBSD.org
58482087d4bSEmmanuel VadotPKG_WWW?=		https://www.FreeBSD.org
58582087d4bSEmmanuel Vadot.export PKG_NAME_PREFIX
58682087d4bSEmmanuel Vadot.export PKG_MAINTAINER
58782087d4bSEmmanuel Vadot.export PKG_WWW
58882087d4bSEmmanuel Vadot
5896e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG)
590bb3f65eaSBryan Drewery_CPUTYPE!=	MAKEFLAGS= CPUTYPE=${_TARGET_CPUTYPE} ${MAKE} -f /dev/null \
591bb3f65eaSBryan Drewery		-m ${.CURDIR}/share/mk MK_AUTO_OBJ=no -V CPUTYPE
592d4f7b113SRuslan Ermilov.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
59332f8ca45SRuslan Ermilov.error CPUTYPE global should be set with ?=.
59432f8ca45SRuslan Ermilov.endif
5956e6be2bbSBryan Drewery.endif
5964448c79eSRuslan Ermilov.if make(buildworld)
597c26efd48SDoug AmbriskoBUILD_ARCH!=	uname -p
5985bb9250eSAlex Richardson# On some Linux systems uname -p returns "unknown" so skip this check there.
5995bb9250eSAlex Richardson# This check only exists to tell people to use TARGET_ARCH instead of
6005bb9250eSAlex Richardson# MACHINE_ARCH so skipping it when crossbuilding on non-FreeBSD should be fine.
6015bb9250eSAlex Richardson.if ${MACHINE_ARCH} != ${BUILD_ARCH} && ${.MAKE.OS} == "FreeBSD"
6024448c79eSRuslan Ermilov.error To cross-build, set TARGET_ARCH.
6034448c79eSRuslan Ermilov.endif
6044448c79eSRuslan Ermilov.endif
605dfa09989SBryan DreweryWORLDTMP?=	${OBJTOP}/tmp
6064f47920eSKyle EvansBPATH=		${CCACHE_WRAPPER_PATH_PFX}${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin:${WORLDTMP}/legacy/usr/libexec
6075bb9250eSAlex RichardsonXPATH=		${WORLDTMP}/bin:${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin
6088f62bca4SAlex Richardson
6098f62bca4SAlex Richardson# When building we want to find the cross tools before the host tools in ${BPATH}.
6108f62bca4SAlex Richardson# We also need to add UNIVERSE_TOOLCHAIN_PATH so that we can find the shared
6118f62bca4SAlex Richardson# toolchain files (clang, lld, etc.) during make universe/tinderbox
6128f62bca4SAlex RichardsonSTRICTTMPPATH=	${XPATH}:${BPATH}:${UNIVERSE_TOOLCHAIN_PATH}
6138f62bca4SAlex Richardson# We should not be using tools from /usr/bin accidentally since this could cause
6148f62bca4SAlex Richardson# the build to break on other systems that don't have that tool. For now we
6158f62bca4SAlex Richardson# still allow using the old behaviour (inheriting $PATH) if
6168f62bca4SAlex Richardson# BUILD_WITH_STRICT_TMPPATH is set to 0 but this will eventually be removed.
617cd6b0f0eSAlex Richardson
61865f28f63SJessica Clarke# Currently strict $PATH can cause build failures. Once the remaining issues
61965f28f63SJessica Clarke# have been resolved it will be turned on by default.
620d3384db3SAlex RichardsonBUILD_WITH_STRICT_TMPPATH?=0
6215bb9250eSAlex Richardson.if defined(CROSSBUILD_HOST)
6225bb9250eSAlex Richardson# When building on non-FreeBSD we can't rely on the tools in /usr/bin being compatible
6235bb9250eSAlex Richardson# with what FreeBSD expects. Therefore we only use tools from STRICTTMPPATH
6245bb9250eSAlex Richardson# during the world build stage. We build most tools during the bootstrap-tools
6255bb9250eSAlex Richardson# phase but symlink host tools that are known to work instead of building them
6265bb9250eSAlex RichardsonBUILD_WITH_STRICT_TMPPATH:=1
6275bb9250eSAlex Richardson.endif
6288f62bca4SAlex Richardson.if ${BUILD_WITH_STRICT_TMPPATH} != 0
6298f62bca4SAlex RichardsonTMPPATH=	${STRICTTMPPATH}
6308f62bca4SAlex Richardson.else
6312a6c45c9SBruce EvansTMPPATH=	${STRICTTMPPATH}:${PATH}
6328f62bca4SAlex Richardson.endif
63311fb97daSJohn Birrell
634519bc416SYaroslav Tykhiy#
635519bc416SYaroslav Tykhiy# Avoid running mktemp(1) unless actually needed.
636519bc416SYaroslav Tykhiy# It may not be functional, e.g., due to new ABI
637519bc416SYaroslav Tykhiy# when in the middle of installing over this system.
638519bc416SYaroslav Tykhiy#
639c69a9896SBaptiste Daroussin.if make(distributeworld) || make(installworld) || make(stageworld)
6408f62bca4SAlex Richardson.if ${BUILD_WITH_STRICT_TMPPATH} != 0
6418f62bca4SAlex RichardsonMKTEMP=${WORLDTMP}/legacy/usr/bin/mktemp
6428f62bca4SAlex Richardson.if !exists(${MKTEMP})
643bca92be6SJohn Baldwin.error mktemp binary doesn't exist in expected location: ${MKTEMP}
6448f62bca4SAlex Richardson.endif
6458f62bca4SAlex Richardson.else
6468f62bca4SAlex RichardsonMKTEMP=mktemp
6478f62bca4SAlex Richardson.endif
6488f62bca4SAlex RichardsonINSTALLTMP!=	${MKTEMP} -d -u -t install
649dda4d972SJessica Clarke
650dda4d972SJessica Clarke.if ${.MAKE.OS} == "FreeBSD"
651dda4d972SJessica Clarke# When building on FreeBSD we always copy the host tools instead of linking
652dda4d972SJessica Clarke# into INSTALLTMP to avoid issues with incompatible libraries (see r364030).
653dda4d972SJessica Clarke# Note: we could create links if we don't intend to update the current machine.
654dda4d972SJessica ClarkeINSTALLTMP_COPY_HOST_TOOL=cp
655dda4d972SJessica Clarke.else
656dda4d972SJessica Clarke# However, this is not necessary on Linux/macOS. Additionally, copying the host
657dda4d972SJessica Clarke# tools to another directory with cp results in AMFI Launch Constraint
658dda4d972SJessica Clarke# Violations on macOS Ventura as part of its System Integrity Protection.
659dda4d972SJessica ClarkeINSTALLTMP_COPY_HOST_TOOL=ln -s
660dda4d972SJessica Clarke.endif
661519bc416SYaroslav Tykhiy.endif
662767ab900SMarcel Moolenaar
6633d98f473SGlen Barber.if make(stagekernel) || make(distributekernel)
6643d98f473SGlen BarberTAGS+=		kernel
6653d98f473SGlen BarberPACKAGE=	kernel
6663d98f473SGlen Barber.endif
6673d98f473SGlen Barber
66876762624SMarcel Moolenaar#
66976762624SMarcel Moolenaar# Building a world goes through the following stages
67076762624SMarcel Moolenaar#
6711c62f923SWarner Losh# 1. legacy stage [BMAKE]
67232054bbbSRuslan Ermilov#	This stage is responsible for creating compatibility
67332054bbbSRuslan Ermilov#	shims that are needed by the bootstrap-tools,
674996d8a0dSWarner Losh#	build-tools and cross-tools stages. These are generally
675996d8a0dSWarner Losh#	APIs that tools from one of those three stages need to
676996d8a0dSWarner Losh#	build that aren't present on the host.
67732054bbbSRuslan Ermilov# 1. bootstrap-tools stage [BMAKE]
67876762624SMarcel Moolenaar#	This stage is responsible for creating programs that
67976762624SMarcel Moolenaar#	are needed for backward compatibility reasons. They
68076762624SMarcel Moolenaar#	are not built as cross-tools.
68132054bbbSRuslan Ermilov# 2. build-tools stage [TMAKE]
68276762624SMarcel Moolenaar#	This stage is responsible for creating the object
68376762624SMarcel Moolenaar#	tree and building any tools that are needed during
6849aca5cedSWarner Losh#	the build process. Some programs are listed during
68539d3a844SWarner Losh#	this phase because they build binaries to generate
6869aca5cedSWarner Losh#	files needed to build these programs. This stage also
6879aca5cedSWarner Losh#	builds the 'build-tools' target rather than 'all'.
68832054bbbSRuslan Ermilov# 3. cross-tools stage [XMAKE]
68976762624SMarcel Moolenaar#	This stage is responsible for creating any tools that
690996d8a0dSWarner Losh#	are needed for building the system. A cross-compiler is one
6919aca5cedSWarner Losh#	of them. This differs from build tools in two ways:
6929aca5cedSWarner Losh#	1. the 'all' target is built rather than 'build-tools'
6939aca5cedSWarner Losh#	2. these tools are installed into TMPPATH for stage 4.
69413387c45SDavid E. O'Brien# 4. world stage [WMAKE]
69576762624SMarcel Moolenaar#	This stage actually builds the world.
69613387c45SDavid E. O'Brien# 5. install stage (optional) [IMAKE]
69776762624SMarcel Moolenaar#	This stage installs a previously built world.
69876762624SMarcel Moolenaar#
69976762624SMarcel Moolenaar
70047c95a33SRuslan ErmilovBOOTSTRAPPING?=	0
701754a9d6cSEd Maste# Keep these in sync
7023b17e19fSWarner LoshMINIMUM_SUPPORTED_OSREL?= 1104001
7033b17e19fSWarner LoshMINIMUM_SUPPORTED_REL?= 11.4
70447c95a33SRuslan Ermilov
70576762624SMarcel Moolenaar# Common environment for world related stages
706dfa09989SBryan DreweryCROSSENV+=	\
7074448c79eSRuslan Ermilov		MACHINE_ARCH=${TARGET_ARCH} \
708444ff633SRuslan Ermilov		MACHINE=${TARGET} \
709423102c6SUlrich Spörlein		CPUTYPE=${TARGET_CPUTYPE}
710d1dd034dSBryan Drewery.if ${MK_META_MODE} != "no"
711d1dd034dSBryan Drewery# Don't rebuild build-tools targets during normal build.
712dbbb03c2SBryan DreweryCROSSENV+=	BUILD_TOOLS_META=.NOMETA
713d1dd034dSBryan Drewery.endif
71402701f04SWarner Losh.if defined(TARGET_CFLAGS)
71502701f04SWarner LoshCROSSENV+=	${TARGET_CFLAGS}
71602701f04SWarner Losh.endif
717c6b00391SJohn Baldwin.if (${TARGET} != ${MACHINE} && !defined(WITH_LOCAL_MODULES)) || \
718c6b00391SJohn Baldwin    defined(WITHOUT_LOCAL_MODULES)
719c6b00391SJohn BaldwinCROSSENV+=	LOCAL_MODULES=
720c6b00391SJohn Baldwin.endif
7217466caf4SMarcel Moolenaar
7228f62bca4SAlex RichardsonBOOTSTRAPPING_OSRELDATE?=${OSRELDATE}
7238f62bca4SAlex Richardson
72432054bbbSRuslan Ermilov# bootstrap-tools stage
725e5d264a3SRuslan ErmilovBMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
72601f124b4SBryan Drewery		TOOLS_PREFIX=${TOOLS_PREFIX_UNDEF:U${WORLDTMP}} \
72734ac629bSAlex Richardson		PATH=${BPATH:Q}:${PATH:Q} \
728cb66f4ddSRuslan Ermilov		WORLDTMP=${WORLDTMP} \
72963e4d6f7SWarner Losh		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
7303cad5c68SBryan Drewery# need to keep this in sync with targets/pseudo/bootstrap-tools/Makefile
7313cad5c68SBryan DreweryBSARGS= 	DESTDIR= \
7322c36cefeSBryan Drewery		OBJTOP='${WORLDTMP}/obj-tools' \
7334dc89c4dSBryan Drewery		OBJROOT='$${OBJTOP}/' \
7341c024976SJohn Baldwin		UNIVERSE_TOOLCHAIN_PATH=${UNIVERSE_TOOLCHAIN_PATH} \
735996e4759SBryan Drewery		MAKEOBJDIRPREFIX= \
7368f62bca4SAlex Richardson		BOOTSTRAPPING=${BOOTSTRAPPING_OSRELDATE} \
737817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
738bcd2f41fSMitchell Horne		-DNO_CPU_CFLAGS \
739bcd2f41fSMitchell Horne		-DNO_LINT \
740bcd2f41fSMitchell Horne		-DNO_PIC \
741c05b382eSWarner Losh		-DNO_SHARED \
742bcd2f41fSMitchell Horne		MK_ASAN=no \
743bcd2f41fSMitchell Horne		MK_CTF=no \
744bcd2f41fSMitchell Horne		MK_CLANG_EXTRAS=no \
745bcd2f41fSMitchell Horne		MK_CLANG_FORMAT=no \
746bcd2f41fSMitchell Horne		MK_CLANG_FULL=no \
747bcd2f41fSMitchell Horne		MK_HTML=no \
748bcd2f41fSMitchell Horne		MK_MAN=no \
749bcd2f41fSMitchell Horne		MK_PROFILE=no \
750bcd2f41fSMitchell Horne		MK_RETPOLINE=no \
75161ed578eSMitchell Horne		MK_SSP=no \
752bcd2f41fSMitchell Horne		MK_TESTS=no \
753bcd2f41fSMitchell Horne		MK_UBSAN=no \
754bcd2f41fSMitchell Horne		MK_WERROR=no \
755bcd2f41fSMitchell Horne		MK_INCLUDES=yes \
756bcd2f41fSMitchell Horne		MK_MAN_UTILS=yes
75776762624SMarcel Moolenaar
7584dc89c4dSBryan DreweryBMAKE=		\
75999feb137SWolfram Schneider		${TIME_ENV} ${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
7603cad5c68SBryan Drewery		${BSARGS}
7612e90942fSBryan Drewery.if empty(.MAKEOVERRIDES:MMK_LLVM_TARGET_ALL)
7622e90942fSBryan DreweryBMAKE+=		MK_LLVM_TARGET_ALL=no
7632e90942fSBryan Drewery.endif
7643cad5c68SBryan Drewery
76532054bbbSRuslan Ermilov# build-tools stage
766dfa09989SBryan DreweryTMAKE=		\
76799feb137SWolfram Schneider		${TIME_ENV} ${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
76889edd7e5SRuslan Ermilov		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
769e5d264a3SRuslan Ermilov		DESTDIR= \
7708f62bca4SAlex Richardson		BOOTSTRAPPING=${BOOTSTRAPPING_OSRELDATE} \
771817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
772bcd2f41fSMitchell Horne		-DNO_CPU_CFLAGS \
773c79f2d97SDavid E. O'Brien		-DNO_LINT \
774bcd2f41fSMitchell Horne		MK_ASAN=no \
775bcd2f41fSMitchell Horne		MK_CTF=no \
776bcd2f41fSMitchell Horne		MK_CLANG_EXTRAS=no \
777bcd2f41fSMitchell Horne		MK_CLANG_FORMAT=no \
778bcd2f41fSMitchell Horne		MK_CLANG_FULL=no \
779bcd2f41fSMitchell Horne		MK_LLDB=no \
780bcd2f41fSMitchell Horne		MK_RETPOLINE=no \
78161ed578eSMitchell Horne		MK_SSP=no \
782bcd2f41fSMitchell Horne		MK_TESTS=no \
783bcd2f41fSMitchell Horne		MK_UBSAN=no \
784bcd2f41fSMitchell Horne		MK_WERROR=no
78576762624SMarcel Moolenaar
78632054bbbSRuslan Ermilov# cross-tools stage
787555c6e60SBryan Drewery# TOOLS_PREFIX set in BMAKE
788555c6e60SBryan DreweryXMAKE=		${BMAKE} \
7890f31538cSRuslan Ermilov		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
7901e4c8029SJessica Clarke		MK_LLDB=no \
791021385abSAlex Richardson		MK_LLVM_BINUTILS=no \
792fe7dff17SEd Maste		MK_TESTS=no
79376762624SMarcel Moolenaar
794d3109d39SIan Lepore# kernel-tools stage
795d3109d39SIan LeporeKTMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
79634ac629bSAlex Richardson		PATH=${BPATH:Q}:${PATH:Q} \
7975bb9250eSAlex Richardson		WORLDTMP=${WORLDTMP} \
7985bb9250eSAlex Richardson		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
7995bb9250eSAlex Richardson
80099feb137SWolfram SchneiderKTMAKE=		${TIME_ENV} \
80101f124b4SBryan Drewery		TOOLS_PREFIX=${TOOLS_PREFIX_UNDEF:U${WORLDTMP}} \
802d3109d39SIan Lepore		${KTMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
803d3109d39SIan Lepore		DESTDIR= \
8044dc89c4dSBryan Drewery		OBJTOP='${WORLDTMP}/obj-kernel-tools' \
8054dc89c4dSBryan Drewery		OBJROOT='$${OBJTOP}/' \
8061c024976SJohn Baldwin		UNIVERSE_TOOLCHAIN_PATH=${UNIVERSE_TOOLCHAIN_PATH} \
807996e4759SBryan Drewery		MAKEOBJDIRPREFIX= \
8088f62bca4SAlex Richardson		BOOTSTRAPPING=${BOOTSTRAPPING_OSRELDATE} \
809bcd2f41fSMitchell Horne		-DNO_CPU_CFLAGS \
810bcd2f41fSMitchell Horne		-DNO_LINT \
811bcd2f41fSMitchell Horne		-DNO_PIC \
812bcd2f41fSMitchell Horne		-DNO_SHARED \
813bcd2f41fSMitchell Horne		MK_CTF=no \
814bcd2f41fSMitchell Horne		MK_HTML=no \
815bcd2f41fSMitchell Horne		MK_MAN=no \
816bcd2f41fSMitchell Horne		MK_PROFILE=no \
81761ed578eSMitchell Horne		MK_SSP=no \
818bcd2f41fSMitchell Horne		MK_RETPOLINE=no \
819bcd2f41fSMitchell Horne		MK_WERROR=no
820d3109d39SIan Lepore
82176762624SMarcel Moolenaar# world stage
82276762624SMarcel MoolenaarWMAKEENV=	${CROSSENV} \
8233ce13dbcSAlex Richardson		INSTALL="${INSTALL_CMD} -U" \
82434ac629bSAlex Richardson		PATH=${TMPPATH:Q} \
82535fb812aSBryan Drewery		SYSROOT=${WORLDTMP}
826c872793dSBrooks Davis
827c872793dSBrooks Davis# make hierarchy
82834ac629bSAlex RichardsonHMAKE=		PATH=${TMPPATH:Q} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q}
829c872793dSBrooks Davis.if defined(NO_ROOT)
83034ac629bSAlex RichardsonHMAKE+=		PATH=${TMPPATH:Q} METALOG=${METALOG} -DNO_ROOT
831c872793dSBrooks Davis.endif
832c872793dSBrooks Davis
8339729cf09SDimitry AndricCROSSENV+=	CC="${XCC} ${XCFLAGS}" CXX="${XCXX} ${XCXXFLAGS} ${XCFLAGS}" \
83475c3b117SBaptiste Daroussin		CPP="${XCPP} ${XCFLAGS}" \
835c6081deaSMarcin Wojtas		AS="${XAS}" AR="${XAR}" ELFCTL="${XELFCTL}" LD="${XLD}" \
836c6081deaSMarcin Wojtas		LLVM_LINK="${XLLVM_LINK}" NM=${XNM} OBJCOPY="${XOBJCOPY}" \
837a5edb5fbSBaptiste Daroussin		RANLIB=${XRANLIB} STRINGS=${XSTRINGS} \
8381a18ab42SAlex Richardson		SIZE="${XSIZE}" STRIPBIN="${XSTRIPBIN}"
839a09aff83SBrooks Davis
8404e3252c4SBryan Drewery.if defined(CROSS_BINUTILS_PREFIX) && exists(${CROSS_BINUTILS_PREFIX})
841a09aff83SBrooks Davis# In the case of xdev-build tools, CROSS_BINUTILS_PREFIX won't be a
8424e3252c4SBryan Drewery# directory, but the compiler will look in the right place for its
843a09aff83SBrooks Davis# tools so we don't need to tell it where to look.
844784b6cd5SPeter GrehanBFLAGS+=	-B${CROSS_BINUTILS_PREFIX}
845a09aff83SBrooks Davis.endif
8464e3252c4SBryan Drewery
847bb0cd1b5SBryan Drewery
848bb0cd1b5SBryan Drewery# The internal bootstrap compiler has a default sysroot set by TOOLS_PREFIX
849bb0cd1b5SBryan Drewery# and target set by TARGET/TARGET_ARCH.  However, there are several needs to
850bb0cd1b5SBryan Drewery# always pass an explicit --sysroot and -target.
851bb0cd1b5SBryan Drewery# - External compiler needs sysroot and target flags.
852bb0cd1b5SBryan Drewery# - External ld needs sysroot.
853bb0cd1b5SBryan Drewery# - To be clear about the use of a sysroot when using the internal compiler.
854bb0cd1b5SBryan Drewery# - Easier debugging.
855bb0cd1b5SBryan Drewery# - Allowing WITH_SYSTEM_COMPILER+WITH_META_MODE to work together due to
856bb0cd1b5SBryan Drewery#   the flip-flopping build command when sometimes using external and
857bb0cd1b5SBryan Drewery#   sometimes using internal.
858bb0cd1b5SBryan Drewery# - Allow using lld which has no support for default paths.
8594e3252c4SBryan Drewery.if !defined(CROSS_BINUTILS_PREFIX) || !exists(${CROSS_BINUTILS_PREFIX})
860784b6cd5SPeter GrehanBFLAGS+=	-B${WORLDTMP}/usr/bin
861a09aff83SBrooks Davis.endif
8624d611b2bSBryan Drewery.if ${WANT_COMPILER_TYPE} == gcc || \
8634d611b2bSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
8644d611b2bSBryan Drewery.elif ${WANT_COMPILER_TYPE} == clang || \
8654d611b2bSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == clang)
86675c3b117SBaptiste DaroussinXCFLAGS+=	-target ${TARGET_TRIPLE}
8675ab58881SCraig Rodrigues.endif
8684e3252c4SBryan DreweryXCFLAGS+=	--sysroot=${WORLDTMP}
8694e3252c4SBryan Drewery
8704e3252c4SBryan Drewery.if !empty(BFLAGS)
871fe692231SEd MasteXCFLAGS+=	${BFLAGS}
8723dce4cb5SBaptiste Daroussin.endif
873a09aff83SBrooks Davis
874264594efSJessica Clarke.include "share/mk/bsd.compat.pre.mk"
875264594efSJessica Clarke.for LIBCOMPAT in ${_ALL_LIBCOMPATS}
876264594efSJessica Clarke.if ${MK_LIB${LIBCOMPAT}} == "yes"
877264594efSJessica Clarke_LIBCOMPATS+=	${LIBCOMPAT}
8788bb23971SNathan Whitehorn.endif
879264594efSJessica Clarke.endfor
88091d7edd5SJessica Clarke.include "Makefile.libcompat"
8818bb23971SNathan Whitehorn
8821a9cc831SBryan Drewery# META_MODE normally ignores host file changes since every build updates
8831a9cc831SBryan Drewery# timestamps (see NO_META_IGNORE_HOST in sys.mk).  There are known times
8841a9cc831SBryan Drewery# when the ABI breaks though that we want to force rebuilding WORLDTMP
8851a9cc831SBryan Drewery# to get updated host tools.
88675766799SEd Maste.if ${MK_META_MODE} == "yes" && ${MK_CLEAN} == "no" && \
8870f827d7aSBryan Drewery    !defined(NO_META_IGNORE_HOST) && !defined(NO_META_IGNORE_HOST_HEADERS) && \
8886e6be2bbSBryan Drewery    !defined(_MKSHOWCONFIG)
889c8fab231SBryan Drewery# r318736 - ino64 major ABI breakage
890c8fab231SBryan DreweryMETA_MODE_BAD_ABI_VERS+=	1200031
8911a9cc831SBryan Drewery
8921a9cc831SBryan Drewery.if !defined(OBJDIR_HOST_OSRELDATE)
893dfa09989SBryan Drewery.if exists(${OBJTOP}/host-osreldate.h)
8941a9cc831SBryan DreweryOBJDIR_HOST_OSRELDATE!=	\
8951a9cc831SBryan Drewery    awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
896dfa09989SBryan Drewery    ${OBJTOP}/host-osreldate.h
897b1237142SBryan Drewery.elif exists(${WORLDTMP}/usr/include/osreldate.h)
8981a9cc831SBryan DreweryOBJDIR_HOST_OSRELDATE=	0
8991a9cc831SBryan Drewery.endif
9001a9cc831SBryan Drewery.export OBJDIR_HOST_OSRELDATE
9011a9cc831SBryan Drewery.endif
9021a9cc831SBryan Drewery
9031a9cc831SBryan Drewery# Note that this logic is the opposite of normal BOOTSTRAP handling.  We want
9041a9cc831SBryan Drewery# to compare the WORLDTMP's OSRELDATE to the host's OSRELDATE.  If the WORLDTMP
9051a9cc831SBryan Drewery# is older than the ABI-breakage OSRELDATE of the HOST then we rebuild.
906b1237142SBryan Drewery.if defined(OBJDIR_HOST_OSRELDATE)
9071a9cc831SBryan Drewery.for _ver in ${META_MODE_BAD_ABI_VERS}
9081a9cc831SBryan Drewery.if ${OSRELDATE} >= ${_ver} && ${OBJDIR_HOST_OSRELDATE} < ${_ver}
9091a9cc831SBryan Drewery_meta_mode_need_rebuild=	${_ver}
9101a9cc831SBryan Drewery.endif
9111a9cc831SBryan Drewery.endfor
9121a9cc831SBryan Drewery.if defined(_meta_mode_need_rebuild)
9131a9cc831SBryan Drewery.info META_MODE: Rebuilding host tools due to ABI breakage in __FreeBSD_version ${_meta_mode_need_rebuild}.
9141a9cc831SBryan DreweryNO_META_IGNORE_HOST_HEADERS=	1
9151a9cc831SBryan Drewery.export NO_META_IGNORE_HOST_HEADERS
916b1237142SBryan Drewery.endif	# defined(_meta_mode_need_rebuild)
917b1237142SBryan Drewery.endif	# defined(OBJDIR_HOST_OSRELDATE)
91875766799SEd Maste.endif	# ${MK_META_MODE} == "yes" && ${MK_CLEAN} == "no" ...
9191a9cc831SBryan Drewery# This is only used for META_MODE+filemon to track what the oldest
9201a9cc831SBryan Drewery# __FreeBSD_version is in WORLDTMP.  This purposely does NOT have
9211a9cc831SBryan Drewery# a make dependency on /usr/include/osreldate.h as the file should
9221a9cc831SBryan Drewery# only be copied when it is missing or meta mode determines it has changed.
9231a9cc831SBryan Drewery# Since host files are normally ignored without NO_META_IGNORE_HOST
9241a9cc831SBryan Drewery# the file will never be updated unless that flag is specified.  This
9251a9cc831SBryan Drewery# allows tracking the oldest osreldate to force rebuilds via
9261a9cc831SBryan Drewery# META_MODE_BADABI_REVS above.
9271a9cc831SBryan Dreweryhost-osreldate.h: # DO NOT ADD /usr/include/osreldate.h here
9285bb9250eSAlex Richardson.if !defined(CROSSBUILD_HOST)
9291a9cc831SBryan Drewery	@cp -f /usr/include/osreldate.h ${.TARGET}
9305bb9250eSAlex Richardson.else
9315bb9250eSAlex Richardson	@echo "#ifndef __FreeBSD_version" > ${.TARGET}
9325bb9250eSAlex Richardson	@echo "#define __FreeBSD_version ${OSRELDATE}" >> ${.TARGET}
9335bb9250eSAlex Richardson	@echo "#endif" >> ${.TARGET}
9345bb9250eSAlex Richardson.endif
9351a9cc831SBryan Drewery
93699feb137SWolfram SchneiderWMAKE=		${TIME_ENV} ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
937817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
938817366f1SBryan Drewery		DESTDIR=${WORLDTMP}
939096924c9SAlexander Leidinger
94091da7698SBryan DreweryIMAKEENV=	${CROSSENV}
94199feb137SWolfram SchneiderIMAKE=		${TIME_ENV} ${IMAKEENV} ${MAKE} -f Makefile.inc1 \
94263e4d6f7SWarner Losh		${IMAKE_INSTALL} ${IMAKE_MTREE}
943519bc416SYaroslav Tykhiy.if empty(.MAKEFLAGS:M-n)
94434ac629bSAlex RichardsonIMAKEENV+=	PATH=${STRICTTMPPATH:Q}:${INSTALLTMP:Q} \
94534ac629bSAlex Richardson		LD_LIBRARY_PATH=${INSTALLTMP:Q} \
946519bc416SYaroslav Tykhiy		PATH_LOCALE=${INSTALLTMP}/locale
947519bc416SYaroslav TykhiyIMAKE+=		__MAKE_SHELL=${INSTALLTMP}/sh
948519bc416SYaroslav Tykhiy.else
94934ac629bSAlex RichardsonIMAKEENV+=	PATH=${TMPPATH:Q}:${INSTALLTMP:Q}
950519bc416SYaroslav Tykhiy.endif
951d0f408faSRoger Pau Monné
952d0f408faSRoger Pau Monné# When generating install media, do not allow user and group information from
953d0f408faSRoger Pau Monné# the build host to affect the contents of the distribution.
954c260dbfbSEd Maste.if make(distributeworld) || make(distrib-dirs) || make(distribution) || \
955c260dbfbSEd Maste    make(stageworld)
956d0f408faSRoger Pau MonnéDB_FROM_SRC=	yes
957d0f408faSRoger Pau Monné.endif
958d0f408faSRoger Pau Monné
95941a8e223SBrooks Davis.if defined(DB_FROM_SRC)
9607fc5693fSBaptiste DaroussinINSTALLFLAGS+=	-N ${.CURDIR}/etc
9617fc5693fSBaptiste DaroussinMTREEFLAGS+=	-N ${.CURDIR}/etc
9624a63ae11SBrooks Davis.endif
9636c461479SBrooks Davis_INSTALL_DDIR=	${DESTDIR}/${DISTDIR}
9646c461479SBrooks DavisINSTALL_DDIR=	${_INSTALL_DDIR:S://:/:g:C:/$::}
9654a63ae11SBrooks Davis.if defined(NO_ROOT)
9664a63ae11SBrooks DavisMETALOG?=	${DESTDIR}/${DISTDIR}/METALOG
9670369270fSBryan DreweryMETALOG:=	${METALOG:C,//+,/,g}
9684a63ae11SBrooks DavisIMAKE+=		-DNO_ROOT METALOG=${METALOG}
969185e8af0SKyle EvansMETALOG_INSTALLFLAGS=	-U -M ${METALOG} -D ${INSTALL_DDIR}
970185e8af0SKyle EvansINSTALLFLAGS+=	${METALOG_INSTALLFLAGS}
971ca4b73c3SKyle EvansCERTCTLFLAGS=	${METALOG_INSTALLFLAGS}
9724a63ae11SBrooks DavisMTREEFLAGS+=	-W
9734a63ae11SBrooks Davis.endif
9749312c006SBaptiste Daroussin.if defined(BUILD_PKGS)
9759312c006SBaptiste DaroussinINSTALLFLAGS+=	-h sha256
9769312c006SBaptiste Daroussin.endif
9774a63ae11SBrooks Davis.if defined(DB_FROM_SRC) || defined(NO_ROOT)
978a8b8edb2SMaxim SobolevIMAKE_INSTALL=	INSTALL="${INSTALL_CMD} ${INSTALLFLAGS}"
979a8b8edb2SMaxim SobolevIMAKE_MTREE=	MTREE_CMD="${MTREE_CMD} ${MTREEFLAGS}"
98041a8e223SBrooks Davis.endif
981ca4b73c3SKyle Evans.if make(distributeworld)
9827e45839aSJessica ClarkeCERTCTLDESTDIR=	${DESTDIR}/${DISTDIR}
9837e45839aSJessica ClarkeCERTCTLFLAGS+=	-d /base
984ca4b73c3SKyle Evans.else
985ca4b73c3SKyle EvansCERTCTLDESTDIR=	${DESTDIR}
986ca4b73c3SKyle Evans.endif
9877e45839aSJessica ClarkeCERTCTLFLAGS+=	-D "${CERTCTLDESTDIR}"
9880ea234deSMarcel Moolenaar
98955a5b46aSAlex RichardsonDESTDIR_MTREEFLAGS=	-deU
99055a5b46aSAlex Richardson# When creating worldtmp we don't need to set the directories as owned by root
99155a5b46aSAlex Richardson# so we also pass -W
99255a5b46aSAlex RichardsonWORLDTMP_MTREEFLAGS=	-deUW
99355a5b46aSAlex Richardson.if defined(NO_ROOT)
99455a5b46aSAlex Richardson# When building with -DNO_ROOT we shouldn't be changing the directories
99555a5b46aSAlex Richardson# that are created by mtree to be owned by root/wheel.
99655a5b46aSAlex RichardsonDESTDIR_MTREEFLAGS+=	-W
99755a5b46aSAlex Richardson.endif
998445421abSJessica Clarke.if defined(DB_FROM_SRC)
999445421abSJessica ClarkeDISTR_MTREEFLAGS=	-N ${.CURDIR}/etc
10008f62bca4SAlex Richardson.endif
1001445421abSJessica ClarkeDISTR_MTREECMD=	${MTREE_CMD}
1002445421abSJessica Clarke.if ${BUILD_WITH_STRICT_TMPPATH} != 0
1003445421abSJessica ClarkeDISTR_MTREECMD=	${WORLDTMP}/legacy/usr/sbin/mtree
1004445421abSJessica Clarke.endif
1005445421abSJessica ClarkeDISTR_MTREE=	${DISTR_MTREECMD} ${DISTR_MTREEFLAGS}
1006445421abSJessica ClarkeWORLDTMP_MTREE=	${DISTR_MTREECMD} ${WORLDTMP_MTREEFLAGS}
1007445421abSJessica ClarkeDESTDIR_MTREE=	${DISTR_MTREECMD} ${DESTDIR_MTREEFLAGS}
100855a5b46aSAlex Richardson
10095e0a749cSJessica ClarkeMETALOG_SORT_CMD=	env -i LC_COLLATE=C sort
10105e0a749cSJessica Clarke
10115963db0fSWarner Losh# kernel stage
101235fb812aSBryan DreweryKMAKEENV=	${WMAKEENV:NSYSROOT=*}
101399feb137SWolfram SchneiderKMAKE=		${TIME_ENV} ${KMAKEENV} ${MAKE} ${.MAKEFLAGS} ${KERNEL_FLAGS} KERNEL=${INSTKERNNAME}
10145963db0fSWarner Losh
101511fb97daSJohn Birrell#
101611fb97daSJohn Birrell# buildworld
101711fb97daSJohn Birrell#
101811fb97daSJohn Birrell# Attempt to rebuild the entire system, with reasonable chance of
101911fb97daSJohn Birrell# success, regardless of how old your existing system is.
102011fb97daSJohn Birrell#
102164ec6792SBryan Drewery_sanity_check: .PHONY .MAKE
1022d0cfa43fSPoul-Henning Kamp.if ${.CURDIR:C/[^,]//g} != ""
1023d0cfa43fSPoul-Henning Kamp#	The m4 build of sendmail files doesn't like it if ',' is used
1024d0cfa43fSPoul-Henning Kamp#	anywhere in the path of it's files.
1025d0cfa43fSPoul-Henning Kamp	@echo
1026d0cfa43fSPoul-Henning Kamp	@echo "*** Error: path to source tree contains a comma ','"
1027d0cfa43fSPoul-Henning Kamp	@echo
102864ec6792SBryan Drewery	@false
102964ec6792SBryan Drewery.elif ${.CURDIR:M*\:*} != ""
103064ec6792SBryan Drewery#	Using ':' leaks into PATH and breaks finding cross-tools.
103164ec6792SBryan Drewery	@echo
103264ec6792SBryan Drewery	@echo "*** Error: path to source tree contains a colon ':'"
103364ec6792SBryan Drewery	@echo
103464ec6792SBryan Drewery	@false
1035d0cfa43fSPoul-Henning Kamp.endif
10365e3b9061SBryan Drewery
1037a28412b0SEd Maste# Our current approach to dependency tracking cannot cope with certain source
1038a28412b0SEd Maste# tree changes, particularly with respect to removing source files and
1039a28412b0SEd Maste# replacing generated files.  Handle these cases here in an ad-hoc fashion.
1040fb3d959cSBryan Drewery_cleanobj_fast_depend_hack: .PHONY
1041dfcef1deSEd Maste	@echo ">>> Deleting stale dependencies...";
1042c70dd03aSJessica Clarke	MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} \
104381805ec3SJessica Clarke	    ALL_libcompats=${_ALL_libcompats:Q} \
10444dad87a4SEd Maste	    sh ${.CURDIR}/tools/build/depend-cleanup.sh ${OBJTOP}
1045457e6311SEd Maste
10468fc3059bSJessica Clarke_cleanworldtmp: .PHONY
10478fc3059bSJessica Clarke.if ${MK_CLEAN} == "yes"
1048fb3d959cSBryan Drewery	@echo
1049fb3d959cSBryan Drewery	@echo "--------------------------------------------------------------"
10508fc3059bSJessica Clarke	@echo ">>> Cleaning up the temporary build tree"
1051fb3d959cSBryan Drewery	@echo "--------------------------------------------------------------"
1052fb3d959cSBryan Drewery	rm -rf ${WORLDTMP}
1053fb3d959cSBryan Drewery.else
10548f62bca4SAlex Richardson# Note: for delete-old we need to set $PATH to also include the host $PATH
10558f62bca4SAlex Richardson# since otherwise a partial build with missing symlinks in ${WORLDTMP}/legacy/
10568f62bca4SAlex Richardson# will fail to run due to missing binaries. $WMAKE sets PATH to only ${TMPPATH}
10578f62bca4SAlex Richardson# so we remove that assingnment from $WMAKE and prepend the new $PATH
10586e6be2bbSBryan Drewery	${_+_}@if [ -e "${WORLDTMP}" ]; then \
10596e6be2bbSBryan Drewery		echo ">>> Deleting stale files in build tree..."; \
106034ac629bSAlex Richardson		cd ${.CURDIR}; env PATH=${TMPPATH:Q}:${PATH:Q} ${WMAKE:NPATH=*} \
106195016839SJohn Baldwin		    _NO_INCLUDE_COMPILERMK=t -DBATCH_DELETE_OLD_FILES delete-old \
10628f62bca4SAlex Richardson		    delete-old-libs >/dev/null; \
10636e6be2bbSBryan Drewery	fi
1064fb3d959cSBryan Drewery	rm -rf ${WORLDTMP}/legacy/usr/include
1065fb3d959cSBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes"
1066fb3d959cSBryan Drewery.for cc in cc c++
1067fb3d959cSBryan Drewery	if [ -x ${WORLDTMP}/usr/bin/${cc} ]; then \
1068fb3d959cSBryan Drewery		inum=$$(stat -f %i ${WORLDTMP}/usr/bin/${cc}); \
1069fb3d959cSBryan Drewery		find ${WORLDTMP}/usr/bin -inum $${inum} -delete; \
1070fb3d959cSBryan Drewery	fi
1071fb3d959cSBryan Drewery.endfor
1072fb3d959cSBryan Drewery.endif	# ${USING_SYSTEM_COMPILER} == "yes"
1073a7d84af8SBryan Drewery.if ${USING_SYSTEM_LINKER} == "yes"
1074a7d84af8SBryan Drewery	@rm -f ${WORLDTMP}/usr/bin/ld ${WORLDTMP}/usr/bin/ld.lld
1075a7d84af8SBryan Drewery.endif	# ${USING_SYSTEM_LINKER} == "yes"
107675766799SEd Maste.endif	# ${MK_CLEAN} == "yes"
10778fc3059bSJessica Clarke_worldtmp: .PHONY
10788fc3059bSJessica Clarke	@echo
10798fc3059bSJessica Clarke	@echo "--------------------------------------------------------------"
10808fc3059bSJessica Clarke	@echo ">>> Rebuilding the temporary build tree"
10818fc3059bSJessica Clarke	@echo "--------------------------------------------------------------"
1082fe480405SBryan Drewery	@mkdir -p ${WORLDTMP}
108389bd07e9SBryan Drewery	@touch ${WORLDTMP}/${.TARGET}
10844acc8a67SAlex Richardson# We can't use mtree to create the worldtmp directories since it may not be
10854acc8a67SAlex Richardson# available on the target system (this happens e.g. when building on non-FreeBSD)
1086a3ddd7c9SBryan Drewery	${_+_}cd ${.CURDIR}/tools/build; \
10874acc8a67SAlex Richardson	    ${MAKE} DIRPRFX=tools/build/ DESTDIR=${WORLDTMP}/legacy installdirs
10888f62bca4SAlex Richardson# In order to build without inheriting $PATH we need to add symlinks to the host
10898f62bca4SAlex Richardson# tools in $WORLDTMP for the tools that we don't build during bootstrap-tools
1090a3ddd7c9SBryan Drewery	${_+_}cd ${.CURDIR}/tools/build; \
10918f62bca4SAlex Richardson	    ${MAKE} DIRPRFX=tools/build/ DESTDIR=${WORLDTMP}/legacy host-symlinks
10928f62bca4SAlex Richardson
10931c62f923SWarner Losh_legacy:
1094f7e19a98SWarner Losh	@echo
1095f7e19a98SWarner Losh	@echo "--------------------------------------------------------------"
1096d61a976bSScott Long	@echo ">>> stage 1.1: legacy release compatibility shims"
1097f7e19a98SWarner Losh	@echo "--------------------------------------------------------------"
1098088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${BMAKE} legacy
10996bde859fSRuslan Ermilov_bootstrap-tools:
11000ea234deSMarcel Moolenaar	@echo
11010ea234deSMarcel Moolenaar	@echo "--------------------------------------------------------------"
1102d61a976bSScott Long	@echo ">>> stage 1.2: bootstrap tools"
11030ea234deSMarcel Moolenaar	@echo "--------------------------------------------------------------"
11040dfaefa9SDag-Erling Smørgrav.if ${MK_CLEAN} != "yes"
11050dfaefa9SDag-Erling Smørgrav	${_+_}cd ${.CURDIR}; ${BMAKE} _NO_INCLUDE_COMPILERMK=t _cleanobj_fast_depend_hack
11060dfaefa9SDag-Erling Smørgrav.endif
1107088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools
11087d8e1e8dSJohn Baldwin	mkdir -p ${WORLDTMP}/usr ${WORLDTMP}/lib/geom ${WORLDTMP}/bin
11094acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
11104acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr >/dev/null
11114acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
11124acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr/include >/dev/null
111381250b9cSMike Karels.for d in ${LIBCOMPAT_INCLUDE_DIRS}
111481250b9cSMike Karels	mkdir -p ${WORLDTMP}/usr/include/${d}
111581250b9cSMike Karels.endfor
11164acc8a67SAlex Richardson	ln -sf ${.CURDIR}/sys ${WORLDTMP}
11174acc8a67SAlex Richardson.if ${MK_DEBUG_FILES} != "no"
11184acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
11194acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr/lib >/dev/null
11204acc8a67SAlex Richardson.endif
11214acc8a67SAlex Richardson.for _mtree in ${LOCAL_MTREE}
11224acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
11234acc8a67SAlex Richardson.endfor
11246bde859fSRuslan Ermilov_cleanobj:
112575766799SEd Maste.if ${MK_CLEAN} == "yes"
112611fb97daSJohn Birrell	@echo
112711fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1128d61a976bSScott Long	@echo ">>> stage 2.1: cleaning up the object tree"
112911fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1130d6be9fddSAlex Richardson	# Avoid including bsd.compiler.mk in clean and obj with _NO_INCLUDE_COMPILERMK
1131d6be9fddSAlex Richardson	# since the restricted $PATH might not contain a valid cc binary
1132d6be9fddSAlex Richardson	${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t ${CLEANDIR}
113391d7edd5SJessica Clarke.for LIBCOMPAT in ${_LIBCOMPATS}
113491d7edd5SJessica Clarke	${_+_}cd ${.CURDIR}; ${LIB${LIBCOMPAT}WMAKE} _NO_INCLUDE_COMPILERMK=t -f Makefile.inc1 ${CLEANDIR}
113591d7edd5SJessica Clarke.endfor
1136dadc342dSEd Maste.else
11370d02682cSEd Maste	${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t _cleanobj_fast_depend_hack
113875766799SEd Maste.endif	# ${MK_CLEAN} == "yes"
11396bde859fSRuslan Ermilov_obj:
114011fb97daSJohn Birrell	@echo
114111fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1142d61a976bSScott Long	@echo ">>> stage 2.2: rebuilding the object tree"
114311fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1144d6be9fddSAlex Richardson	${_+_}cd ${.CURDIR}; ${WMAKE} _NO_INCLUDE_COMPILERMK=t obj
11456bde859fSRuslan Ermilov_build-tools:
1146bfc59eb8SMarcel Moolenaar	@echo
1147bfc59eb8SMarcel Moolenaar	@echo "--------------------------------------------------------------"
1148d61a976bSScott Long	@echo ">>> stage 2.3: build tools"
1149bfc59eb8SMarcel Moolenaar	@echo "--------------------------------------------------------------"
1150088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${TMAKE} build-tools
11516bde859fSRuslan Ermilov_cross-tools:
115217139066SWarner Losh	@echo
115317139066SWarner Losh	@echo "--------------------------------------------------------------"
115476762624SMarcel Moolenaar	@echo ">>> stage 3: cross tools"
115517139066SWarner Losh	@echo "--------------------------------------------------------------"
1156cb623f63SEd Maste	@rm -f ${OBJTOP}/toolchain-metadata.mk
1157088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
11586abd71b0SIan Lepore	${_+_}cd ${.CURDIR}; ${XMAKE} kernel-tools
11591a9cc831SBryan Drewery_build-metadata:
1160848d5e92SBryan Drewery	@echo
1161848d5e92SBryan Drewery	@echo "--------------------------------------------------------------"
11621a9cc831SBryan Drewery	@echo ">>> stage 3.1: recording build metadata"
1163848d5e92SBryan Drewery	@echo "--------------------------------------------------------------"
1164cb623f63SEd Maste	${_+_}cd ${.CURDIR}; ${WMAKE} toolchain-metadata.mk
11651a9cc831SBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} host-osreldate.h
11666bde859fSRuslan Ermilov_includes:
116711fb97daSJohn Birrell	@echo
116811fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1169c54d7e02SRuslan Ermilov	@echo ">>> stage 4.1: building includes"
117011fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
11717f1636b7SBryan Drewery# Special handling for SUBDIR_OVERRIDE in buildworld as they most likely need
11727f1636b7SBryan Drewery# headers from default SUBDIR.  Do SUBDIR_OVERRIDE includes last.
11737f1636b7SBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} SUBDIR_OVERRIDE= SHARED=symlinks \
1174ac978f5aSBryan Drewery	    MK_INCLUDES=yes includes
11757f1636b7SBryan Drewery.if !empty(SUBDIR_OVERRIDE) && make(buildworld)
1176ac978f5aSBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} MK_INCLUDES=yes SHARED=symlinks includes
11777f1636b7SBryan Drewery.endif
11787a171e30SWarner Losh	${_+_}cd ${.CURDIR};  ${WMAKE} test-includes
11796bde859fSRuslan Ermilov_libraries:
118011fb97daSJohn Birrell	@echo
118111fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1182d61a976bSScott Long	@echo ">>> stage 4.2: building libraries"
1183f80df2faSMarcel Moolenaar	@echo "--------------------------------------------------------------"
1184088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; \
11852d281361SBaptiste Daroussin	    ${WMAKE} -DNO_FSCHG MK_HTML=no -DNO_LINT MK_MAN=no \
1186be2af8fbSBrooks Davis	    MK_PROFILE=no MK_TESTS=no MK_TESTS_SUPPORT=${MK_TESTS_SUPPORT} \
1187be2af8fbSBrooks Davis	    libraries
118840cf3344SBryan Dreweryeverything: .PHONY
118976762624SMarcel Moolenaar	@echo
119076762624SMarcel Moolenaar	@echo "--------------------------------------------------------------"
11915dab1313SBrooks Davis	@echo ">>> stage 4.4: building everything"
119276762624SMarcel Moolenaar	@echo "--------------------------------------------------------------"
11931c2a618bSBryan Drewery	${_+_}cd ${.CURDIR}; _PARALLEL_SUBDIR_OK=1 ${WMAKE} all
119411fb97daSJohn Birrell
11956bde859fSRuslan ErmilovWMAKE_TGTS=
119616892c77SBryan Drewery.if !defined(WORLDFAST)
11978fc3059bSJessica ClarkeWMAKE_TGTS+=	_sanity_check _cleanworldtmp _worldtmp _legacy
11987f1636b7SBryan Drewery.if empty(SUBDIR_OVERRIDE)
11997f1636b7SBryan DreweryWMAKE_TGTS+=	_bootstrap-tools
12006bde859fSRuslan Ermilov.endif
12016d75a7a8SBryan DreweryWMAKE_TGTS+=	_cleanobj
12022abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
12036d75a7a8SBryan DreweryWMAKE_TGTS+=	_obj
12046d75a7a8SBryan Drewery.endif
12056d75a7a8SBryan DreweryWMAKE_TGTS+=	_build-tools _cross-tools
12061a9cc831SBryan DreweryWMAKE_TGTS+=	_build-metadata
120716892c77SBryan DreweryWMAKE_TGTS+=	_includes
120816892c77SBryan Drewery.endif
1209c596c287SBryan Drewery.if !defined(NO_LIBS)
121016892c77SBryan DreweryWMAKE_TGTS+=	_libraries
1211c596c287SBryan Drewery.endif
121291d7edd5SJessica Clarke.if empty(SUBDIR_OVERRIDE)
121391d7edd5SJessica Clarke.for libcompat in ${libcompats}
1214dba75e9fSBryan DreweryWMAKE_TGTS+=	build${libcompat}
121591d7edd5SJessica Clarke.endfor
12161d9468eeSPeter Wemm.endif
12175dab1313SBrooks DavisWMAKE_TGTS+=	everything
12186bde859fSRuslan Ermilov
1219328dcc68SWolfram Schneider# record buildworld time in seconds
1220328dcc68SWolfram Schneider.if make(buildworld)
1221328dcc68SWolfram Schneider_BUILDWORLD_START!= date '+%s'
1222328dcc68SWolfram Schneider.export _BUILDWORLD_START
1223328dcc68SWolfram Schneider.endif
1224328dcc68SWolfram Schneider
122540cf3344SBryan Drewerybuildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue .PHONY
1226d2f03ebbSRuslan Ermilov.ORDER: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
122711fb97daSJohn Birrell
1228ebae797cSAlex Richardson_ncpu_cmd=sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo unknown
1229ebae797cSAlex Richardson
1230a561b106SBryan Drewerybuildworld_prologue: .PHONY
1231d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1232d2f03ebbSRuslan Ermilov	@echo ">>> World build started on `LC_ALL=C date`"
1233d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1234d2f03ebbSRuslan Ermilov
1235a561b106SBryan Drewerybuildworld_epilogue: .PHONY
1236d2f03ebbSRuslan Ermilov	@echo
1237d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1238d2f03ebbSRuslan Ermilov	@echo ">>> World build completed on `LC_ALL=C date`"
1239328dcc68SWolfram Schneider	@seconds=$$(($$(date '+%s') - ${_BUILDWORLD_START})); \
1240656898abSWolfram Schneider	  echo -n ">>> World built in $$seconds seconds, "; \
1241ebae797cSAlex Richardson	  echo "ncpu: $$(${_ncpu_cmd})${.MAKE.JOBS:S/^/, make -j/}"
1242d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1243621e4ae1SWarner Losh
1244621e4ae1SWarner Losh#
1245621e4ae1SWarner Losh# We need to have this as a target because the indirection between Makefile
1246621e4ae1SWarner Losh# and Makefile.inc1 causes the correct PATH to be used, rather than a
12476f13c7adSWarner Losh# modification of the current environment's PATH.  In addition, we need
12486f13c7adSWarner Losh# to quote multiword values.
1249621e4ae1SWarner Losh#
1250208f1083SBryan Drewerybuildenvvars: .PHONY
125153c0e6d5SBryan Drewery	@echo ${WMAKEENV:Q} ${.MAKE.EXPORTED:@v@$v=\"${$v}\"@}
1252621e4ae1SWarner Losh
1253e163efb6SBrooks Davis.if ${.TARGETS:Mbuildenv}
1254e163efb6SBrooks Davis.if ${.MAKEFLAGS:M-j}
1255e163efb6SBrooks Davis.error The buildenv target is incompatible with -j
1256e163efb6SBrooks Davis.endif
1257e163efb6SBrooks Davis.endif
1258208f1083SBryan DreweryBUILDENV_DIR?=	${.CURDIR}
12593fa561a4SWarner Losh#
12603fa561a4SWarner Losh# Note: make will report any errors the shell reports. This can
12613fa561a4SWarner Losh# be odd if the last command in an interactive shell generates an
12623fa561a4SWarner Losh# error or is terminated by SIGINT. These reported errors look bad,
1263895545d0SDoug Rabson# but are harmless. Allowing them also allows BUILDENV_SHELL to
12643fa561a4SWarner Losh# be a complex command whose status will be returned to the caller.
12653fa561a4SWarner Losh# Some scripts in tools rely on this behavior to report build errors.
12663fa561a4SWarner Losh#
1267208f1083SBryan Drewerybuildenv: .PHONY
126820bfae84SRuslan Ermilov	@echo Entering world for ${TARGET_ARCH}:${TARGET}
1269a55d4dddSBryan Drewery.if ${BUILDENV_SHELL:M*zsh*}
1270a55d4dddSBryan Drewery	@echo For ZSH you must run: export CPUTYPE=${TARGET_CPUTYPE}
1271a55d4dddSBryan Drewery.endif
12720f31fdf2SAlex Richardson	@cd ${BUILDENV_DIR} && env ${WMAKEENV} \
12730f31fdf2SAlex Richardson	INSTALL="${INSTALL_CMD} ${INSTALLFLAGS}" \
12740f31fdf2SAlex Richardson	MTREE_CMD="${MTREE_CMD} ${MTREEFLAGS}" BUILDENV=1 ${BUILDENV_SHELL}
127520bfae84SRuslan Ermilov
127691d7edd5SJessica ClarkeTOOLCHAIN_TGTS=	${WMAKE_TGTS:Neverything:${libcompats:@v@Nbuild${v}@:ts:}}
127740cf3344SBryan Drewerytoolchain: ${TOOLCHAIN_TGTS} .PHONY
1278651c6845SBryan DreweryKERNEL_TOOLCHAIN_TGTS=	${TOOLCHAIN_TGTS:N_obj:N_cleanobj:N_includes:N_libraries}
1279651c6845SBryan Drewery.if make(kernel-toolchain)
1280651c6845SBryan Drewery.ORDER: ${KERNEL_TOOLCHAIN_TGTS}
1281651c6845SBryan Drewery.endif
1282651c6845SBryan Drewerykernel-toolchain: ${KERNEL_TOOLCHAIN_TGTS} .PHONY
1283839274c7SRuslan Ermilov
128411fb97daSJohn Birrell#
12850da07b29SRuslan Ermilov# installcheck
1286afc6f086SGarance A Drosehn#
12870da07b29SRuslan Ermilov# Checks to be sure system is ready for installworld/installkernel.
12880da07b29SRuslan Ermilov#
1289c943a53eSBryan Dreweryinstallcheck: _installcheck_world _installcheck_kernel .PHONY
1290c943a53eSBryan Drewery_installcheck_world: .PHONY
1291d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1292d0338de5SWolfram Schneider	@echo ">>> Install check world"
1293d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1294c943a53eSBryan Drewery_installcheck_kernel: .PHONY
1295d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1296d0338de5SWolfram Schneider	@echo ">>> Install check kernel"
1297d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1298afc6f086SGarance A Drosehn
1299afc6f086SGarance A Drosehn#
130041a8e223SBrooks Davis# Require DESTDIR to be set if installing for a different architecture or
130141a8e223SBrooks Davis# using the user/group database in the source tree.
1302e576df39SRuslan Ermilov#
130341a8e223SBrooks Davis.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE} || \
130441a8e223SBrooks Davis    defined(DB_FROM_SRC)
13050f8bb094SRuslan Ermilov.if !make(distributeworld)
130631caf4c8SBryan Drewery_installcheck_world: __installcheck_DESTDIR
130731caf4c8SBryan Drewery_installcheck_kernel: __installcheck_DESTDIR
1308c943a53eSBryan Drewery__installcheck_DESTDIR: .PHONY
1309e576df39SRuslan Ermilov.if !defined(DESTDIR) || empty(DESTDIR)
1310e576df39SRuslan Ermilov	@echo "ERROR: Please set DESTDIR!"; \
1311e576df39SRuslan Ermilov	false
1312e576df39SRuslan Ermilov.endif
1313e576df39SRuslan Ermilov.endif
13140f8bb094SRuslan Ermilov.endif
1315e576df39SRuslan Ermilov
131641a8e223SBrooks Davis.if !defined(DB_FROM_SRC)
1317e576df39SRuslan Ermilov#
13180fc1aae5SBrooks Davis# Check for missing UIDs/GIDs.
13190fc1aae5SBrooks Davis#
13200fc1aae5SBrooks DavisCHECK_UIDS=	auditdistd
13210fc1aae5SBrooks DavisCHECK_GIDS=	audit
132207b95333SIan LeporeCHECK_UIDS+=	ntpd
132307b95333SIan LeporeCHECK_GIDS+=	ntpd
13249898e6dfSIan LeporeCHECK_UIDS+=	proxy
13259898e6dfSIan LeporeCHECK_GIDS+=	proxy authpf
13269898e6dfSIan LeporeCHECK_UIDS+=	smmsp
13279898e6dfSIan LeporeCHECK_GIDS+=	smmsp
13289898e6dfSIan LeporeCHECK_UIDS+=	unbound
13299898e6dfSIan LeporeCHECK_GIDS+=	unbound
133031caf4c8SBryan Drewery_installcheck_world: __installcheck_UGID
1331c943a53eSBryan Drewery__installcheck_UGID: .PHONY
13320fc1aae5SBrooks Davis.for uid in ${CHECK_UIDS}
13330fc1aae5SBrooks Davis	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
13340fc1aae5SBrooks Davis		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
13350fc1aae5SBrooks Davis		false; \
13360fc1aae5SBrooks Davis	fi
13370fc1aae5SBrooks Davis.endfor
13380fc1aae5SBrooks Davis.for gid in ${CHECK_GIDS}
13390fc1aae5SBrooks Davis	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
13400fc1aae5SBrooks Davis		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
13410fc1aae5SBrooks Davis		false; \
13420fc1aae5SBrooks Davis	fi
13430fc1aae5SBrooks Davis.endfor
134441a8e223SBrooks Davis.endif
1345bd1c3badSEd Maste#
1346bd1c3badSEd Maste# If installing over the running system (DESTDIR is / or unset) and the install
1347bd1c3badSEd Maste# includes rescue, try running rescue from the objdir as a sanity check.  If
1348bd1c3badSEd Maste# rescue is not functional (e.g., because it depends on a system call not
1349bd1c3badSEd Maste# supported by the currently running kernel), abort the installation.
1350bd1c3badSEd Maste#
1351bd1c3badSEd Maste.if !make(distributeworld) && ${MK_RESCUE} != "no" && \
1352bd1c3badSEd Maste    (empty(DESTDIR) || ${DESTDIR} == "/") && empty(BYPASS_INSTALLCHECK_SH)
1353bd1c3badSEd Maste_installcheck_world: __installcheck_sh_check
1354bd1c3badSEd Maste__installcheck_sh_check: .PHONY
1355dfa09989SBryan Drewery	@if [ "`${OBJTOP}/rescue/rescue/rescue sh -c 'echo OK'`" != \
1356bd1c3badSEd Maste	    OK ]; then \
1357bd1c3badSEd Maste		echo "rescue/sh check failed, installation aborted" >&2; \
1358bd1c3badSEd Maste		false; \
1359bd1c3badSEd Maste	fi
1360bd1c3badSEd Maste.endif
13610fc1aae5SBrooks Davis
13620fc1aae5SBrooks Davis#
1363519bc416SYaroslav Tykhiy# Required install tools to be saved in a scratch dir for safety.
1364519bc416SYaroslav Tykhiy#
13655bb9250eSAlex Richardson.if !defined(CROSSBUILD_HOST)
13665bb9250eSAlex Richardson_sysctl=sysctl
13675bb9250eSAlex Richardson.endif
13685bb9250eSAlex Richardson
1369f600d35fSWarner LoshITOOLS=	[ awk cap_mkdb cat chflags chmod chown cmp cp \
13704a63ae11SBrooks Davis	date echo egrep find grep id install ${_install-info} \
1371c38230ebSBryan Drewery	ln make mkdir mtree mv pwd_mkdb \
13727a4a5200SDag-Erling Smørgrav	rm sed services_mkdb sh sort strip ${_sysctl} test time true uname wc
13737a4a5200SDag-Erling Smørgrav
13747a4a5200SDag-Erling Smørgrav.if ${MK_ZONEINFO} != "no"
13757a4a5200SDag-Erling SmørgravITOOLS+=tzsetup
13767a4a5200SDag-Erling Smørgrav.endif
1377519bc416SYaroslav Tykhiy
137846fe68cdSEnji Cooper# Needed for share/man
1379fe50ba05SEd Maste.if ${MK_MAN_UTILS} != "no"
138046fe68cdSEnji CooperITOOLS+=makewhatis
138146fe68cdSEnji Cooper.endif
138246fe68cdSEnji Cooper
13837a4a5200SDag-Erling SmørgravITOOLS+=${LOCAL_ITOOLS}
13847a4a5200SDag-Erling Smørgrav
1385519bc416SYaroslav Tykhiy#
13861fbb6ab5SRuslan Ermilov# distributeworld
13871fbb6ab5SRuslan Ermilov#
13881fbb6ab5SRuslan Ermilov# Distributes everything compiled by a `buildworld'.
13891fbb6ab5SRuslan Ermilov#
139011fb97daSJohn Birrell# installworld
139111fb97daSJohn Birrell#
139211fb97daSJohn Birrell# Installs everything compiled by a 'buildworld'.
139311fb97daSJohn Birrell#
139499ad39c8SNathan Whitehorn
139599ad39c8SNathan Whitehorn# Non-base distributions produced by the base system
13968643808aSGlen BarberEXTRA_DISTRIBUTIONS=
139791d7edd5SJessica Clarke.for libcompat in ${libcompats}
1398dba75e9fSBryan DreweryEXTRA_DISTRIBUTIONS+=	lib${libcompat}
139991d7edd5SJessica Clarke.endfor
1400e8a34402SJulio Merino.if ${MK_TESTS} != "no"
1401e8a34402SJulio MerinoEXTRA_DISTRIBUTIONS+=	tests
1402e8a34402SJulio Merino.endif
140399ad39c8SNathan Whitehorn
1404ffc6fb79SGlen BarberDEBUG_DISTRIBUTIONS=
1405ffc6fb79SGlen Barber.if ${MK_DEBUG_FILES} != "no"
14068643808aSGlen BarberDEBUG_DISTRIBUTIONS+=	base ${EXTRA_DISTRIBUTIONS:S,tests,,}
1407ffc6fb79SGlen Barber.endif
1408ffc6fb79SGlen Barber
14094a63ae11SBrooks DavisMTREE_MAGIC?=	mtree 2.0
14104a63ae11SBrooks Davis
141140cf3344SBryan Drewerydistributeworld installworld stageworld: _installcheck_world .PHONY
1412767ab900SMarcel Moolenaar	mkdir -p ${INSTALLTMP}
1413c93073c2SYaroslav Tykhiy	progs=$$(for prog in ${ITOOLS}; do \
141434ac629bSAlex Richardson		if progpath=`env PATH=${TMPPATH:Q} which $$prog`; then \
1415c93073c2SYaroslav Tykhiy			echo $$progpath; \
14161602894eSEd Maste		else \
14174ebd18cfSJessica Clarke			echo "Required tool $$prog not found in PATH ("${TMPPATH:Q}")." >&2; \
14181602894eSEd Maste			exit 1; \
14191602894eSEd Maste		fi; \
1420c93073c2SYaroslav Tykhiy	    done); \
14215bb9250eSAlex Richardson	if [ -z "${CROSSBUILD_HOST}" ] ; then \
1422bda5d2a4SBrooks Davis		libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | grep -Ev '\[.*]' | \
1423c93073c2SYaroslav Tykhiy		    while read line; do \
1424c93073c2SYaroslav Tykhiy			set -- $$line; \
1425c93073c2SYaroslav Tykhiy			if [ "$$2 $$3" != "not found" ]; then \
1426c93073c2SYaroslav Tykhiy				echo $$2; \
1427c93073c2SYaroslav Tykhiy			else \
1428c93073c2SYaroslav Tykhiy				echo "Required library $$1 not found." >&2; \
1429c93073c2SYaroslav Tykhiy				exit 1; \
1430c93073c2SYaroslav Tykhiy			fi; \
1431c93073c2SYaroslav Tykhiy		    done); \
14325bb9250eSAlex Richardson	fi; \
1433dda4d972SJessica Clarke	${INSTALLTMP_COPY_HOST_TOOL} $$libs $$progs ${INSTALLTMP}
1434519bc416SYaroslav Tykhiy	cp -R $${PATH_LOCALE:-"/usr/share/locale"} ${INSTALLTMP}/locale
14354a63ae11SBrooks Davis.if defined(NO_ROOT)
1436bd6daf52SBryan Drewery	-mkdir -p ${METALOG:H}
14374a63ae11SBrooks Davis	echo "#${MTREE_MAGIC}" > ${METALOG}
14384a63ae11SBrooks Davis.endif
143999ad39c8SNathan Whitehorn.if make(distributeworld)
144099ad39c8SNathan Whitehorn.for dist in ${EXTRA_DISTRIBUTIONS}
144199ad39c8SNathan Whitehorn	-mkdir ${DESTDIR}/${DISTDIR}/${dist}
144255a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.root.dist \
144399ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist} >/dev/null
144455a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
144599ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
144655a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
144799ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null
144881250b9cSMike Karels.for d in ${LIBCOMPAT_INCLUDE_DIRS}
144981250b9cSMike Karels	-mkdir ${DESTDIR}/${DISTDIR}/${dist}/usr/include/${d}
145081250b9cSMike Karels.endfor
145142f8c5b5SEd Maste.if ${MK_DEBUG_FILES} != "no"
145255a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
145342f8c5b5SEd Maste	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
145442f8c5b5SEd Maste.endif
145591d7edd5SJessica Clarke.for libcompat in ${libcompats}
145655a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
145774c52c65SJulio Merino	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
145874c52c65SJulio Merino.if ${MK_DEBUG_FILES} != "no"
145955a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
146074c52c65SJulio Merino	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/usr >/dev/null
146174c52c65SJulio Merino.endif
146291d7edd5SJessica Clarke.endfor
1463e8a34402SJulio Merino.if ${MK_TESTS} != "no" && ${dist} == "tests"
1464f703589eSEnji Cooper	-mkdir -p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE}
146555a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
1466f703589eSEnji Cooper	    -p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE} >/dev/null
146707670b30SEd Maste.if ${MK_DEBUG_FILES} != "no"
146855a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
146907670b30SEd Maste	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/${TESTSBASE} >/dev/null
147007670b30SEd Maste.endif
1471e8a34402SJulio Merino.endif
14724a63ae11SBrooks Davis.if defined(NO_ROOT)
1473a8b8edb2SMaxim Sobolev	${IMAKEENV} ${DISTR_MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.root.dist | \
14744a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/#' >> ${METALOG}
1475a8b8edb2SMaxim Sobolev	${IMAKEENV} ${DISTR_MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.usr.dist | \
14764a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
1477a8b8edb2SMaxim Sobolev	${IMAKEENV} ${DISTR_MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.include.dist | \
14784a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/usr/include/#' >> ${METALOG}
147981250b9cSMike Karels.for d in ${LIBCOMPAT_INCLUDE_DIRS}
148081250b9cSMike Karels	echo "./${dist}/usr/include/${d} type=dir uname=root gname=wheel mode=0755" >> ${METALOG}
148181250b9cSMike Karels.endfor
148291d7edd5SJessica Clarke.for libcompat in ${libcompats}
1483a8b8edb2SMaxim Sobolev	${IMAKEENV} ${DISTR_MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist | \
148474c52c65SJulio Merino	    sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
148591d7edd5SJessica Clarke.endfor
14864a63ae11SBrooks Davis.endif
148799ad39c8SNathan Whitehorn.endfor
148899ad39c8SNathan Whitehorn	-mkdir ${DESTDIR}/${DISTDIR}/base
148934ac629bSAlex Richardson	${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH:Q} ${MAKE} \
14904a63ae11SBrooks Davis	    METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \
1491469727c9SJessica Clarke	    DISTBASE=/base DESTDIR=${INSTALL_DDIR}/base \
149206362369SBryan Drewery	    LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs
149326ffc1abSLi-Wen Hsu	${INSTALL_SYMLINK} ${INSTALLFLAGS} usr/src/sys ${INSTALL_DDIR}/base/sys
149430d46e45SEd Maste.endif # make(distributeworld)
1495519bc416SYaroslav Tykhiy	${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \
1496519bc416SYaroslav Tykhiy	    ${IMAKEENV} rm -rf ${INSTALLTMP}
14977e45839aSJessica Clarke.if !make(packageworld) && ${MK_CAROOT} != "no"
14987e45839aSJessica Clarke	@if which openssl>/dev/null; then \
149934ac629bSAlex Richardson		PATH=${TMPPATH:Q}:${PATH:Q} \
15007e45839aSJessica Clarke		    sh ${SRCTOP}/usr.sbin/certctl/certctl.sh ${CERTCTLFLAGS} rehash; \
15017e45839aSJessica Clarke	else \
15027e45839aSJessica Clarke		echo "No openssl on the host, not rehashing certificates target -- /etc/ssl may not be populated."; \
15037e45839aSJessica Clarke	fi
15047e45839aSJessica Clarke.endif
150599ad39c8SNathan Whitehorn.if make(distributeworld)
150699ad39c8SNathan Whitehorn.for dist in ${EXTRA_DISTRIBUTIONS}
150714009f5eSLi-Wen Hsu	find ${DESTDIR}/${DISTDIR}/${dist} -mindepth 1 -type d -empty -delete
150899ad39c8SNathan Whitehorn.endfor
15094a63ae11SBrooks Davis.if defined(NO_ROOT)
15104a63ae11SBrooks Davis.for dist in base ${EXTRA_DISTRIBUTIONS}
15114a63ae11SBrooks Davis	@# For each file that exists in this dist, print the corresponding
15124a63ae11SBrooks Davis	@# line from the METALOG.  This relies on the fact that
1513a1ff7af0SPedro F. Giffuni	@# a line containing only the filename will sort immediately before
15144a63ae11SBrooks Davis	@# the relevant mtree line.
15154a63ae11SBrooks Davis	cd ${DESTDIR}/${DISTDIR}; \
15165e0a749cSJessica Clarke	find ./${dist} | ${METALOG_SORT_CMD} -u ${METALOG} - | \
15172e0d99a9SJessica Clarke	awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}/, "."); print } }' > \
15184a63ae11SBrooks Davis	${DESTDIR}/${DISTDIR}/${dist}.meta
15194a63ae11SBrooks Davis.endfor
1520ffc6fb79SGlen Barber.for dist in ${DEBUG_DISTRIBUTIONS}
15212d0bcb76SEd Maste	@# For each file that exists in this dist, print the corresponding
15222d0bcb76SEd Maste	@# line from the METALOG.  This relies on the fact that
1523a1ff7af0SPedro F. Giffuni	@# a line containing only the filename will sort immediately before
15242d0bcb76SEd Maste	@# the relevant mtree line.
15252d0bcb76SEd Maste	cd ${DESTDIR}/${DISTDIR}; \
15265e0a749cSJessica Clarke	find ./${dist}/usr/lib/debug | ${METALOG_SORT_CMD} -u ${METALOG} - | \
15272e0d99a9SJessica Clarke	awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}/, "."); print } }' > \
15282d0bcb76SEd Maste	${DESTDIR}/${DISTDIR}/${dist}.debug.meta
15292d0bcb76SEd Maste.endfor
15302d0bcb76SEd Maste.endif
1531ca4b73c3SKyle Evans.endif # make(distributeworld)
153299ad39c8SNathan Whitehorn
1533c943a53eSBryan Drewerypackageworld: .PHONY
153499ad39c8SNathan Whitehorn.for dist in base ${EXTRA_DISTRIBUTIONS}
15354a63ae11SBrooks Davis.if defined(NO_ROOT)
15364a63ae11SBrooks Davis	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1537fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude usr/lib/debug \
1538bd9cab6fSRui Paulo	    @${DESTDIR}/${DISTDIR}/${dist}.meta | \
15390a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}.txz
15404a63ae11SBrooks Davis.else
154199ad39c8SNathan Whitehorn	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1542fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude usr/lib/debug . | \
15430a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}.txz
15444a63ae11SBrooks Davis.endif
154599ad39c8SNathan Whitehorn.endfor
154611fb97daSJohn Birrell
1547ffc6fb79SGlen Barber.for dist in ${DEBUG_DISTRIBUTIONS}
15482d0bcb76SEd Maste. if defined(NO_ROOT)
15492d0bcb76SEd Maste	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1550fcf12081SJessica Clarke	    ${TAR_CMD} cvf - @${DESTDIR}/${DISTDIR}/${dist}.debug.meta | \
15510a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}-dbg.txz
15522d0bcb76SEd Maste. else
15532d0bcb76SEd Maste	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1554fcf12081SJessica Clarke	    ${TAR_CMD} cvLf - usr/lib/debug | \
15550a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}-dbg.txz
15562d0bcb76SEd Maste. endif
15572d0bcb76SEd Maste.endfor
15582d0bcb76SEd Maste
1559c1d45320SKyle Evansmakeman: .PHONY
1560c1d45320SKyle Evans	${_+_}cd ${.CURDIR}/tools/build/options; sh makeman > \
1561c1d45320SKyle Evans	    ${.CURDIR}/share/man/man5/src.conf.5
1562c1d45320SKyle Evans
1563dd55767bSWarner Losh# Ensure no regressions in self-includeability of sys/*.h and net*/*.h
1564dd55767bSWarner Loshtest-includes: .PHONY
1565dd55767bSWarner Losh	${_+_}cd ${.CURDIR}/tools/build/test-includes; \
1566dd55767bSWarner Losh	    ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} DESTDIR=${WORLDTMP} test-includes
1567dd55767bSWarner Losh
15684f47920eSKyle Evans# We can't assume here that ${TMPPATH} will include ${PATH} or /usr/libexec
15694f47920eSKyle Evans# because we may be building with a STRICTTMPPATH, so we explicitly include
15704f47920eSKyle Evans# /usr/libexec here for flua.  ${TMPPATH} still usefully includes anything else
15714f47920eSKyle Evans# we may need to function.
15724f47920eSKyle Evans_sysent_PATH=	${TMPPATH}:/usr/libexec
15730a9fcf32SBrooks Davis_sysent_dirs=	sys/kern
15740a9fcf32SBrooks Davis_sysent_dirs+=	sys/compat/freebsd32
15750a9fcf32SBrooks Davis_sysent_dirs+=	sys/amd64/linux		\
15760a9fcf32SBrooks Davis		sys/amd64/linux32	\
15770a9fcf32SBrooks Davis		sys/arm64/linux		\
15780a9fcf32SBrooks Davis		sys/i386/linux
157955be47b8SKyle Evans
15800a9fcf32SBrooks Davissysent: .PHONY
15810a9fcf32SBrooks Davis.for _dir in ${_sysent_dirs}
158255be47b8SKyle Evanssysent-${_dir}: .PHONY
1583f22a5921SKyle Evans	@echo "${MAKE} -C ${.CURDIR}/${_dir} sysent"
158434ac629bSAlex Richardson	${_+_}@env PATH=${_sysent_PATH:Q} ${MAKE} -C ${.CURDIR}/${_dir} sysent
158555be47b8SKyle Evans
158655be47b8SKyle Evanssysent: sysent-${_dir}
15870a9fcf32SBrooks Davis.endfor
15880a9fcf32SBrooks Davis
158911fb97daSJohn Birrell#
159011fb97daSJohn Birrell# reinstall
159111fb97daSJohn Birrell#
159211fb97daSJohn Birrell# If you have a build server, you can NFS mount the source and obj directories
159311fb97daSJohn Birrell# and do a 'make reinstall' on the *client* to install new binaries from the
159411fb97daSJohn Birrell# most recent server build.
159511fb97daSJohn Birrell#
1596ecb92e2dSBryan Dreweryrestage reinstall: .MAKE .PHONY
1597d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1598d4ca5483SGlen Barber	@echo ">>> Making hierarchy"
1599d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1600d4ca5483SGlen Barber	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
1601d4ca5483SGlen Barber	    LOCAL_MTREE=${LOCAL_MTREE:Q} hierarchy
1602ecb92e2dSBryan Drewery.if make(restage)
1603d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1604ecb92e2dSBryan Drewery	@echo ">>> Making distribution"
1605c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1606c69a9896SBaptiste Daroussin	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
1607ecb92e2dSBryan Drewery	    LOCAL_MTREE=${LOCAL_MTREE:Q} distribution
1608ecb92e2dSBryan Drewery.endif
1609c69a9896SBaptiste Daroussin	@echo
1610c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1611d0338de5SWolfram Schneider	@echo ">>> Installing everything started on `LC_ALL=C date`"
1612c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1613c69a9896SBaptiste Daroussin	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
161491d7edd5SJessica Clarke.for libcompat in ${libcompats}
1615396f5ab6SBryan Drewery	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install${libcompat}
161691d7edd5SJessica Clarke.endfor
1617d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1618d0338de5SWolfram Schneider	@echo ">>> Installing everything completed on `LC_ALL=C date`"
1619d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1620b626f5a7SGlen Barber
1621d82fd861SBryan Dreweryredistribute: .MAKE .PHONY
16228f1f55e9SRuslan Ermilov	@echo "--------------------------------------------------------------"
1623e5b369afSRuslan Ermilov	@echo ">>> Distributing everything"
16248f1f55e9SRuslan Ermilov	@echo "--------------------------------------------------------------"
1625088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
162691d7edd5SJessica Clarke.for libcompat in ${libcompats}
1627dba75e9fSBryan Drewery	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute${libcompat} \
1628dba75e9fSBryan Drewery	    DISTRIBUTION=lib${libcompat}
162991d7edd5SJessica Clarke.endfor
16300a0743b5SMarcel Moolenaar
1631db9ba9eeSBryan Drewerydistrib-dirs distribution: .MAKE .PHONY
163234ac629bSAlex Richardson	${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH:Q} ${MAKE} \
16334a63ae11SBrooks Davis	    ${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET}
1634db9ba9eeSBryan Drewery.if make(distribution)
163534ac629bSAlex Richardson	${_+_}cd ${.CURDIR}; ${CROSSENV} PATH=${TMPPATH:Q} \
16365d8d6498SBaptiste Daroussin		${MAKE} -f Makefile.inc1 ${IMAKE_INSTALL} \
1637e40fa28fSBrooks Davis		METALOG=${METALOG} MK_TESTS=no \
1638e40fa28fSBrooks Davis		MK_TESTS_SUPPORT=${MK_TESTS_SUPPORT} installconfig
1639db9ba9eeSBryan Drewery.endif
1640dd985c8fSBaptiste Daroussin
16410a0743b5SMarcel Moolenaar#
1642d81da4c9SJessica Clarke# buildetc and installetc
1643d81da4c9SJessica Clarke#
1644d81da4c9SJessica Clarkebuildetc: .MAKE .PHONY
1645d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 _worldtmp
1646d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 _legacy
1647d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 _bootstrap-tools \
1648d81da4c9SJessica Clarke	    MK_CROSS_COMPILER=no MK_TOOLCHAIN=no
1649d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 _obj \
1650d81da4c9SJessica Clarke	    SUBDIR_OVERRIDE=etc
1651d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 everything \
1652d81da4c9SJessica Clarke	    SUBDIR_OVERRIDE=etc
1653d81da4c9SJessica Clarke
1654d81da4c9SJessica Clarkeinstalletc: .MAKE .PHONY
1655d81da4c9SJessica Clarke	@echo "--------------------------------------------------------------"
1656d81da4c9SJessica Clarke	@echo ">>> Making hierarchy"
1657d81da4c9SJessica Clarke	@echo "--------------------------------------------------------------"
1658d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distrib-dirs
1659d81da4c9SJessica Clarke	@echo "--------------------------------------------------------------"
1660d81da4c9SJessica Clarke	@echo ">>> Making distribution"
1661d81da4c9SJessica Clarke	@echo "--------------------------------------------------------------"
1662d81da4c9SJessica Clarke	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribution
1663d81da4c9SJessica Clarke
1664d81da4c9SJessica Clarke#
1665f3bb8dbdSMarcel Moolenaar# buildkernel and installkernel
1666f3bb8dbdSMarcel Moolenaar#
1667f3bb8dbdSMarcel Moolenaar# Which kernels to build and/or install is specified by setting
1668c1ae5e3dSPeter Wemm# KERNCONF. If not defined a GENERIC kernel is built/installed.
1669444ff633SRuslan Ermilov# Only the existing (depending TARGET) config files are used
1670f3bb8dbdSMarcel Moolenaar# for building kernels and only the first of these is designated
1671f3bb8dbdSMarcel Moolenaar# as the one being installed.
1672f3bb8dbdSMarcel Moolenaar#
1673444ff633SRuslan Ermilov# Note that we have to use TARGET instead of TARGET_ARCH when
16744448c79eSRuslan Ermilov# we're in kernel-land. Since only TARGET_ARCH is (expected) to
1675444ff633SRuslan Ermilov# be set to cross-build, we have to make sure TARGET is set
1676f3bb8dbdSMarcel Moolenaar# properly.
1677f3bb8dbdSMarcel Moolenaar
167879177775SWarner Losh.if defined(KERNFAST)
167979177775SWarner LoshNO_KERNELCLEAN=	t
168079177775SWarner LoshNO_KERNELCONFIG=	t
168162012822SWarner LoshNO_KERNELOBJ=		t
1682b61a9dcfSWarner Losh# Shortcut for KERNCONF=Blah -DKERNFAST is now KERNFAST=Blah
1683b61a9dcfSWarner Losh.if !defined(KERNCONF) && ${KERNFAST} != "1"
1684b61a9dcfSWarner LoshKERNCONF=${KERNFAST}
1685b61a9dcfSWarner Losh.endif
168679177775SWarner Losh.endif
1687181cc65dSBaptiste DaroussinGENERIC_KERNCONF_SUFX_powerpc64=	64
1688181cc65dSBaptiste DaroussinGENERIC_KERNCONF_SUFX_powerpc64le=	64LE
1689181cc65dSBaptiste DaroussinGENERIC_KERNCONF_powerpcspe=	MPC85XXSPE
1690181cc65dSBaptiste DaroussinGENERIC_KERNCONF?=	${GENERIC_KERNCONF_${TARGET_ARCH}:UGENERIC${GENERIC_KERNCONF_SUFX_${TARGET_ARCH}}}
1691ae78d52fSDavid E. O'BrienINSTKERNNAME?=	kernel
1692f3bb8dbdSMarcel Moolenaar
169369e74195SJohn BaldwinKERNSRCDIR?=	${.CURDIR}/sys
169469e74195SJohn BaldwinKRNLCONFDIR=	${KERNSRCDIR}/${TARGET}/conf
1695dfa09989SBryan DreweryKRNLOBJDIR=	${OBJTOP}${KERNSRCDIR:C,^${.CURDIR},,}
1696934372e2SPaul RichardsKERNCONFDIR?=	${KRNLCONFDIR}
1697f3bb8dbdSMarcel Moolenaar
1698181cc65dSBaptiste Daroussin.for _k in ${GENERIC_KERNCONF} MINIMAL${GENERIC_KERNCONF_SUFX_${TARGET_ARCH}} ${GENERIC_KERNCONF}-MMCCAM
1699181cc65dSBaptiste Daroussin.if exists(${KERNCONFDIR}/${_k})
1700181cc65dSBaptiste DaroussinPKG_KERNCONF+=	${_k}
1701181cc65dSBaptiste Daroussin.for _dbg in NODEBUG DEBUG
1702181cc65dSBaptiste Daroussin.if exists(${KERNCONFDIR}/${_k}-${_dbg})
1703181cc65dSBaptiste DaroussinPKG_KERNCONF+= ${_k}-${_dbg}
1704181cc65dSBaptiste Daroussin.endif
1705181cc65dSBaptiste Daroussin.endfor
1706181cc65dSBaptiste Daroussin.endif
1707181cc65dSBaptiste Daroussin.endfor
1708181cc65dSBaptiste Daroussin
1709181cc65dSBaptiste Daroussin.if defined(PACKAGE_BUILDING)
1710181cc65dSBaptiste DaroussinKERNCONF?=	${PKG_KERNCONF}
1711181cc65dSBaptiste Daroussin.else
1712181cc65dSBaptiste DaroussinKERNCONF?=	${GENERIC_KERNCONF}
1713181cc65dSBaptiste Daroussin.endif
1714181cc65dSBaptiste Daroussin
1715f3bb8dbdSMarcel MoolenaarBUILDKERNELS=
1716f3bb8dbdSMarcel MoolenaarINSTALLKERNEL=
17176fa97020SBryan Drewery.if defined(NO_INSTALLKERNEL)
17186fa97020SBryan Drewery# All of the BUILDKERNELS loops start at index 1.
17196fa97020SBryan DreweryBUILDKERNELS+= dummy
17206fa97020SBryan Drewery.endif
1721c1ae5e3dSPeter Wemm.for _kernel in ${KERNCONF}
17226e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${KERNCONFDIR}/${_kernel})
1723f3bb8dbdSMarcel MoolenaarBUILDKERNELS+=	${_kernel}
17246fa97020SBryan Drewery.if empty(INSTALLKERNEL) && !defined(NO_INSTALLKERNEL)
1725f3bb8dbdSMarcel MoolenaarINSTALLKERNEL= ${_kernel}
1726f3bb8dbdSMarcel Moolenaar.endif
17270c059da3SCy Schubert.else
17280c059da3SCy Schubert.if make(buildkernel)
17290c059da3SCy Schubert.error Missing KERNCONF ${KERNCONFDIR}/${_kernel}
17300c059da3SCy Schubert.endif
1731f3bb8dbdSMarcel Moolenaar.endif
1732f3bb8dbdSMarcel Moolenaar.endfor
1733f3bb8dbdSMarcel Moolenaar
1734aa9ceac4SEd Maste_cleankernobj_fast_depend_hack: .PHONY
1735dfe76e95SEd Maste# 20191009  r353340  removal of opensolaris_atomic.S (also r353381)
1736dfe76e95SEd Maste.if ${MACHINE} != i386
1737dfe76e95SEd Maste.for f in opensolaris_atomic
1738dfe76e95SEd Maste.for m in opensolaris zfs
1739dfe76e95SEd Maste	@if [ -e "${KRNLOBJDIR}/${KERNCONF}/modules${SRCTOP}/sys/modules/${m}/.depend.${f}.o" ] && \
1740dfe76e95SEd Maste	    grep -q ${f}.S "${KRNLOBJDIR}/${KERNCONF}/modules${SRCTOP}/sys/modules/${m}/.depend.${f}.o"; then \
1741dfe76e95SEd Maste		echo "Removing stale dependencies for opensolaris_atomic"; \
1742dfe76e95SEd Maste		rm -f ${KRNLOBJDIR}/${KERNCONF}/modules${SRCTOP}/sys/modules/${m}/.depend.${f}.*; \
1743dfe76e95SEd Maste	fi
1744dfe76e95SEd Maste.endfor
1745dfe76e95SEd Maste.endfor
1746dfe76e95SEd Maste.endif
1747aa9ceac4SEd Maste
17488fc3059bSJessica Clarke${WMAKE_TGTS:N_cleanworldtmp:N_worldtmp:${libcompats:@v@Nbuild${v}@:ts:}}: .MAKE .PHONY
17498fc3059bSJessica Clarke${.ALLTARGETS:M_*:N_cleanworldtmp:N_worldtmp}: .MAKE .PHONY
1750bfbada6eSWarner Losh
17511d3a067eSWolfram Schneider# record kernel(s) build time in seconds
17521d3a067eSWolfram Schneider.if make(buildkernel)
17531d3a067eSWolfram Schneider_BUILDKERNEL_START!= date '+%s'
17541d3a067eSWolfram Schneider.endif
17551d3a067eSWolfram Schneider
1756f3bb8dbdSMarcel Moolenaar#
1757f3bb8dbdSMarcel Moolenaar# buildkernel
1758f3bb8dbdSMarcel Moolenaar#
1759f3bb8dbdSMarcel Moolenaar# Builds all kernels defined by BUILDKERNELS.
1760f3bb8dbdSMarcel Moolenaar#
1761d82fd861SBryan Drewerybuildkernel: .MAKE .PHONY
17626fa97020SBryan Drewery.if empty(BUILDKERNELS:Ndummy)
1763552b98b9SRuslan Ermilov	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \
17649565bbf3SBruce Evans	false
1765a62264fbSJoseph Koshy.endif
1766f3bb8dbdSMarcel Moolenaar	@echo
17676fa97020SBryan Drewery.for _kernel in ${BUILDKERNELS:Ndummy}
1768c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1769afcf05e4SRuslan Ermilov	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
1770c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1771f3bb8dbdSMarcel Moolenaar	@echo "===> ${_kernel}"
177268924308SSheldon Hearn	mkdir -p ${KRNLOBJDIR}
177359bb1d9cSBrian Somers.if !defined(NO_KERNELCONFIG)
1774ba3ae554SRuslan Ermilov	@echo
1775ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1776ba3ae554SRuslan Ermilov	@echo ">>> stage 1: configuring the kernel"
1777ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1778f3bb8dbdSMarcel Moolenaar	cd ${KRNLCONFDIR}; \
177934ac629bSAlex Richardson		PATH=${TMPPATH:Q} \
1780934372e2SPaul Richards		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
178101a69565SAndriy Gapon			-I '${KERNCONFDIR}' -I '${KRNLCONFDIR}' \
178201a69565SAndriy Gapon			'${KERNCONFDIR}/${_kernel}'
178359bb1d9cSBrian Somers.endif
178475766799SEd Maste.if ${MK_CLEAN} == "yes" && !defined(NO_KERNELCLEAN)
1785ba3ae554SRuslan Ermilov	@echo
1786ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1787ba3ae554SRuslan Ermilov	@echo ">>> stage 2.1: cleaning up the object tree"
1788ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1789d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR}
1790aa9ceac4SEd Maste.else
1791aa9ceac4SEd Maste	${_+_}cd ${.CURDIR}; ${WMAKE} _cleankernobj_fast_depend_hack
179251dfb947SPeter Wemm.endif
179362012822SWarner Losh.if !defined(NO_KERNELOBJ)
1794ba3ae554SRuslan Ermilov	@echo
1795ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1796ba3ae554SRuslan Ermilov	@echo ">>> stage 2.2: rebuilding the object tree"
1797ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1798d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj
179962012822SWarner Losh.endif
1800ba3ae554SRuslan Ermilov	@echo
1801ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1802ba3ae554SRuslan Ermilov	@echo ">>> stage 2.3: build tools"
1803ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1804d3109d39SIan Lepore	${_+_}cd ${.CURDIR}; ${KTMAKE} kernel-tools
1805ba3ae554SRuslan Ermilov	@echo
1806ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1807497e8091SBryan Drewery	@echo ">>> stage 3.1: building everything"
1808ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1809d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ
1810c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1811afcf05e4SRuslan Ermilov	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
1812c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
18131d3a067eSWolfram Schneider
1814f3bb8dbdSMarcel Moolenaar.endfor
18151d3a067eSWolfram Schneider	@seconds=$$(($$(date '+%s') - ${_BUILDKERNEL_START})); \
1816656898abSWolfram Schneider	  echo -n ">>> Kernel(s) ${BUILDKERNELS} built in $$seconds seconds, "; \
1817ebae797cSAlex Richardson	  echo "ncpu: $$(${_ncpu_cmd})${.MAKE.JOBS:S/^/, make -j/}"
18181d3a067eSWolfram Schneider	@echo "--------------------------------------------------------------"
1819f3bb8dbdSMarcel Moolenaar
18209af9e7c5SKyle Evans.if !make(packages) && !make(update-packages)
182179ccc589SEnji CooperNO_INSTALLEXTRAKERNELS?=	yes
18229af9e7c5SKyle Evans.else
18239af9e7c5SKyle Evans# packages/update-packages installs kernels to a staging directory then builds
18249af9e7c5SKyle Evans# packages from the result to be installed, typically to other systems.  It is
18259af9e7c5SKyle Evans# less surprising for these targets to honor KERNCONF if multiple kernels are
18269af9e7c5SKyle Evans# specified.
18279af9e7c5SKyle EvansNO_INSTALLEXTRAKERNELS?=	no
18289af9e7c5SKyle Evans.endif
1829c0fd4255SEnji Cooper
1830f3bb8dbdSMarcel Moolenaar#
18319565bbf3SBruce Evans# installkernel, etc.
1832f3bb8dbdSMarcel Moolenaar#
1833f3bb8dbdSMarcel Moolenaar# Install the kernel defined by INSTALLKERNEL
1834f3bb8dbdSMarcel Moolenaar#
1835afc6f086SGarance A Drosehninstallkernel installkernel.debug \
1836c943a53eSBryan Dreweryreinstallkernel reinstallkernel.debug: _installcheck_kernel .PHONY
18376fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
183807e5ffbaSJoseph Koshy.if empty(INSTALLKERNEL)
1839552b98b9SRuslan Ermilov	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
18409565bbf3SBruce Evans	false
184107e5ffbaSJoseph Koshy.endif
18422f00651dSRuslan Ermilov	@echo "--------------------------------------------------------------"
1843a564880cSWolfram Schneider	@echo ">>> Installing kernel ${INSTALLKERNEL} on $$(LC_ALL=C date)"
18442f00651dSRuslan Ermilov	@echo "--------------------------------------------------------------"
18453faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
184634ac629bSAlex Richardson	    ${CROSSENV} PATH=${TMPPATH:Q} \
1847509a5d93SJessica Clarke	    ${MAKE} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME} METALOG=${METALOG} \
1848509a5d93SJessica Clarke	    ${.TARGET:S/kernel//}
1849a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1850a564880cSWolfram Schneider	@echo ">>> Installing kernel ${INSTALLKERNEL} completed on $$(LC_ALL=C date)"
1851a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
18526fa97020SBryan Drewery.endif
1853f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
1854f3c7b830SGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
1855f3c7b830SGleb Smirnoff	@echo "--------------------------------------------------------------"
1856a564880cSWolfram Schneider	@echo ">>> Installing kernel ${_kernel} $$(LC_ALL=C date)"
1857f3c7b830SGleb Smirnoff	@echo "--------------------------------------------------------------"
18583faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; \
185934ac629bSAlex Richardson	    ${CROSSENV} PATH=${TMPPATH:Q} \
1860509a5d93SJessica Clarke	    ${MAKE} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME}.${_kernel} METALOG=${METALOG} \
1861509a5d93SJessica Clarke	    ${.TARGET:S/kernel//}
1862a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1863a564880cSWolfram Schneider	@echo ">>> Installing kernel ${_kernel} completed on $$(LC_ALL=C date)"
1864a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1865f3c7b830SGleb Smirnoff.endfor
186605f05f8bSGleb Smirnoff.endif
1867ae78d52fSDavid E. O'Brien
1868c943a53eSBryan Drewerydistributekernel distributekernel.debug: .PHONY
18696fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
187099ad39c8SNathan Whitehorn.if empty(INSTALLKERNEL)
187199ad39c8SNathan Whitehorn	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
187299ad39c8SNathan Whitehorn	false
187399ad39c8SNathan Whitehorn.endif
187439da820bSBrooks Davis	mkdir -p ${DESTDIR}/${DISTDIR}
187539da820bSBrooks Davis.if defined(NO_ROOT)
1876848f2374SGlen Barber	@echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.premeta
187739da820bSBrooks Davis.endif
18783faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
187939da820bSBrooks Davis	    ${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.premeta/} \
188034ac629bSAlex Richardson	    ${IMAKE_MTREE} PATH=${TMPPATH:Q} ${MAKE} KERNEL=${INSTKERNNAME} \
1881509a5d93SJessica Clarke	    DISTBASE=/kernel DESTDIR=${INSTALL_DDIR}/kernel \
1882509a5d93SJessica Clarke	    METALOG=${METALOG:S/METALOG/kernel.premeta/} \
188399ad39c8SNathan Whitehorn	    ${.TARGET:S/distributekernel/install/}
188454cf6141SBrooks Davis.if defined(NO_ROOT)
1885848f2374SGlen Barber	@sed -e 's|^./kernel|.|' ${DESTDIR}/${DISTDIR}/kernel.premeta > \
188639da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.meta
188754cf6141SBrooks Davis.endif
18886fa97020SBryan Drewery.endif
1889f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
18906d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
189139da820bSBrooks Davis.if defined(NO_ROOT)
1892848f2374SGlen Barber	@echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta
189339da820bSBrooks Davis.endif
18943faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; \
189539da820bSBrooks Davis	    ${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.${_kernel}.premeta/} \
189634ac629bSAlex Richardson	    ${IMAKE_MTREE} PATH=${TMPPATH:Q} ${MAKE} \
1897d6ba7d93SGleb Smirnoff	    KERNEL=${INSTKERNNAME}.${_kernel} \
1898509a5d93SJessica Clarke	    DISTBASE=/kernel.${_kernel} DESTDIR=${INSTALL_DDIR}/kernel.${_kernel} \
1899509a5d93SJessica Clarke	    METALOG=${METALOG:S/METALOG/kernel.${_kernel}.premeta/} \
1900d6ba7d93SGleb Smirnoff	    ${.TARGET:S/distributekernel/install/}
1901865f7779SJohn Baldwin.if defined(NO_ROOT)
1902848f2374SGlen Barber	@sed -e "s|^./kernel.${_kernel}|.|" \
190339da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta > \
190439da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta
1905865f7779SJohn Baldwin.endif
1906d6ba7d93SGleb Smirnoff.endfor
190705f05f8bSGleb Smirnoff.endif
190899ad39c8SNathan Whitehorn
1909c943a53eSBryan Drewerypackagekernel: .PHONY
191039da820bSBrooks Davis.if defined(NO_ROOT)
19116fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
191239da820bSBrooks Davis	cd ${DESTDIR}/${DISTDIR}/kernel; \
1913fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude '*.debug' \
191488343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.meta | \
19150a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.txz
19166fa97020SBryan Drewery.endif
191733f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
191888343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel; \
1919fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --include '*/*/*.debug' \
192088343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.meta | \
192188343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel-dbg.txz
192233f8570dSGlen Barber.endif
1923f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
19246d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
192539da820bSBrooks Davis	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
1926fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude '*.debug' \
192788343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta | \
19280a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.${_kernel}.txz
192933f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
193088343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
1931fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --include '*/*/*.debug' \
193288343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta | \
193388343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}-dbg.txz
193433f8570dSGlen Barber.endif
193539da820bSBrooks Davis.endfor
193605f05f8bSGleb Smirnoff.endif
193739da820bSBrooks Davis.else
19386fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
1939d6ba7d93SGleb Smirnoff	cd ${DESTDIR}/${DISTDIR}/kernel; \
1940fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude '*.debug' . | \
19410a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.txz
19426fa97020SBryan Drewery.endif
194333f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
194488343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel; \
1945fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --include '*/*/*.debug' $$(eval find .) | \
194688343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel-dbg.txz
194733f8570dSGlen Barber.endif
1948f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
19496d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
1950d6ba7d93SGleb Smirnoff	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
1951fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --exclude '*.debug' . | \
19520a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.${_kernel}.txz
195333f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
195488343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
1955fcf12081SJessica Clarke	    ${TAR_CMD} cvf - --include '*/*/*.debug' $$(eval find .) | \
195688343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}-dbg.txz
195733f8570dSGlen Barber.endif
1958d6ba7d93SGleb Smirnoff.endfor
195939da820bSBrooks Davis.endif
196005f05f8bSGleb Smirnoff.endif
196199ad39c8SNathan Whitehorn
1962c943a53eSBryan Drewerystagekernel: .PHONY
1963ae001499SBryan Drewery	${_+_}${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} distributekernel
19643d98f473SGlen Barber
196590963403SGlen BarberPORTSDIR?=	/usr/ports
1966dfa09989SBryan DreweryWSTAGEDIR?=	${OBJTOP}/worldstage
1967dfa09989SBryan DreweryKSTAGEDIR?=	${OBJTOP}/kernelstage
19681aa0345bSBaptiste DaroussinSSTAGEDIR?=	${OBJTOP}/sourcestage
1969dfa09989SBryan DreweryREPODIR?=	${OBJROOT}repo
1970eac828bcSBaptiste DaroussinPKG_FORMAT?=	tzst
19714401fa9bSEmmanuel VadotPKG_REPO_SIGNING_KEY?=	# empty
197270fc0cc3SEmmanuel VadotPKG_OUTPUT_DIR?=	${PKG_VERSION}
1973aab2c431SMark JohnstonPKG_ABI_FILE?=	${WSTAGEDIR}/usr/bin/uname
1974aab2c431SMark Johnston.if make(create-*-packages*) || make(real-update-packages) || make(real-sign-packages)
1975aab2c431SMark JohnstonPKG_ABI!=	${PKG_CMD} -o ABI_FILE=${PKG_ABI_FILE} config ABI
1976aab2c431SMark Johnston.endif
1977f9371dcaSGlen Barber
197814cda706SGlen Barber.ORDER:		stage-packages create-packages
197914cda706SGlen Barber.ORDER:		create-packages create-world-packages
19801aa0345bSBaptiste Daroussin.ORDER:		create-packages create-source-packages
198114cda706SGlen Barber.ORDER:		create-packages create-kernel-packages
198214cda706SGlen Barber.ORDER:		create-packages sign-packages
198314cda706SGlen Barber
1984c943a53eSBryan Drewery_pkgbootstrap: .PHONY
19856e6be2bbSBryan Drewery.if make(*package*) && !exists(${LOCALBASE}/sbin/pkg)
1986f9371dcaSGlen Barber	@env ASSUME_ALWAYS_YES=YES pkg bootstrap
1987d7a8d386SGlen Barber.endif
1988f9371dcaSGlen Barber
198954247ce1SEd MastePKG_BIN_VERSION!=${PKG_CMD} --version </dev/null 2>/dev/null |\
199054247ce1SEd Maste    awk -F. '/^[0-9.]+$$/ {print $$1 * 10000 + $$2 * 100 + $$3}'
19914e224e4bSEd Maste.if ${PKG_BIN_VERSION} < 11700
19924e224e4bSEd MastePKG_EXT=	${PKG_FORMAT}
19934e224e4bSEd Maste.else
19944e224e4bSEd MastePKG_EXT=	pkg
19954e224e4bSEd Maste.endif
19960ac8aa55SEmmanuel Vadot
199795ae95d4SKyle Evans.if !defined(PKG_VERSION_FROM) && make(real-update-packages)
1998aab2c431SMark Johnston.if exists(${PKG_ABI_FILE}) && exists(${REPODIR}/${PKG_ABI})
19990ac8aa55SEmmanuel VadotPKG_VERSION_FROM!=/usr/bin/readlink ${REPODIR}/${PKG_ABI}/latest
200026490d9bSKyle EvansPKG_VERSION_FROM_DIR=	${REPODIR}/${PKG_ABI}/${PKG_VERSION_FROM}
2001d45717e4SSiva MahadevanBRANCH_EXT_FROM=	${PKG_VERSION_FROM:C/.*([[:alpha:]][^\.]*).*/\1/}
200226490d9bSKyle Evans.else
200326490d9bSKyle EvansPKG_VERSION_FROM=
200426490d9bSKyle EvansPKG_VERSION_FROM_DIR=
2005d45717e4SSiva MahadevanBRANCH_EXT_FROM=
200626490d9bSKyle Evans.endif
20070ac8aa55SEmmanuel Vadot.endif
20080ac8aa55SEmmanuel Vadot
20099af9e7c5SKyle EvansPKGMAKEARGS+=	PKG_VERSION=${PKG_VERSION} \
20109af9e7c5SKyle Evans		NO_INSTALLEXTRAKERNELS=${NO_INSTALLEXTRAKERNELS}
20119af9e7c5SKyle Evans
2012c943a53eSBryan Drewerypackages: .PHONY
20139af9e7c5SKyle Evans	${_+_}${MAKE} -C ${.CURDIR} ${PKGMAKEARGS} real-packages
2014a5395435SGlen Barber
20150ac8aa55SEmmanuel Vadotupdate-packages: .PHONY
20169af9e7c5SKyle Evans	${_+_}${MAKE} -C ${.CURDIR} ${PKGMAKEARGS} real-update-packages
20170ac8aa55SEmmanuel Vadot
2018c943a53eSBryan Drewerypackage-pkg: .PHONY
20193a3f435fSGlen Barber	rm -rf /tmp/ports.${TARGET} || :
202075a6cb4fSBryan Drewery	env ${WMAKEENV:Q} SRCDIR=${.CURDIR} PORTSDIR=${PORTSDIR} REVISION=${_REVISION} \
2021aeb76c0bSMatthew Seaman		PKG_CMD=${PKG_CMD} PKG_VERSION=${PKG_VERSION} REPODIR=${REPODIR} \
2022aeb76c0bSMatthew Seaman		WSTAGEDIR=${WSTAGEDIR} \
202344600eb7SBaptiste Daroussin		OSVERSION="${SRCRELDATE}" \
20243a3f435fSGlen Barber		sh ${.CURDIR}/release/scripts/make-pkg-package.sh
20253a3f435fSGlen Barber
2026c943a53eSBryan Dreweryreal-packages:	stage-packages create-packages sign-packages .PHONY
2027ee1627c4SDag-Erling Smørgrav
20280ac8aa55SEmmanuel Vadotreal-update-packages: stage-packages .PHONY
20290ac8aa55SEmmanuel Vadot	${_+_}${MAKE} -C ${.CURDIR} PKG_VERSION=${PKG_VERSION} create-packages
203026490d9bSKyle Evans.if empty(PKG_VERSION_FROM_DIR)
203126490d9bSKyle Evans	@echo "==> Bootstrapping repository, not checking for new packages"
203226490d9bSKyle Evans.else
20330ac8aa55SEmmanuel Vadot	@echo "==> Checking for new packages (comparing ${PKG_VERSION} to ${PKG_VERSION_FROM})"
203426490d9bSKyle Evans	@for pkg in ${PKG_VERSION_FROM_DIR}/${PKG_NAME_PREFIX}-*; do \
20350ac8aa55SEmmanuel Vadot	  pkgname=$$(pkg query -F $${pkg} '%n' | sed 's/${PKG_NAME_PREFIX}-\(.*\)/\1/') ; \
20364e224e4bSEd Maste	  newpkgname=${PKG_NAME_PREFIX}-$${pkgname}-${PKG_VERSION}.${PKG_EXT} ; \
20370ac8aa55SEmmanuel Vadot	  oldsum=$$(pkg query -F $${pkg} '%X') ; \
20380ac8aa55SEmmanuel Vadot	  if [ ! -f ${REPODIR}/${PKG_ABI}/${PKG_VERSION}/$${newpkgname} ]; then \
20390ac8aa55SEmmanuel Vadot	    continue; \
20400ac8aa55SEmmanuel Vadot	  fi ; \
20410ac8aa55SEmmanuel Vadot	  newsum=$$(pkg query -F ${REPODIR}/${PKG_ABI}/${PKG_VERSION}/$${newpkgname} '%X') ; \
2042f8df1734SNavdeep Parhar	  if [ "${BRANCH_EXT_FROM}" == "${BRANCH_EXT}" -a "$${oldsum}" == "$${newsum}" ]; then \
20434e224e4bSEd Maste	   echo "==> Keeping old ${PKG_NAME_PREFIX}-$${pkgname}-${PKG_VERSION_FROM}.${PKG_EXT}" ; \
20440ac8aa55SEmmanuel Vadot	   rm ${REPODIR}/${PKG_ABI}/${PKG_VERSION}/$${newpkgname} ; \
20450ac8aa55SEmmanuel Vadot	   cp $${pkg} ${REPODIR}/${PKG_ABI}/${PKG_VERSION} ; \
20460ac8aa55SEmmanuel Vadot	  else \
20470ac8aa55SEmmanuel Vadot	    echo "==> New package $${newpkgname}" ; \
20480ac8aa55SEmmanuel Vadot	  fi ; \
20490ac8aa55SEmmanuel Vadot	done
205026490d9bSKyle Evans.endif
20510ac8aa55SEmmanuel Vadot	${_+_}@cd ${.CURDIR}; \
20520ac8aa55SEmmanuel Vadot		${MAKE} -f Makefile.inc1 PKG_VERSION=${PKG_VERSION} sign-packages
20530ac8aa55SEmmanuel Vadot
205400c44825SBryan Drewerystage-packages-world: .PHONY
205500c44825SBryan Drewery	@mkdir -p ${WSTAGEDIR}
2056f9371dcaSGlen Barber	${_+_}@cd ${.CURDIR}; \
205700c44825SBryan Drewery		${MAKE} DESTDIR=${WSTAGEDIR} -DNO_ROOT stageworld
205800c44825SBryan Drewery
205900c44825SBryan Drewerystage-packages-kernel: .PHONY
206000c44825SBryan Drewery	@mkdir -p ${KSTAGEDIR}
206100c44825SBryan Drewery	${_+_}@cd ${.CURDIR}; \
2062dd7b4c15SBryan Drewery		${MAKE} DESTDIR=${KSTAGEDIR} -DNO_ROOT stagekernel
2063ee1627c4SDag-Erling Smørgrav
20641aa0345bSBaptiste Daroussinstage-packages-source: .PHONY
20651aa0345bSBaptiste Daroussin	@mkdir -p ${SSTAGEDIR};
20661aa0345bSBaptiste Daroussin
20671aa0345bSBaptiste Daroussinstage-packages: .PHONY stage-packages-world stage-packages-kernel stage-packages-source
206800c44825SBryan Drewery
206948c22674SBryan Drewery_repodir: .PHONY
2070ee1627c4SDag-Erling Smørgrav	@mkdir -p ${REPODIR}
207148c22674SBryan Drewery
207248c22674SBryan Drewerycreate-packages-world:	_pkgbootstrap _repodir .PHONY
2073ee1627c4SDag-Erling Smørgrav	${_+_}@cd ${.CURDIR}; \
2074275219cfSBryan Drewery		${MAKE} -f Makefile.inc1 \
2075275219cfSBryan Drewery			DESTDIR=${WSTAGEDIR} \
207648c22674SBryan Drewery			PKG_VERSION=${PKG_VERSION} create-world-packages
207748c22674SBryan Drewery
207848c22674SBryan Drewerycreate-packages-kernel:	_pkgbootstrap _repodir .PHONY
207948c22674SBryan Drewery	${_+_}@cd ${.CURDIR}; \
2080275219cfSBryan Drewery		${MAKE} -f Makefile.inc1 \
2081275219cfSBryan Drewery			DESTDIR=${KSTAGEDIR} \
20821793d339SGlen Barber			PKG_VERSION=${PKG_VERSION} DISTDIR=kernel \
2083d0327929SEmmanuel Vadot			SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
20841793d339SGlen Barber			create-kernel-packages
2085f9371dcaSGlen Barber
20869ddbc3d4SEmmanuel Vadotcreate-packages-kernel-repo: .PHONY create-packages-kernel sign-packages
20879ddbc3d4SEmmanuel Vadot
20889ddbc3d4SEmmanuel Vadotcreate-packages-world-repo: .PHONY create-packages-world sign-packages
20899ddbc3d4SEmmanuel Vadot
20901aa0345bSBaptiste Daroussincreate-packages-source:	_pkgbootstrap _repodir .PHONY
20911aa0345bSBaptiste Daroussin	${_+_}@cd ${.CURDIR}; \
20921aa0345bSBaptiste Daroussin		${MAKE} -f Makefile.inc1 \
20931aa0345bSBaptiste Daroussin			DESTDIR=${SSTAGEDIR} \
20941aa0345bSBaptiste Daroussin			PKG_VERSION=${PKG_VERSION} create-source-packages
20951aa0345bSBaptiste Daroussin
20961aa0345bSBaptiste Daroussincreate-packages: .PHONY create-packages-world create-packages-kernel create-packages-source
20971aa0345bSBaptiste Daroussin
2098c06e1fdcSMark Johnstoncreate-source-src-package: _pkgbootstrap .PHONY
2099c8856795SMark Johnston	rm -f ${SSTAGEDIR}/src.plist 2>/dev/null || :
21001aa0345bSBaptiste Daroussin.if !empty(GIT_CMD) && exists(${GIT_CMD}) && exists(${SRCDIR}/.git)
21011aa0345bSBaptiste Daroussin	@cd ${SRCDIR}; \
21021aa0345bSBaptiste Daroussin		( echo "@override_prefix /usr/src" ;  \
2103c8c5d91fSEd Maste		${GIT_CMD} ls-files --recurse-submodules ":!:sys/" ) \
2104c8c5d91fSEd Maste		> ${SSTAGEDIR}/src.plist
2105099bd9e6SBaptiste Daroussin	${SRCDIR}/release/packages/generate-ucl.lua \
2106099bd9e6SBaptiste Daroussin		PKGNAME "src" \
2107099bd9e6SBaptiste Daroussin		PKGGENNAME "src" \
2108099bd9e6SBaptiste Daroussin		VERSION "${PKG_VERSION}" \
2109099bd9e6SBaptiste Daroussin		DESC "FreeBSD Kernel Sources" \
2110099bd9e6SBaptiste Daroussin		COMMENT "FreeBSD Userland Sources" \
2111099bd9e6SBaptiste Daroussin		PKG_NAME_PREFIX "${PKG_NAME_PREFIX}" \
2112099bd9e6SBaptiste Daroussin		PKG_MAINTAINER "${PKG_MAINTAINER}" \
2113099bd9e6SBaptiste Daroussin		PKG_WWW "${PKG_WWW}" \
2114099bd9e6SBaptiste Daroussin		${SRCDIR}/release/packages/template.ucl \
2115099bd9e6SBaptiste Daroussin		${SSTAGEDIR}/src.ucl
2116c06e1fdcSMark Johnston	${PKG_CMD} -o ABI=${PKG_ABI} \
2117c06e1fdcSMark Johnston		-o OSVERSION="${SRCRELDATE}" \
2118c06e1fdcSMark Johnston		create -f ${PKG_FORMAT} \
2119c06e1fdcSMark Johnston		-M ${SSTAGEDIR}/src.ucl \
2120c06e1fdcSMark Johnston		-p ${SSTAGEDIR}/src.plist \
2121c06e1fdcSMark Johnston		-r ${SRCDIR} \
2122c06e1fdcSMark Johnston		-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
2123c06e1fdcSMark Johnston.endif
2124c06e1fdcSMark Johnston
2125c06e1fdcSMark Johnstoncreate-source-src-sys-package: _pkgbootstrap .PHONY
2126c8856795SMark Johnston	rm -f ${SSTAGEDIR}/src-sys.plist 2>/dev/null || :
2127c06e1fdcSMark Johnston.if !empty(GIT_CMD) && exists(${GIT_CMD}) && exists(${SRCDIR}/.git)
2128c06e1fdcSMark Johnston	@cd ${SRCDIR}; \
2129c06e1fdcSMark Johnston		( echo "@override_prefix /usr/src" ; \
2130c06e1fdcSMark Johnston		${GIT_CMD} ls-files --recurse-submodules "sys/" ) \
2131c06e1fdcSMark Johnston		> ${SSTAGEDIR}/src-sys.plist
2132099bd9e6SBaptiste Daroussin	${SRCDIR}/release/packages/generate-ucl.lua \
2133099bd9e6SBaptiste Daroussin		PKGNAME "src-sys" \
2134099bd9e6SBaptiste Daroussin		PKGGENNAME "src" \
2135099bd9e6SBaptiste Daroussin		VERSION "${PKG_VERSION}" \
2136099bd9e6SBaptiste Daroussin		DESC "FreeBSD Kernel Sources" \
2137099bd9e6SBaptiste Daroussin		COMMENT "FreeBSD Kernel Sources" \
2138099bd9e6SBaptiste Daroussin		PKG_NAME_PREFIX "${PKG_NAME_PREFIX}" \
2139099bd9e6SBaptiste Daroussin		PKG_MAINTAINER "${PKG_MAINTAINER}" \
2140099bd9e6SBaptiste Daroussin		PKG_WWW "${PKG_WWW}" \
2141099bd9e6SBaptiste Daroussin		${SRCDIR}/release/packages/template.ucl \
2142099bd9e6SBaptiste Daroussin		${SSTAGEDIR}/src-sys.ucl
214344600eb7SBaptiste Daroussin	${PKG_CMD} -o ABI=${PKG_ABI} \
214444600eb7SBaptiste Daroussin		-o OSVERSION="${SRCRELDATE}" \
214544600eb7SBaptiste Daroussin		create -f ${PKG_FORMAT} \
21461aa0345bSBaptiste Daroussin		-M ${SSTAGEDIR}/src-sys.ucl \
21471aa0345bSBaptiste Daroussin		-p ${SSTAGEDIR}/src-sys.plist \
21481aa0345bSBaptiste Daroussin		-r ${SRCDIR} \
21491aa0345bSBaptiste Daroussin		-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
21501aa0345bSBaptiste Daroussin.endif
215148c22674SBryan Drewery
2152c06e1fdcSMark Johnstoncreate-source-packages: .PHONY _pkgbootstrap create-source-src-package create-source-src-sys-package
2153c06e1fdcSMark Johnston
2154c943a53eSBryan Drewerycreate-world-packages:	_pkgbootstrap .PHONY
21557a888f32SGlen Barber	@rm -f ${WSTAGEDIR}/*.plist 2>/dev/null || :
21567a888f32SGlen Barber	@cd ${WSTAGEDIR} ; \
21575e0a749cSJessica Clarke		${METALOG_SORT_CMD} ${WSTAGEDIR}/${DISTDIR}/METALOG | \
215892b800ccSEd Maste		awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk
21597a888f32SGlen Barber	@for plist in ${WSTAGEDIR}/*.plist; do \
2160ca0abefbSBaptiste Daroussin	  plist=$${plist##*/} ; \
21615c52b2f5SGlen Barber	  pkgname=$${plist%.plist} ; \
2162f77b03aaSBryan Drewery	  echo "_PKGS+= $${pkgname}" ; \
2163f77b03aaSBryan Drewery	done > ${WSTAGEDIR}/packages.mk
2164f77b03aaSBryan Drewery	${_+_}@cd ${.CURDIR}; \
2165f77b03aaSBryan Drewery		${MAKE} -f Makefile.inc1 create-world-packages-jobs \
2166d0327929SEmmanuel Vadot		SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
2167f77b03aaSBryan Drewery		.MAKE.JOB.PREFIX=
2168f77b03aaSBryan Drewery
2169f77b03aaSBryan Drewery.if make(create-world-packages-jobs)
2170f77b03aaSBryan Drewery.include "${WSTAGEDIR}/packages.mk"
2171f77b03aaSBryan Drewery.endif
2172f77b03aaSBryan Drewery
2173f77b03aaSBryan Drewerycreate-world-packages-jobs: .PHONY
2174f77b03aaSBryan Drewery.for pkgname in ${_PKGS}
2175f77b03aaSBryan Drewerycreate-world-packages-jobs: create-world-package-${pkgname}
2176f77b03aaSBryan Drewerycreate-world-package-${pkgname}: .PHONY
2177f77b03aaSBryan Drewery	@sh ${SRCDIR}/release/packages/generate-ucl.sh -o ${pkgname} \
2178f77b03aaSBryan Drewery		-s ${SRCDIR} -u ${WSTAGEDIR}/${pkgname}.ucl
2179f77b03aaSBryan Drewery	@awk -F\" ' \
21802cc77b79SBrad Davis		/^name/ { printf("===> Creating %s-", $$2); next } \
21812cc77b79SBrad Davis		/^version/ { print $$2; next } \
2182ebd2eeb3SGlen Barber		' ${WSTAGEDIR}/${pkgname}.ucl
218316398a11SGlen Barber	@if [ "${pkgname}" == "runtime" ]; then \
2184ebd2eeb3SGlen Barber		sed -i '' -e "s/%VCS_REVISION%/${VCS_REVISION}/" ${WSTAGEDIR}/${pkgname}.ucl ; \
218516398a11SGlen Barber	fi
2186aab2c431SMark Johnston	${PKG_CMD} -o ABI=${PKG_ABI} -o ALLOW_BASE_SHLIBS=yes \
218744600eb7SBaptiste Daroussin		-o OSVERSION="${SRCRELDATE}" \
21889ccace3fSEd Maste		create -f ${PKG_FORMAT} -M ${WSTAGEDIR}/${pkgname}.ucl \
2189f77b03aaSBryan Drewery		-p ${WSTAGEDIR}/${pkgname}.plist \
21907a888f32SGlen Barber		-r ${WSTAGEDIR} \
219170fc0cc3SEmmanuel Vadot		-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
2192f77b03aaSBryan Drewery.endfor
2193ca0abefbSBaptiste Daroussin
219410c93529SBryan Drewery_default_flavor=	-default
21956e6be2bbSBryan Drewery.if make(*package*) && exists(${KSTAGEDIR}/kernel.meta)
219633f8570dSGlen Barber. if ${MK_DEBUG_FILES} != "no"
2197697b271dSEd Maste_debug=-dbg
219833f8570dSGlen Barber. endif
21990d26206dSBryan Drewerycreate-kernel-packages:	.PHONY
220033f8570dSGlen Barber. for flavor in "" ${_debug}
220110c93529SBryan Drewerycreate-kernel-packages: create-kernel-packages-flavor${flavor:C,^""$,${_default_flavor},}
220210c93529SBryan Drewerycreate-kernel-packages-flavor${flavor:C,^""$,${_default_flavor},}: _pkgbootstrap .PHONY
22037a888f32SGlen Barber	@cd ${KSTAGEDIR}/${DISTDIR} ; \
22045e0a749cSJessica Clarke	${METALOG_SORT_CMD} ${KSTAGEDIR}/kernel.meta | \
2205183a8eadSBaptiste Daroussin	awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk \
220692b800ccSEd Maste		-v kernel=yes -v _kernconf=${INSTALLKERNEL} ; \
2207099bd9e6SBaptiste Daroussin	${SRCDIR}/release/packages/generate-ucl.lua \
2208099bd9e6SBaptiste Daroussin		PKGNAME "kernel-${INSTALLKERNEL:tl}${flavor}" \
2209099bd9e6SBaptiste Daroussin		VERSION "${PKG_VERSION}" \
2210099bd9e6SBaptiste Daroussin		KERNELDIR "kernel" \
2211099bd9e6SBaptiste Daroussin		COMMENT "FreeBSD ${INSTALLKERNEL} kernel ${flavor}" \
2212099bd9e6SBaptiste Daroussin		DESC "FreeBSD ${INSTALLKERNEL} kernel ${flavor}" \
2213099bd9e6SBaptiste Daroussin		PKG_NAME_PREFIX "${PKG_NAME_PREFIX}" \
2214099bd9e6SBaptiste Daroussin		PKG_MAINTAINER "${PKG_MAINTAINER}" \
2215099bd9e6SBaptiste Daroussin		PKG_WWW "${PKG_WWW}" \
2216099bd9e6SBaptiste Daroussin		${SRCDIR}/release/packages/template.ucl \
2217099bd9e6SBaptiste Daroussin		 ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl ; \
22183d98f473SGlen Barber	awk -F\" ' \
22193d98f473SGlen Barber		/name/ { printf("===> Creating %s-", $$2); next } \
22203d98f473SGlen Barber		/version/ {print $$2; next } ' \
22217a888f32SGlen Barber		${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl ; \
222259f4abfaSEmmanuel Vadot	${PKG_CMD} -o ABI=${PKG_ABI} -o ALLOW_BASE_SHLIBS=yes \
222344600eb7SBaptiste Daroussin		-o OSVERSION="${SRCRELDATE}" \
22249ccace3fSEd Maste		create -f ${PKG_FORMAT} \
22259ccace3fSEd Maste		-M ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl \
22267a888f32SGlen Barber		-p ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.plist \
22277a888f32SGlen Barber		-r ${KSTAGEDIR}/${DISTDIR} \
222870fc0cc3SEmmanuel Vadot		-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
2229183a8eadSBaptiste Daroussin. endfor
22303d98f473SGlen Barber.endif
2231f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
22323d98f473SGlen Barber. for _kernel in ${BUILDKERNELS:[2..-1]}
22337a888f32SGlen Barber.  if exists(${KSTAGEDIR}/kernel.${_kernel}.meta)
223433f8570dSGlen Barber.   if ${MK_DEBUG_FILES} != "no"
2235697b271dSEd Maste_debug=-dbg
223633f8570dSGlen Barber.   endif
223733f8570dSGlen Barber.   for flavor in "" ${_debug}
2238f45c7805SBryan Drewerycreate-kernel-packages: create-kernel-packages-extra-flavor${flavor:C,^""$,${_default_flavor},}-${_kernel}
2239f45c7805SBryan Drewerycreate-kernel-packages-extra-flavor${flavor:C,^""$,${_default_flavor},}-${_kernel}: _pkgbootstrap .PHONY
22407a888f32SGlen Barber	@cd ${KSTAGEDIR}/kernel.${_kernel} ; \
22415e0a749cSJessica Clarke	${METALOG_SORT_CMD} ${KSTAGEDIR}/kernel.${_kernel}.meta | \
2242183a8eadSBaptiste Daroussin	awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk \
224392b800ccSEd Maste		-v kernel=yes -v _kernconf=${_kernel} ; \
224469cd13d4SBaptiste Daroussin	${SRCDIR}/release/packages/generate-ucl.lua \
2245fa0d9893SBaptiste Daroussin		PKGNAME "kernel-${_kernel:tl}${flavor}" \
224669cd13d4SBaptiste Daroussin		PKGGENNAME "kernel" \
22470e3acd57SBaptiste Daroussin		FORCEINCLUDE "kernel${flavor}" \
22480e3acd57SBaptiste Daroussin		UCLFILES "${SRCDIR}/release/packages/" \
224969cd13d4SBaptiste Daroussin		VERSION "${PKG_VERSION}" \
225069cd13d4SBaptiste Daroussin		KERNELDIR "kernel.${_kernel}" \
225169cd13d4SBaptiste Daroussin		DESC "FreeBSD ${_kernel} kernel ${flavor}" \
225269cd13d4SBaptiste Daroussin		COMMENT "FreeBSD ${_kernel} kernel ${flavor}" \
225369cd13d4SBaptiste Daroussin		PKG_NAME_PREFIX "${PKG_NAME_PREFIX}" \
225469cd13d4SBaptiste Daroussin		PKG_MAINTAINER "${PKG_MAINTAINER}" \
225569cd13d4SBaptiste Daroussin		PKG_WWW "${PKG_WWW}" \
225669cd13d4SBaptiste Daroussin		${SRCDIR}/release/packages/template.ucl \
225769cd13d4SBaptiste Daroussin		${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl ; \
22583d98f473SGlen Barber	awk -F\" ' \
22593d98f473SGlen Barber		/name/ { printf("===> Creating %s-", $$2); next } \
22603d98f473SGlen Barber		/version/ {print $$2; next } ' \
22617a888f32SGlen Barber		${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl ; \
2262aab2c431SMark Johnston	${PKG_CMD} -o ABI=${PKG_ABI} -o ALLOW_BASE_SHLIBS=yes \
226344600eb7SBaptiste Daroussin		-o OSVERSION="${SRCRELDATE}" \
22649ccace3fSEd Maste		create -f ${PKG_FORMAT} \
22659ccace3fSEd Maste		-M ${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl \
22667a888f32SGlen Barber		-p ${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.plist \
22677a888f32SGlen Barber		-r ${KSTAGEDIR}/kernel.${_kernel} \
226870fc0cc3SEmmanuel Vadot		-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
22693d98f473SGlen Barber.   endfor
2270183a8eadSBaptiste Daroussin.  endif
2271183a8eadSBaptiste Daroussin. endfor
22723d98f473SGlen Barber.endif
2273183a8eadSBaptiste Daroussin
2274aab2c431SMark Johnstonsign-packages:	.PHONY
2275aab2c431SMark Johnston	${_+_}@cd ${.CURDIR}; \
2276aab2c431SMark Johnston		${MAKE} -f Makefile.inc1 PKG_VERSION=${PKG_VERSION} real-sign-packages
2277aab2c431SMark Johnston
2278aab2c431SMark Johnstonreal-sign-packages:	_pkgbootstrap .PHONY
22796cafdee7SEmmanuel Vadot	printf "version = 2;\n" > ${WSTAGEDIR}/meta
22804e224e4bSEd Maste.if ${PKG_BIN_VERSION} < 11700
22814e224e4bSEd Maste	printf "packing_format = \"${PKG_FORMAT}\";\n" >> ${WSTAGEDIR}/meta
22824e224e4bSEd Maste.endif
2283*1e8db1f7SKyle Evans	@${PKG_CMD} -o ABI=${PKG_ABI} repo -o OSVERSION="${SRCRELDATE}" \
22849ccace3fSEd Maste		-m ${WSTAGEDIR}/meta \
2285aab2c431SMark Johnston		-o ${REPODIR}/${PKG_ABI}/${PKG_VERSION} \
2286aab2c431SMark Johnston		${REPODIR}/${PKG_ABI}/${PKG_VERSION} \
22874401fa9bSEmmanuel Vadot		${PKG_REPO_SIGNING_KEY} ; \
2288aab2c431SMark Johnston	cd ${REPODIR}/${PKG_ABI}; \
2289*1e8db1f7SKyle Evans	ln -hfs ${PKG_OUTPUT_DIR} latest
2290d46f0432SGlen Barber
2291ae78d52fSDavid E. O'Brien#
229271b7fa12SEnji Cooper#
229371b7fa12SEnji Cooper# checkworld
229471b7fa12SEnji Cooper#
229571b7fa12SEnji Cooper# Run test suite on installed world.
229671b7fa12SEnji Cooper#
229771b7fa12SEnji Coopercheckworld: .PHONY
2298c42a6767SBrooks Davis	@if [ ! -x "${LOCALBASE}/bin/kyua" ] && [ ! -x "/usr/bin/kyua" ]; then \
229971b7fa12SEnji Cooper		echo "You need kyua (devel/kyua) to run the test suite." | /usr/bin/fmt; \
230071b7fa12SEnji Cooper		exit 1; \
230171b7fa12SEnji Cooper	fi
230274464d3cSEnji Cooper	${_+_}PATH="$$PATH:${LOCALBASE}/bin" kyua test -k ${TESTSBASE}/Kyuafile
230371b7fa12SEnji Cooper
230471b7fa12SEnji Cooper#
230571b7fa12SEnji Cooper#
2306becc5c62SAlexander Leidinger# doxygen
2307becc5c62SAlexander Leidinger#
2308becc5c62SAlexander Leidinger# Build the API documentation with doxygen
2309becc5c62SAlexander Leidinger#
2310d82fd861SBryan Drewerydoxygen: .PHONY
231166df1425SEnji Cooper	@if [ ! -x "${LOCALBASE}/bin/doxygen" ]; then \
2312becc5c62SAlexander Leidinger		echo "You need doxygen (devel/doxygen) to generate the API documentation of the kernel." | /usr/bin/fmt; \
2313becc5c62SAlexander Leidinger		exit 1; \
2314becc5c62SAlexander Leidinger	fi
2315b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}/tools/kerneldoc/subsys; ${MAKE} obj all
2316becc5c62SAlexander Leidinger
2317becc5c62SAlexander Leidinger#
231811fb97daSJohn Birrell# ------------------------------------------------------------------------
231911fb97daSJohn Birrell#
232011fb97daSJohn Birrell# From here onwards are utility targets used by the 'make world' and
232111fb97daSJohn Birrell# related targets.  If your 'world' breaks, you may like to try to fix
232211fb97daSJohn Birrell# the problem and manually run the following targets to attempt to
232311fb97daSJohn Birrell# complete the build.  Beware, this is *not* guaranteed to work, you
232411fb97daSJohn Birrell# need to have a pretty good grip on the current state of the system
232511fb97daSJohn Birrell# to attempt to manually finish it.  If in doubt, 'make world' again.
232611fb97daSJohn Birrell#
232711fb97daSJohn Birrell
232811fb97daSJohn Birrell#
2329d9933780SEd Maste# legacy: Build compatibility shims for the next three targets. This is a
2330d9933780SEd Maste# minimal set of tools and shims necessary to compensate for older systems
2331d9933780SEd Maste# which don't have the APIs required by the targets built in bootstrap-tools,
2332d9933780SEd Maste# build-tools or cross-tools.
233376762624SMarcel Moolenaar#
2334c943a53eSBryan Drewerylegacy: .PHONY
23354d40df1bSBryan Drewery.if ${BOOTSTRAPPING} < ${MINIMUM_SUPPORTED_OSREL} && ${BOOTSTRAPPING} != 0
23364d40df1bSBryan Drewery	@echo "ERROR: Source upgrades from versions prior to ${MINIMUM_SUPPORTED_REL} are not supported."; \
233751dc1e12SRuslan Ermilov	false
233851dc1e12SRuslan Ermilov.endif
233990136961SWarner Losh
234080cedb80SBryan Drewery.for _tool in \
234180cedb80SBryan Drewery  tools/build \
234280cedb80SBryan Drewery  ${LOCAL_LEGACY_DIRS}
2343497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,all,install)"; \
2344b67490a3SBryan Drewery	    cd ${.CURDIR}/${_tool}; \
23452abeba9dSBryan Drewery	    if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
2346dfa09989SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy includes; \
2347aa06dfc9SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no all; \
2348aa06dfc9SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no \
2349dfa09989SBryan Drewery	        DESTDIR=${WORLDTMP}/legacy install
2350f7e19a98SWarner Losh.endfor
2351f7e19a98SWarner Losh
2352cfc236e8SRuslan Ermilov#
2353996d8a0dSWarner Losh# bootstrap-tools: Build tools needed for compatibility. These are binaries that
2354996d8a0dSWarner Losh# are built to build other binaries in the system. However, the focus of these
2355996d8a0dSWarner Losh# binaries is usually quite narrow. Bootstrap tools use the host's compiler and
23566806504dSAlex Richardson# libraries, augmented by -legacy, in addition to the libraries built during
23576806504dSAlex Richardson# bootstrap-tools.
2358cfc236e8SRuslan Ermilov#
2359aebc0e35SEnji Cooper_bt=		_bootstrap-tools
2360aebc0e35SEnji Cooper
23618f62bca4SAlex Richardson# We want to run the build with only ${WORLDTMP} in $PATH to ensure we don't
23628f62bca4SAlex Richardson# accidentally run tools that are incompatible but happen to be in $PATH.
23638f62bca4SAlex Richardson# This is especially important when building on Linux/MacOS where many of the
23648f62bca4SAlex Richardson# programs used during the build accept different flags or generate different
23658f62bca4SAlex Richardson# output. On those platforms we only symlink the tools known to be compatible
23668f62bca4SAlex Richardson# (e.g. basic utilities such as mkdir) into ${WORLDTMP} and build all others
23678f62bca4SAlex Richardson# from the FreeBSD sources during the bootstrap-tools stage.
23688f62bca4SAlex Richardson# We want to build without the user's $PATH starting in the bootstrap-tools
23698f62bca4SAlex Richardson# phase so the tools used in that phase (ln, cp, etc) must have already been
23708f62bca4SAlex Richardson# linked to $WORLDTMP. The tools are listed in the _host_tools_to_symlink
23718f62bca4SAlex Richardson# variable in tools/build/Makefile and are linked during the legacy phase.
23728f62bca4SAlex Richardson# Since they could be Linux or MacOS binaries, too we must only use flags that
23738f62bca4SAlex Richardson# are portable across operating systems.
23748f62bca4SAlex Richardson
23758f62bca4SAlex Richardson# If BOOTSTRAP_ALL_TOOLS is set we will build all the required tools from the
23768f62bca4SAlex Richardson# current source tree. Otherwise we create a symlink to the version found in
23778f62bca4SAlex Richardson# $PATH during the bootstrap-tools stage.
23785bb9250eSAlex Richardson# When building on non-FreeBSD systems we can't assume that the host binaries
23795bb9250eSAlex Richardson# accept compatible flags or produce compatible output. Therefore we force
23805bb9250eSAlex Richardson# BOOTSTRAP_ALL_TOOLS and just build the FreeBSD version of the binary.
23815bb9250eSAlex Richardson.if defined(CROSSBUILD_HOST)
23825bb9250eSAlex RichardsonBOOTSTRAP_ALL_TOOLS:=	1
23835bb9250eSAlex Richardson.endif
23848f62bca4SAlex Richardson.if defined(BOOTSTRAP_ALL_TOOLS)
23858f62bca4SAlex Richardson# BOOTSTRAPPING will be set on the command line so we can't override it here.
23868f62bca4SAlex Richardson# Instead set BOOTSTRAPPING_OSRELDATE so that the value 0 is set ${BSARGS}
23878f62bca4SAlex RichardsonBOOTSTRAPPING_OSRELDATE:=	0
23888f62bca4SAlex Richardson.endif
23898f62bca4SAlex Richardson
2390e1fe3dbaSRuslan Ermilov.if ${MK_GAMES} != "no"
23916ae1554aSColin Percival_strfile=	usr.bin/fortune/strfile
2392cfc236e8SRuslan Ermilov.endif
2393cfc236e8SRuslan Ermilov
2394f1829643SToomas Soome# vtfontcvt is used to build font files for loader and to generate
2395f1829643SToomas Soome# C source for loader built in font (8x16.c).
2396cce0f182SEd Maste_vtfontcvt=	usr.bin/vtfontcvt
2397cce0f182SEd Maste
23987a4a5200SDag-Erling Smørgrav# zic is used to compile timezone data
23997a4a5200SDag-Erling Smørgrav.if ${MK_ZONEINFO} != "no"
24007a4a5200SDag-Erling Smørgrav_zic=		usr.sbin/zic
24017a4a5200SDag-Erling Smørgrav.endif
24027a4a5200SDag-Erling Smørgrav
24038f62bca4SAlex Richardson# If we are not building the bootstrap because BOOTSTRAPPING is sufficient
24048f62bca4SAlex Richardson# we symlink the host version to $WORLDTMP instead. By doing this we can also
24058f62bca4SAlex Richardson# detect when a bootstrap tool is being used without the required MK_FOO.
24068f62bca4SAlex Richardson# If you add a new bootstrap tool where we could also use the host version,
24078f62bca4SAlex Richardson# please ensure that you also add a .else case where you add the tool to the
24088f62bca4SAlex Richardson# _bootstrap_tools_links variable.
24098502220dSWarner Losh.if ${BOOTSTRAPPING} < 1000033
24108502220dSWarner Losh# Note: lex needs m4 to build but m4 also depends on lex (which needs m4 to
24118502220dSWarner Losh# generate any files). To fix this cyclic dependency we can build a bootstrap
24128502220dSWarner Losh# version of m4 (with pre-generated files) then use that to build the real m4.
24138502220dSWarner Losh# We can't simply use the host m4 since e.g. the macOS version does not accept
24148502220dSWarner Losh# the flags that are passed by lex.
24158502220dSWarner Losh# For lex we also use the pre-gerated files since we would otherwise need to
24168502220dSWarner Losh# build awk and sed first (which need lex to build)
24178502220dSWarner Losh# TODO: add a _bootstrap_lex and then build the real lex afterwards
24188502220dSWarner Losh_lex=		usr.bin/lex
24198502220dSWarner Losh_m4=		tools/build/bootstrap-m4 usr.bin/m4
24208502220dSWarner Losh${_bt}-tools/build/bootstrap-m4: ${_bt}-usr.bin/lex ${_bt}-lib/libopenbsd ${_bt}-usr.bin/yacc
24218502220dSWarner Losh${_bt}-usr.bin/m4: ${_bt}-lib/libopenbsd ${_bt}-usr.bin/yacc ${_bt}-usr.bin/lex ${_bt}-tools/build/bootstrap-m4
24228502220dSWarner Losh_bt_m4_depend=${_bt}-usr.bin/m4
24238502220dSWarner Losh_bt_lex_depend=${_bt}-usr.bin/lex ${_bt_m4_depend}
24248502220dSWarner Losh.else
24258502220dSWarner Losh_bootstrap_tools_links+=m4 lex
24268502220dSWarner Losh.endif
242703bc68caSEd Schouten
24286806504dSAlex Richardson# ELF Tool Chain libraries are needed for ELF tools and dtrace tools.
24296806504dSAlex Richardson# r296685 fix cross-endian objcopy
24306806504dSAlex Richardson# r310724 fixed PR 215350, a crash in libdwarf with objects built by GCC 6.2.
24316806504dSAlex Richardson# r334881 added libdwarf constants used by ctfconvert.
24326806504dSAlex Richardson# r338478 fixed a crash in objcopy for mips64el objects
24336806504dSAlex Richardson# r339083 libelf: correct mips64el test to use ELF header
243478473c58SJustin Hibbits# r348347 Add missing powerpc64 relocation support to libdwarf
243578473c58SJustin Hibbits.if ${BOOTSTRAPPING} < 1300030
243617adf17bSSimon J. Gerraty_elftoolchain_libs= lib/libelf lib/libdwarf lib/libzstd
24376806504dSAlex Richardson${_bt}-lib/libelf: ${_bt_m4_depend}
24386806504dSAlex Richardson${_bt}-lib/libdwarf: ${_bt_m4_depend}
24392fbed5e9SJessica Clarke_bt_libelf_depend=${_bt}-lib/libelf
24406806504dSAlex Richardson.endif
24416806504dSAlex Richardson
24422fbed5e9SJessica Clarke_kldxref=	usr.sbin/kldxref
24432fbed5e9SJessica Clarke${_bt}-usr.sbin/kldxref: ${_bt_libelf_depend}
24442fbed5e9SJessica Clarke
2445f22a5921SKyle Evans# flua is required to regenerate syscall files.  It first appeared during the
2446f22a5921SKyle Evans# 13.0-CURRENT cycle, thus needs to be built on -older releases and stable
2447f22a5921SKyle Evans# branches.
2448f22a5921SKyle Evans.if ${BOOTSTRAPPING} < 1300059
244994a82666SRyan Moeller${_bt}-libexec/flua: ${_bt}-lib/liblua ${_bt}-lib/libucl
245094a82666SRyan Moeller_flua= lib/liblua lib/libucl libexec/flua
2451f22a5921SKyle Evans.endif
2452f22a5921SKyle Evans
24530e4e8f1bSBryan Drewery# r245440 mtree -N support added
24540e4e8f1bSBryan Drewery# r313404 requires sha384.h for libnetbsd, added to libmd in r292782
245551c6e78dSBryan Drewery.if ${BOOTSTRAPPING} < 1100093
24569e914c7aSJessica Clarke_libnetbsd=	lib/libnetbsd
245751c6e78dSBryan Drewery_nmtree=	lib/libmd \
245841a8e223SBrooks Davis		usr.sbin/nmtree
2459aebc0e35SEnji Cooper
246051c6e78dSBryan Drewery${_bt}-lib/libnetbsd: ${_bt}-lib/libmd
2461aebc0e35SEnji Cooper${_bt}-usr.sbin/nmtree: ${_bt}-lib/libnetbsd
24628f62bca4SAlex Richardson.else
24638f62bca4SAlex Richardson_bootstrap_tools_links+=mtree
246441a8e223SBrooks Davis.endif
246541a8e223SBrooks Davis
24668502220dSWarner Losh# r246097: log addition login.conf.db, passwd, pwd.db, and spwd.db with cat -l
24678502220dSWarner Losh.if ${BOOTSTRAPPING} < 1000027
24688502220dSWarner Losh_cat=		bin/cat
24698502220dSWarner Losh.else
24708502220dSWarner Losh_bootstrap_tools_links+=cat
24718502220dSWarner Losh.endif
24728502220dSWarner Losh
24738502220dSWarner Losh# r277259 crunchide: Correct 64-bit section header offset
24748502220dSWarner Losh# r281674 crunchide: always include both 32- and 64-bit ELF support
24758502220dSWarner Losh.if ${BOOTSTRAPPING} < 1100078
24768502220dSWarner Losh_crunchide=	usr.sbin/crunch/crunchide
24778502220dSWarner Losh.else
24788502220dSWarner Losh_bootstrap_tools_links+=crunchide
24798502220dSWarner Losh.endif
24808502220dSWarner Losh
248193f5ab12SDimitry Andric# 1400052, 1300526, 1203507: Removed -dc from linker invocation
248293f5ab12SDimitry Andric.if ${BOOTSTRAPPING} < 1203507 || \
248393f5ab12SDimitry Andric	(${BOOTSTRAPPING} > 1300000 && ${BOOTSTRAPPING} < 1300526) || \
248493f5ab12SDimitry Andric	(${BOOTSTRAPPING} > 1400000 && ${BOOTSTRAPPING} < 1400052)
2485eb9b07bbSBryan Drewery_crunchgen=	usr.sbin/crunch/crunchgen
24868f62bca4SAlex Richardson.else
24878f62bca4SAlex Richardson_bootstrap_tools_links+=crunchgen
24882d8d8e3cSEd Maste.endif
24892d8d8e3cSEd Maste
24902a4d73f3SJessica Clarke# The ATKBD_DFLT_KEYMAP, UKBD_DFLT_KEYMAP and KBDMUX_DFLT_KEYMAP kernel options
24912a4d73f3SJessica Clarke# require kbdcontrol. Note that, even on FreeBSD, the host will lack kbdcontrol
24922a4d73f3SJessica Clarke# if built with WITHOUT_LEGACY_CONSOLE.
24932a4d73f3SJessica Clarke.if defined(BOOTSTRAP_ALL_TOOLS) || !exists(/usr/sbin/kbdcontrol)
24942a4d73f3SJessica Clarke_kbdcontrol=	usr.sbin/kbdcontrol
24952a4d73f3SJessica Clarke.else
24962a4d73f3SJessica Clarke_bootstrap_tools_links+=kbdcontrol
24972a4d73f3SJessica Clarke.endif
24982a4d73f3SJessica Clarke
24999e914c7aSJessica Clarke.if ${MK_DISK_IMAGE_TOOLS_BOOTSTRAP} != "no"
25009e914c7aSJessica Clarke_etdump=	usr.bin/etdump
25019e914c7aSJessica Clarke_makefs=	usr.sbin/makefs
25029e914c7aSJessica Clarke
25039e914c7aSJessica Clarke_libnetbsd=	lib/libnetbsd
25049e914c7aSJessica Clarke${_bt}-usr.sbin/makefs: ${_bt}-lib/libnetbsd
25059e914c7aSJessica Clarke
25069e914c7aSJessica Clarke.if defined(BOOTSTRAP_ALL_TOOLS)
25079e914c7aSJessica Clarke_libsbuf=	lib/libsbuf
25089e914c7aSJessica Clarke${_bt}-usr.sbin/makefs: ${_bt}-lib/libsbuf
25099e914c7aSJessica Clarke.endif
25109e914c7aSJessica Clarke.endif
25119e914c7aSJessica Clarke
25120cace0bbSAlex Richardson# 1300102: VHDX support
25130cace0bbSAlex Richardson.if ${BOOTSTRAPPING} < 1201520 || \
25149e914c7aSJessica Clarke	(${BOOTSTRAPPING} > 1300000 && ${BOOTSTRAPPING} < 1300102) || \
25159e914c7aSJessica Clarke	${MK_DISK_IMAGE_TOOLS_BOOTSTRAP} != "no"
25160cace0bbSAlex Richardson_mkimg=	usr.bin/mkimg
25170cace0bbSAlex Richardson.else
25180cace0bbSAlex Richardson_bootstrap_tools_links+=mkimg
25190cace0bbSAlex Richardson.endif
25200cace0bbSAlex Richardson
2521eb61f7bdSEmmanuel Vadot_yacc=		usr.bin/yacc
25229c633debSJung-uk Kim
252351483c42SEnji Cooper.if ${MK_BSNMP} != "no"
2524d6acfaf5SRuslan Ermilov_gensnmptree=	usr.sbin/bsnmpd/gensnmptree
2525d6acfaf5SRuslan Ermilov.endif
2526d6acfaf5SRuslan Ermilov
2527c97e5167SAlex Richardson
2528ffe63c8bSEd Maste# We need to build tblgen when we're building clang or lld, either as
2529ffe63c8bSEd Maste# bootstrap tools, or as the part of the normal build.
2530021385abSAlex Richardson# llvm-tblgen is also needed for various llvm binutils (e.g. objcopy).
2531ffe63c8bSEd Maste.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_CLANG} != "no" || \
2532c5d1d88aSAlex Richardson    ${MK_LLD_BOOTSTRAP} != "no" || ${MK_LLD} != "no" || \
2533021385abSAlex Richardson    ${MK_LLDB} != "no" || ${MK_LLVM_BINUTILS} != "no"
2534907eed1fSDimitry Andric_clang_tblgen= \
2535986e05bcSDimitry Andric	lib/clang/libllvmminimal \
2536fe013be4SDimitry Andric	usr.bin/clang/llvm-min-tblgen \
2537c5d1d88aSAlex Richardson	usr.bin/clang/llvm-tblgen
2538adc88b9cSEd Maste.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_CLANG} != "no" || \
2539adc88b9cSEd Maste    ${MK_LLDB} != "no"
254081ad6265SDimitry Andric_clang_tblgen+=	lib/clang/libclangminimal
2541c5d1d88aSAlex Richardson_clang_tblgen+= usr.bin/clang/clang-tblgen
2542c5d1d88aSAlex Richardson.endif
2543c5d1d88aSAlex Richardson.if ${MK_LLDB} != "no"
2544c5d1d88aSAlex Richardson_clang_tblgen+=	usr.bin/clang/lldb-tblgen
2545c5d1d88aSAlex Richardson.endif
2546986e05bcSDimitry Andric${_bt}-usr.bin/clang/clang-tblgen: ${_bt}-lib/clang/libllvmminimal
254784ee6de9SDimitry Andric${_bt}-usr.bin/clang/lldb-tblgen: ${_bt}-lib/clang/libllvmminimal
2548fe013be4SDimitry Andric${_bt}-usr.bin/clang/llvm-min-tblgen: ${_bt}-lib/clang/libllvmminimal
2549fe013be4SDimitry Andric${_bt}-usr.bin/clang/llvm-tblgen: ${_bt}-lib/clang/libllvmminimal
2550fe013be4SDimitry Andric${_bt}-usr.bin/clang/llvm-tblgen: ${_bt}-usr.bin/clang/llvm-min-tblgen
2551907eed1fSDimitry Andric.endif
2552907eed1fSDimitry Andric
2553298ee47eSBjoern A. Zeeb# C.UTF-8 is always built in share/ctypes and we need localedef for that.
25548f62bca4SAlex Richardson_localedef=	usr.bin/localedef
25555bb9250eSAlex Richardson${_bt}-usr.bin/localedef: ${_bt}-usr.bin/yacc ${_bt_lex_depend}
25568f62bca4SAlex Richardson
25572de949cfSAlex Richardson.if ${MK_ICONV} != "no"
25582de949cfSAlex Richardson_mkesdb=	usr.bin/mkesdb
25592de949cfSAlex Richardson_mkcsmapper=	usr.bin/mkcsmapper
2560cc134505SAlex Richardson${_bt}-usr.bin/mkesdb: ${_bt}-usr.bin/yacc ${_bt_lex_depend}
2561cc134505SAlex Richardson${_bt}-usr.bin/mkcsmapper: ${_bt}-usr.bin/yacc ${_bt_lex_depend}
25622de949cfSAlex Richardson.endif
25632de949cfSAlex Richardson
256484f54c4fSCy Schubert.if ${MK_KERBEROS} != "no"
256584f54c4fSCy Schubert_kerberos5_bootstrap_tools= \
256684f54c4fSCy Schubert	kerberos5/tools/make-roken \
256784f54c4fSCy Schubert	kerberos5/lib/libroken \
256884f54c4fSCy Schubert	kerberos5/lib/libvers \
256984f54c4fSCy Schubert	kerberos5/tools/asn1_compile \
257084f54c4fSCy Schubert	kerberos5/tools/slc \
257184f54c4fSCy Schubert	usr.bin/compile_et
257284f54c4fSCy Schubert
257384f54c4fSCy Schubert.ORDER: ${_kerberos5_bootstrap_tools:C/^/${_bt}-/g}
25748f62bca4SAlex Richardson.for _tool in ${_kerberos5_bootstrap_tools}
25758f62bca4SAlex Richardson${_bt}-${_tool}: ${_bt}-usr.bin/yacc ${_bt_lex_depend}
25768f62bca4SAlex Richardson.endfor
257784f54c4fSCy Schubert.endif
257884f54c4fSCy Schubert
25797666f500SBaptiste Daroussin${_bt}-usr.bin/mandoc: ${_bt}-lib/libopenbsd
25808faa40d1SBaptiste Daroussin
25818f62bca4SAlex Richardson# The tools listed in _basic_bootstrap_tools will generally not be
25828f62bca4SAlex Richardson# bootstrapped unless BOOTSTRAP_ALL_TOOL is set. However, when building on a
25838f62bca4SAlex Richardson# Linux or MacOS host the host versions are incompatible so we need to build
25848f62bca4SAlex Richardson# them from the source tree. Usually the link name will be the same as the subdir,
25858f62bca4SAlex Richardson# but some directories such as grep or test install multiple binaries. In that
25868f62bca4SAlex Richardson# case we use the _basic_bootstrap_tools_multilink variable which is a list of
25878f62bca4SAlex Richardson# subdirectory and comma-separated list of files.
25888f62bca4SAlex Richardson_basic_bootstrap_tools_multilink=usr.bin/grep grep,egrep,fgrep
25898f62bca4SAlex Richardson_basic_bootstrap_tools_multilink+=bin/test test,[
25908f62bca4SAlex Richardson# bootstrap tools needed by buildworld:
25915bb9250eSAlex Richardson_basic_bootstrap_tools+=usr.bin/cut bin/expr usr.bin/gencat usr.bin/join \
25925bb9250eSAlex Richardson    usr.bin/mktemp bin/realpath bin/rmdir usr.bin/sed usr.bin/sort \
25938f62bca4SAlex Richardson    usr.bin/truncate usr.bin/tsort
2594f57b27e3SAlex Richardson# Some build scripts use nawk instead of awk (this happens at least in
2595f57b27e3SAlex Richardson# cddl/contrib/opensolaris/lib/libdtrace/common/mknames.sh) so we need both awk
2596f57b27e3SAlex Richardson# and nawk in ${WORLDTMP}/legacy/bin.
2597f57b27e3SAlex Richardson_basic_bootstrap_tools_multilink+=usr.bin/awk awk,nawk
25988f62bca4SAlex Richardson# file2c is required for building usr.sbin/config:
25998f62bca4SAlex Richardson_basic_bootstrap_tools+=usr.bin/file2c
26008f62bca4SAlex Richardson# uuencode/uudecode required for share/tabset
260147bcbde9SPiotr Pawel Stefaniak_basic_bootstrap_tools_multilink+=usr.bin/bintrans uuencode,uudecode
26028f62bca4SAlex Richardson# xargs is required by mkioctls
26038f62bca4SAlex Richardson_basic_bootstrap_tools+=usr.bin/xargs
26048f62bca4SAlex Richardson# cap_mkdb is required for share/termcap:
26058f62bca4SAlex Richardson_basic_bootstrap_tools+=usr.bin/cap_mkdb
26068f62bca4SAlex Richardson# services_mkdb/pwd_mkdb are required for installworld:
26078f62bca4SAlex Richardson_basic_bootstrap_tools+=usr.sbin/services_mkdb usr.sbin/pwd_mkdb
26085bb9250eSAlex Richardson# ldd is required for installcheck (TODO: just always use /usr/bin/ldd instead?)
26095bb9250eSAlex Richardson.if !defined(CROSSBUILD_HOST)
26105bb9250eSAlex Richardson# ldd is only needed for updating the running system so we don't need to
26115bb9250eSAlex Richardson# bootstrap ldd on non-FreeBSD systems
26125bb9250eSAlex Richardson_basic_bootstrap_tools+=usr.bin/ldd
26135bb9250eSAlex Richardson.endif
26148f62bca4SAlex Richardson# sysctl/chflags are required for installkernel:
26155bb9250eSAlex Richardson.if !defined(CROSSBUILD_HOST)
2616e5ccad50SAlex Richardson_basic_bootstrap_tools+=bin/chflags
2617e5ccad50SAlex Richardson# Note: sysctl does not bootstrap on FreeBSD < 13 anymore, but that doesn't
2618e5ccad50SAlex Richardson# matter since we don't need any of the new features for the build.
2619e5ccad50SAlex Richardson_bootstrap_tools_links+=sysctl
26205bb9250eSAlex Richardson.else
26215bb9250eSAlex Richardson# When building on non-FreeBSD, install a fake chflags instead since the
26225bb9250eSAlex Richardson# version from the source tree cannot work. We also don't need sysctl since we
26235bb9250eSAlex Richardson# are install with -DNO_ROOT.
26245bb9250eSAlex Richardson_other_bootstrap_tools+=tools/build/cross-build/fake_chflags
26255bb9250eSAlex Richardson.endif
2626c10d927cSAlex Richardson# mkfifo is used by sys/conf/newvers.sh
2627c10d927cSAlex Richardson_basic_bootstrap_tools+=usr.bin/mkfifo
26283ac62888SAlex Richardson# jot is needed for the mkimg tests
26293ac62888SAlex Richardson_basic_bootstrap_tools+=usr.bin/jot
26308f62bca4SAlex Richardson
26318f62bca4SAlex Richardson.if ${MK_BOOT} != "no"
26328f62bca4SAlex Richardson# md5 is used by boot/beri (and possibly others)
26338f62bca4SAlex Richardson_basic_bootstrap_tools+=sbin/md5
26348f62bca4SAlex Richardson.endif
26358f62bca4SAlex Richardson
2636d4fdfd3fSJessica Clarke# tzsetup is needed as an install tool
2637d4fdfd3fSJessica Clarke.if ${MK_ZONEINFO} != "no"
2638d4fdfd3fSJessica Clarke_basic_bootstrap_tools+=usr.sbin/tzsetup
2639d4fdfd3fSJessica Clarke.endif
2640d4fdfd3fSJessica Clarke
26418f62bca4SAlex Richardson.if defined(BOOTSTRAP_ALL_TOOLS)
26428f62bca4SAlex Richardson_other_bootstrap_tools+=${_basic_bootstrap_tools}
26438f62bca4SAlex Richardson.for _subdir _links in ${_basic_bootstrap_tools_multilink}
26448f62bca4SAlex Richardson_other_bootstrap_tools+=${_subdir}
26458f62bca4SAlex Richardson.endfor
26468f62bca4SAlex Richardson${_bt}-usr.bin/awk: ${_bt_lex_depend} ${_bt}-usr.bin/yacc
26478f62bca4SAlex Richardson${_bt}-bin/expr: ${_bt_lex_depend} ${_bt}-usr.bin/yacc
26488f62bca4SAlex Richardson# If we are bootstrapping file2c, we have to build it before config:
26498f62bca4SAlex Richardson${_bt}-usr.sbin/config: ${_bt}-usr.bin/file2c ${_bt_lex_depend}
26508f62bca4SAlex Richardson# Note: no symlink to make/bmake in the !BOOTSTRAP_ALL_TOOLS case here since
26518f62bca4SAlex Richardson# the links to make/bmake make links will have already have been created in the
26528f62bca4SAlex Richardson# `make legacy` step. Not adding a link to make is important on non-FreeBSD
26538f62bca4SAlex Richardson# since "make" will usually point to GNU make there.
26548f62bca4SAlex Richardson_other_bootstrap_tools+=usr.bin/bmake
26555bb9250eSAlex Richardson
26565bb9250eSAlex Richardson# Avoid dependency on host bz2 headers:
26575bb9250eSAlex Richardson_other_bootstrap_tools+=lib/libbz2
26585bb9250eSAlex Richardson${_bt}-usr.bin/grep: ${_bt}-lib/libbz2
26598d5d3295SJessica Clarke
26608d5d3295SJessica Clarke# libdwarf depends on libz
26618d5d3295SJessica Clarke_other_bootstrap_tools+=lib/libz
26628d5d3295SJessica Clarke${_bt}-lib/libdwarf: ${_bt}-lib/libz
26638f7eb330SJessica Clarke
26648f7eb330SJessica Clarke# libroken depends on libcrypt
26658f7eb330SJessica Clarke_other_bootstrap_tools+=lib/libcrypt
26668f7eb330SJessica Clarke${_bt}-lib/libroken: ${_bt}-lib/libcrypt
26678f62bca4SAlex Richardson.else
26688f62bca4SAlex Richardson# All tools in _basic_bootstrap_tools have the same name as the subdirectory
26698f62bca4SAlex Richardson# so we can use :T to get the name of the symlinks that we need to create.
26708f62bca4SAlex Richardson_bootstrap_tools_links+=${_basic_bootstrap_tools:T}
26718f62bca4SAlex Richardson.for _subdir _links in ${_basic_bootstrap_tools_multilink}
26728f62bca4SAlex Richardson_bootstrap_tools_links+=${_links:S/,/ /g}
26738f62bca4SAlex Richardson.endfor
26748f62bca4SAlex Richardson.endif	# defined(BOOTSTRAP_ALL_TOOLS)
26758f62bca4SAlex Richardson
26768f62bca4SAlex Richardson# Link the tools that we need for building but don't need to bootstrap because
26778f62bca4SAlex Richardson# the host version is known to be compatible into ${WORLDTMP}/legacy
26788f62bca4SAlex Richardson# We do this before building any of the bootstrap tools in case they depend on
26798f62bca4SAlex Richardson# the presence of any of the links (e.g. as m4/lex/awk)
26808f62bca4SAlex Richardson${_bt}-links: .PHONY
26818f62bca4SAlex Richardson
26828f62bca4SAlex Richardson.for _tool in ${_bootstrap_tools_links}
26834b7bf842SBryan Drewery${_bt}-link-${_tool}: .PHONY
268433176cdcSWarner Losh	@rm -f "${WORLDTMP}/legacy/bin/${_tool}"; \
26858f62bca4SAlex Richardson	source_path=`which ${_tool}`; \
26868f62bca4SAlex Richardson	if [ ! -e "$${source_path}" ] ; then \
26878f62bca4SAlex Richardson		echo "Cannot find host tool '${_tool}'"; false; \
26888f62bca4SAlex Richardson	fi; \
26890e533c72SWarner Losh	cp -pf "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}"
26908f62bca4SAlex Richardson${_bt}-links: ${_bt}-link-${_tool}
26918f62bca4SAlex Richardson.endfor
26928f62bca4SAlex Richardson
26938f62bca4SAlex Richardsonbootstrap-tools: ${_bt}-links .PHONY
2694aebc0e35SEnji Cooper
2695c79f2d97SDavid E. O'Brien#	Please document (add comment) why something is in 'bootstrap-tools'.
2696c79f2d97SDavid E. O'Brien#	Try to bound the building of the bootstrap-tool to just the
2697c79f2d97SDavid E. O'Brien#	FreeBSD versions that need the tool built at this stage of the build.
26983cc95654SRuslan Ermilov.for _tool in \
2699907eed1fSDimitry Andric    ${_clang_tblgen} \
270084f54c4fSCy Schubert    ${_kerberos5_bootstrap_tools} \
27013cc95654SRuslan Ermilov    ${_strfile} \
2702134b3783SEd Maste    usr.bin/dtc \
270364dc091fSBrooks Davis    ${_cat} \
2704915d57aeSEd Maste    ${_kbdcontrol} \
27056806504dSAlex Richardson    ${_elftoolchain_libs} \
27062fbed5e9SJessica Clarke    ${_kldxref} \
2707a13a8505SBryan Drewery    lib/libopenbsd \
2708a13a8505SBryan Drewery    usr.bin/mandoc \
27093cc95654SRuslan Ermilov    usr.bin/rpcgen \
271003bc68caSEd Schouten    ${_yacc} \
2711ab76bc97SJung-uk Kim    ${_m4} \
27125bfe3851SDag-Erling Smørgrav    ${_lex} \
27138f62bca4SAlex Richardson    ${_other_bootstrap_tools} \
27143cc95654SRuslan Ermilov    usr.bin/xinstall \
271500602d09SGiorgos Keramidas    ${_gensnmptree} \
2716b4f7a31fSKyle Evans    usr.sbin/config \
2717f22a5921SKyle Evans    ${_flua} \
2718eb9b07bbSBryan Drewery    ${_crunchide} \
2719eb9b07bbSBryan Drewery    ${_crunchgen} \
27209e914c7aSJessica Clarke    ${_etdump} \
27219e914c7aSJessica Clarke    ${_libnetbsd} \
27229e914c7aSJessica Clarke    ${_libsbuf} \
27239e914c7aSJessica Clarke    ${_makefs} \
27240cace0bbSAlex Richardson    ${_mkimg} \
2725cce0f182SEd Maste    ${_nmtree} \
272657df665aSBaptiste Daroussin    ${_vtfontcvt} \
272780cedb80SBryan Drewery    ${_localedef} \
27282de949cfSAlex Richardson    ${_mkcsmapper} \
27292de949cfSAlex Richardson    ${_mkesdb} \
27307a4a5200SDag-Erling Smørgrav    ${_zic} \
273180cedb80SBryan Drewery    ${LOCAL_BSTOOL_DIRS}
27328f62bca4SAlex Richardson${_bt}-${_tool}: ${_bt}-links .PHONY .MAKE
2733497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
2734b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
27352abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
27368f62bca4SAlex Richardson		if [ "${_tool}" = "usr.bin/lex" ]; then \
27378f62bca4SAlex Richardson			${MAKE} DIRPRFX=${_tool}/ bootstrap; \
27388f62bca4SAlex Richardson		fi; \
2739b67490a3SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ all; \
2740dfa09989SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy install
2741aebc0e35SEnji Cooper
2742aebc0e35SEnji Cooperbootstrap-tools: ${_bt}-${_tool}
274376762624SMarcel Moolenaar.endfor
27445bb9250eSAlex Richardson.if target(${_bt}-lib/libmd)
27455bb9250eSAlex Richardson# If we are bootstrapping libmd (e.g. when building on macOS/Linux) add the
27465bb9250eSAlex Richardson# necessary dependencies:
27475bb9250eSAlex Richardson${_bt}-usr.bin/sort: ${_bt}-lib/libmd
27485bb9250eSAlex Richardson${_bt}-usr.bin/xinstall: ${_bt}-lib/libmd
27495bb9250eSAlex Richardson${_bt}-sbin/md5: ${_bt}-lib/libmd
27505bb9250eSAlex Richardson.endif
27515bb9250eSAlex Richardson
275276762624SMarcel Moolenaar
275376762624SMarcel Moolenaar#
275476762624SMarcel Moolenaar# build-tools: Build special purpose build tools
275576762624SMarcel Moolenaar#
2756ebe45c64SAlex Richardson.if !defined(NO_SHARE) && ${MK_SYSCONS} != "no"
275776762624SMarcel Moolenaar_share=	share/syscons/scrnmaps
275876762624SMarcel Moolenaar.endif
275976762624SMarcel Moolenaar
2760e1fe3dbaSRuslan Ermilov.if ${MK_RESCUE} != "no"
27619aca5cedSWarner Losh# rescue includes programs that have build-tools targets
2762a20c015cSGordon Tetlow_rescue=rescue/rescue
2763a20c015cSGordon Tetlow.endif
2764a20c015cSGordon Tetlow
2765e133ecbbSEnji Cooper.if ${MK_TCSH} != "no"
2766e133ecbbSEnji Cooper_tcsh=bin/csh
2767e133ecbbSEnji Cooper.endif
27687202739fSAlex Richardson.if ${MK_FILE} != "no"
27697202739fSAlex Richardson_libmagic=lib/libmagic
27707202739fSAlex Richardson.endif
2771e133ecbbSEnji Cooper
2772689c7e79SMitchell Horne.if ${MK_PMC} != "no"
2773959826caSMatt Macy_jevents=lib/libpmc/pmu-events
2774e98bbcf9SMatt Macy.endif
2775e98bbcf9SMatt Macy
27765a4121a8SBryan Drewery# kernel-toolchain skips _cleanobj, so handle cleaning up previous
27775a4121a8SBryan Drewery# build-tools directories if needed.
277875766799SEd Maste.if ${MK_CLEAN} == "yes" && make(kernel-toolchain)
27795a4121a8SBryan Drewery_bt_clean=	${CLEANDIR}
27805a4121a8SBryan Drewery.endif
27815a4121a8SBryan Drewery
27823cc95654SRuslan Ermilov.for _tool in \
2783e133ecbbSEnji Cooper    ${_tcsh} \
27843cc95654SRuslan Ermilov    bin/sh \
27859b428cfaSAdrian Chadd    ${LOCAL_TOOL_DIRS} \
2786e98bbcf9SMatt Macy    ${_jevents} \
2787cbc83e37SBaptiste Daroussin    lib/ncurses/tinfo \
2788572ec1c5SXin LI    ${_rescue} \
27893cc95654SRuslan Ermilov    ${_share} \
27903cc95654SRuslan Ermilov    usr.bin/awk \
27917202739fSAlex Richardson    ${_libmagic} \
279257f80467SEd Maste    usr.bin/vi/catalog
279368847f14SBryan Drewerybuild-tools_${_tool}: .PHONY
27945a4121a8SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (${_bt_clean:D${_bt_clean},}obj,build-tools)"; \
2795b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
27965a4121a8SBryan Drewery		if [ -n "${_bt_clean}" ]; then ${MAKE} DIRPRFX=${_tool}/ ${_bt_clean}; fi; \
27972abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
27982ff31e0dSRuslan Ermilov		${MAKE} DIRPRFX=${_tool}/ build-tools
279968847f14SBryan Drewerybuild-tools: build-tools_${_tool}
280076762624SMarcel Moolenaar.endfor
280176762624SMarcel Moolenaar
280276762624SMarcel Moolenaar#
2803f382c38eSIan Lepore# kernel-tools: Build kernel-building tools
2804f382c38eSIan Lepore#
2805c943a53eSBryan Drewerykernel-tools: .PHONY
2806dfa09989SBryan Drewery	mkdir -p ${WORLDTMP}/usr
280755a5b46aSAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
2808dfa09989SBryan Drewery	    -p ${WORLDTMP}/usr >/dev/null
2809f382c38eSIan Lepore
2810f382c38eSIan Lepore#
2811996d8a0dSWarner Losh# cross-tools: All the tools needed to build the rest of the system after
2812996d8a0dSWarner Losh# we get done with the earlier stages. It is the last set of tools needed
2813996d8a0dSWarner Losh# to begin building the target binaries.
2814bfc59eb8SMarcel Moolenaar#
28154805dd68SAlex Richardson.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${BUILD_WITH_STRICT_TMPPATH} != 0
2816620b3a0cSRuslan Ermilov.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
28171d19afdeSMarcel Moolenaar_btxld=		usr.sbin/btxld
2818b501b9b5SRuslan Ermilov.endif
28193d42ee26SRuslan Ermilov.endif
2820bd42830fSRuslan Ermilov
2821b5512f3bSEd Maste# Rebuild ctfconvert and ctfmerge to avoid difficult-to-diagnose failures
2822b5512f3bSEd Maste# resulting from missing bug fixes or ELF Toolchain updates.
2823b5512f3bSEd Maste.if ${MK_CDDL} != "no"
28249e5787d2SMatt Macy_dtrace_tools= cddl/lib/libctf cddl/lib/libspl cddl/usr.bin/ctfconvert \
2825b5512f3bSEd Maste    cddl/usr.bin/ctfmerge
2826b5512f3bSEd Maste.endif
2827b5512f3bSEd Maste
28282bf36e7eSWarner Losh# If we're given an XAS, don't build binutils.
28297d612a43SEd Maste.if ${XAS:M/*} == ""
283008474898SEd Maste.if ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
283131942939SEd Maste_elftctools=	lib/libelftc \
2832c1da2974SEd Maste		lib/libpe \
2833c6081deaSMarcin Wojtas		usr.bin/elfctl \
28349b135747SKonstantin Belousov		usr.bin/elfdump \
28359b844631SEd Maste		usr.bin/objcopy \
283631942939SEd Maste		usr.bin/nm \
283731942939SEd Maste		usr.bin/size \
283831942939SEd Maste		usr.bin/strings
283927051ca1SEd Maste# These are not required by the build, but can be useful for developers who
284027051ca1SEd Maste# cross-build on a FreeBSD 10 host:
284127051ca1SEd Maste_elftctools+=	usr.bin/addr2line
284231942939SEd Maste.endif
284308474898SEd Maste.elif ${TARGET_ARCH} != ${MACHINE_ARCH} && ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
2844a8bed44aSEd Maste# If cross-building with an external binutils we still need to build strip for
2845a8bed44aSEd Maste# the target (for at least crunchide).
2846a8bed44aSEd Maste_elftctools=	lib/libelftc \
2847c1da2974SEd Maste		lib/libpe \
2848c6081deaSMarcin Wojtas		usr.bin/elfctl \
28499b135747SKonstantin Belousov		usr.bin/elfdump \
28509b844631SEd Maste		usr.bin/objcopy
28510163af23SWarner Losh.endif
28520163af23SWarner Losh
28532bf36e7eSWarner Losh.if ${MK_CLANG_BOOTSTRAP} != "no"
2854338f97feSDimitry Andric_clang=		usr.bin/clang
2855ffe63c8bSEd Maste.endif
2856ffe63c8bSEd Maste.if ${MK_LLD_BOOTSTRAP} != "no"
2857ffe63c8bSEd Maste_lld=		usr.bin/clang/lld
2858ffe63c8bSEd Maste.endif
2859ffe63c8bSEd Maste.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_LLD_BOOTSTRAP} != "no"
2860907eed1fSDimitry Andric_clang_libs=	lib/clang
28610163af23SWarner Losh.endif
2862b61e5e48SEnji Cooper.if ${MK_USB} != "no"
2863ca987d46SWarner Losh_usb_tools=	stand/usb/tools
2864b61e5e48SEnji Cooper.endif
28650163af23SWarner Losh
28668f62bca4SAlex Richardson.if ${BUILD_WITH_STRICT_TMPPATH} != 0 || defined(BOOTSTRAP_ALL_TOOLS)
28678f62bca4SAlex Richardson_ar=usr.bin/ar
28688f62bca4SAlex Richardson.endif
28698f62bca4SAlex Richardson
2870d82fd861SBryan Drewerycross-tools: .MAKE .PHONY
28713cc95654SRuslan Ermilov.for _tool in \
28724143850bSBryan Drewery    ${LOCAL_XTOOL_DIRS} \
28738f62bca4SAlex Richardson    ${_ar} \
2874ad8a0e42SRui Paulo    ${_clang_libs} \
2875ad8a0e42SRui Paulo    ${_clang} \
2876737872e9SEd Maste    ${_lld} \
287731942939SEd Maste    ${_elftctools} \
2878b5512f3bSEd Maste    ${_dtrace_tools} \
28793cc95654SRuslan Ermilov    ${_btxld} \
2880b61e5e48SEnji Cooper    ${_usb_tools}
2881497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
2882b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
28832abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
2884b67490a3SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ all; \
2885dfa09989SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP} install
2886894157f5SMarcel Moolenaar.endfor
2887894157f5SMarcel Moolenaar
2888ca95e9ddSBryan Drewery#
2889bf3befadSSean Bruno# native-xtools is the current target for qemu-user cross builds of ports
2890bf3befadSSean Bruno# via poudriere and the imgact_binmisc kernel module.
2891ca95e9ddSBryan Drewery# This target merely builds a toolchan/sysroot, then builds the tools it wants
2892ca95e9ddSBryan Drewery# with the options it wants in a special MAKEOBJDIRPREFIX, using the toolchain
2893ca95e9ddSBryan Drewery# already built.  It then installs the static tools to NXBDESTDIR for Poudriere
2894ca95e9ddSBryan Drewery# to pickup.
2895ca95e9ddSBryan Drewery#
28963d165b2fSBryan DreweryNXBOBJROOT=	${OBJROOT}${MACHINE}.${MACHINE_ARCH}/nxb/
28979cde684dSBryan DreweryNXBOBJTOP=	${NXBOBJROOT}${NXB_TARGET}.${NXB_TARGET_ARCH}
28985bd47cc5SBryan DreweryNXTP?=		/nxb-bin
28995bd47cc5SBryan Drewery.if ${NXTP:N/*}
29005bd47cc5SBryan Drewery.error NXTP variable should be an absolute path
29015bd47cc5SBryan Drewery.endif
29025bd47cc5SBryan DreweryNXBDESTDIR?=	${DESTDIR}${NXTP}
2903ca95e9ddSBryan Drewery
2904ca95e9ddSBryan Drewery# This is the list of tools to be built/installed as static and where
2905ca95e9ddSBryan Drewery# appropriate to build for the given TARGET.TARGET_ARCH.
2906ca95e9ddSBryan DreweryNXBDIRS+= \
2907e98c3c3fSSean Bruno    bin/cat \
2908e98c3c3fSSean Bruno    bin/chmod \
2909e98c3c3fSSean Bruno    bin/cp \
2910e133ecbbSEnji Cooper    ${_tcsh} \
2911e93397e5SSean Bruno    bin/echo \
2912e98c3c3fSSean Bruno    bin/expr \
2913e93397e5SSean Bruno    bin/hostname \
2914e98c3c3fSSean Bruno    bin/ln \
2915e98c3c3fSSean Bruno    bin/ls \
2916e98c3c3fSSean Bruno    bin/mkdir \
2917e93397e5SSean Bruno    bin/mv \
2918e98c3c3fSSean Bruno    bin/ps \
2919e98c3c3fSSean Bruno    bin/realpath \
2920e98c3c3fSSean Bruno    bin/rm \
2921e98c3c3fSSean Bruno    bin/rmdir \
29222c8c40a7SSean Bruno    bin/sh \
2923e98c3c3fSSean Bruno    bin/sleep \
29242c8c40a7SSean Bruno    sbin/md5 \
2925e98c3c3fSSean Bruno    sbin/sysctl \
2926ca95e9ddSBryan Drewery    usr.bin/addr2line \
2927ca95e9ddSBryan Drewery    usr.bin/ar \
292875872267SWarner Losh    usr.bin/awk \
2929e98c3c3fSSean Bruno    usr.bin/basename \
293075872267SWarner Losh    usr.bin/bmake \
29312c8c40a7SSean Bruno    usr.bin/bzip2 \
2932e98c3c3fSSean Bruno    usr.bin/cmp \
2933ca95e9ddSBryan Drewery    usr.bin/diff \
2934e98c3c3fSSean Bruno    usr.bin/dirname \
29359b844631SEd Maste    usr.bin/objcopy \
2936e98c3c3fSSean Bruno    usr.bin/env \
29372c8c40a7SSean Bruno    usr.bin/fetch \
2938e98c3c3fSSean Bruno    usr.bin/find \
2939e98c3c3fSSean Bruno    usr.bin/grep \
29402c8c40a7SSean Bruno    usr.bin/gzip \
294113212983SAntoine Brodin    usr.bin/head \
2942e98c3c3fSSean Bruno    usr.bin/id \
294375872267SWarner Losh    usr.bin/lex \
2944111bf579SAntoine Brodin    usr.bin/limits \
2945ca95e9ddSBryan Drewery    usr.bin/mandoc \
2946e98c3c3fSSean Bruno    usr.bin/mktemp \
2947e98c3c3fSSean Bruno    usr.bin/mt \
2948ca95e9ddSBryan Drewery    usr.bin/nm \
2949e98c3c3fSSean Bruno    usr.bin/patch \
295027f134b6SBryan Drewery    usr.bin/readelf \
295175872267SWarner Losh    usr.bin/sed \
2952ca95e9ddSBryan Drewery    usr.bin/size \
2953e98c3c3fSSean Bruno    usr.bin/sort \
2954ca95e9ddSBryan Drewery    usr.bin/strings \
29552c8c40a7SSean Bruno    usr.bin/tar \
2956e98c3c3fSSean Bruno    usr.bin/touch \
2957e98c3c3fSSean Bruno    usr.bin/tr \
2958e98c3c3fSSean Bruno    usr.bin/true \
2959e98c3c3fSSean Bruno    usr.bin/uniq \
29602c8c40a7SSean Bruno    usr.bin/unzip \
29619c8f66cbSAntoine Brodin    usr.bin/wc \
2962e98c3c3fSSean Bruno    usr.bin/xargs \
2963e98c3c3fSSean Bruno    usr.bin/xinstall \
29642c8c40a7SSean Bruno    usr.bin/xz \
2965e98c3c3fSSean Bruno    usr.bin/yacc \
2966e98c3c3fSSean Bruno    usr.sbin/chown
2967ca95e9ddSBryan Drewery
29689cde684dSBryan DrewerySUBDIR_DEPEND_usr.bin/clang=	lib/clang
2969ca95e9ddSBryan Drewery.if ${MK_CLANG} != "no"
2970ca95e9ddSBryan DreweryNXBDIRS+=	lib/clang
2971ca95e9ddSBryan DreweryNXBDIRS+=	usr.bin/clang
29729cde684dSBryan Drewery.endif
29739cde684dSBryan Drewery# XXX: native-xtools passes along ${NXBDIRS} in SUBDIR_OVERRIDE that needs
29749cde684dSBryan Drewery# to be evaluated after NXBDIRS is set.
29759cde684dSBryan Drewery.if make(install) && !empty(SUBDIR_OVERRIDE)
29769cde684dSBryan DrewerySUBDIR=	${SUBDIR_OVERRIDE}
29779cde684dSBryan Drewery.endif
2978ca95e9ddSBryan Drewery
2979ca95e9ddSBryan DreweryNXBMAKEARGS+= \
2980dfa09989SBryan Drewery	OBJTOP=${NXBOBJTOP:Q} \
2981dfa09989SBryan Drewery	OBJROOT=${NXBOBJROOT:Q} \
2982ca95e9ddSBryan Drewery	-DNO_SHARED \
2983ca95e9ddSBryan Drewery	-DNO_CPU_CFLAGS \
2984ca95e9ddSBryan Drewery	-DNO_PIC \
29859c8f66cbSAntoine Brodin	MK_CASPER=no \
2986ca95e9ddSBryan Drewery	MK_CLANG_EXTRAS=no \
29870a9ab9f5SConrad Meyer	MK_CLANG_FORMAT=no \
2988ca95e9ddSBryan Drewery	MK_CLANG_FULL=no \
2989ca95e9ddSBryan Drewery	MK_CTF=no \
2990ca95e9ddSBryan Drewery	MK_DEBUG_FILES=no \
2991ca95e9ddSBryan Drewery	MK_HTML=no \
2992ca95e9ddSBryan Drewery	MK_LLDB=no \
2993ca95e9ddSBryan Drewery	MK_MAN=no \
2994ca95e9ddSBryan Drewery	MK_MAN_UTILS=yes \
2995ca95e9ddSBryan Drewery	MK_OFED=no \
2996ca95e9ddSBryan Drewery	MK_OPENSSH=no \
2997ca95e9ddSBryan Drewery	MK_PROFILE=no \
2998fc191b11SEd Maste	MK_RETPOLINE=no \
2999ca95e9ddSBryan Drewery	MK_SENDMAIL=no \
300061ed578eSMitchell Horne	MK_SSP=no \
3001ca95e9ddSBryan Drewery	MK_TESTS=no \
30027fa2f2a6SAlex Richardson	MK_WERROR=no \
3003ca95e9ddSBryan Drewery	MK_ZFS=no
3004ca95e9ddSBryan Drewery
3005b60770fcSBryan DreweryNXBMAKEENV+= \
3006b60770fcSBryan Drewery	MAKEOBJDIRPREFIX=
3007b60770fcSBryan Drewery
3008e2e2c622SKyle Evans# This should match all of the knobs in lib/Makefile that it takes to avoid
3009e2e2c622SKyle Evans# descending into lib/clang!
3010e2e2c622SKyle EvansNXBTNOTOOLS=	MK_CLANG=no MK_LLD=no MK_LLDB=no MK_LLVM_BINUTILS=no
3011e2e2c622SKyle Evans
30129cde684dSBryan Drewery.if make(native-xtools*) && \
30139cde684dSBryan Drewery    (!defined(NXB_TARGET) || !defined(NXB_TARGET_ARCH))
30149cde684dSBryan Drewery.error Missing NXB_TARGET / NXB_TARGET_ARCH
30159cde684dSBryan Drewery.endif
3016ca95e9ddSBryan Drewery# For 'toolchain' we want to produce native binaries that themselves generate
3017ca95e9ddSBryan Drewery# native binaries.
3018ca95e9ddSBryan DreweryNXBTMAKE=	${NXBMAKEENV} ${MAKE} ${NXBMAKEARGS:N-DNO_PIC:N-DNO_SHARED} \
3019ca95e9ddSBryan Drewery		TARGET=${MACHINE} TARGET_ARCH=${MACHINE_ARCH}
3020ca95e9ddSBryan Drewery# For 'everything' we want to produce native binaries (hence -target to
3021ca95e9ddSBryan Drewery# be MACHINE) that themselves generate TARGET.TARGET_ARCH binaries.
3022ca95e9ddSBryan Drewery# TARGET/TARGET_ARCH are still passed along from user.
30239cde684dSBryan Drewery#
30249cde684dSBryan Drewery# Use the toolchain we create as an external toolchain.
30259cde684dSBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes" || ${XCC:N${CCACHE_BIN}:M/*}
30269cde684dSBryan DreweryNXBMAKE+=	XCC="${XCC}" \
30279cde684dSBryan Drewery		XCXX="${XCXX}" \
30289cde684dSBryan Drewery		XCPP="${XCPP}"
30299cde684dSBryan Drewery.else
30309cde684dSBryan DreweryNXBMAKE+=	XCC="${NXBOBJTOP}/tmp/usr/bin/cc" \
30319cde684dSBryan Drewery		XCXX="${NXBOBJTOP}/tmp/usr/bin/c++" \
30329cde684dSBryan Drewery		XCPP="${NXBOBJTOP}/tmp/usr/bin/cpp"
30339cde684dSBryan Drewery.endif
30349cde684dSBryan DreweryNXBMAKE+=	${NXBMAKEENV} ${MAKE} -f Makefile.inc1 ${NXBMAKEARGS} \
303552de22caSMitchell Horne		MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} \
30369cde684dSBryan Drewery		TARGET=${NXB_TARGET} TARGET_ARCH=${NXB_TARGET_ARCH} \
3037ca95e9ddSBryan Drewery		TARGET_TRIPLE=${MACHINE_TRIPLE:Q}
30389cde684dSBryan Drewery# NXBDIRS is improperly based on MACHINE rather than NXB_TARGET.  Need to
303957f80467SEd Maste# invoke a sub-make to reevaluate MK_CLANG, etc, for NXBDIRS.
30409cde684dSBryan DreweryNXBMAKE+=	SUBDIR_OVERRIDE='$${NXBDIRS:M*}'
30419cde684dSBryan Drewery# Need to avoid the -isystem logic when using clang as an external toolchain
30429cde684dSBryan Drewery# even if the TARGET being built for wants GCC.
30439cde684dSBryan DreweryNXBMAKE+=	WANT_COMPILER_TYPE='$${X_COMPILER_TYPE}'
3044ca95e9ddSBryan Drewerynative-xtools: .PHONY
304557f80467SEd Maste	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _cleanobj
3046ca95e9ddSBryan Drewery	# Build the bootstrap/host/cross tools that produce native binaries
304757f80467SEd Maste	${_+_}cd ${.CURDIR}; ${NXBTMAKE} kernel-toolchain
3048ca95e9ddSBryan Drewery	# Populate includes/libraries sysroot that produce native binaries.
3049ca95e9ddSBryan Drewery	# This is split out from 'toolchain' above mostly so that target LLVM
3050ca95e9ddSBryan Drewery	# libraries have a proper LLVM_DEFAULT_TARGET_TRIPLE without
3051e2e2c622SKyle Evans	# polluting the cross-compiler build.  The LLVM libs are skipped
3052ca95e9ddSBryan Drewery	# here to avoid the problem but are kept in 'toolchain' so that
3053ca95e9ddSBryan Drewery	# needed build tools are built.
3054e2e2c622SKyle Evans	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _includes ${NXBTNOTOOLS}
3055e2e2c622SKyle Evans	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _libraries ${NXBTNOTOOLS}
30562abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
30579cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} _obj
3058ca95e9ddSBryan Drewery.endif
30599cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} everything
30605bd47cc5SBryan Drewery	@echo ">> native-xtools done.  Use 'make native-xtools-install' to install to a given DESTDIR"
30615bd47cc5SBryan Drewery
30625bd47cc5SBryan Drewerynative-xtools-install: .PHONY
3063ca95e9ddSBryan Drewery	mkdir -p ${NXBDESTDIR}/bin ${NXBDESTDIR}/sbin ${NXBDESTDIR}/usr
306455a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
3065ca95e9ddSBryan Drewery	    -p ${NXBDESTDIR}/usr >/dev/null
306655a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
3067ca95e9ddSBryan Drewery	    -p ${NXBDESTDIR}/usr/include >/dev/null
306881250b9cSMike Karels.for d in ${LIBCOMPAT_INCLUDE_DIRS}
306981250b9cSMike Karels	mkdir -p ${NXBDESTDIR}/usr/include/${d}
307081250b9cSMike Karels.endfor
30719cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} \
3072ca95e9ddSBryan Drewery	    DESTDIR=${NXBDESTDIR} \
3073ca95e9ddSBryan Drewery	    -DNO_ROOT \
3074ca95e9ddSBryan Drewery	    install
307575872267SWarner Losh
3076894157f5SMarcel Moolenaar#
307711fb97daSJohn Birrell# hierarchy - ensure that all the needed directories are present
307811fb97daSJohn Birrell#
3079d82fd861SBryan Dreweryhierarchy hier: .MAKE .PHONY
3080b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}/etc; ${HMAKE} distrib-dirs
308111fb97daSJohn Birrell
308211fb97daSJohn Birrell#
3083894157f5SMarcel Moolenaar# libraries - build all libraries, and install them under ${DESTDIR}.
308411fb97daSJohn Birrell#
30854d8bba46SRuslan Ermilov# The list of libraries with dependents (${_prebuild_libs}) and their
30864d8bba46SRuslan Ermilov# interdependencies (__L) are built automatically by the
30874d8bba46SRuslan Ermilov# ${.CURDIR}/tools/make_libdeps.sh script.
308811fb97daSJohn Birrell#
3089d82fd861SBryan Drewerylibraries: .MAKE .PHONY
3090b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}; \
3091b67490a3SBryan Drewery	    ${MAKE} -f Makefile.inc1 _prereq_libs; \
3092b67490a3SBryan Drewery	    ${MAKE} -f Makefile.inc1 _startup_libs; \
3093fd4b13acSPierre Pronchery	    ${MAKE} -f Makefile.inc1 _prebuild_libs -DLIBCRYPTO_WITHOUT_SUBDIRS; \
3094bb6d7d0eSSimon J. Gerraty	    ${MAKE} -f Makefile.inc1 _generic_libs
30954d8bba46SRuslan Ermilov
309625a362d7SAlexander Kabaev#
309725a362d7SAlexander Kabaev# static libgcc.a prerequisite for shared libc
309825a362d7SAlexander Kabaev#
3099c7fbd772SEd Maste_prereq_libs= lib/libcompiler_rt
3100c615275cSEd Maste.if ${MK_SSP} != "no"
3101cd0d51baSKyle Evans_prereq_libs+= lib/libssp_nonshared
3102c615275cSEd Maste.endif
31037bc797e3SAlex Richardson.if ${MK_ASAN} != "no"
31047bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/asan
31057bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/asan-preinit
31067bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/asan_cxx
3107d98193f0SSHENG-YI HONG_prereq_libs+=	lib/libclang_rt/asan_static
31087bc797e3SAlex Richardson.endif
31097bc797e3SAlex Richardson.if ${MK_UBSAN} != "no"
31107bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/ubsan_minimal
31117bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/ubsan_standalone
31127bc797e3SAlex Richardson_prereq_libs+=	lib/libclang_rt/ubsan_standalone_cxx
31137bc797e3SAlex Richardson.endif
311425a362d7SAlexander Kabaev
311592815c0cSRuslan Ermilov# These dependencies are not automatically generated:
311692815c0cSRuslan Ermilov#
3117c4501804SEd Maste# lib/csu and lib/libc must be built before
311825a362d7SAlexander Kabaev# all shared libraries for ELF.
311992815c0cSRuslan Ermilov#
31207dc61ac1SAndrew Turner_startup_libs=	lib/csu
312125a362d7SAlexander Kabaev_startup_libs+=	lib/libc
3122091b8336SPeter Wemm_startup_libs+=	lib/libc_nonshared
31237a984708SDavid Chisnall_startup_libs+=	lib/libcxxrt
312425a362d7SAlexander Kabaev
3125c7fbd772SEd Maste_prereq_libs+=	lib/libgcc_eh lib/libgcc_s
3126c7fbd772SEd Maste_startup_libs+=	lib/libgcc_eh lib/libgcc_s
3127c7fbd772SEd Maste
3128c7fbd772SEd Mastelib/libgcc_s__L: lib/libc__L
3129c7fbd772SEd Mastelib/libgcc_s__L: lib/libc_nonshared__L
3130c7fbd772SEd Mastelib/libcxxrt__L: lib/libgcc_s__L
313111fb97daSJohn Birrell
3132ae771770SStanislav Sedov_prebuild_libs=	${_kerberos5_lib_libasn1} \
3133ae771770SStanislav Sedov		${_kerberos5_lib_libhdb} \
3134ae771770SStanislav Sedov		${_kerberos5_lib_libheimbase} \
3135611ff617SStanislav Sedov		${_kerberos5_lib_libheimntlm} \
3136f3dba867SBaptiste Daroussin		${_libsqlite3} \
3137ae771770SStanislav Sedov		${_kerberos5_lib_libheimipcc} \
31380f49f7ebSRuslan Ermilov		${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \
31390f49f7ebSRuslan Ermilov		${_kerberos5_lib_libroken} \
3140ae771770SStanislav Sedov		${_kerberos5_lib_libwind} \
31410e46933cSStanislav Sedov		lib/libbz2 ${_libcom_err} lib/libcrypt \
3142ac4c695aSEd Maste		lib/libc++ \
3143b18ddb2aSMikolaj Golub		lib/libelf lib/libexpat \
31442b293f6aSDevin Teske		lib/libfigpar \
31452c284d93SGleb Smirnoff		${_lib_libgssapi} \
314673577bf0SRyan Moeller		lib/libjail \
314742a85952SPawel Jakub Dawidek		lib/libkiconv lib/libkvm lib/liblzma lib/libmd lib/libnv \
3148d567f909SBaptiste Daroussin		lib/libzstd \
3149c501d73cSMariusz Zaborski		${_lib_casper} \
3150cbc83e37SBaptiste Daroussin		lib/ncurses/tinfo \
3151821aa63aSBaptiste Daroussin		lib/ncurses/ncurses \
3152483a2262SEd Maste		lib/ncurses/form \
31530aa27001SDag-Erling Smørgrav		lib/libpam/libpam lib/libthr \
315431a741f4SEnji Cooper		${_lib_libradius} lib/libsbuf lib/libtacplus \
3155c36047bdSXin LI		lib/libgeom \
3156f7893816SMartin Matuska		${_lib_librt} \
3157e9832bb1SMartin Matuska		${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
3158c36047bdSXin LI		${_cddl_lib_libuutil} \
3159e00e69abSXin LI		${_cddl_lib_libavl} \
31609e5787d2SMatt Macy		${_cddl_lib_libicp} \
31619e5787d2SMatt Macy		${_cddl_lib_libicp_rescue} \
31629e5787d2SMatt Macy		${_cddl_lib_libspl} \
31639e5787d2SMatt Macy		${_cddl_lib_libtpool} \
3164f335e41bSKyle Evans		${_cddl_lib_libzfs_core} ${_cddl_lib_libzfs} \
31659e5787d2SMatt Macy		${_cddl_lib_libzutil} \
3166e307eb94SToomas Soome		${_cddl_lib_libctf} ${_cddl_lib_libzfsbootenv} \
3167e4b0a90eSBrooks Davis		lib/libufs \
31682f02600aSPawel Jakub Dawidek		lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
3169aef45041SDomagoj Stolfa		lib/libxo \
3170d97bf519SDag-Erling Smørgrav		${_secure_lib_libcrypto} ${_secure_lib_libssl} \
3171d97bf519SDag-Erling Smørgrav		${_lib_libldns} ${_secure_lib_libssh}
31727cbd0a29SBryan Drewery
3173f987297fSEd Maste.if ${MK_DIALOG} != "no"
3174f987297fSEd Maste_prebuild_libs+= gnu/lib/libdialog
3175cbc83e37SBaptiste Daroussingnu/lib/libdialog__L: lib/msun__L lib/ncurses/tinfo__L lib/ncurses/ncurses__L
3176f987297fSEd Maste.endif
3177f987297fSEd Maste
3178eb578fecSKyle Evans.if ${MK_GOOGLETEST} != "no"
3179eb578fecSKyle Evans_prebuild_libs+= lib/libregex
3180eb578fecSKyle Evans.endif
3181eb578fecSKyle Evans
318261fbd61bSDimitry Andriclib/libgeom__L: lib/libexpat__L lib/libsbuf__L
31837f911abeSJohn Baldwinlib/libkvm__L: lib/libelf__L
3184c36047bdSXin LI
318531a741f4SEnji Cooper.if ${MK_RADIUS_SUPPORT} != "no"
318631a741f4SEnji Cooper_lib_libradius=	lib/libradius
318731a741f4SEnji Cooper.endif
318831a741f4SEnji Cooper
31894d7876aaSKyle Evanslib/ncurses/ncurses__L:	lib/ncurses/tinfo__L
3190483a2262SEd Mastelib/ncurses/form__L: lib/ncurses/ncurses__L
31914d7876aaSKyle Evans
3192aa0a1e58SJeff Roberson.if ${MK_OFED} != "no"
3193f39bffc6SKonstantin Belousov_prebuild_libs+= \
3194f39bffc6SKonstantin Belousov	lib/ofed/libibverbs \
3195f39bffc6SKonstantin Belousov	lib/ofed/libibmad \
3196f39bffc6SKonstantin Belousov	lib/ofed/libibumad \
3197f39bffc6SKonstantin Belousov	lib/ofed/complib \
3198f39bffc6SKonstantin Belousov	lib/ofed/libmlx5
3199400b94bbSBryan Drewery
3200f39bffc6SKonstantin Belousovlib/ofed/libibmad__L:	lib/ofed/libibumad__L
3201f39bffc6SKonstantin Belousovlib/ofed/complib__L:	lib/libthr__L
3202f39bffc6SKonstantin Belousovlib/ofed/libmlx5__L:	lib/ofed/libibverbs__L lib/libthr__L
3203aa0a1e58SJeff Roberson.endif
3204aa0a1e58SJeff Roberson
320542a85952SPawel Jakub Dawidek.if ${MK_CASPER} != "no"
3206c501d73cSMariusz Zaborski_lib_casper=	lib/libcasper
320742a85952SPawel Jakub Dawidek.endif
320842a85952SPawel Jakub Dawidek
32092f02600aSPawel Jakub Dawideklib/libpjdlog__L: lib/libutil__L
3210c501d73cSMariusz Zaborskilib/libcasper__L: lib/libnv__L
3211a19aa4f7SKyle Evanslib/liblzma__L: lib/libmd__L lib/libthr__L
3212af3ccc07SBaptiste Daroussinlib/libzstd__L: lib/libthr__L
3213f7893816SMartin Matuskalib/librt__L: lib/libthr__L
32142f02600aSPawel Jakub Dawidek
3215eb61f7bdSEmmanuel Vadot_generic_libs=	${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib}
3216ae9f7248SBryan Drewery.if ${MK_IPFILTER} != "no"
3217ae9f7248SBryan Drewery_generic_libs+=	sbin/ipf/libipf
3218ae9f7248SBryan Drewery.endif
32196e4ee6ddSBrooks Davis.for _DIR in ${LOCAL_LIB_DIRS}
3220e93e5bb0SIan Lepore.if ${_DIR} == ".WAIT"  || (empty(_generic_libs:M${_DIR}) && exists(${.CURDIR}/${_DIR}/Makefile))
32216e4ee6ddSBrooks Davis_generic_libs+= ${_DIR}
32226e4ee6ddSBrooks Davis.endif
32236e4ee6ddSBrooks Davis.endfor
322411fb97daSJohn Birrell
3225bd9049eeSDag-Erling Smørgravlib/libtacplus__L: lib/libmd__L lib/libpam/libpam__L
3226aef45041SDomagoj Stolfalib/libxo__L: lib/libutil__L
3227127a2cfaSJohn Polstra
3228ceef0c31SPawel Jakub Dawidek.if ${MK_CDDL} != "no"
32296be04ba6SPawel Jakub Dawidek_cddl_lib_libumem= cddl/lib/libumem
3230e9832bb1SMartin Matuska_cddl_lib_libnvpair= cddl/lib/libnvpair
3231e00e69abSXin LI_cddl_lib_libavl= cddl/lib/libavl
3232c36047bdSXin LI_cddl_lib_libuutil= cddl/lib/libuutil
32339e5787d2SMatt Macy_cddl_lib_libspl= cddl/lib/libspl
32349e5787d2SMatt Macy
32357b3642daSMark Johnstoncddl/lib/libavl__L: cddl/lib/libspl__L
32367b3642daSMark Johnstoncddl/lib/libnvpair__L: cddl/lib/libspl__L
32379e5787d2SMatt Macycddl/lib/libuutil__L: cddl/lib/libavl__L cddl/lib/libspl__L
32389e5787d2SMatt Macy
3239b7c6a063SBryan Drewery.if ${MK_ZFS} != "no"
3240f7893816SMartin Matuska_lib_librt= lib/librt
32419e5787d2SMatt Macy_cddl_lib_libicp= cddl/lib/libicp
32429e5787d2SMatt Macy_cddl_lib_libicp_rescue= cddl/lib/libicp_rescue
32439e5787d2SMatt Macy_cddl_lib_libtpool= cddl/lib/libtpool
32449e5787d2SMatt Macy_cddl_lib_libzutil= cddl/lib/libzutil
3245dce1a726SMartin Matuska_cddl_lib_libzfs_core= cddl/lib/libzfs_core
3246f335e41bSKyle Evans_cddl_lib_libzfs= cddl/lib/libzfs
3247e307eb94SToomas Soome_cddl_lib_libzfsbootenv= cddl/lib/libzfsbootenv
324835d2028fSKyle Evans
32499e5787d2SMatt Macycddl/lib/libtpool__L: cddl/lib/libspl__L
32509e5787d2SMatt Macy
32519e9c651cSGreg Vcddl/lib/libzutil__L: cddl/lib/libavl__L lib/libgeom__L lib/msun__L cddl/lib/libtpool__L
32529e5787d2SMatt Macy
32539e9c651cSGreg Vcddl/lib/libzfs_core__L: cddl/lib/libnvpair__L cddl/lib/libspl__L cddl/lib/libzutil__L
325435d2028fSKyle Evans
3255f7893816SMartin Matuskacddl/lib/libzfs__L: cddl/lib/libzfs_core__L lib/msun__L lib/libutil__L lib/librt__L
325635d2028fSKyle Evanscddl/lib/libzfs__L: lib/libthr__L lib/libmd__L lib/libz__L cddl/lib/libumem__L
325735d2028fSKyle Evanscddl/lib/libzfs__L: cddl/lib/libuutil__L cddl/lib/libavl__L lib/libgeom__L
32589e5787d2SMatt Macycddl/lib/libzfs__L: cddl/lib/libnvpair__L cddl/lib/libzutil__L
3259cd568e2bSRyan Moellercddl/lib/libzfs__L: secure/lib/libcrypto__L
326035d2028fSKyle Evans
3261e307eb94SToomas Soomecddl/lib/libzfsbootenv__L: cddl/lib/libzfs__L
3262e307eb94SToomas Soomelib/libbe__L: cddl/lib/libzfs__L cddl/lib/libzfsbootenv__L
3263b7c6a063SBryan Drewery.endif
326406429175SMark Johnston_cddl_lib_libctf= cddl/lib/libctf
3265ceef0c31SPawel Jakub Dawidek_cddl_lib= cddl/lib
32669e5787d2SMatt Macycddl/lib/libctf__L: lib/libz__L cddl/lib/libspl__L
3267aef45041SDomagoj Stolfacddl/lib/libdtrace__L: lib/libxo__L
3268ceef0c31SPawel Jakub Dawidek.endif
326975ababf8SWarner Losh# cddl/lib/libdtrace requires lib/libproc and lib/librtld_db
3270a7e13d50SMark Johnston_prebuild_libs+=	lib/libprocstat lib/libproc lib/librtld_db
327187ae8210SMark Johnstonlib/libprocstat__L: lib/libelf__L lib/libkvm__L lib/libutil__L
3272a7e13d50SMark Johnstonlib/libproc__L: lib/libprocstat__L
3273a7e13d50SMark Johnstonlib/librtld_db__L: lib/libprocstat__L
3274ceef0c31SPawel Jakub Dawidek
3275e1fe3dbaSRuslan Ermilov.if ${MK_CRYPT} != "no"
3276e1fe3dbaSRuslan Ermilov.if ${MK_OPENSSL} != "no"
327749e62f1cSRuslan Ermilov_secure_lib_libcrypto= secure/lib/libcrypto
327849e62f1cSRuslan Ermilov_secure_lib_libssl= secure/lib/libssl
3279e4a93f1eSRuslan Ermilovlib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L
3280e4a41be5SDag-Erling Smørgravsecure/lib/libcrypto__L: lib/libthr__L
32819cfa8b3fSDag-Erling Smørgrav.if ${MK_LDNS} != "no"
32829cfa8b3fSDag-Erling Smørgrav_lib_libldns= lib/libldns
3283e4a41be5SDag-Erling Smørgravlib/libldns__L: secure/lib/libssl__L
32849cfa8b3fSDag-Erling Smørgrav.endif
3285c1f5e730SAntoine Brodin.if ${MK_OPENSSH} != "no"
3286c1f5e730SAntoine Brodin_secure_lib_libssh= secure/lib/libssh
3287c1f5e730SAntoine Brodinsecure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L
32889cfa8b3fSDag-Erling Smørgrav.if ${MK_LDNS} != "no"
32899cfa8b3fSDag-Erling Smørgravsecure/lib/libssh__L: lib/libldns__L
32909cfa8b3fSDag-Erling Smørgrav.endif
329194ef145eSEnji Cooper.if ${MK_GSSAPI} != "no" && ${MK_KERBEROS_SUPPORT} != "no"
32920f49f7ebSRuslan Ermilovsecure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \
32930f49f7ebSRuslan Ermilov    kerberos5/lib/libhx509__L kerberos5/lib/libasn1__L lib/libcom_err__L \
32940f49f7ebSRuslan Ermilov    lib/libmd__L kerberos5/lib/libroken__L
3295466b960fSRuslan Ermilov.endif
32964d8bba46SRuslan Ermilov.endif
3297072f6798SRuslan Ermilov.endif
329849e62f1cSRuslan Ermilov_secure_lib=	secure/lib
329949e62f1cSRuslan Ermilov.endif
330049e62f1cSRuslan Ermilov
3301611ff617SStanislav Sedov.if ${MK_KERBEROS} != "no"
3302611ff617SStanislav Sedovkerberos5/lib/libasn1__L: lib/libcom_err__L kerberos5/lib/libroken__L
3303611ff617SStanislav Sedovkerberos5/lib/libhdb__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
3304ae771770SStanislav Sedov    kerberos5/lib/libkrb5__L kerberos5/lib/libroken__L \
3305f3dba867SBaptiste Daroussin    kerberos5/lib/libwind__L lib/libsqlite3__L
3306ae771770SStanislav Sedovkerberos5/lib/libheimntlm__L: secure/lib/libcrypto__L kerberos5/lib/libkrb5__L \
3307ae771770SStanislav Sedov    kerberos5/lib/libroken__L lib/libcom_err__L
3308611ff617SStanislav Sedovkerberos5/lib/libhx509__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
3309ae771770SStanislav Sedov    secure/lib/libcrypto__L kerberos5/lib/libroken__L kerberos5/lib/libwind__L
3310611ff617SStanislav Sedovkerberos5/lib/libkrb5__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
3311611ff617SStanislav Sedov    lib/libcrypt__L secure/lib/libcrypto__L kerberos5/lib/libhx509__L \
3312ae771770SStanislav Sedov    kerberos5/lib/libroken__L kerberos5/lib/libwind__L \
3313ae771770SStanislav Sedov    kerberos5/lib/libheimbase__L kerberos5/lib/libheimipcc__L
3314611ff617SStanislav Sedovkerberos5/lib/libroken__L: lib/libcrypt__L
3315ae771770SStanislav Sedovkerberos5/lib/libwind__L: kerberos5/lib/libroken__L lib/libcom_err__L
3316ae771770SStanislav Sedovkerberos5/lib/libheimbase__L: lib/libthr__L
3317ae771770SStanislav Sedovkerberos5/lib/libheimipcc__L: kerberos5/lib/libroken__L kerberos5/lib/libheimbase__L lib/libthr__L
3318611ff617SStanislav Sedov.endif
3319611ff617SStanislav Sedov
3320645acf41SBaptiste Daroussinlib/libsqlite3__L: lib/libthr__L
3321645acf41SBaptiste Daroussin
3322c1f5e730SAntoine Brodin.if ${MK_GSSAPI} != "no"
3323c1f5e730SAntoine Brodin_lib_libgssapi=	lib/libgssapi
3324c1f5e730SAntoine Brodin.endif
3325c1f5e730SAntoine Brodin
332649e62f1cSRuslan Ermilov.if ${MK_KERBEROS} != "no"
332749e62f1cSRuslan Ermilov_kerberos5_lib=	kerberos5/lib
332849e62f1cSRuslan Ermilov_kerberos5_lib_libasn1= kerberos5/lib/libasn1
3329611ff617SStanislav Sedov_kerberos5_lib_libhdb= kerberos5/lib/libhdb
3330ae771770SStanislav Sedov_kerberos5_lib_libheimbase= kerberos5/lib/libheimbase
333149e62f1cSRuslan Ermilov_kerberos5_lib_libkrb5= kerberos5/lib/libkrb5
333233f12199SDoug Rabson_kerberos5_lib_libhx509= kerberos5/lib/libhx509
333349e62f1cSRuslan Ermilov_kerberos5_lib_libroken= kerberos5/lib/libroken
333433f12199SDoug Rabson_kerberos5_lib_libheimntlm= kerberos5/lib/libheimntlm
3335f3dba867SBaptiste Daroussin_libsqlite3= lib/libsqlite3
3336ae771770SStanislav Sedov_kerberos5_lib_libheimipcc= kerberos5/lib/libheimipcc
3337ae771770SStanislav Sedov_kerberos5_lib_libwind= kerberos5/lib/libwind
33380e46933cSStanislav Sedov_libcom_err= lib/libcom_err
333949e62f1cSRuslan Ermilov.endif
334049e62f1cSRuslan Ermilov
334149e62f1cSRuslan Ermilov.if ${MK_NIS} != "no"
334249e62f1cSRuslan Ermilov_lib_libypclnt=	lib/libypclnt
334392815c0cSRuslan Ermilov.endif
33444d8bba46SRuslan Ermilov
3345e1fe3dbaSRuslan Ermilov.if ${MK_OPENSSL} == "no"
33462eb4b00cSFlorent Thoumielib/libradius__L: lib/libmd__L
3347b4b831efSRuslan Ermilov.endif
3348b4b831efSRuslan Ermilov
33492b42dcf7SEnji Cooperlib/libproc__L: \
3350ac4c695aSEd Maste    ${_cddl_lib_libctf:D${_cddl_lib_libctf}__L} \
3351ac4c695aSEd Maste    lib/libelf__L lib/librtld_db__L lib/libutil__L lib/libcxxrt__L
33522b42dcf7SEnji Cooper
335325a362d7SAlexander Kabaev.for _lib in ${_prereq_libs}
3354bb6d7d0eSSimon J. Gerraty${_lib}__PL: .PHONY .MAKE
33556e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${.CURDIR}/${_lib})
3356497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_lib} (obj,all,install)"; \
3357b67490a3SBryan Drewery		cd ${.CURDIR}/${_lib}; \
33582abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
335998407b8bSWarner Losh		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
3360b67490a3SBryan Drewery		    DIRPRFX=${_lib}/ all; \
336198407b8bSWarner Losh		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
336257028ca4SJulio Merino		    DIRPRFX=${_lib}/ install
336325a362d7SAlexander Kabaev.endif
336425a362d7SAlexander Kabaev.endfor
336525a362d7SAlexander Kabaev
33667cbd0a29SBryan Drewery.for _lib in ${_startup_libs} ${_prebuild_libs} ${_generic_libs}
3367bb6d7d0eSSimon J. Gerraty${_lib}__L: .PHONY .MAKE
33686e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${.CURDIR}/${_lib})
3369497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_lib} (obj,all,install)"; \
3370b67490a3SBryan Drewery		cd ${.CURDIR}/${_lib}; \
33712abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
3372b67490a3SBryan Drewery		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ all; \
337315eee895SWarner Losh		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ install
337430fdccdcSDavid E. O'Brien.endif
337530fdccdcSDavid E. O'Brien.endfor
337630fdccdcSDavid E. O'Brien
337725a362d7SAlexander Kabaev_prereq_libs: ${_prereq_libs:S/$/__PL/}
33784d8bba46SRuslan Ermilov_startup_libs: ${_startup_libs:S/$/__L/}
33794d8bba46SRuslan Ermilov_prebuild_libs: ${_prebuild_libs:S/$/__L/}
33804d8bba46SRuslan Ermilov_generic_libs: ${_generic_libs:S/$/__L/}
33814d8bba46SRuslan Ermilov
338203173d2fSBryan Drewery# Enable SUBDIR_PARALLEL when not calling 'make all', unless called from
33831c2a618bSBryan Drewery# 'everything' with _PARALLEL_SUBDIR_OK set.  This is because it is unlikely
338403173d2fSBryan Drewery# that running 'make all' from the top-level, especially with a SUBDIR_OVERRIDE
338503173d2fSBryan Drewery# or LOCAL_DIRS set, will have a reliable build if SUBDIRs are built in
338603173d2fSBryan Drewery# parallel.  This is safe for the world stage of buildworld though since it has
338703173d2fSBryan Drewery# already built libraries in a proper order and installed includes into
338803173d2fSBryan Drewery# WORLDTMP. Special handling is done for SUBDIR ordering for 'install*' to
338903173d2fSBryan Drewery# avoid trashing a system if it crashes mid-install.
33901c2a618bSBryan Drewery.if !make(all) || defined(_PARALLEL_SUBDIR_OK)
3391fb84a99eSBryan DrewerySUBDIR_PARALLEL=
3392fb84a99eSBryan Drewery.endif
339311fb97daSJohn Birrell
339411fb97daSJohn Birrell.include <bsd.subdir.mk>
3395e2a36081SAlexander Leidinger
339632cd239bSDag-Erling Smørgrav.if make(check-old) || make(check-old-dirs) || \
339732cd239bSDag-Erling Smørgrav    make(check-old-files) || make(check-old-libs) || \
339832cd239bSDag-Erling Smørgrav    make(delete-old) || make(delete-old-dirs) || \
339921baf42cSJohn Baldwin    make(delete-old-files) || make(delete-old-libs) || \
340021baf42cSJohn Baldwin    make(list-old-dirs) || make(list-old-files) || make(list-old-libs)
34011b24254bSAlexander Leidinger
3402e2a36081SAlexander Leidinger#
3403e2a36081SAlexander Leidinger# check for / delete old files section
3404e2a36081SAlexander Leidinger#
3405e2a36081SAlexander Leidinger
3406e2a36081SAlexander Leidinger.include "ObsoleteFiles.inc"
3407e2a36081SAlexander Leidinger
3408e2a36081SAlexander LeidingerOLD_LIBS_MESSAGE="Please be sure no application still uses those libraries, \
3409e2a36081SAlexander Leidingerelse you can not start such an application. Consult UPDATING for more \
3410e2a36081SAlexander Leidingerinformation regarding how to cope with the removal/revision bump of a \
3411e2a36081SAlexander Leidingerspecific library."
3412e2a36081SAlexander Leidinger
3413e2a36081SAlexander Leidinger.if !defined(BATCH_DELETE_OLD_FILES)
3414e2a36081SAlexander LeidingerRM_I=-i
34151b24254bSAlexander Leidinger.else
3416470fb726SEd MasteRM_I=-fv
3417e2a36081SAlexander Leidinger.endif
3418e2a36081SAlexander Leidinger
341921baf42cSJohn Baldwinlist-old-files: .PHONY
342021baf42cSJohn Baldwin	@cd ${.CURDIR}; \
342121baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
3422f7057652SEd Maste	    -V "OLD_FILES:ts\n" -V "OLD_FILES:Musr/share/*.gz:R:ts\n" \
342373099785SEd Maste	    -V "MOVED_LIBS:ts\n" \
3424264594efSJessica Clarke	    ${_ALL_libcompats:@v@-V "OLD_FILES:Mlib/*.so.*:S,^lib,usr/lib$v,:ts\n"@} \
3425264594efSJessica Clarke	    ${_ALL_libcompats:@v@-V "OLD_FILES:Musr/lib/*:S,^usr/lib,usr/lib$v,:ts\n"@} | \
3426264594efSJessica Clarke	sort
342721baf42cSJohn Baldwin
3428c943a53eSBryan Drewerydelete-old-files: .PHONY
3429e2a36081SAlexander Leidinger	@echo ">>> Removing old files (only deletes safe to delete libs)"
3430e2a36081SAlexander Leidinger# Ask for every old file if the user really wants to remove it.
3431188a72eeSBrian Somers# It's annoying, but better safe than sorry.
343286be7546SUlrich Spörlein# NB: We cannot pass the list of OLD_FILES as a parameter because the
343386be7546SUlrich Spörlein# argument list will get too long. Using .for/.endfor make "loops" will make
343486be7546SUlrich Spörlein# the Makefile parser segfault.
343586be7546SUlrich Spörlein	@exec 3<&0; \
34368b78b15bSXin LI	cd ${.CURDIR}; \
343721baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-files | \
343886be7546SUlrich Spörlein	while read file; do \
3439d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
344098a0900aSDag-Erling Smørgrav			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
344186be7546SUlrich Spörlein			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
34428a32134cSAlexander Leidinger		fi; \
3443651e2703SBryan Drewery		for ext in debug symbols; do \
3444651e2703SBryan Drewery		  if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
3445651e2703SBryan Drewery		      "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
3446651e2703SBryan Drewery			  rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
3447651e2703SBryan Drewery			      <&3; \
3448651e2703SBryan Drewery		  fi; \
3449651e2703SBryan Drewery		done; \
3450f27f8258SDag-Erling Smørgrav	done
3451edd04c6fSAlexander Leidinger# Remove catpages without corresponding manpages.
34526f7be14aSJilles Tjoelker	@exec 3<&0; \
34535acedb55SEd Maste	find ${DESTDIR}/usr/share/man/cat* ! -type d 2>/dev/null | sort | \
3454006846f7SRuslan Ermilov	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
3455006846f7SRuslan Ermilov	while read catpage; do \
3456006846f7SRuslan Ermilov		read manpage; \
3457006846f7SRuslan Ermilov		if [ ! -e "$${manpage}" ]; then \
3458006846f7SRuslan Ermilov			rm ${RM_I} $${catpage} <&3; \
3459006846f7SRuslan Ermilov	        fi; \
3460edd04c6fSAlexander Leidinger	done
3461e2a36081SAlexander Leidinger	@echo ">>> Old files removed"
3462e2a36081SAlexander Leidinger
3463c943a53eSBryan Drewerycheck-old-files: .PHONY
3464e2a36081SAlexander Leidinger	@echo ">>> Checking for old files"
34658b78b15bSXin LI	@cd ${.CURDIR}; \
346621baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-files | \
346786be7546SUlrich Spörlein	while read file; do \
3468d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
346961305271SDag-Erling Smørgrav		 	echo "${DESTDIR}/$${file}"; \
347061305271SDag-Erling Smørgrav		fi; \
3471651e2703SBryan Drewery		for ext in debug symbols; do \
3472651e2703SBryan Drewery		  if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
3473651e2703SBryan Drewery			  echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
3474651e2703SBryan Drewery		  fi; \
3475651e2703SBryan Drewery		done; \
347621baf42cSJohn Baldwin	done
3477edd04c6fSAlexander Leidinger# Check for catpages without corresponding manpages.
347871a6afa2SBaptiste Daroussin	@find ${DESTDIR}/usr/share/man/cat* ! -type d 2>/dev/null | \
3479006846f7SRuslan Ermilov	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
3480006846f7SRuslan Ermilov	while read catpage; do \
3481006846f7SRuslan Ermilov		read manpage; \
3482006846f7SRuslan Ermilov		if [ ! -e "$${manpage}" ]; then \
3483006846f7SRuslan Ermilov			echo $${catpage}; \
3484006846f7SRuslan Ermilov	        fi; \
34855acedb55SEd Maste	done | sort
3486e2a36081SAlexander Leidinger
348721baf42cSJohn Baldwinlist-old-libs: .PHONY
348821baf42cSJohn Baldwin	@cd ${.CURDIR}; \
348921baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
349026db5b3eSEd Maste	    -V "OLD_LIBS:ts\n" \
3491264594efSJessica Clarke	    ${_ALL_libcompats:@v@-V "OLD_LIBS:Mlib/*:S,^lib,usr/lib$v,:ts\n"@} \
34929f811192SJessica Clarke	    ${_ALL_libcompats:@v@-V "OLD_LIBS:Musr/lib/*:S,^usr/lib,usr/lib$v,:ts\n"@} \
3493264594efSJessica Clarke	    ${_ALL_libcompats:@v@-V "OLD_LIBS:Mlib/casper/*:S,^lib/casper,usr/lib$v,:ts\n"@} | \
3494264594efSJessica Clarke	sort
349521baf42cSJohn Baldwin
3496c943a53eSBryan Drewerydelete-old-libs: .PHONY
3497e2a36081SAlexander Leidinger	@echo ">>> Removing old libraries"
3498e2a36081SAlexander Leidinger	@echo "${OLD_LIBS_MESSAGE}" | fmt
349986be7546SUlrich Spörlein	@exec 3<&0; \
35008b78b15bSXin LI	cd ${.CURDIR}; \
350121baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-libs | \
350286be7546SUlrich Spörlein	while read file; do \
3503d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
350498a0900aSDag-Erling Smørgrav			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
350586be7546SUlrich Spörlein			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
35068a32134cSAlexander Leidinger		fi; \
3507e45e2255SBryan Drewery		for ext in debug symbols; do \
3508e45e2255SBryan Drewery		  if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
3509e45e2255SBryan Drewery		      "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
3510e45e2255SBryan Drewery			  rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
3511e45e2255SBryan Drewery			      <&3; \
3512e45e2255SBryan Drewery		  fi; \
3513e45e2255SBryan Drewery		done; \
3514f27f8258SDag-Erling Smørgrav	done
3515e2a36081SAlexander Leidinger	@echo ">>> Old libraries removed"
3516e2a36081SAlexander Leidinger
3517c943a53eSBryan Drewerycheck-old-libs: .PHONY
3518e2a36081SAlexander Leidinger	@echo ">>> Checking for old libraries"
35198b78b15bSXin LI	@cd ${.CURDIR}; \
352021baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-libs | \
352186be7546SUlrich Spörlein	while read file; do \
3522d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
352361305271SDag-Erling Smørgrav			echo "${DESTDIR}/$${file}"; \
352461305271SDag-Erling Smørgrav		fi; \
3525e45e2255SBryan Drewery		for ext in debug symbols; do \
3526e45e2255SBryan Drewery		  if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
3527e45e2255SBryan Drewery			  echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
3528e45e2255SBryan Drewery		  fi; \
3529e45e2255SBryan Drewery		done; \
353021baf42cSJohn Baldwin	done
353121baf42cSJohn Baldwin
353221baf42cSJohn Baldwinlist-old-dirs: .PHONY
353321baf42cSJohn Baldwin	@cd ${.CURDIR}; \
353421baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
3535a8267eccSEd Maste	    -V OLD_DIRS | sed -E 's/[[:space:]]+/\n/g' | sort -r
3536e2a36081SAlexander Leidinger
3537c943a53eSBryan Drewerydelete-old-dirs: .PHONY
3538e2a36081SAlexander Leidinger	@echo ">>> Removing old directories"
35398b78b15bSXin LI	@cd ${.CURDIR}; \
354021baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-dirs | \
354186be7546SUlrich Spörlein	while read dir; do \
3542d1e75b81SDag-Erling Smørgrav		if [ -d "${DESTDIR}/$${dir}" ]; then \
3543d1e75b81SDag-Erling Smørgrav			rmdir -v "${DESTDIR}/$${dir}" || true; \
3544d1e75b81SDag-Erling Smørgrav		elif [ -L "${DESTDIR}/$${dir}" ]; then \
3545d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
35468a32134cSAlexander Leidinger		fi; \
354726e28783SDimitry Andric		if [ -d "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
354826e28783SDimitry Andric			rmdir -v "${DESTDIR}${DEBUGDIR}/$${dir}" || true; \
354926e28783SDimitry Andric		elif [ -L "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
355026e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir} is a link, please remove everything manually."; \
355126e28783SDimitry Andric		fi; \
3552f27f8258SDag-Erling Smørgrav	done
3553e2a36081SAlexander Leidinger	@echo ">>> Old directories removed"
3554e2a36081SAlexander Leidinger
3555c943a53eSBryan Drewerycheck-old-dirs: .PHONY
3556e2a36081SAlexander Leidinger	@echo ">>> Checking for old directories"
35578b78b15bSXin LI	@cd ${.CURDIR}; \
355821baf42cSJohn Baldwin	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} list-old-dirs | \
355986be7546SUlrich Spörlein	while read dir; do \
3560d1e75b81SDag-Erling Smørgrav		if [ -d "${DESTDIR}/$${dir}" ]; then \
3561d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir}"; \
3562d1e75b81SDag-Erling Smørgrav		elif [ -L "${DESTDIR}/$${dir}" ]; then \
3563d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
35648a32134cSAlexander Leidinger		fi; \
356526e28783SDimitry Andric		if [ -d "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
356626e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir}"; \
356726e28783SDimitry Andric		elif [ -L "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
356826e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir} is a link, please remove everything manually."; \
356926e28783SDimitry Andric		fi; \
3570f27f8258SDag-Erling Smørgrav	done
3571e2a36081SAlexander Leidinger
3572c943a53eSBryan Drewerydelete-old: delete-old-files delete-old-dirs .PHONY
3573c8de0c57SBryan Drewery	@echo "To remove old libraries run '${MAKE_CMD} delete-old-libs'."
3574e2a36081SAlexander Leidinger
3575c943a53eSBryan Drewerycheck-old: check-old-files check-old-libs check-old-dirs .PHONY
3576c8de0c57SBryan Drewery	@echo "To remove old files and directories run '${MAKE_CMD} delete-old'."
3577c8de0c57SBryan Drewery	@echo "To remove old libraries run '${MAKE_CMD} delete-old-libs'."
3578e2a36081SAlexander Leidinger
35791b24254bSAlexander Leidinger.endif
35801b24254bSAlexander Leidinger
3581c3ed02cfSRuslan Ermilov#
3582c3ed02cfSRuslan Ermilov# showconfig - show build configuration.
3583c3ed02cfSRuslan Ermilov#
3584a1bf1a1aSSimon J. Gerraty# ignore lower case knobs (not for use with WITH*)
3585a1bf1a1aSSimon J. Gerraty#
3586c943a53eSBryan Dreweryshowconfig: .PHONY
3587d7a491ddSEd Maste	@(${MAKE} -n -f ${.CURDIR}/sys/conf/kern.opts.mk -V dummy -dg1 UPDATE_DEPENDFILE=no NO_OBJ=yes MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH}; \
3588a1bf1a1aSSimon J. Gerraty	  ${MAKE} -n -f ${.CURDIR}/share/mk/src.opts.mk -V dummy -dg1 UPDATE_DEPENDFILE=no NO_OBJ=yes) 2>&1 | grep '^MK_[A-Z]' | sort -u
358925bacc78SWarner Losh
3590f263e792SWarner Losh.if !empty(KRNLOBJDIR) && !empty(KERNCONF)
3591f263e792SWarner LoshDTBOUTPUTPATH= ${KRNLOBJDIR}/${KERNCONF}/
3592f263e792SWarner Losh
3593f263e792SWarner Losh.if !defined(FDT_DTS_FILE) || empty(FDT_DTS_FILE)
35946e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${KERNCONFDIR}/${KERNCONF})
3595f263e792SWarner LoshFDT_DTS_FILE!= awk 'BEGIN {FS="="} /^makeoptions[[:space:]]+FDT_DTS_FILE/ {print $$2}' \
3596cf35c685SThomas Quinot	'${KERNCONFDIR}/${KERNCONF}' ; echo
3597f263e792SWarner Losh.endif
3598f263e792SWarner Losh.endif
3599f263e792SWarner Losh
3600f263e792SWarner Losh.endif
3601f263e792SWarner Losh
3602f263e792SWarner Losh.if !defined(DTBOUTPUTPATH) || !exists(${DTBOUTPUTPATH})
3603f263e792SWarner LoshDTBOUTPUTPATH= ${.CURDIR}
3604f263e792SWarner Losh.endif
3605f263e792SWarner Losh
3606f263e792SWarner Losh#
3607f263e792SWarner Losh# Build 'standalone' Device Tree Blob
3608f263e792SWarner Losh#
3609c943a53eSBryan Drewerybuilddtb: .PHONY
361034ac629bSAlex Richardson	@PATH=${TMPPATH:Q} MACHINE=${TARGET} \
3611eb51ce8eSAlex Richardson	sh ${.CURDIR}/sys/tools/fdt/make_dtb.sh ${.CURDIR}/sys \
36120edb7351SWarner Losh	    "${FDT_DTS_FILE}" ${DTBOUTPUTPATH}
361325bacc78SWarner Losh
361425bacc78SWarner Losh###############
361525bacc78SWarner Losh
36162753ba1aSBryan Drewery# cleanworld
36172753ba1aSBryan Drewery# In the following, the first 'rm' in a series will usually remove all
36182753ba1aSBryan Drewery# files and directories.  If it does not, then there are probably some
36192753ba1aSBryan Drewery# files with file flags set, so this unsets them and tries the 'rm' a
36202753ba1aSBryan Drewery# second time.  There are situations where this target will be cleaning
36212753ba1aSBryan Drewery# some directories via more than one method, but that duplication is
36222753ba1aSBryan Drewery# needed to correctly handle all the possible situations.  Removing all
36232753ba1aSBryan Drewery# files without file flags set in the first 'rm' instance saves time,
36242753ba1aSBryan Drewery# because 'chflags' will need to operate on fewer files afterwards.
36252753ba1aSBryan Drewery#
36262753ba1aSBryan Drewery# It is expected that BW_CANONICALOBJDIR == the CANONICALOBJDIR as would be
36272753ba1aSBryan Drewery# created by bsd.obj.mk, except that we don't want to .include that file
3628601594edSBryan Drewery# in this makefile.  We don't do a cleandir walk if MK_AUTO_OBJ is yes
3629601594edSBryan Drewery# since it is not possible for files to land in the wrong place.
36302753ba1aSBryan Drewery#
3631c10062b9SBryan Drewery.if make(cleanworld)
3632c10062b9SBryan DreweryBW_CANONICALOBJDIR:=${OBJTOP}/
36333e65b7d9SWarner Losh.elif make(cleankernel)
36343e65b7d9SWarner LoshBW_CANONICALOBJDIR:=${KRNLOBJDIR}/${KERNCONF}/
3635c10062b9SBryan Drewery.elif make(cleanuniverse)
3636c10062b9SBryan DreweryBW_CANONICALOBJDIR:=${OBJROOT}
3637c10062b9SBryan Drewery.if ${MK_UNIFIED_OBJDIR} == "no"
3638c10062b9SBryan Drewery.error ${.TARGETS} only supported with WITH_UNIFIED_OBJDIR enabled.
36392753ba1aSBryan Drewery.endif
3640c10062b9SBryan Drewery.endif
36413e65b7d9SWarner Loshcleanworld cleanuniverse cleankernel: .PHONY
3642fa65e3a5SBryan Drewery.if !empty(BW_CANONICALOBJDIR) && exists(${BW_CANONICALOBJDIR}) && \
3643fa65e3a5SBryan Drewery    ${.CURDIR:tA} != ${BW_CANONICALOBJDIR:tA}
36443e65b7d9SWarner Losh	-(cd ${BW_CANONICALOBJDIR} && rm -rf *)
3645c10062b9SBryan Drewery	-chflags -R 0 ${BW_CANONICALOBJDIR}
36463e65b7d9SWarner Losh	-(cd ${BW_CANONICALOBJDIR} && rm -rf *)
3647c10062b9SBryan Drewery.endif
3648f649ab27SBryan Drewery.if make(cleanworld) && ${MK_AUTO_OBJ} == "no" && \
3649f649ab27SBryan Drewery    (empty(BW_CANONICALOBJDIR) || ${.CURDIR:tA} == ${BW_CANONICALOBJDIR:tA})
3650ddd945c7SBryan Drewery.if ${.CURDIR} == ${.OBJDIR} || ${.CURDIR}/obj == ${.OBJDIR}
36512753ba1aSBryan Drewery	#   To be safe in this case, fall back to a 'make cleandir'
36522753ba1aSBryan Drewery	${_+_}@cd ${.CURDIR}; ${MAKE} cleandir
36532753ba1aSBryan Drewery.endif
3654601594edSBryan Drewery.endif
36552753ba1aSBryan Drewery
365622cbbf9dSSean Bruno.if ${TARGET} == ${MACHINE} && ${TARGET_ARCH} == ${MACHINE_ARCH}
3657f263e792SWarner LoshXDEV_CPUTYPE?=${CPUTYPE}
3658f263e792SWarner Losh.else
3659f263e792SWarner LoshXDEV_CPUTYPE?=${TARGET_CPUTYPE}
3660f263e792SWarner Losh.endif
3661f263e792SWarner Losh
36622d281361SBaptiste DaroussinNOFUN=-DNO_FSCHG MK_HTML=no -DNO_LINT \
366398407b8bSWarner Losh	MK_MAN=no MK_NLS=no MK_PROFILE=no \
36647fa2f2a6SAlex Richardson	MK_KERBEROS=no MK_RESCUE=no MK_TESTS=no MK_WERROR=no \
366522cbbf9dSSean Bruno	TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
3666f263e792SWarner Losh	CPUTYPE=${XDEV_CPUTYPE}
36679b3d9914SWarner Losh
366822cbbf9dSSean BrunoXDDIR=${TARGET_ARCH}-freebsd
366962c4a462SBaptiste DaroussinXDTP?=/usr/${XDDIR}
367062c4a462SBaptiste Daroussin.if ${XDTP:N/*}
367162c4a462SBaptiste Daroussin.error XDTP variable should be an absolute path
367262c4a462SBaptiste Daroussin.endif
367362c4a462SBaptiste Daroussin
36743d165b2fSBryan DreweryCDBOBJROOT=	${OBJROOT}${MACHINE}.${MACHINE_ARCH}/xdev/
36753d165b2fSBryan DreweryCDBOBJTOP=	${CDBOBJROOT}${XDDIR}
36763d165b2fSBryan DreweryCDBENV= \
36771dc56acdSAndrew Turner	INSTALL="sh ${.CURDIR}/tools/install.sh"
367825bacc78SWarner LoshCDENV= ${CDBENV} \
3679cf44c89bSBaptiste Daroussin	TOOLS_PREFIX=${XDTP}
36803d165b2fSBryan DreweryCDMAKEARGS= \
36813d165b2fSBryan Drewery	OBJTOP=${CDBOBJTOP:Q} \
36823d165b2fSBryan Drewery	OBJROOT=${CDBOBJROOT:Q}
36833d165b2fSBryan DreweryCD2MAKEARGS= ${CDMAKEARGS}
368468a558ecSBryan Drewery
368568a558ecSBryan Drewery.if ${WANT_COMPILER_TYPE} == gcc || \
368668a558ecSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
368768a558ecSBryan Drewery# GCC requires -isystem and -L when using a cross-compiler.  --sysroot
368868a558ecSBryan Drewery# won't set header path and -L is used to ensure the base library path
368968a558ecSBryan Drewery# is added before the port PREFIX library path.
369068a558ecSBryan DreweryCD2CFLAGS+=	-isystem ${XDDESTDIR}/usr/include -L${XDDESTDIR}/usr/lib
369168a558ecSBryan Drewery# GCC requires -B to find /usr/lib/crti.o when using a cross-compiler
369268a558ecSBryan Drewery# combined with --sysroot.
369368a558ecSBryan DreweryCD2CFLAGS+=	-B${XDDESTDIR}/usr/lib
369468a558ecSBryan Drewery# Force using libc++ for external GCC.
36951c0cac23SBryan Drewery.if defined(X_COMPILER_TYPE) && \
36961c0cac23SBryan Drewery    ${X_COMPILER_TYPE} == gcc && ${X_COMPILER_VERSION} >= 40800
369768a558ecSBryan DreweryCD2CXXFLAGS+=	-isystem ${XDDESTDIR}/usr/include/c++/v1 -std=c++11 \
369868a558ecSBryan Drewery		-nostdinc++
369968a558ecSBryan Drewery.endif
370068a558ecSBryan Drewery.endif
370168a558ecSBryan DreweryCD2CFLAGS+=	--sysroot=${XDDESTDIR}/
370268a558ecSBryan DreweryCD2ENV=${CDENV} CC="${CC} ${CD2CFLAGS}" CXX="${CXX} ${CD2CXXFLAGS} ${CD2CFLAGS}" \
3703cf44c89bSBaptiste Daroussin	CPP="${CPP} ${CD2CFLAGS}" \
370422cbbf9dSSean Bruno	MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH}
370525bacc78SWarner Losh
3706dfa09989SBryan DreweryCDTMP=	${OBJTOP}/${XDDIR}/tmp
370734ac629bSAlex RichardsonCDMAKE=${CDENV} PATH=${CDTMP:Q}/usr/bin:${PATH:Q} ${MAKE} ${CDMAKEARGS} ${NOFUN}
370834ac629bSAlex RichardsonCD2MAKE=${CD2ENV} PATH=${CDTMP:Q}/usr/bin:${XDDESTDIR:Q}/usr/bin:${PATH:Q} \
37093d165b2fSBryan Drewery	${MAKE} ${CD2MAKEARGS} ${NOFUN}
37109e580940SBryan Drewery.if ${MK_META_MODE} != "no"
37119e580940SBryan Drewery# Don't rebuild build-tools targets during normal build.
3712dbbb03c2SBryan DreweryCD2MAKE+=	BUILD_TOOLS_META=.NOMETA
37139e580940SBryan Drewery.endif
371486c4ac99SBryan DreweryXDDESTDIR=${DESTDIR}${XDTP}
371525bacc78SWarner Losh
37169e488366SWarner Losh.ORDER: xdev-build xdev-install xdev-links
3717c943a53eSBryan Dreweryxdev: xdev-build xdev-install .PHONY
371825bacc78SWarner Losh
371945fab5d8SAndrew Turner.ORDER: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools
3720c943a53eSBryan Dreweryxdev-build: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools .PHONY
372145fab5d8SAndrew Turner
3722d82fd861SBryan Drewery_xb-worldtmp: .PHONY
372345fab5d8SAndrew Turner	mkdir -p ${CDTMP}/usr
372455a5b46aSAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
372545fab5d8SAndrew Turner	    -p ${CDTMP}/usr >/dev/null
372645fab5d8SAndrew Turner
3727d82fd861SBryan Drewery_xb-bootstrap-tools: .PHONY
372845fab5d8SAndrew Turner.for _tool in \
37292bc62d50SEnji Cooper    ${_clang_tblgen} \
3730e36b831fSBryan Drewery    ${_yacc}
3731497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
3732b67490a3SBryan Drewery	cd ${.CURDIR}/${_tool}; \
37332abeba9dSBryan Drewery	if [ -z "${NO_OBJWALK}" ]; then ${CDMAKE} DIRPRFX=${_tool}/ obj; fi; \
3734b67490a3SBryan Drewery	${CDMAKE} DIRPRFX=${_tool}/ all; \
373545fab5d8SAndrew Turner	${CDMAKE} DIRPRFX=${_tool}/ DESTDIR=${CDTMP} install
373645fab5d8SAndrew Turner.endfor
373725bacc78SWarner Losh
3738d82fd861SBryan Drewery_xb-build-tools: .PHONY
37399b3d9914SWarner Losh	${_+_}@cd ${.CURDIR}; \
37403d165b2fSBryan Drewery	${CDBENV} ${MAKE} ${CDMAKEARGS} -f Makefile.inc1 ${NOFUN} build-tools
374125bacc78SWarner Losh
3742be1ef37bSBryan DreweryXDEVDIRS= \
3743f0696740SBryan Drewery    ${_clang_libs} \
3744c16a698bSBryan Drewery    ${_lld} \
374531942939SEd Maste    ${_elftctools} \
374645fab5d8SAndrew Turner    usr.bin/ar \
374757f80467SEd Maste    ${_clang}
3748be1ef37bSBryan Drewery
3749be1ef37bSBryan Drewery_xb-cross-tools: .PHONY
3750be1ef37bSBryan Drewery.for _tool in ${XDEVDIRS}
3751497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> xdev ${_tool} (obj,all)"; \
3752b67490a3SBryan Drewery	cd ${.CURDIR}/${_tool}; \
37532abeba9dSBryan Drewery	if [ -z "${NO_OBJWALK}" ]; then ${CDMAKE} DIRPRFX=${_tool}/ obj; fi; \
375425bacc78SWarner Losh	${CDMAKE} DIRPRFX=${_tool}/ all
375525bacc78SWarner Losh.endfor
375625bacc78SWarner Losh
3757d82fd861SBryan Drewery_xi-mtree: .PHONY
375825bacc78SWarner Losh	${_+_}@${ECHODIR} "mtree populating ${XDDESTDIR}"
375925bacc78SWarner Losh	mkdir -p ${XDDESTDIR}
376055a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.root.dist \
376125bacc78SWarner Losh	    -p ${XDDESTDIR} >/dev/null
376255a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
376325bacc78SWarner Losh	    -p ${XDDESTDIR}/usr >/dev/null
376455a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
376525bacc78SWarner Losh	    -p ${XDDESTDIR}/usr/include >/dev/null
376681250b9cSMike Karels.for d in ${LIBCOMPAT_INCLUDE_DIRS}
376781250b9cSMike Karels	mkdir -p ${XDDESTDIR}/usr/include/${d}
376881250b9cSMike Karels.endfor
376991d7edd5SJessica Clarke.for libcompat in ${libcompats}
377055a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
377174c52c65SJulio Merino	    -p ${XDDESTDIR}/usr >/dev/null
377291d7edd5SJessica Clarke.endfor
37731782c649SDimitry Andric.if ${MK_TESTS} != "no"
3774f703589eSEnji Cooper	mkdir -p ${XDDESTDIR}${TESTSBASE}
377555a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
3776f703589eSEnji Cooper	    -p ${XDDESTDIR}${TESTSBASE} >/dev/null
37771782c649SDimitry Andric.endif
377825bacc78SWarner Losh
37799e488366SWarner Losh.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
3780c943a53eSBryan Dreweryxdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries .PHONY
378125bacc78SWarner Losh
3782d82fd861SBryan Drewery_xi-cross-tools: .PHONY
378325bacc78SWarner Losh	@echo "_xi-cross-tools"
3784be1ef37bSBryan Drewery.for _tool in ${XDEVDIRS}
378525bacc78SWarner Losh	${_+_}@${ECHODIR} "===> xdev ${_tool} (install)"; \
378625bacc78SWarner Losh	cd ${.CURDIR}/${_tool}; \
378725bacc78SWarner Losh	${CDMAKE} DIRPRFX=${_tool}/ install DESTDIR=${XDDESTDIR}
378825bacc78SWarner Losh.endfor
378925bacc78SWarner Losh
3790d82fd861SBryan Drewery_xi-includes: .PHONY
37912abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
379257820ca8SBryan Drewery	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 _obj \
379357820ca8SBryan Drewery		DESTDIR=${XDDESTDIR}
379457820ca8SBryan Drewery.endif
379503173d2fSBryan Drewery	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 includes \
379625bacc78SWarner Losh		DESTDIR=${XDDESTDIR}
379725bacc78SWarner Losh
3798d82fd861SBryan Drewery_xi-libraries: .PHONY
379925bacc78SWarner Losh	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \
380025bacc78SWarner Losh		DESTDIR=${XDDESTDIR}
380125bacc78SWarner Losh
3802d82fd861SBryan Dreweryxdev-links: .PHONY
380325bacc78SWarner Losh	${_+_}cd ${XDDESTDIR}/usr/bin; \
3804923cfb89SIan Lepore	mkdir -p ../../../../usr/bin; \
380525bacc78SWarner Losh		for i in *; do \
380625bacc78SWarner Losh			ln -sf ../../${XDTP}/usr/bin/$$i \
380725bacc78SWarner Losh			    ../../../../usr/bin/${XDDIR}-$$i; \
380825bacc78SWarner Losh			ln -sf ../../${XDTP}/usr/bin/$$i \
3809dca576beSIan Lepore			    ../../../../usr/bin/${XDDIR}${_REVISION}-$$i; \
381025bacc78SWarner Losh		done
3811