xref: /freebsd-12.1/Makefile.inc1 (revision 68762cd7)
111fb97daSJohn Birrell#
297d92980SPeter Wemm# $FreeBSD$
311fb97daSJohn Birrell#
411fb97daSJohn Birrell# Make command line options:
5f45a5bbdSRuslan Ermilov#	-DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
6f45a5bbdSRuslan Ermilov#	-DNO_CLEAN do not clean at all
74a63ae11SBrooks Davis#	-DDB_FROM_SRC use the user/group databases in src/etc instead of
84a63ae11SBrooks Davis#	    the system database when installing.
96495335eSRuslan Ermilov#	-DNO_SHARE do not go into share subdir
10497e8091SBryan Drewery#	-DKERNFAST define NO_KERNEL{CONFIG,CLEAN,OBJ}
1159bb1d9cSBrian Somers#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
126d84d742SPeter Wemm#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
1362012822SWarner Losh#	-DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel
14ef102276SSheldon Hearn#	-DNO_PORTSUPDATE do not update ports in ${MAKE} update
154a63ae11SBrooks Davis#	-DNO_ROOT install without using root privilege
16ef102276SSheldon Hearn#	-DNO_DOCUPDATE do not update doc in ${MAKE} update
1796267df3SWarner Losh#	-DWITHOUT_CTF do not run the DTrace CTF conversion tools on built objects
1811fb97daSJohn Birrell#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
19a0e6a013SBryan Drewery#	LOCAL_ITOOLS="list of tools" to add additional tools to the ITOOLS list
205814131aSBrooks Davis#	LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
2129f5a35cSBrooks Davis#	LOCAL_MTREE="list of mtree files" to process to allow local directories
2229f5a35cSBrooks Davis#	    to be created before files are installed
239b428cfaSAdrian Chadd#	LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools
249b428cfaSAdrian Chadd#	    list
254143850bSBryan Drewery#	LOCAL_XTOOL_DIRS="list of dirs" to add additional dirs to the
264143850bSBryan Drewery#	    cross-tools target
274a63ae11SBrooks Davis#	METALOG="path to metadata log" to write permission and ownership
284a63ae11SBrooks Davis#	    when NO_ROOT is set.  (default: ${DESTDIR}/METALOG)
29e6cb78fbSRuslan Ermilov#	TARGET="machine" to crossbuild world for a different machine type
30f672e5fbSWarner Losh#	TARGET_ARCH= may be required when a TARGET supports multiple endians
31e4fa4fafSBryan Drewery#	BUILDENV_SHELL= shell to launch for the buildenv target (def:${SHELL})
32de17cbccSHiroki Sato#	WORLD_FLAGS= additional flags to pass to make(1) during buildworld
33de17cbccSHiroki Sato#	KERNEL_FLAGS= additional flags to pass to make(1) during buildkernel
347f1636b7SBryan Drewery#	SUBDIR_OVERRIDE="list of dirs" to build rather than everything.
357f1636b7SBryan Drewery#	    All libraries and includes, and some build tools will still build.
3611fb97daSJohn Birrell
3711fb97daSJohn Birrell#
3811fb97daSJohn Birrell# The intended user-driven targets are:
3911fb97daSJohn Birrell# buildworld  - rebuild *everything*, including glue to help do upgrades
4011fb97daSJohn Birrell# installworld- install everything built by "buildworld"
4171b7fa12SEnji Cooper# checkworld  - run test suite on installed world
42becc5c62SAlexander Leidinger# doxygen     - build API documentation of the kernel
43527f7dc3SGlen Barber# update      - convenient way to update your source tree (eg: svn/svnup)
4411fb97daSJohn Birrell#
4511fb97daSJohn Birrell# Standard targets (not defined here) are documented in the makefiles in
4611fb97daSJohn Birrell# /usr/share/mk.  These include:
4711fb97daSJohn Birrell#		obj depend all install clean cleandepend cleanobj
4811fb97daSJohn Birrell
49fbd0c280SWarner Losh.if !defined(TARGET) || !defined(TARGET_ARCH)
50fbd0c280SWarner Losh.error "Both TARGET and TARGET_ARCH must be defined."
51fbd0c280SWarner Losh.endif
52fbd0c280SWarner Losh
536e6be2bbSBryan Drewery.if make(showconfig) || make(test-system-*)
546e6be2bbSBryan Drewery_MKSHOWCONFIG=	t
556e6be2bbSBryan Drewery.endif
566e6be2bbSBryan Drewery
576120aabdSBryan DrewerySRCDIR?=	${.CURDIR}
584a2a740eSEnji CooperLOCALBASE?=	/usr/local
59bcffa935SDavid E. O'Brien
60e5ff3aadSWarner Losh# Cross toolchain changes must be in effect before bsd.compiler.mk
61e5ff3aadSWarner Losh# so that gets the right CC, and pass CROSS_TOOLCHAIN to submakes.
62e5ff3aadSWarner Losh.if defined(CROSS_TOOLCHAIN)
630df651d7SBrooks Davis.if exists(${LOCALBASE}/share/toolchains/${CROSS_TOOLCHAIN}.mk)
64e5ff3aadSWarner Losh.include "${LOCALBASE}/share/toolchains/${CROSS_TOOLCHAIN}.mk"
650df651d7SBrooks Davis.elif exists(${CROSS_TOOLCHAIN})
660df651d7SBrooks Davis.include "${CROSS_TOOLCHAIN}"
670df651d7SBrooks Davis.else
682f513483SBrooks Davis.error CROSS_TOOLCHAIN ${CROSS_TOOLCHAIN} not found
690df651d7SBrooks Davis.endif
70e5ff3aadSWarner LoshCROSSENV+=CROSS_TOOLCHAIN="${CROSS_TOOLCHAIN}"
71e5ff3aadSWarner Losh.endif
7234fb4407SBryan Drewery.if defined(CROSS_TOOLCHAIN_PREFIX)
7334fb4407SBryan DreweryCROSS_COMPILER_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
7434fb4407SBryan Drewery.endif
7534fb4407SBryan Drewery
7634fb4407SBryan DreweryXCOMPILERS=	CC CXX CPP
7734fb4407SBryan Drewery.for COMPILER in ${XCOMPILERS}
7834fb4407SBryan Drewery.if defined(CROSS_COMPILER_PREFIX)
7934fb4407SBryan DreweryX${COMPILER}?=	${CROSS_COMPILER_PREFIX}${${COMPILER}}
8034fb4407SBryan Drewery.else
8134fb4407SBryan DreweryX${COMPILER}?=	${${COMPILER}}
8234fb4407SBryan Drewery.endif
8334fb4407SBryan Drewery.endfor
84c1b9d002SBryan Drewery# If a full path to an external cross compiler is given, don't build
85c1b9d002SBryan Drewery# a cross compiler.
86c1b9d002SBryan Drewery.if ${XCC:N${CCACHE_BIN}:M/*}
8773371266SBryan DreweryMK_CLANG_BOOTSTRAP=	no
8873371266SBryan DreweryMK_GCC_BOOTSTRAP=	no
89c1b9d002SBryan Drewery.endif
90c1b9d002SBryan Drewery
91848d5e92SBryan Drewery# Pull in compiler metadata from buildworld/toolchain if possible to avoid
92848d5e92SBryan Drewery# running CC from bsd.compiler.mk.
93d20bd9e4SBryan Drewery.if make(installworld) || make(install) || make(distributeworld) || \
94d20bd9e4SBryan Drewery    make(stageworld)
95cb623f63SEd Maste.-include "${OBJTOP}/toolchain-metadata.mk"
96cb623f63SEd Maste.if !defined(_LOADED_TOOLCHAIN_METADATA)
974e3db1e0SBryan Drewery.error A build is required first.  You may have the wrong MAKEOBJDIRPREFIX set.
984e3db1e0SBryan Drewery.endif
99848d5e92SBryan Drewery.endif
100848d5e92SBryan Drewery
101207efdb3SWarner Losh# Pull in COMPILER_TYPE and COMPILER_FREEBSD_VERSION early. Pull it from the
102207efdb3SWarner Losh# tree to be friendlier to foreign OS builds. It's safe to do so unconditionally
103207efdb3SWarner Losh# here since we will always have the right make, unlike in src/Makefile
104a7d84af8SBryan Drewery# Don't include bsd.linker.mk yet until XBINUTILS is handled (after src.opts.mk)
105a7d84af8SBryan Drewery_NO_INCLUDE_LINKERMK=	t
106207efdb3SWarner Losh.include "share/mk/bsd.compiler.mk"
107a7d84af8SBryan Drewery.undef _NO_INCLUDE_LINKERMK
108a7d84af8SBryan Drewery# src.opts.mk depends on COMPILER_FEATURES
1095091e3dfSGarance A Drosehn.include "share/mk/src.opts.mk"
11011fb97daSJohn Birrell
1112d2aba18SBryan Drewery.if ${TARGET} == ${MACHINE}
1122d2aba18SBryan DreweryTARGET_CPUTYPE?=${CPUTYPE}
1132d2aba18SBryan Drewery.else
1142d2aba18SBryan DreweryTARGET_CPUTYPE?=
1152d2aba18SBryan Drewery.endif
1162d2aba18SBryan Drewery.if !empty(TARGET_CPUTYPE)
1172d2aba18SBryan Drewery_TARGET_CPUTYPE=${TARGET_CPUTYPE}
1182d2aba18SBryan Drewery.else
1192d2aba18SBryan Drewery_TARGET_CPUTYPE=dummy
1202d2aba18SBryan Drewery.endif
1212d2aba18SBryan Drewery.if ${TARGET} == "arm"
1222d2aba18SBryan Drewery.if ${TARGET_ARCH:Marmv[67]*} != "" && ${TARGET_CPUTYPE:M*soft*} == ""
1232d2aba18SBryan DreweryTARGET_ABI=	gnueabihf
1242d2aba18SBryan Drewery.else
1252d2aba18SBryan DreweryTARGET_ABI=	gnueabi
1262d2aba18SBryan Drewery.endif
1272d2aba18SBryan Drewery.endif
1282d2aba18SBryan DreweryMACHINE_ABI?=	unknown
12994a131d5SGlen BarberMACHINE_TRIPLE?=${MACHINE_ARCH:S/amd64/x86_64/:C/hf$//:S/mipsn32/mips64/}-${MACHINE_ABI}-freebsd12.1
1302d2aba18SBryan DreweryTARGET_ABI?=	unknown
13194a131d5SGlen BarberTARGET_TRIPLE?=	${TARGET_ARCH:S/amd64/x86_64/:C/hf$//:S/mipsn32/mips64/}-${TARGET_ABI}-freebsd12.1
1328706983fSBryan DreweryKNOWN_ARCHES?=	aarch64/arm64 \
1338706983fSBryan Drewery		amd64 \
1348706983fSBryan Drewery		arm \
1358706983fSBryan Drewery		armv6/arm \
1368706983fSBryan Drewery		armv7/arm \
1378706983fSBryan Drewery		i386 \
1388706983fSBryan Drewery		mips \
1398706983fSBryan Drewery		mipsel/mips \
1408706983fSBryan Drewery		mips64el/mips \
1418706983fSBryan Drewery		mipsn32el/mips \
1428706983fSBryan Drewery		mips64/mips \
1438706983fSBryan Drewery		mipsn32/mips \
1448706983fSBryan Drewery		mipshf/mips \
1458706983fSBryan Drewery		mipselhf/mips \
1468706983fSBryan Drewery		mips64elhf/mips \
1478706983fSBryan Drewery		mips64hf/mips \
1488706983fSBryan Drewery		powerpc \
1498706983fSBryan Drewery		powerpc64/powerpc \
1508706983fSBryan Drewery		powerpcspe/powerpc \
1518706983fSBryan Drewery		riscv64/riscv \
1528706983fSBryan Drewery		riscv64sf/riscv \
1538706983fSBryan Drewery		sparc64
1548706983fSBryan Drewery
1558706983fSBryan Drewery.if ${TARGET} == ${TARGET_ARCH}
1568706983fSBryan Drewery_t=		${TARGET}
1578706983fSBryan Drewery.else
1588706983fSBryan Drewery_t=		${TARGET_ARCH}/${TARGET}
1598706983fSBryan Drewery.endif
1608706983fSBryan Drewery.for _t in ${_t}
1618706983fSBryan Drewery.if empty(KNOWN_ARCHES:M${_t})
1628706983fSBryan Drewery.error Unknown target ${TARGET_ARCH}:${TARGET}.
1638706983fSBryan Drewery.endif
1648706983fSBryan Drewery.endfor
1652d2aba18SBryan Drewery
166631e709fSBryan Drewery# If all targets are disabled for system llvm then don't expect it to work
167631e709fSBryan Drewery# for cross-builds.
16852b7824bSBryan Drewery.if !defined(TOOLS_PREFIX) && ${MK_LLVM_TARGET_ALL} == "no" && \
169631e709fSBryan Drewery    ${MACHINE} != ${TARGET} && ${MACHINE_ARCH} != ${TARGET_ARCH} && \
170631e709fSBryan Drewery    !make(showconfig)
171631e709fSBryan DreweryMK_SYSTEM_COMPILER=	no
172631e709fSBryan DreweryMK_SYSTEM_LINKER=	no
173631e709fSBryan Drewery.endif
174631e709fSBryan Drewery
1757e1b3c5eSBryan Drewery# Handle external binutils.
1767e1b3c5eSBryan Drewery.if defined(CROSS_TOOLCHAIN_PREFIX)
1777e1b3c5eSBryan DreweryCROSS_BINUTILS_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
1787e1b3c5eSBryan Drewery.endif
1797e1b3c5eSBryan Drewery# If we do not have a bootstrap binutils (because the in-tree one does not
1807e1b3c5eSBryan Drewery# support the target architecture), provide a default cross-binutils prefix.
1811bf5e133SEd Maste# This allows riscv64 builds, for example, to automatically use the
1821bf5e133SEd Maste# riscv64-binutils port or package.
1837e1b3c5eSBryan Drewery.if !make(showconfig)
1847e1b3c5eSBryan Drewery.if !empty(BROKEN_OPTIONS:MBINUTILS_BOOTSTRAP) && \
185ffe63c8bSEd Maste    ${MK_LLD_BOOTSTRAP} == "no" && \
1867e1b3c5eSBryan Drewery    !defined(CROSS_BINUTILS_PREFIX)
187d18e2bcaSBryan DreweryCROSS_BINUTILS_PREFIX=/usr/local/${TARGET_TRIPLE}/bin/
1887e1b3c5eSBryan Drewery.if !exists(${CROSS_BINUTILS_PREFIX})
1897e1b3c5eSBryan Drewery.error In-tree binutils does not support the ${TARGET_ARCH} architecture. Install the ${TARGET_ARCH}-binutils port or package or set CROSS_BINUTILS_PREFIX.
1907e1b3c5eSBryan Drewery.endif
1917e1b3c5eSBryan Drewery.endif
1927e1b3c5eSBryan Drewery.endif
193fd406aa3SEd MasteXBINUTILS=	AS AR LD NM OBJCOPY RANLIB SIZE STRINGS
1947e1b3c5eSBryan Drewery.for BINUTIL in ${XBINUTILS}
1957e1b3c5eSBryan Drewery.if defined(CROSS_BINUTILS_PREFIX) && \
1964d64cb78SBryan Drewery    exists(${CROSS_BINUTILS_PREFIX}/${${BINUTIL}})
1974d64cb78SBryan DreweryX${BINUTIL}?=	${CROSS_BINUTILS_PREFIX:C,/*$,,}/${${BINUTIL}}
1987e1b3c5eSBryan Drewery.else
1997e1b3c5eSBryan DreweryX${BINUTIL}?=	${${BINUTIL}}
2007e1b3c5eSBryan Drewery.endif
2017e1b3c5eSBryan Drewery.endfor
2027e1b3c5eSBryan Drewery
203cf43faaaSBryan Drewery# If a full path to an external linker is given, don't build lld.
204cf43faaaSBryan Drewery.if ${XLD:M/*}
205cf43faaaSBryan DreweryMK_LLD_BOOTSTRAP=	no
206cf43faaaSBryan Drewery.endif
2076120aabdSBryan Drewery
208a7d84af8SBryan Drewery.include "share/mk/bsd.linker.mk"
209a7d84af8SBryan Drewery
210a7d84af8SBryan Drewery# Begin WITH_SYSTEM_COMPILER / WITH_SYSTEM_LD
211a7d84af8SBryan Drewery
212a7d84af8SBryan Drewery# WITH_SYSTEM_COMPILER - Pull in needed values and make a decision.
213a7d84af8SBryan Drewery
214a7d84af8SBryan Drewery# Check if there is a local compiler that can satisfy as an external compiler.
215a7d84af8SBryan Drewery# Which compiler is expected to be used?
216a7d84af8SBryan Drewery.if ${MK_CLANG_BOOTSTRAP} == "yes"
217a7d84af8SBryan DreweryWANT_COMPILER_TYPE=	clang
218a7d84af8SBryan Drewery.elif ${MK_GCC_BOOTSTRAP} == "yes"
219a7d84af8SBryan DreweryWANT_COMPILER_TYPE=	gcc
220a7d84af8SBryan Drewery.else
221a7d84af8SBryan DreweryWANT_COMPILER_TYPE=
222a7d84af8SBryan Drewery.endif
223a7d84af8SBryan Drewery
2246e6be2bbSBryan Drewery.if !defined(WANT_COMPILER_FREEBSD_VERSION) && !make(showconfig) && \
2256e6be2bbSBryan Drewery    !make(test-system-linker)
226a7d84af8SBryan Drewery.if ${WANT_COMPILER_TYPE} == "clang"
227a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION_FILE= lib/clang/freebsd_cc_version.h
228a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION!= \
229a7d84af8SBryan Drewery	awk '$$2 == "FREEBSD_CC_VERSION" {printf("%d\n", $$3)}' \
230a7d84af8SBryan Drewery	${SRCDIR}/${WANT_COMPILER_FREEBSD_VERSION_FILE} || echo unknown
231a7d84af8SBryan DreweryWANT_COMPILER_VERSION_FILE= lib/clang/include/clang/Basic/Version.inc
232a7d84af8SBryan DreweryWANT_COMPILER_VERSION!= \
233a7d84af8SBryan Drewery	awk '$$2 == "CLANG_VERSION" {split($$3, a, "."); print a[1] * 10000 + a[2] * 100 + a[3]}' \
234a7d84af8SBryan Drewery	${SRCDIR}/${WANT_COMPILER_VERSION_FILE} || echo unknown
235a7d84af8SBryan Drewery.elif ${WANT_COMPILER_TYPE} == "gcc"
236a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION_FILE= gnu/usr.bin/cc/cc_tools/freebsd-native.h
237a7d84af8SBryan DreweryWANT_COMPILER_FREEBSD_VERSION!= \
238a7d84af8SBryan Drewery	awk '$$2 == "FBSD_CC_VER" {printf("%d\n", $$3)}' \
239a7d84af8SBryan Drewery	${SRCDIR}/${WANT_COMPILER_FREEBSD_VERSION_FILE} || echo unknown
240a7d84af8SBryan DreweryWANT_COMPILER_VERSION_FILE= contrib/gcc/BASE-VER
241a7d84af8SBryan DreweryWANT_COMPILER_VERSION!= \
242a7d84af8SBryan Drewery	awk -F. '{print $$1 * 10000 + $$2 * 100 + $$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) && \
254a7d84af8SBryan Drewery    (${MK_CLANG_BOOTSTRAP} == "yes" || ${MK_GCC_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 DreweryMK_GCC_BOOTSTRAP=	no
263a7d84af8SBryan DreweryUSING_SYSTEM_COMPILER=	yes
264a7d84af8SBryan Drewery.endif	# ${WANT_COMPILER_TYPE} == ${COMPILER_TYPE}
265a7d84af8SBryan Drewery
266a7d84af8SBryan Drewery# WITH_SYSTEM_LD - Pull in needed values and make a decision.
267a7d84af8SBryan Drewery
268a7d84af8SBryan Drewery# Check if there is a local linker that can satisfy as an external linker.
269a7d84af8SBryan Drewery# Which linker is expected to be used?
270a7d84af8SBryan Drewery.if ${MK_LLD_BOOTSTRAP} == "yes"
271a7d84af8SBryan DreweryWANT_LINKER_TYPE=		lld
272a7d84af8SBryan Drewery.elif ${MK_BINUTILS_BOOTSTRAP} == "yes"
273a7d84af8SBryan Drewery# Note that there's no support for bfd in WITH_SYSTEM_LINKER.
274a7d84af8SBryan DreweryWANT_LINKER_TYPE=	bfd
275a7d84af8SBryan Drewery.else
276a7d84af8SBryan DreweryWANT_LINKER_TYPE=
277a7d84af8SBryan Drewery.endif
278a7d84af8SBryan Drewery
2796e6be2bbSBryan Drewery.if !defined(WANT_LINKER_FREEBSD_VERSION) && !make(showconfig) && \
2806e6be2bbSBryan Drewery    !make(test-system-compiler)
281a7d84af8SBryan Drewery.if ${WANT_LINKER_TYPE} == "lld"
282a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION_FILE= lib/clang/include/lld/Common/Version.inc
283a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION!= \
284a7d84af8SBryan Drewery	awk '$$2 == "LLD_REVISION_STRING" {gsub(/"/, "", $$3); print $$3}' \
285a7d84af8SBryan Drewery	${SRCDIR}/${WANT_LINKER_FREEBSD_VERSION_FILE} || echo unknown
286a7d84af8SBryan DreweryWANT_LINKER_VERSION_FILE= lib/clang/include/lld/Common/Version.inc
287a7d84af8SBryan DreweryWANT_LINKER_VERSION!= \
288a7d84af8SBryan Drewery	awk '$$2 == "LLD_VERSION" {split($$3, a, "."); print a[1] * 10000 + a[2] * 100 + a[3]}' \
289a7d84af8SBryan Drewery	${SRCDIR}/${WANT_LINKER_VERSION_FILE} || echo unknown
290a7d84af8SBryan Drewery.else
291a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION_FILE=
292a7d84af8SBryan DreweryWANT_LINKER_FREEBSD_VERSION=
293a7d84af8SBryan Drewery.endif
294a7d84af8SBryan Drewery.export WANT_LINKER_FREEBSD_VERSION WANT_LINKER_VERSION
295a7d84af8SBryan Drewery.endif	# !defined(WANT_LINKER_FREEBSD_VERSION)
296a7d84af8SBryan Drewery
297a7d84af8SBryan Drewery.if ${MK_SYSTEM_LINKER} == "yes" && \
2986e6be2bbSBryan Drewery    defined(WANT_LINKER_FREEBSD_VERSION) && \
299a7d84af8SBryan Drewery    (${MK_LLD_BOOTSTRAP} == "yes") && \
3006e6be2bbSBryan Drewery    !make(xdev*) && \
301a7d84af8SBryan Drewery    ${X_LINKER_TYPE} == ${WANT_LINKER_TYPE} && \
302a7d84af8SBryan Drewery    ${X_LINKER_VERSION} == ${WANT_LINKER_VERSION} && \
303a7d84af8SBryan Drewery    ${X_LINKER_FREEBSD_VERSION} == ${WANT_LINKER_FREEBSD_VERSION}
304a7d84af8SBryan Drewery# Everything matches, disable the bootstrap linker.
305a7d84af8SBryan DreweryMK_LLD_BOOTSTRAP=	no
306a7d84af8SBryan DreweryUSING_SYSTEM_LINKER=	yes
307a7d84af8SBryan Drewery.endif	# ${WANT_LINKER_TYPE} == ${LINKER_TYPE}
308a7d84af8SBryan Drewery
309a7d84af8SBryan Drewery# WITH_SYSTEM_COMPILER / WITH_SYSTEM_LINKER - Handle defaults and debug.
310a7d84af8SBryan DreweryUSING_SYSTEM_COMPILER?=	no
311a7d84af8SBryan DreweryUSING_SYSTEM_LINKER?=	no
312a7d84af8SBryan Drewery
313a7d84af8SBryan DreweryTEST_SYSTEM_COMPILER_VARS= \
314a7d84af8SBryan Drewery	USING_SYSTEM_COMPILER MK_SYSTEM_COMPILER \
315a7d84af8SBryan Drewery	MK_CROSS_COMPILER MK_CLANG_BOOTSTRAP MK_GCC_BOOTSTRAP \
316a7d84af8SBryan Drewery	WANT_COMPILER_TYPE WANT_COMPILER_VERSION WANT_COMPILER_VERSION_FILE \
317a7d84af8SBryan Drewery	WANT_COMPILER_FREEBSD_VERSION WANT_COMPILER_FREEBSD_VERSION_FILE \
318a7d84af8SBryan Drewery	CC COMPILER_TYPE COMPILER_FEATURES COMPILER_VERSION \
319a7d84af8SBryan Drewery	COMPILER_FREEBSD_VERSION \
320a7d84af8SBryan Drewery	XCC X_COMPILER_TYPE X_COMPILER_FEATURES X_COMPILER_VERSION \
321a7d84af8SBryan Drewery	X_COMPILER_FREEBSD_VERSION
322a7d84af8SBryan DreweryTEST_SYSTEM_LINKER_VARS= \
323a7d84af8SBryan Drewery	USING_SYSTEM_LINKER MK_SYSTEM_LINKER \
324a7d84af8SBryan Drewery	MK_LLD_BOOTSTRAP MK_BINUTILS_BOOTSTRAP \
325a7d84af8SBryan Drewery	WANT_LINKER_TYPE WANT_LINKER_VERSION WANT_LINKER_VERSION_FILE \
326a7d84af8SBryan Drewery	WANT_LINKER_FREEBSD_VERSION WANT_LINKER_FREEBSD_VERSION_FILE \
327a7d84af8SBryan Drewery	LD LINKER_TYPE LINKER_FEATURES LINKER_VERSION \
328a7d84af8SBryan Drewery	LINKER_FREEBSD_VERSION \
329a7d84af8SBryan Drewery	XLD X_LINKER_TYPE X_LINKER_FEATURES X_LINKER_VERSION \
330a7d84af8SBryan Drewery	X_LINKER_FREEBSD_VERSION
331a7d84af8SBryan Drewery
332a7d84af8SBryan Drewery.for _t in compiler linker
333a7d84af8SBryan Drewerytest-system-${_t}: .PHONY
334a7d84af8SBryan Drewery.for v in ${TEST_SYSTEM_${_t:tu}_VARS}
335a7d84af8SBryan Drewery	${_+_}@printf "%-35s= %s\n" "${v}" "${${v}}"
336a7d84af8SBryan Drewery.endfor
337a7d84af8SBryan Drewery.endfor
338a7d84af8SBryan Drewery.if (make(buildworld) || make(buildkernel) || make(kernel-toolchain) || \
339a7d84af8SBryan Drewery    make(toolchain) || make(_cross-tools))
340a7d84af8SBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes"
341a7d84af8SBryan Drewery.info SYSTEM_COMPILER: Determined that CC=${CC} matches the source tree.  Not bootstrapping a cross-compiler.
342a7d84af8SBryan Drewery.elif ${MK_CLANG_BOOTSTRAP} == "yes"
343a7d84af8SBryan Drewery.info SYSTEM_COMPILER: libclang will be built for bootstrapping a cross-compiler.
344a7d84af8SBryan Drewery.endif
345a7d84af8SBryan Drewery.if ${USING_SYSTEM_LINKER} == "yes"
346a7d84af8SBryan Drewery.info SYSTEM_LINKER: Determined that LD=${LD} matches the source tree.  Not bootstrapping a cross-linker.
347a7d84af8SBryan Drewery.elif ${MK_LLD_BOOTSTRAP} == "yes"
348a7d84af8SBryan Drewery.info SYSTEM_LINKER: libclang will be built for bootstrapping a cross-linker.
349a7d84af8SBryan Drewery.endif
350a7d84af8SBryan Drewery.endif
351a7d84af8SBryan Drewery
352a7d84af8SBryan Drewery# End WITH_SYSTEM_COMPILER / WITH_SYSTEM_LD
353a7d84af8SBryan Drewery
354a7d84af8SBryan Drewery# Store some compiler metadata for use in installworld where we don't
355a7d84af8SBryan Drewery# want to invoke CC at all.
356cb623f63SEd Maste_TOOLCHAIN_METADATA_VARS=	COMPILER_VERSION \
357a7d84af8SBryan Drewery				COMPILER_TYPE \
358a7d84af8SBryan Drewery				COMPILER_FEATURES \
359a7d84af8SBryan Drewery				COMPILER_FREEBSD_VERSION \
360a7d84af8SBryan Drewery				LINKER_VERSION \
361a7d84af8SBryan Drewery				LINKER_FEATURES \
362a7d84af8SBryan Drewery				LINKER_TYPE \
363a7d84af8SBryan Drewery				LINKER_FREEBSD_VERSION
364cb623f63SEd Mastetoolchain-metadata.mk: .PHONY .META
365a7d84af8SBryan Drewery	@: > ${.TARGET}
366cb623f63SEd Maste	@echo ".info Using cached toolchain metadata from build at $$(hostname) on $$(date)" \
367a7d84af8SBryan Drewery	    > ${.TARGET}
368cb623f63SEd Maste	@echo "_LOADED_TOOLCHAIN_METADATA=t" >> ${.TARGET}
369cb623f63SEd Maste.for v in ${_TOOLCHAIN_METADATA_VARS}
370a7d84af8SBryan Drewery	@echo "${v}=${${v}}" >> ${.TARGET}
371a7d84af8SBryan Drewery	@echo "X_${v}=${X_${v}}" >> ${.TARGET}
372a7d84af8SBryan Drewery.endfor
373cb623f63SEd Maste	@echo ".export ${_TOOLCHAIN_METADATA_VARS}" >> ${.TARGET}
374cb623f63SEd Maste	@echo ".export ${_TOOLCHAIN_METADATA_VARS:C,^,X_,}" >> ${.TARGET}
375a7d84af8SBryan Drewery
376a7d84af8SBryan Drewery
3777e81b832SBryan Drewery# We must do lib/ and libexec/ before bin/ in case of a mid-install error to
3787e81b832SBryan Drewery# keep the users system reasonably usable.  For static->dynamic root upgrades,
3797e81b832SBryan Drewery# we don't want to install a dynamic binary without rtld and the needed
3807e81b832SBryan Drewery# libraries.  More commonly, for dynamic root, we don't want to install a
3817e81b832SBryan Drewery# binary that requires a newer library version that hasn't been installed yet.
3827e81b832SBryan Drewery# This ordering is not a guarantee though.  The only guarantee of a working
3837e81b832SBryan Drewery# system here would require fine-grained ordering of all components based
3847e81b832SBryan Drewery# on their dependencies.
3857f1636b7SBryan Drewery.if !empty(SUBDIR_OVERRIDE)
386f26a777cSBenno RiceSUBDIR=	${SUBDIR_OVERRIDE}
387f26a777cSBenno Rice.else
38864e55c39SBaptiste DaroussinSUBDIR=	lib libexec
3892a821fd9SIan Lepore# Add LOCAL_LIB_DIRS, but only if they will not be picked up as a SUBDIR
3902a821fd9SIan Lepore# of a LOCAL_DIRS directory.  This allows LOCAL_DIRS=foo and
3912a821fd9SIan Lepore# LOCAL_LIB_DIRS=foo/lib to behave as expected.
3922a821fd9SIan Lepore.for _DIR in ${LOCAL_DIRS:M*/} ${LOCAL_DIRS:N*/:S|$|/|}
3932a821fd9SIan Lepore_REDUNDANT_LIB_DIRS+=    ${LOCAL_LIB_DIRS:M${_DIR}*}
3942a821fd9SIan Lepore.endfor
3952a821fd9SIan Lepore.for _DIR in ${LOCAL_LIB_DIRS}
3962a821fd9SIan Lepore.if ${_DIR} == ".WAIT" || (empty(_REDUNDANT_LIB_DIRS:M${_DIR}) && exists(${.CURDIR}/${_DIR}/Makefile))
3972a821fd9SIan LeporeSUBDIR+=	${_DIR}
3982a821fd9SIan Lepore.endif
3992a821fd9SIan Lepore.endfor
4007cd7d126SBryan Drewery.if !defined(NO_ROOT) && (make(installworld) || make(install))
401fb84a99eSBryan Drewery# Ensure libraries are installed before progressing.
402fb84a99eSBryan DrewerySUBDIR+=.WAIT
403fb84a99eSBryan Drewery.endif
40487b8c12dSRuslan ErmilovSUBDIR+=bin
405ceef0c31SPawel Jakub Dawidek.if ${MK_CDDL} != "no"
406ceef0c31SPawel Jakub DawidekSUBDIR+=cddl
407ceef0c31SPawel Jakub Dawidek.endif
40887b8c12dSRuslan ErmilovSUBDIR+=gnu include
409e1fe3dbaSRuslan Ermilov.if ${MK_KERBEROS} != "no"
410d092560cSMark MurraySUBDIR+=kerberos5
411d092560cSMark Murray.endif
412e1fe3dbaSRuslan Ermilov.if ${MK_RESCUE} != "no"
4133cc95654SRuslan ErmilovSUBDIR+=rescue
4143cc95654SRuslan Ermilov.endif
41511fb97daSJohn BirrellSUBDIR+=sbin
416e1fe3dbaSRuslan Ermilov.if ${MK_CRYPT} != "no"
417b69cb634SJohn BaldwinSUBDIR+=secure
418b69cb634SJohn Baldwin.endif
4196495335eSRuslan Ermilov.if !defined(NO_SHARE)
42011fb97daSJohn BirrellSUBDIR+=share
42111fb97daSJohn Birrell.endif
422ca987d46SWarner Losh.if ${MK_BOOT} != "no"
423ca987d46SWarner LoshSUBDIR+=stand
424ca987d46SWarner Losh.endif
42587b8c12dSRuslan ErmilovSUBDIR+=sys usr.bin usr.sbin
426e2197f80SRui Paulo.if ${MK_TESTS} != "no"
427e2197f80SRui PauloSUBDIR+=	tests
428e2197f80SRui Paulo.endif
429d6e61d98SRuslan Ermilov
430e93e5bb0SIan Lepore# Local directories are built in parallel with the base system directories.
431e93e5bb0SIan Lepore# Users may insert a .WAIT directive at the beginning or elsewhere within
432e93e5bb0SIan Lepore# the LOCAL_DIRS and LOCAL_LIB_DIRS lists as needed.
4330e97688fSBrooks Davis.for _DIR in ${LOCAL_DIRS}
434e93e5bb0SIan Lepore.if ${_DIR} == ".WAIT" || exists(${.CURDIR}/${_DIR}/Makefile)
43511fb97daSJohn BirrellSUBDIR+=	${_DIR}
43611fb97daSJohn Birrell.endif
43711fb97daSJohn Birrell.endfor
4386bde859fSRuslan Ermilov
43923ffbc10SBryan Drewery# We must do etc/ last as it hooks into building the man whatis file
44023ffbc10SBryan Drewery# by calling 'makedb' in share/man.  This is only relevant for
44123ffbc10SBryan Drewery# install/distribute so they build the whatis file after every manpage is
44223ffbc10SBryan Drewery# installed.
4437cd7d126SBryan Drewery.if make(installworld) || make(install)
444fb84a99eSBryan DrewerySUBDIR+=.WAIT
44511fb97daSJohn Birrell.endif
44623ffbc10SBryan DrewerySUBDIR+=etc
44723ffbc10SBryan Drewery
4487f1636b7SBryan Drewery.endif	# !empty(SUBDIR_OVERRIDE)
44911fb97daSJohn Birrell
45030d7f067SDavid E. O'Brien.if defined(NOCLEAN)
4518f9403e9SEd Maste.warning NOCLEAN option is deprecated. Use NO_CLEAN instead.
45230d7f067SDavid E. O'BrienNO_CLEAN=	${NOCLEAN}
45330d7f067SDavid E. O'Brien.endif
454f45a5bbdSRuslan Ermilov.if defined(NO_CLEANDIR)
45511fb97daSJohn BirrellCLEANDIR=	clean cleandepend
45611fb97daSJohn Birrell.else
45711fb97daSJohn BirrellCLEANDIR=	cleandir
45811fb97daSJohn Birrell.endif
45911fb97daSJohn Birrell
46016892c77SBryan Drewery.if defined(WORLDFAST)
46116892c77SBryan DreweryNO_CLEAN=	t
4622abeba9dSBryan DreweryNO_OBJWALK=	t
46316892c77SBryan Drewery.endif
46416892c77SBryan Drewery
465473fda75SBryan Drewery.if ${MK_META_MODE} == "yes"
466473fda75SBryan Drewery# If filemon is used then we can rely on the build being incremental-safe.
467473fda75SBryan Drewery# The .meta files will also track the build command and rebuild should
468473fda75SBryan Drewery# it change.
469473fda75SBryan Drewery.if empty(.MAKE.MODE:Mnofilemon)
470473fda75SBryan DreweryNO_CLEAN=	t
471473fda75SBryan Drewery.endif
472473fda75SBryan Drewery.endif
4732abeba9dSBryan Drewery.if defined(NO_OBJWALK) || ${MK_AUTO_OBJ} == "yes"
4742abeba9dSBryan DreweryNO_OBJWALK=	t
4756d75a7a8SBryan DreweryNO_KERNELOBJ=	t
4766d75a7a8SBryan Drewery.endif
4772abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
4786d75a7a8SBryan Drewery_obj=		obj
4796d75a7a8SBryan Drewery.endif
480473fda75SBryan Drewery
4810d9f40f2SAdrian ChaddLOCAL_TOOL_DIRS?=
4820a63717cSBryan DreweryPACKAGEDIR?=	${DESTDIR}/${DISTDIR}
4839b428cfaSAdrian Chadd
48437ded2a7SBryan Drewery.if empty(SHELL:M*csh*)
485e4fa4fafSBryan DreweryBUILDENV_SHELL?=${SHELL}
48637ded2a7SBryan Drewery.else
4875db254adSWarner LoshBUILDENV_SHELL?=/bin/sh
48837ded2a7SBryan Drewery.endif
4895db254adSWarner Losh
4906e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG)
4910f8995a9SBryan Drewery.if !defined(SVN_CMD) || empty(SVN_CMD)
492d13c4614SSteve Wills. for _P in /usr/bin /usr/local/bin
493d13c4614SSteve Wills.  for _S in svn svnlite
494d13c4614SSteve Wills.   if exists(${_P}/${_S})
4950f8995a9SBryan DrewerySVN_CMD=   ${_P}/${_S}
496d13c4614SSteve Wills.   endif
497d13c4614SSteve Wills.  endfor
498d13c4614SSteve Wills. endfor
4990f8995a9SBryan Drewery.export SVN_CMD
500d13c4614SSteve Wills.endif
50151a8ff0cSMark MurraySVNFLAGS?=	-r HEAD
50255927f28SBryan Drewery.if !defined(VCS_REVISION) || empty(VCS_REVISION)
50355927f28SBryan Drewery.if !defined(SVNVERSION_CMD) || empty(SVNVERSION_CMD)
50449a1108aSBryan Drewery. for _D in ${PATH:S,:, ,g}
50549a1108aSBryan Drewery.  if exists(${_D}/svnversion)
50649a1108aSBryan DrewerySVNVERSION_CMD?=${_D}/svnversion
50749a1108aSBryan Drewery.  endif
50849a1108aSBryan Drewery.  if exists(${_D}/svnliteversion)
50949a1108aSBryan DrewerySVNVERSION_CMD?=${_D}/svnliteversion
51049a1108aSBryan Drewery.  endif
51149a1108aSBryan Drewery. endfor
51249a1108aSBryan Drewery.endif
513ebd2eeb3SGlen Barber_VCS_REVISION?=	$$(eval ${SVNVERSION_CMD} ${SRCDIR})
514ebd2eeb3SGlen Barber. if !empty(_VCS_REVISION)
515ebd2eeb3SGlen BarberVCS_REVISION=	$$(echo r${_VCS_REVISION})
516ebd2eeb3SGlen Barber. endif
517c0d9f07dSBryan Drewery.export VCS_REVISION
518ebd2eeb3SGlen Barber.endif
51911fb97daSJohn Birrell
52022bd4d16SWarner Losh.if !defined(OSRELDATE)
521b21d83f1SWarner Losh.if exists(/usr/include/osreldate.h)
52250da533cSRuslan ErmilovOSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
52350da533cSRuslan Ermilov		/usr/include/osreldate.h
524b21d83f1SWarner Losh.else
525c3754771SWarner LoshOSRELDATE=	0
526b21d83f1SWarner Losh.endif
527470c2b3aSBryan Drewery.export OSRELDATE
52822bd4d16SWarner Losh.endif
529e6cb78fbSRuslan Ermilov
530a378087dSBryan Drewery# Set VERSION for CTFMERGE to use via the default CTFFLAGS=-L VERSION.
53175a6cb4fSBryan Drewery.if !defined(_REVISION)
532bb3f65eaSBryan Drewery_REVISION!=	${MAKE} -C ${SRCDIR}/release MK_AUTO_OBJ=no -V REVISION
53375a6cb4fSBryan Drewery.export _REVISION
53475a6cb4fSBryan Drewery.endif
53575a6cb4fSBryan Drewery.if !defined(_BRANCH)
536bb3f65eaSBryan Drewery_BRANCH!=	${MAKE} -C ${SRCDIR}/release MK_AUTO_OBJ=no -V BRANCH
53775a6cb4fSBryan Drewery.export _BRANCH
53875a6cb4fSBryan Drewery.endif
53975a6cb4fSBryan Drewery.if !defined(SRCRELDATE)
54057bd24ceSGlen BarberSRCRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
54157bd24ceSGlen Barber		${SRCDIR}/sys/sys/param.h
54275a6cb4fSBryan Drewery.export SRCRELDATE
54375a6cb4fSBryan Drewery.endif
54475a6cb4fSBryan Drewery.if !defined(VERSION)
54575a6cb4fSBryan DreweryVERSION=	FreeBSD ${_REVISION}-${_BRANCH:C/-p[0-9]+$//} ${TARGET_ARCH} ${SRCRELDATE}
546a378087dSBryan Drewery.export VERSION
54751062e59SJohn Birrell.endif
54851062e59SJohn Birrell
549183a8eadSBaptiste Daroussin.if !defined(PKG_VERSION)
5505929ee29SGlen Barber.if ${_BRANCH:MSTABLE*} || ${_BRANCH:MCURRENT*} || ${_BRANCH:MALPHA*}
5515d3fd44bSBaptiste DaroussinTIMENOW=	%Y%m%d%H%M%S
5525d3fd44bSBaptiste DaroussinEXTRA_REVISION=	.s${TIMENOW:gmtime}
553183a8eadSBaptiste Daroussin.endif
55475a6cb4fSBryan Drewery.if ${_BRANCH:M*-p*}
55575a6cb4fSBryan DreweryEXTRA_REVISION=	_${_BRANCH:C/.*-p([0-9]+$)/\1/}
556183a8eadSBaptiste Daroussin.endif
55775a6cb4fSBryan DreweryPKG_VERSION=	${_REVISION}${EXTRA_REVISION}
558183a8eadSBaptiste Daroussin.endif
5596e6be2bbSBryan Drewery.endif	# !defined(_MKSHOWCONFIG)
560183a8eadSBaptiste Daroussin
5616e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG)
562bb3f65eaSBryan Drewery_CPUTYPE!=	MAKEFLAGS= CPUTYPE=${_TARGET_CPUTYPE} ${MAKE} -f /dev/null \
563bb3f65eaSBryan Drewery		-m ${.CURDIR}/share/mk MK_AUTO_OBJ=no -V CPUTYPE
564d4f7b113SRuslan Ermilov.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
56532f8ca45SRuslan Ermilov.error CPUTYPE global should be set with ?=.
56632f8ca45SRuslan Ermilov.endif
5676e6be2bbSBryan Drewery.endif
5684448c79eSRuslan Ermilov.if make(buildworld)
569c26efd48SDoug AmbriskoBUILD_ARCH!=	uname -p
5704448c79eSRuslan Ermilov.if ${MACHINE_ARCH} != ${BUILD_ARCH}
5714448c79eSRuslan Ermilov.error To cross-build, set TARGET_ARCH.
5724448c79eSRuslan Ermilov.endif
5734448c79eSRuslan Ermilov.endif
574dfa09989SBryan DreweryWORLDTMP?=	${OBJTOP}/tmp
57591234af7SBryan DreweryBPATH=		${CCACHE_WRAPPER_PATH_PFX}${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin
57611d9aa67SColin PercivalXPATH=		${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin
577ad1520bdSRuslan ErmilovSTRICTTMPPATH=	${BPATH}:${XPATH}
5782a6c45c9SBruce EvansTMPPATH=	${STRICTTMPPATH}:${PATH}
57911fb97daSJohn Birrell
580519bc416SYaroslav Tykhiy#
581519bc416SYaroslav Tykhiy# Avoid running mktemp(1) unless actually needed.
582519bc416SYaroslav Tykhiy# It may not be functional, e.g., due to new ABI
583519bc416SYaroslav Tykhiy# when in the middle of installing over this system.
584519bc416SYaroslav Tykhiy#
585c69a9896SBaptiste Daroussin.if make(distributeworld) || make(installworld) || make(stageworld)
586fb1df203SAlex RichardsonINSTALLTMP!=	mktemp -d -u -t install
587519bc416SYaroslav Tykhiy.endif
588767ab900SMarcel Moolenaar
5893d98f473SGlen Barber.if make(stagekernel) || make(distributekernel)
5903d98f473SGlen BarberTAGS+=		kernel
5913d98f473SGlen BarberPACKAGE=	kernel
5923d98f473SGlen Barber.endif
5933d98f473SGlen Barber
59476762624SMarcel Moolenaar#
59576762624SMarcel Moolenaar# Building a world goes through the following stages
59676762624SMarcel Moolenaar#
5971c62f923SWarner Losh# 1. legacy stage [BMAKE]
59832054bbbSRuslan Ermilov#	This stage is responsible for creating compatibility
59932054bbbSRuslan Ermilov#	shims that are needed by the bootstrap-tools,
600996d8a0dSWarner Losh#	build-tools and cross-tools stages. These are generally
601996d8a0dSWarner Losh#	APIs that tools from one of those three stages need to
602996d8a0dSWarner Losh#	build that aren't present on the host.
60332054bbbSRuslan Ermilov# 1. bootstrap-tools stage [BMAKE]
60476762624SMarcel Moolenaar#	This stage is responsible for creating programs that
60576762624SMarcel Moolenaar#	are needed for backward compatibility reasons. They
60676762624SMarcel Moolenaar#	are not built as cross-tools.
60732054bbbSRuslan Ermilov# 2. build-tools stage [TMAKE]
60876762624SMarcel Moolenaar#	This stage is responsible for creating the object
60976762624SMarcel Moolenaar#	tree and building any tools that are needed during
6109aca5cedSWarner Losh#	the build process. Some programs are listed during
61139d3a844SWarner Losh#	this phase because they build binaries to generate
6129aca5cedSWarner Losh#	files needed to build these programs. This stage also
6139aca5cedSWarner Losh#	builds the 'build-tools' target rather than 'all'.
61432054bbbSRuslan Ermilov# 3. cross-tools stage [XMAKE]
61576762624SMarcel Moolenaar#	This stage is responsible for creating any tools that
616996d8a0dSWarner Losh#	are needed for building the system. A cross-compiler is one
6179aca5cedSWarner Losh#	of them. This differs from build tools in two ways:
6189aca5cedSWarner Losh#	1. the 'all' target is built rather than 'build-tools'
6199aca5cedSWarner Losh#	2. these tools are installed into TMPPATH for stage 4.
62013387c45SDavid E. O'Brien# 4. world stage [WMAKE]
62176762624SMarcel Moolenaar#	This stage actually builds the world.
62213387c45SDavid E. O'Brien# 5. install stage (optional) [IMAKE]
62376762624SMarcel Moolenaar#	This stage installs a previously built world.
62476762624SMarcel Moolenaar#
62576762624SMarcel Moolenaar
62647c95a33SRuslan ErmilovBOOTSTRAPPING?=	0
627754a9d6cSEd Maste# Keep these in sync
628754a9d6cSEd MasteMINIMUM_SUPPORTED_OSREL?= 1002501
629754a9d6cSEd MasteMINIMUM_SUPPORTED_REL?= 10.3
63047c95a33SRuslan Ermilov
63176762624SMarcel Moolenaar# Common environment for world related stages
632dfa09989SBryan DreweryCROSSENV+=	\
6334448c79eSRuslan Ermilov		MACHINE_ARCH=${TARGET_ARCH} \
634444ff633SRuslan Ermilov		MACHINE=${TARGET} \
635423102c6SUlrich Spörlein		CPUTYPE=${TARGET_CPUTYPE}
636d1dd034dSBryan Drewery.if ${MK_META_MODE} != "no"
637d1dd034dSBryan Drewery# Don't rebuild build-tools targets during normal build.
638dbbb03c2SBryan DreweryCROSSENV+=	BUILD_TOOLS_META=.NOMETA
639d1dd034dSBryan Drewery.endif
64002701f04SWarner Losh.if defined(TARGET_CFLAGS)
64102701f04SWarner LoshCROSSENV+=	${TARGET_CFLAGS}
64202701f04SWarner Losh.endif
6437466caf4SMarcel Moolenaar
64432054bbbSRuslan Ermilov# bootstrap-tools stage
645e5d264a3SRuslan ErmilovBMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
64601f124b4SBryan Drewery		TOOLS_PREFIX=${TOOLS_PREFIX_UNDEF:U${WORLDTMP}} \
647ad1520bdSRuslan Ermilov		PATH=${BPATH}:${PATH} \
648cb66f4ddSRuslan Ermilov		WORLDTMP=${WORLDTMP} \
64963e4d6f7SWarner Losh		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
6503cad5c68SBryan Drewery# need to keep this in sync with targets/pseudo/bootstrap-tools/Makefile
6513cad5c68SBryan DreweryBSARGS= 	DESTDIR= \
6522c36cefeSBryan Drewery		OBJTOP='${WORLDTMP}/obj-tools' \
6534dc89c4dSBryan Drewery		OBJROOT='$${OBJTOP}/' \
654996e4759SBryan Drewery		MAKEOBJDIRPREFIX= \
65540c6b893SRuslan Ermilov		BOOTSTRAPPING=${OSRELDATE} \
656817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
6575608fd23SBryan Drewery		SSP_CFLAGS= \
6582d281361SBaptiste Daroussin		MK_HTML=no NO_LINT=yes MK_MAN=no \
65998407b8bSWarner Losh		-DNO_PIC MK_PROFILE=no -DNO_SHARED \
6607273339dSWarner Losh		-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
661c8ed1da7SEnji Cooper		MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
662f8a6e93cSEd Maste		MK_LLDB=no MK_RETPOLINE=no MK_TESTS=no \
663b9a9d9caSEd Maste		MK_INCLUDES=yes
66476762624SMarcel Moolenaar
6654dc89c4dSBryan DreweryBMAKE=		\
6663cad5c68SBryan Drewery		${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
6673cad5c68SBryan Drewery		${BSARGS}
6682e90942fSBryan Drewery.if empty(.MAKEOVERRIDES:MMK_LLVM_TARGET_ALL)
6692e90942fSBryan DreweryBMAKE+=		MK_LLVM_TARGET_ALL=no
6702e90942fSBryan Drewery.endif
6713cad5c68SBryan Drewery
67232054bbbSRuslan Ermilov# build-tools stage
673dfa09989SBryan DreweryTMAKE=		\
674de17cbccSHiroki Sato		${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
67589edd7e5SRuslan Ermilov		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
676e5d264a3SRuslan Ermilov		DESTDIR= \
677c79f2d97SDavid E. O'Brien		BOOTSTRAPPING=${OSRELDATE} \
678817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
6795608fd23SBryan Drewery		SSP_CFLAGS= \
680c79f2d97SDavid E. O'Brien		-DNO_LINT \
681c8ed1da7SEnji Cooper		-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
682c8ed1da7SEnji Cooper		MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
683f8a6e93cSEd Maste		MK_LLDB=no MK_RETPOLINE=no MK_TESTS=no
68476762624SMarcel Moolenaar
68532054bbbSRuslan Ermilov# cross-tools stage
686555c6e60SBryan Drewery# TOOLS_PREFIX set in BMAKE
687555c6e60SBryan DreweryXMAKE=		${BMAKE} \
6880f31538cSRuslan Ermilov		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
689d74021d6SBryan Drewery		MK_GDB=no MK_TESTS=no
69076762624SMarcel Moolenaar
691d3109d39SIan Lepore# kernel-tools stage
692d3109d39SIan LeporeKTMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
693d3109d39SIan Lepore		PATH=${BPATH}:${PATH} \
694a378087dSBryan Drewery		WORLDTMP=${WORLDTMP}
69501f124b4SBryan DreweryKTMAKE=		\
69601f124b4SBryan Drewery		TOOLS_PREFIX=${TOOLS_PREFIX_UNDEF:U${WORLDTMP}} \
697d3109d39SIan Lepore		${KTMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
698d3109d39SIan Lepore		DESTDIR= \
6994dc89c4dSBryan Drewery		OBJTOP='${WORLDTMP}/obj-kernel-tools' \
7004dc89c4dSBryan Drewery		OBJROOT='$${OBJTOP}/' \
701996e4759SBryan Drewery		MAKEOBJDIRPREFIX= \
702d3109d39SIan Lepore		BOOTSTRAPPING=${OSRELDATE} \
7035608fd23SBryan Drewery		SSP_CFLAGS= \
7042d281361SBaptiste Daroussin		MK_HTML=no -DNO_LINT MK_MAN=no \
70598407b8bSWarner Losh		-DNO_PIC MK_PROFILE=no -DNO_SHARED \
706f8a6e93cSEd Maste		-DNO_CPU_CFLAGS MK_RETPOLINE=no MK_WARNS=no MK_CTF=no
707d3109d39SIan Lepore
70876762624SMarcel Moolenaar# world stage
70976762624SMarcel MoolenaarWMAKEENV=	${CROSSENV} \
71015e1a306SMarcel Moolenaar		INSTALL="sh ${.CURDIR}/tools/install.sh" \
71135fb812aSBryan Drewery		PATH=${TMPPATH} \
71235fb812aSBryan Drewery		SYSROOT=${WORLDTMP}
713c872793dSBrooks Davis
714c872793dSBrooks Davis# make hierarchy
71506362369SBryan DreweryHMAKE=		PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q}
716c872793dSBrooks Davis.if defined(NO_ROOT)
717c872793dSBrooks DavisHMAKE+=		PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT
718c872793dSBrooks Davis.endif
719c872793dSBrooks Davis
7209729cf09SDimitry AndricCROSSENV+=	CC="${XCC} ${XCFLAGS}" CXX="${XCXX} ${XCXXFLAGS} ${XCFLAGS}" \
72175c3b117SBaptiste Daroussin		CPP="${XCPP} ${XCFLAGS}" \
722e4195e2eSJonathan Anderson		AS="${XAS}" AR="${XAR}" LD="${XLD}" LLVM_LINK="${XLLVM_LINK}" \
723e4195e2eSJonathan Anderson		NM=${XNM} OBJCOPY="${XOBJCOPY}" \
724a5edb5fbSBaptiste Daroussin		RANLIB=${XRANLIB} STRINGS=${XSTRINGS} \
725a5edb5fbSBaptiste Daroussin		SIZE="${XSIZE}"
726a09aff83SBrooks Davis
7274e3252c4SBryan Drewery.if defined(CROSS_BINUTILS_PREFIX) && exists(${CROSS_BINUTILS_PREFIX})
728a09aff83SBrooks Davis# In the case of xdev-build tools, CROSS_BINUTILS_PREFIX won't be a
7294e3252c4SBryan Drewery# directory, but the compiler will look in the right place for its
730a09aff83SBrooks Davis# tools so we don't need to tell it where to look.
731784b6cd5SPeter GrehanBFLAGS+=	-B${CROSS_BINUTILS_PREFIX}
732a09aff83SBrooks Davis.endif
7334e3252c4SBryan Drewery
734bb0cd1b5SBryan Drewery
735bb0cd1b5SBryan Drewery# The internal bootstrap compiler has a default sysroot set by TOOLS_PREFIX
736bb0cd1b5SBryan Drewery# and target set by TARGET/TARGET_ARCH.  However, there are several needs to
737bb0cd1b5SBryan Drewery# always pass an explicit --sysroot and -target.
738bb0cd1b5SBryan Drewery# - External compiler needs sysroot and target flags.
739bb0cd1b5SBryan Drewery# - External ld needs sysroot.
740bb0cd1b5SBryan Drewery# - To be clear about the use of a sysroot when using the internal compiler.
741bb0cd1b5SBryan Drewery# - Easier debugging.
742bb0cd1b5SBryan Drewery# - Allowing WITH_SYSTEM_COMPILER+WITH_META_MODE to work together due to
743bb0cd1b5SBryan Drewery#   the flip-flopping build command when sometimes using external and
744bb0cd1b5SBryan Drewery#   sometimes using internal.
745bb0cd1b5SBryan Drewery# - Allow using lld which has no support for default paths.
7464e3252c4SBryan Drewery.if !defined(CROSS_BINUTILS_PREFIX) || !exists(${CROSS_BINUTILS_PREFIX})
747784b6cd5SPeter GrehanBFLAGS+=	-B${WORLDTMP}/usr/bin
748a09aff83SBrooks Davis.endif
7494d611b2bSBryan Drewery.if ${WANT_COMPILER_TYPE} == gcc || \
7504d611b2bSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
7514d611b2bSBryan Drewery.elif ${WANT_COMPILER_TYPE} == clang || \
7524d611b2bSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == clang)
75375c3b117SBaptiste DaroussinXCFLAGS+=	-target ${TARGET_TRIPLE}
7545ab58881SCraig Rodrigues.endif
7554e3252c4SBryan DreweryXCFLAGS+=	--sysroot=${WORLDTMP}
7564e3252c4SBryan Drewery
7574e3252c4SBryan Drewery.if !empty(BFLAGS)
758fe692231SEd MasteXCFLAGS+=	${BFLAGS}
7593dce4cb5SBaptiste Daroussin.endif
760a09aff83SBrooks Davis
761dba75e9fSBryan Drewery.if ${MK_LIB32} != "no" && (${TARGET_ARCH} == "amd64" || \
762d5392a41SJohn Baldwin    ${TARGET_ARCH} == "powerpc64" || ${TARGET_ARCH:Mmips64*} != "")
763dba75e9fSBryan DreweryLIBCOMPAT= 32
764dba75e9fSBryan Drewery.include "Makefile.libcompat"
7650b972ac9SWarner Losh.elif ${MK_LIBSOFT} != "no" && ${TARGET_ARCH:Marmv[67]*} != ""
766bb52d711SWarner LoshLIBCOMPAT= SOFT
767bb52d711SWarner Losh.include "Makefile.libcompat"
7688bb23971SNathan Whitehorn.endif
7698bb23971SNathan Whitehorn
7701a9cc831SBryan Drewery# META_MODE normally ignores host file changes since every build updates
7711a9cc831SBryan Drewery# timestamps (see NO_META_IGNORE_HOST in sys.mk).  There are known times
7721a9cc831SBryan Drewery# when the ABI breaks though that we want to force rebuilding WORLDTMP
7731a9cc831SBryan Drewery# to get updated host tools.
7741a9cc831SBryan Drewery.if ${MK_META_MODE} == "yes" && defined(NO_CLEAN) && \
7750f827d7aSBryan Drewery    !defined(NO_META_IGNORE_HOST) && !defined(NO_META_IGNORE_HOST_HEADERS) && \
7766e6be2bbSBryan Drewery    !defined(_MKSHOWCONFIG)
777c8fab231SBryan Drewery# r318736 - ino64 major ABI breakage
778c8fab231SBryan DreweryMETA_MODE_BAD_ABI_VERS+=	1200031
7791a9cc831SBryan Drewery
7801a9cc831SBryan Drewery.if !defined(OBJDIR_HOST_OSRELDATE)
781dfa09989SBryan Drewery.if exists(${OBJTOP}/host-osreldate.h)
7821a9cc831SBryan DreweryOBJDIR_HOST_OSRELDATE!=	\
7831a9cc831SBryan Drewery    awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
784dfa09989SBryan Drewery    ${OBJTOP}/host-osreldate.h
785b1237142SBryan Drewery.elif exists(${WORLDTMP}/usr/include/osreldate.h)
7861a9cc831SBryan DreweryOBJDIR_HOST_OSRELDATE=	0
7871a9cc831SBryan Drewery.endif
7881a9cc831SBryan Drewery.export OBJDIR_HOST_OSRELDATE
7891a9cc831SBryan Drewery.endif
7901a9cc831SBryan Drewery
7911a9cc831SBryan Drewery# Note that this logic is the opposite of normal BOOTSTRAP handling.  We want
7921a9cc831SBryan Drewery# to compare the WORLDTMP's OSRELDATE to the host's OSRELDATE.  If the WORLDTMP
7931a9cc831SBryan Drewery# is older than the ABI-breakage OSRELDATE of the HOST then we rebuild.
794b1237142SBryan Drewery.if defined(OBJDIR_HOST_OSRELDATE)
7951a9cc831SBryan Drewery.for _ver in ${META_MODE_BAD_ABI_VERS}
7961a9cc831SBryan Drewery.if ${OSRELDATE} >= ${_ver} && ${OBJDIR_HOST_OSRELDATE} < ${_ver}
7971a9cc831SBryan Drewery_meta_mode_need_rebuild=	${_ver}
7981a9cc831SBryan Drewery.endif
7991a9cc831SBryan Drewery.endfor
8001a9cc831SBryan Drewery.if defined(_meta_mode_need_rebuild)
8011a9cc831SBryan Drewery.info META_MODE: Rebuilding host tools due to ABI breakage in __FreeBSD_version ${_meta_mode_need_rebuild}.
8021a9cc831SBryan DreweryNO_META_IGNORE_HOST_HEADERS=	1
8031a9cc831SBryan Drewery.export NO_META_IGNORE_HOST_HEADERS
804b1237142SBryan Drewery.endif	# defined(_meta_mode_need_rebuild)
805b1237142SBryan Drewery.endif	# defined(OBJDIR_HOST_OSRELDATE)
806b1237142SBryan Drewery.endif	# ${MK_META_MODE} == "yes" && defined(NO_CLEAN) ...
8071a9cc831SBryan Drewery# This is only used for META_MODE+filemon to track what the oldest
8081a9cc831SBryan Drewery# __FreeBSD_version is in WORLDTMP.  This purposely does NOT have
8091a9cc831SBryan Drewery# a make dependency on /usr/include/osreldate.h as the file should
8101a9cc831SBryan Drewery# only be copied when it is missing or meta mode determines it has changed.
8111a9cc831SBryan Drewery# Since host files are normally ignored without NO_META_IGNORE_HOST
8121a9cc831SBryan Drewery# the file will never be updated unless that flag is specified.  This
8131a9cc831SBryan Drewery# allows tracking the oldest osreldate to force rebuilds via
8141a9cc831SBryan Drewery# META_MODE_BADABI_REVS above.
8151a9cc831SBryan Dreweryhost-osreldate.h: # DO NOT ADD /usr/include/osreldate.h here
8161a9cc831SBryan Drewery	@cp -f /usr/include/osreldate.h ${.TARGET}
8171a9cc831SBryan Drewery
818817366f1SBryan DreweryWMAKE=		${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
819817366f1SBryan Drewery		BWPHASE=${.TARGET:C,^_,,} \
820817366f1SBryan Drewery		DESTDIR=${WORLDTMP}
821096924c9SAlexander Leidinger
82291da7698SBryan DreweryIMAKEENV=	${CROSSENV}
82341a8e223SBrooks DavisIMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1 \
82463e4d6f7SWarner Losh		${IMAKE_INSTALL} ${IMAKE_MTREE}
825519bc416SYaroslav Tykhiy.if empty(.MAKEFLAGS:M-n)
826519bc416SYaroslav TykhiyIMAKEENV+=	PATH=${STRICTTMPPATH}:${INSTALLTMP} \
827519bc416SYaroslav Tykhiy		LD_LIBRARY_PATH=${INSTALLTMP} \
828519bc416SYaroslav Tykhiy		PATH_LOCALE=${INSTALLTMP}/locale
829519bc416SYaroslav TykhiyIMAKE+=		__MAKE_SHELL=${INSTALLTMP}/sh
830519bc416SYaroslav Tykhiy.else
831519bc416SYaroslav TykhiyIMAKEENV+=	PATH=${TMPPATH}:${INSTALLTMP}
832519bc416SYaroslav Tykhiy.endif
833d0f408faSRoger Pau Monné
834d0f408faSRoger Pau Monné# When generating install media, do not allow user and group information from
835d0f408faSRoger Pau Monné# the build host to affect the contents of the distribution.
8362502c66bSRoger Pau Monné.if make(distributeworld) || make(distrib-dirs) || make(distribution)
837d0f408faSRoger Pau MonnéDB_FROM_SRC=	yes
838d0f408faSRoger Pau Monné.endif
839d0f408faSRoger Pau Monné
84041a8e223SBrooks Davis.if defined(DB_FROM_SRC)
8414a63ae11SBrooks DavisINSTALLFLAGS+=	-N ${.CURDIR}/etc
8424a63ae11SBrooks DavisMTREEFLAGS+=	-N ${.CURDIR}/etc
8434a63ae11SBrooks Davis.endif
8446c461479SBrooks Davis_INSTALL_DDIR=	${DESTDIR}/${DISTDIR}
8456c461479SBrooks DavisINSTALL_DDIR=	${_INSTALL_DDIR:S://:/:g:C:/$::}
8464a63ae11SBrooks Davis.if defined(NO_ROOT)
8474a63ae11SBrooks DavisMETALOG?=	${DESTDIR}/${DISTDIR}/METALOG
8480369270fSBryan DreweryMETALOG:=	${METALOG:C,//+,/,g}
8494a63ae11SBrooks DavisIMAKE+=		-DNO_ROOT METALOG=${METALOG}
8506c461479SBrooks DavisINSTALLFLAGS+=	-U -M ${METALOG} -D ${INSTALL_DDIR}
8514a63ae11SBrooks DavisMTREEFLAGS+=	-W
8524a63ae11SBrooks Davis.endif
8539312c006SBaptiste Daroussin.if defined(BUILD_PKGS)
8549312c006SBaptiste DaroussinINSTALLFLAGS+=	-h sha256
8559312c006SBaptiste Daroussin.endif
8564a63ae11SBrooks Davis.if defined(DB_FROM_SRC) || defined(NO_ROOT)
8574a63ae11SBrooks DavisIMAKE_INSTALL=	INSTALL="install ${INSTALLFLAGS}"
858d2ed6da0SBrooks DavisIMAKE_MTREE=	MTREE_CMD="mtree ${MTREEFLAGS}"
85941a8e223SBrooks Davis.endif
8600ea234deSMarcel Moolenaar
86155a5b46aSAlex RichardsonDESTDIR_MTREEFLAGS=	-deU
86255a5b46aSAlex Richardson# When creating worldtmp we don't need to set the directories as owned by root
86355a5b46aSAlex Richardson# so we also pass -W
86455a5b46aSAlex RichardsonWORLDTMP_MTREEFLAGS=	-deUW
86555a5b46aSAlex Richardson.if defined(NO_ROOT)
86655a5b46aSAlex Richardson# When building with -DNO_ROOT we shouldn't be changing the directories
86755a5b46aSAlex Richardson# that are created by mtree to be owned by root/wheel.
86855a5b46aSAlex RichardsonDESTDIR_MTREEFLAGS+=	-W
86955a5b46aSAlex Richardson.endif
87055a5b46aSAlex RichardsonMTREE?=	mtree
87155a5b46aSAlex RichardsonWORLDTMP_MTREE=	${MTREE} ${WORLDTMP_MTREEFLAGS}
87255a5b46aSAlex RichardsonDESTDIR_MTREE=	${MTREE} ${DESTDIR_MTREEFLAGS}
87355a5b46aSAlex Richardson
8745963db0fSWarner Losh# kernel stage
87535fb812aSBryan DreweryKMAKEENV=	${WMAKEENV:NSYSROOT=*}
876139f7f9bSDimitry AndricKMAKE=		${KMAKEENV} ${MAKE} ${.MAKEFLAGS} ${KERNEL_FLAGS} KERNEL=${INSTKERNNAME}
8775963db0fSWarner Losh
87811fb97daSJohn Birrell#
87911fb97daSJohn Birrell# buildworld
88011fb97daSJohn Birrell#
88111fb97daSJohn Birrell# Attempt to rebuild the entire system, with reasonable chance of
88211fb97daSJohn Birrell# success, regardless of how old your existing system is.
88311fb97daSJohn Birrell#
88464ec6792SBryan Drewery_sanity_check: .PHONY .MAKE
885d0cfa43fSPoul-Henning Kamp.if ${.CURDIR:C/[^,]//g} != ""
886d0cfa43fSPoul-Henning Kamp#	The m4 build of sendmail files doesn't like it if ',' is used
887d0cfa43fSPoul-Henning Kamp#	anywhere in the path of it's files.
888d0cfa43fSPoul-Henning Kamp	@echo
889d0cfa43fSPoul-Henning Kamp	@echo "*** Error: path to source tree contains a comma ','"
890d0cfa43fSPoul-Henning Kamp	@echo
89164ec6792SBryan Drewery	@false
89264ec6792SBryan Drewery.elif ${.CURDIR:M*\:*} != ""
89364ec6792SBryan Drewery#	Using ':' leaks into PATH and breaks finding cross-tools.
89464ec6792SBryan Drewery	@echo
89564ec6792SBryan Drewery	@echo "*** Error: path to source tree contains a colon ':'"
89664ec6792SBryan Drewery	@echo
89764ec6792SBryan Drewery	@false
898d0cfa43fSPoul-Henning Kamp.endif
8995e3b9061SBryan Drewery
900a28412b0SEd Maste# Our current approach to dependency tracking cannot cope with certain source
901a28412b0SEd Maste# tree changes, particularly with respect to removing source files and
902a28412b0SEd Maste# replacing generated files.  Handle these cases here in an ad-hoc fashion.
903fb3d959cSBryan Drewery_cleanobj_fast_depend_hack: .PHONY
90462d6bc39SBrooks Davis# Syscall stubs rewritten in C and obsolete MD assembly implementations
905a28412b0SEd Maste# Date      SVN Rev  Syscalls
906a28412b0SEd Maste# 20170624  r320278  fstat fstatat fstatfs getdirentries getfsstat statfs
90762d6bc39SBrooks Davis# 20180404  r332048  sigreturn
908e4e7a46bSBrooks Davis# 20180405  r332080  shmat
909d9b41671SBrooks Davis# 20180406  r332119  setlogin
910810c4dcdSBrooks Davis# 20180411  r332443  exect
911c2decc35SBrooks Davis# 20180525  r334224  vadvise
912521ef556SEd Maste# 20180604  r334626  brk sbrk
913521ef556SEd Maste.for f in brk exect fstat fstatat fstatfs getdirentries getfsstat sbrk setlogin shmat sigreturn statfs vadvise
9146e6be2bbSBryan Drewery	@if [ -e "${OBJTOP}/lib/libc/.depend.${f}.o" ] && \
9156e6be2bbSBryan Drewery	    egrep -qw '${f}\.[sS]' ${OBJTOP}/lib/libc/.depend.${f}.o; then \
9166e6be2bbSBryan Drewery		echo "Removing stale dependencies for ${f} syscall wrappers"; \
917dfa09989SBryan Drewery		rm -f ${OBJTOP}/lib/libc/.depend.${f}.* \
918dfa09989SBryan Drewery		   ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
91955b87d46SEd Maste	fi
92055b87d46SEd Maste.endfor
921ff6c17c9SEd Maste# 20170607 remove stale dependencies for utimens* wrappers removed in r319663
922ff6c17c9SEd Maste.for f in futimens utimensat
9236e6be2bbSBryan Drewery	@if [ -e "${OBJTOP}/lib/libc/.depend.${f}.o" ] && \
9246e6be2bbSBryan Drewery	    egrep -q '/${f}.c' ${OBJTOP}/lib/libc/.depend.${f}.o; then \
9256e6be2bbSBryan Drewery		echo "Removing stale dependencies for ${f} syscall wrappers"; \
926dfa09989SBryan Drewery		rm -f ${OBJTOP}/lib/libc/.depend.${f}.* \
927dfa09989SBryan Drewery		   ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
928ff6c17c9SEd Maste	fi
929ff6c17c9SEd Maste.endfor
93090d4415dSEd Maste# 20170523 remove stale generated asm files for functions which are no longer
93190d4415dSEd Maste# syscalls after r302092 (pipe) and r318736 (others)
93290d4415dSEd Maste.for f in getdents lstat mknod pipe stat
9336e6be2bbSBryan Drewery	@if [ -e "${OBJTOP}/lib/libc/${f}.s" ] || \
9346e6be2bbSBryan Drewery	    [ -e "${OBJTOP}/lib/libc/${f}.S" ] ; then \
9356e6be2bbSBryan Drewery		echo "Removing stale generated ${f} syscall files"; \
9366e6be2bbSBryan Drewery		rm -f ${OBJTOP}/lib/libc/${f}.* \
937dfa09989SBryan Drewery		    ${OBJTOP}/lib/libc/.depend.${f}.* \
938dfa09989SBryan Drewery		    ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/${f}.*} \
9396e6be2bbSBryan Drewery		    ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
9406e6be2bbSBryan Drewery	fi
94190d4415dSEd Maste.endfor
942bfe5c1dcSEd Maste# 20181013  r339348  bcopy reimplemented as .c
943bfe5c1dcSEd Maste.for f in bcopy memcpy memmove
944bfe5c1dcSEd Maste	@if [ -e "${OBJTOP}/lib/libc/.depend.${f}.o" ] && \
945bfe5c1dcSEd Maste	    egrep -qw 'bcopy\.[sS]' ${OBJTOP}/lib/libc/.depend.${f}.o; then \
946bfe5c1dcSEd Maste		echo "Removing stale dependencies for bcopy"; \
947bfe5c1dcSEd Maste		rm -f ${OBJTOP}/lib/libc/.depend.${f}.* \
948bfe5c1dcSEd Maste		   ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
949bfe5c1dcSEd Maste	fi
950bfe5c1dcSEd Maste.endfor
95178e0dea2SMateusz Guzik# 20181115  r340463  bzero reimplemented as .c
95278e0dea2SMateusz Guzik	@if [ -e "${OBJTOP}/lib/libc/.depend.bzero.o" ] && \
95378e0dea2SMateusz Guzik	    egrep -qw 'bzero\.[sS]' ${OBJTOP}/lib/libc/.depend.bzero.o; then \
95478e0dea2SMateusz Guzik		echo "Removing stale dependencies for bzero"; \
95578e0dea2SMateusz Guzik		rm -f ${OBJTOP}/lib/libc/.depend.bzero.* \
95678e0dea2SMateusz Guzik		   ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.bzero.*}; \
95778e0dea2SMateusz Guzik	fi
958539a27e1SEd Maste# 20181009 track migration from ntp's embedded libevent to updated one
959539a27e1SEd Maste	@if [ -e "${OBJTOP}/usr.sbin/ntp/libntpevent/.depend.bufferevent_openssl.o" ] && \
960539a27e1SEd Maste	    egrep -q 'contrib/ntp/sntp/libevent/bufferevent_openssl.c' \
961539a27e1SEd Maste	    ${OBJTOP}/usr.sbin/ntp/libntpevent/.depend.bufferevent_openssl.o ; then \
962539a27e1SEd Maste		echo "Removing stale libevent dependencies"; \
963539a27e1SEd Maste		rm -f ${OBJTOP}/usr.sbin/ntp/libntpevent/.depend.*; \
964539a27e1SEd Maste	fi
965dc75d44eSBryan Drewery
9665f5f5d2cSCy Schubert# 20181209  r341759 track migration across wpa update
9675f5f5d2cSCy Schubert	@if [ -e "${OBJTOP}/usr.sbin/wpa/wpa_supplicant/.depend.rrm.o" ] && \
9685f5f5d2cSCy Schubert	    egrep -q 'src/ap/rrm.c' \
9695f5f5d2cSCy Schubert	    ${OBJTOP}/usr.sbin/wpa/wpa_supplicant/.depend.rrm.o; then \
9705f5f5d2cSCy Schubert		echo "Removing stale wpa dependencies"; \
9715f5f5d2cSCy Schubert		rm -f ${OBJTOP}/usr.sbin/wpa/*/.depend*; \
9725f5f5d2cSCy Schubert	fi
9735f5f5d2cSCy Schubert
974fb3d959cSBryan Drewery_worldtmp: .PHONY
975fb3d959cSBryan Drewery	@echo
976fb3d959cSBryan Drewery	@echo "--------------------------------------------------------------"
977fb3d959cSBryan Drewery	@echo ">>> Rebuilding the temporary build tree"
978fb3d959cSBryan Drewery	@echo "--------------------------------------------------------------"
979fb3d959cSBryan Drewery.if !defined(NO_CLEAN)
980fb3d959cSBryan Drewery	rm -rf ${WORLDTMP}
981fb3d959cSBryan Drewery.else
9826e6be2bbSBryan Drewery	${_+_}@if [ -e "${WORLDTMP}" ]; then \
9836e6be2bbSBryan Drewery		echo ">>> Deleting stale files in build tree..."; \
9846e6be2bbSBryan Drewery		cd ${.CURDIR}; ${WMAKE} -DBATCH_DELETE_OLD_FILES \
9856e6be2bbSBryan Drewery		    delete-old delete-old-libs >/dev/null; \
9866e6be2bbSBryan Drewery	fi
987fb3d959cSBryan Drewery	rm -rf ${WORLDTMP}/legacy/usr/include
988fb3d959cSBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes"
989fb3d959cSBryan Drewery.for cc in cc c++
990fb3d959cSBryan Drewery	if [ -x ${WORLDTMP}/usr/bin/${cc} ]; then \
991fb3d959cSBryan Drewery		inum=$$(stat -f %i ${WORLDTMP}/usr/bin/${cc}); \
992fb3d959cSBryan Drewery		find ${WORLDTMP}/usr/bin -inum $${inum} -delete; \
993fb3d959cSBryan Drewery	fi
994fb3d959cSBryan Drewery.endfor
995fb3d959cSBryan Drewery.endif	# ${USING_SYSTEM_COMPILER} == "yes"
996a7d84af8SBryan Drewery.if ${USING_SYSTEM_LINKER} == "yes"
997a7d84af8SBryan Drewery	@rm -f ${WORLDTMP}/usr/bin/ld ${WORLDTMP}/usr/bin/ld.lld
998a7d84af8SBryan Drewery.endif	# ${USING_SYSTEM_LINKER} == "yes"
999dc75d44eSBryan Drewery.endif	# !defined(NO_CLEAN)
1000fe480405SBryan Drewery	@mkdir -p ${WORLDTMP}
100189bd07e9SBryan Drewery	@touch ${WORLDTMP}/${.TARGET}
10024acc8a67SAlex Richardson# We can't use mtree to create the worldtmp directories since it may not be
10034acc8a67SAlex Richardson# available on the target system (this happens e.g. when building on non-FreeBSD)
10044acc8a67SAlex Richardson	cd ${.CURDIR}/tools/build; \
10054acc8a67SAlex Richardson	    ${MAKE} DIRPRFX=tools/build/ DESTDIR=${WORLDTMP}/legacy installdirs
10061c62f923SWarner Losh_legacy:
1007f7e19a98SWarner Losh	@echo
1008f7e19a98SWarner Losh	@echo "--------------------------------------------------------------"
1009d61a976bSScott Long	@echo ">>> stage 1.1: legacy release compatibility shims"
1010f7e19a98SWarner Losh	@echo "--------------------------------------------------------------"
1011088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${BMAKE} legacy
10126bde859fSRuslan Ermilov_bootstrap-tools:
10130ea234deSMarcel Moolenaar	@echo
10140ea234deSMarcel Moolenaar	@echo "--------------------------------------------------------------"
1015d61a976bSScott Long	@echo ">>> stage 1.2: bootstrap tools"
10160ea234deSMarcel Moolenaar	@echo "--------------------------------------------------------------"
1017088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools
10184acc8a67SAlex Richardson	mkdir -p ${WORLDTMP}/usr ${WORLDTMP}/lib/casper ${WORLDTMP}/lib/geom
10194acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
10204acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr >/dev/null
10214acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
10224acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr/include >/dev/null
10234acc8a67SAlex Richardson	ln -sf ${.CURDIR}/sys ${WORLDTMP}
10244acc8a67SAlex Richardson.if ${MK_DEBUG_FILES} != "no"
10254acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
10264acc8a67SAlex Richardson	    -p ${WORLDTMP}/usr/lib >/dev/null
10274acc8a67SAlex Richardson.endif
10284acc8a67SAlex Richardson.for _mtree in ${LOCAL_MTREE}
10294acc8a67SAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
10304acc8a67SAlex Richardson.endfor
10316bde859fSRuslan Ermilov_cleanobj:
1032f45a5bbdSRuslan Ermilov.if !defined(NO_CLEAN)
103311fb97daSJohn Birrell	@echo
103411fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1035d61a976bSScott Long	@echo ">>> stage 2.1: cleaning up the object tree"
103611fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1037fb84a99eSBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR}
1038dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
1039dba75e9fSBryan Drewery	${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} -f Makefile.inc1 ${CLEANDIR}
10408dee0414SRuslan Ermilov.endif
1041fb3d959cSBryan Drewery.else
1042fb3d959cSBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} _cleanobj_fast_depend_hack
1043fb3d959cSBryan Drewery.endif	# !defined(NO_CLEAN)
10446bde859fSRuslan Ermilov_obj:
104511fb97daSJohn Birrell	@echo
104611fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1047d61a976bSScott Long	@echo ">>> stage 2.2: rebuilding the object tree"
104811fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1049fb84a99eSBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} obj
10506bde859fSRuslan Ermilov_build-tools:
1051bfc59eb8SMarcel Moolenaar	@echo
1052bfc59eb8SMarcel Moolenaar	@echo "--------------------------------------------------------------"
1053d61a976bSScott Long	@echo ">>> stage 2.3: build tools"
1054bfc59eb8SMarcel Moolenaar	@echo "--------------------------------------------------------------"
1055088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${TMAKE} build-tools
10566bde859fSRuslan Ermilov_cross-tools:
105717139066SWarner Losh	@echo
105817139066SWarner Losh	@echo "--------------------------------------------------------------"
105976762624SMarcel Moolenaar	@echo ">>> stage 3: cross tools"
106017139066SWarner Losh	@echo "--------------------------------------------------------------"
1061cb623f63SEd Maste	@rm -f ${OBJTOP}/toolchain-metadata.mk
1062088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
10636abd71b0SIan Lepore	${_+_}cd ${.CURDIR}; ${XMAKE} kernel-tools
10641a9cc831SBryan Drewery_build-metadata:
1065848d5e92SBryan Drewery	@echo
1066848d5e92SBryan Drewery	@echo "--------------------------------------------------------------"
10671a9cc831SBryan Drewery	@echo ">>> stage 3.1: recording build metadata"
1068848d5e92SBryan Drewery	@echo "--------------------------------------------------------------"
1069cb623f63SEd Maste	${_+_}cd ${.CURDIR}; ${WMAKE} toolchain-metadata.mk
10701a9cc831SBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} host-osreldate.h
10716bde859fSRuslan Ermilov_includes:
107211fb97daSJohn Birrell	@echo
107311fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1074c54d7e02SRuslan Ermilov	@echo ">>> stage 4.1: building includes"
107511fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
10767f1636b7SBryan Drewery# Special handling for SUBDIR_OVERRIDE in buildworld as they most likely need
10777f1636b7SBryan Drewery# headers from default SUBDIR.  Do SUBDIR_OVERRIDE includes last.
10787f1636b7SBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} SUBDIR_OVERRIDE= SHARED=symlinks \
1079ac978f5aSBryan Drewery	    MK_INCLUDES=yes includes
10807f1636b7SBryan Drewery.if !empty(SUBDIR_OVERRIDE) && make(buildworld)
1081ac978f5aSBryan Drewery	${_+_}cd ${.CURDIR}; ${WMAKE} MK_INCLUDES=yes SHARED=symlinks includes
10827f1636b7SBryan Drewery.endif
10836bde859fSRuslan Ermilov_libraries:
108411fb97daSJohn Birrell	@echo
108511fb97daSJohn Birrell	@echo "--------------------------------------------------------------"
1086d61a976bSScott Long	@echo ">>> stage 4.2: building libraries"
1087f80df2faSMarcel Moolenaar	@echo "--------------------------------------------------------------"
1088088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; \
10892d281361SBaptiste Daroussin	    ${WMAKE} -DNO_FSCHG MK_HTML=no -DNO_LINT MK_MAN=no \
1090b55e8e6eSWarner Losh	    MK_PROFILE=no MK_TESTS=no MK_TESTS_SUPPORT=${MK_TESTS} libraries
109140cf3344SBryan Dreweryeverything: .PHONY
109276762624SMarcel Moolenaar	@echo
109376762624SMarcel Moolenaar	@echo "--------------------------------------------------------------"
1094497e8091SBryan Drewery	@echo ">>> stage 4.3: building everything"
109576762624SMarcel Moolenaar	@echo "--------------------------------------------------------------"
10961c2a618bSBryan Drewery	${_+_}cd ${.CURDIR}; _PARALLEL_SUBDIR_OK=1 ${WMAKE} all
109711fb97daSJohn Birrell
10986bde859fSRuslan ErmilovWMAKE_TGTS=
109916892c77SBryan Drewery.if !defined(WORLDFAST)
11005e3b9061SBryan DreweryWMAKE_TGTS+=	_sanity_check _worldtmp _legacy
11017f1636b7SBryan Drewery.if empty(SUBDIR_OVERRIDE)
11027f1636b7SBryan DreweryWMAKE_TGTS+=	_bootstrap-tools
11036bde859fSRuslan Ermilov.endif
11046d75a7a8SBryan DreweryWMAKE_TGTS+=	_cleanobj
11052abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
11066d75a7a8SBryan DreweryWMAKE_TGTS+=	_obj
11076d75a7a8SBryan Drewery.endif
11086d75a7a8SBryan DreweryWMAKE_TGTS+=	_build-tools _cross-tools
11091a9cc831SBryan DreweryWMAKE_TGTS+=	_build-metadata
111016892c77SBryan DreweryWMAKE_TGTS+=	_includes
111116892c77SBryan Drewery.endif
1112c596c287SBryan Drewery.if !defined(NO_LIBS)
111316892c77SBryan DreweryWMAKE_TGTS+=	_libraries
1114c596c287SBryan Drewery.endif
1115f4d0f67fSBryan DreweryWMAKE_TGTS+=	everything
1116dba75e9fSBryan Drewery.if defined(LIBCOMPAT) && empty(SUBDIR_OVERRIDE)
1117dba75e9fSBryan DreweryWMAKE_TGTS+=	build${libcompat}
11181d9468eeSPeter Wemm.endif
11196bde859fSRuslan Ermilov
112040cf3344SBryan Drewerybuildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue .PHONY
1121d2f03ebbSRuslan Ermilov.ORDER: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
112211fb97daSJohn Birrell
1123a561b106SBryan Drewerybuildworld_prologue: .PHONY
1124d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1125d2f03ebbSRuslan Ermilov	@echo ">>> World build started on `LC_ALL=C date`"
1126d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1127d2f03ebbSRuslan Ermilov
1128a561b106SBryan Drewerybuildworld_epilogue: .PHONY
1129d2f03ebbSRuslan Ermilov	@echo
1130d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1131d2f03ebbSRuslan Ermilov	@echo ">>> World build completed on `LC_ALL=C date`"
1132d2f03ebbSRuslan Ermilov	@echo "--------------------------------------------------------------"
1133621e4ae1SWarner Losh
1134621e4ae1SWarner Losh#
1135621e4ae1SWarner Losh# We need to have this as a target because the indirection between Makefile
1136621e4ae1SWarner Losh# and Makefile.inc1 causes the correct PATH to be used, rather than a
11376f13c7adSWarner Losh# modification of the current environment's PATH.  In addition, we need
11386f13c7adSWarner Losh# to quote multiword values.
1139621e4ae1SWarner Losh#
1140208f1083SBryan Drewerybuildenvvars: .PHONY
114153c0e6d5SBryan Drewery	@echo ${WMAKEENV:Q} ${.MAKE.EXPORTED:@v@$v=\"${$v}\"@}
1142621e4ae1SWarner Losh
1143e163efb6SBrooks Davis.if ${.TARGETS:Mbuildenv}
1144e163efb6SBrooks Davis.if ${.MAKEFLAGS:M-j}
1145e163efb6SBrooks Davis.error The buildenv target is incompatible with -j
1146e163efb6SBrooks Davis.endif
1147e163efb6SBrooks Davis.endif
1148208f1083SBryan DreweryBUILDENV_DIR?=	${.CURDIR}
11493fa561a4SWarner Losh#
11503fa561a4SWarner Losh# Note: make will report any errors the shell reports. This can
11513fa561a4SWarner Losh# be odd if the last command in an interactive shell generates an
11523fa561a4SWarner Losh# error or is terminated by SIGINT. These reported errors look bad,
11533fa561a4SWarner Losh# but are harmless. Allowing them also allows BUIDLENV_SHELL to
11543fa561a4SWarner Losh# be a complex command whose status will be returned to the caller.
11553fa561a4SWarner Losh# Some scripts in tools rely on this behavior to report build errors.
11563fa561a4SWarner Losh#
1157208f1083SBryan Drewerybuildenv: .PHONY
115820bfae84SRuslan Ermilov	@echo Entering world for ${TARGET_ARCH}:${TARGET}
1159a55d4dddSBryan Drewery.if ${BUILDENV_SHELL:M*zsh*}
1160a55d4dddSBryan Drewery	@echo For ZSH you must run: export CPUTYPE=${TARGET_CPUTYPE}
1161a55d4dddSBryan Drewery.endif
11620255bc13SWarner Losh	@cd ${BUILDENV_DIR} && env ${WMAKEENV} BUILDENV=1 ${BUILDENV_SHELL}
116320bfae84SRuslan Ermilov
1164497e8091SBryan DreweryTOOLCHAIN_TGTS=	${WMAKE_TGTS:Neverything:Nbuild${libcompat}}
116540cf3344SBryan Drewerytoolchain: ${TOOLCHAIN_TGTS} .PHONY
1166651c6845SBryan DreweryKERNEL_TOOLCHAIN_TGTS=	${TOOLCHAIN_TGTS:N_obj:N_cleanobj:N_includes:N_libraries}
1167651c6845SBryan Drewery.if make(kernel-toolchain)
1168651c6845SBryan Drewery.ORDER: ${KERNEL_TOOLCHAIN_TGTS}
1169651c6845SBryan Drewery.endif
1170651c6845SBryan Drewerykernel-toolchain: ${KERNEL_TOOLCHAIN_TGTS} .PHONY
1171839274c7SRuslan Ermilov
117211fb97daSJohn Birrell#
11730da07b29SRuslan Ermilov# installcheck
1174afc6f086SGarance A Drosehn#
11750da07b29SRuslan Ermilov# Checks to be sure system is ready for installworld/installkernel.
11760da07b29SRuslan Ermilov#
1177c943a53eSBryan Dreweryinstallcheck: _installcheck_world _installcheck_kernel .PHONY
1178c943a53eSBryan Drewery_installcheck_world: .PHONY
1179d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1180d0338de5SWolfram Schneider	@echo ">>> Install check world"
1181d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1182c943a53eSBryan Drewery_installcheck_kernel: .PHONY
1183d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1184d0338de5SWolfram Schneider	@echo ">>> Install check kernel"
1185d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1186afc6f086SGarance A Drosehn
1187afc6f086SGarance A Drosehn#
118841a8e223SBrooks Davis# Require DESTDIR to be set if installing for a different architecture or
118941a8e223SBrooks Davis# using the user/group database in the source tree.
1190e576df39SRuslan Ermilov#
119141a8e223SBrooks Davis.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE} || \
119241a8e223SBrooks Davis    defined(DB_FROM_SRC)
11930f8bb094SRuslan Ermilov.if !make(distributeworld)
119431caf4c8SBryan Drewery_installcheck_world: __installcheck_DESTDIR
119531caf4c8SBryan Drewery_installcheck_kernel: __installcheck_DESTDIR
1196c943a53eSBryan Drewery__installcheck_DESTDIR: .PHONY
1197e576df39SRuslan Ermilov.if !defined(DESTDIR) || empty(DESTDIR)
1198e576df39SRuslan Ermilov	@echo "ERROR: Please set DESTDIR!"; \
1199e576df39SRuslan Ermilov	false
1200e576df39SRuslan Ermilov.endif
1201e576df39SRuslan Ermilov.endif
12020f8bb094SRuslan Ermilov.endif
1203e576df39SRuslan Ermilov
120441a8e223SBrooks Davis.if !defined(DB_FROM_SRC)
1205e576df39SRuslan Ermilov#
12060fc1aae5SBrooks Davis# Check for missing UIDs/GIDs.
12070fc1aae5SBrooks Davis#
12080fc1aae5SBrooks DavisCHECK_UIDS=	auditdistd
12090fc1aae5SBrooks DavisCHECK_GIDS=	audit
121007b95333SIan LeporeCHECK_UIDS+=	ntpd
121107b95333SIan LeporeCHECK_GIDS+=	ntpd
12129898e6dfSIan LeporeCHECK_UIDS+=	proxy
12139898e6dfSIan LeporeCHECK_GIDS+=	proxy authpf
12149898e6dfSIan LeporeCHECK_UIDS+=	smmsp
12159898e6dfSIan LeporeCHECK_GIDS+=	smmsp
12169898e6dfSIan LeporeCHECK_UIDS+=	unbound
12179898e6dfSIan LeporeCHECK_GIDS+=	unbound
121831caf4c8SBryan Drewery_installcheck_world: __installcheck_UGID
1219c943a53eSBryan Drewery__installcheck_UGID: .PHONY
12200fc1aae5SBrooks Davis.for uid in ${CHECK_UIDS}
12210fc1aae5SBrooks Davis	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
12220fc1aae5SBrooks Davis		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
12230fc1aae5SBrooks Davis		false; \
12240fc1aae5SBrooks Davis	fi
12250fc1aae5SBrooks Davis.endfor
12260fc1aae5SBrooks Davis.for gid in ${CHECK_GIDS}
12270fc1aae5SBrooks Davis	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
12280fc1aae5SBrooks Davis		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
12290fc1aae5SBrooks Davis		false; \
12300fc1aae5SBrooks Davis	fi
12310fc1aae5SBrooks Davis.endfor
123241a8e223SBrooks Davis.endif
1233bd1c3badSEd Maste#
1234bd1c3badSEd Maste# If installing over the running system (DESTDIR is / or unset) and the install
1235bd1c3badSEd Maste# includes rescue, try running rescue from the objdir as a sanity check.  If
1236bd1c3badSEd Maste# rescue is not functional (e.g., because it depends on a system call not
1237bd1c3badSEd Maste# supported by the currently running kernel), abort the installation.
1238bd1c3badSEd Maste#
1239bd1c3badSEd Maste.if !make(distributeworld) && ${MK_RESCUE} != "no" && \
1240bd1c3badSEd Maste    (empty(DESTDIR) || ${DESTDIR} == "/") && empty(BYPASS_INSTALLCHECK_SH)
1241bd1c3badSEd Maste_installcheck_world: __installcheck_sh_check
1242bd1c3badSEd Maste__installcheck_sh_check: .PHONY
1243dfa09989SBryan Drewery	@if [ "`${OBJTOP}/rescue/rescue/rescue sh -c 'echo OK'`" != \
1244bd1c3badSEd Maste	    OK ]; then \
1245bd1c3badSEd Maste		echo "rescue/sh check failed, installation aborted" >&2; \
1246bd1c3badSEd Maste		false; \
1247bd1c3badSEd Maste	fi
1248bd1c3badSEd Maste.endif
12490fc1aae5SBrooks Davis
12500fc1aae5SBrooks Davis#
1251519bc416SYaroslav Tykhiy# Required install tools to be saved in a scratch dir for safety.
1252519bc416SYaroslav Tykhiy#
12538d5ed6e7SEdwin Groothuis.if ${MK_ZONEINFO} != "no"
125422c2069fSBrooks Davis_zoneinfo=	zic tzsetup
12558d5ed6e7SEdwin Groothuis.endif
1256555aaddfSRuslan Ermilov
1257f600d35fSWarner LoshITOOLS=	[ awk cap_mkdb cat chflags chmod chown cmp cp \
12584a63ae11SBrooks Davis	date echo egrep find grep id install ${_install-info} \
1259c38230ebSBryan Drewery	ln make mkdir mtree mv pwd_mkdb \
1260c1c35c10SWarner Losh	rm sed services_mkdb sh sort strip sysctl test true uname wc ${_zoneinfo} \
1261a0e6a013SBryan Drewery	${LOCAL_ITOOLS}
1262519bc416SYaroslav Tykhiy
126346fe68cdSEnji Cooper# Needed for share/man
1264fe50ba05SEd Maste.if ${MK_MAN_UTILS} != "no"
126546fe68cdSEnji CooperITOOLS+=makewhatis
126646fe68cdSEnji Cooper.endif
126746fe68cdSEnji Cooper
1268519bc416SYaroslav Tykhiy#
12691fbb6ab5SRuslan Ermilov# distributeworld
12701fbb6ab5SRuslan Ermilov#
12711fbb6ab5SRuslan Ermilov# Distributes everything compiled by a `buildworld'.
12721fbb6ab5SRuslan Ermilov#
127311fb97daSJohn Birrell# installworld
127411fb97daSJohn Birrell#
127511fb97daSJohn Birrell# Installs everything compiled by a 'buildworld'.
127611fb97daSJohn Birrell#
127799ad39c8SNathan Whitehorn
127899ad39c8SNathan Whitehorn# Non-base distributions produced by the base system
127910d2255fSGlen BarberEXTRA_DISTRIBUTIONS=	doc
1280dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
1281dba75e9fSBryan DreweryEXTRA_DISTRIBUTIONS+=	lib${libcompat}
128299ad39c8SNathan Whitehorn.endif
1283e8a34402SJulio Merino.if ${MK_TESTS} != "no"
1284e8a34402SJulio MerinoEXTRA_DISTRIBUTIONS+=	tests
1285e8a34402SJulio Merino.endif
128699ad39c8SNathan Whitehorn
1287ffc6fb79SGlen BarberDEBUG_DISTRIBUTIONS=
1288ffc6fb79SGlen Barber.if ${MK_DEBUG_FILES} != "no"
1289cf4b80d8SGlen BarberDEBUG_DISTRIBUTIONS+=	base ${EXTRA_DISTRIBUTIONS:S,doc,,:S,tests,,}
1290ffc6fb79SGlen Barber.endif
1291ffc6fb79SGlen Barber
12924a63ae11SBrooks DavisMTREE_MAGIC?=	mtree 2.0
12934a63ae11SBrooks Davis
129440cf3344SBryan Drewerydistributeworld installworld stageworld: _installcheck_world .PHONY
1295767ab900SMarcel Moolenaar	mkdir -p ${INSTALLTMP}
1296c93073c2SYaroslav Tykhiy	progs=$$(for prog in ${ITOOLS}; do \
12971602894eSEd Maste		if progpath=`which $$prog`; then \
1298c93073c2SYaroslav Tykhiy			echo $$progpath; \
12991602894eSEd Maste		else \
1300519bc416SYaroslav Tykhiy			echo "Required tool $$prog not found in PATH." >&2; \
13011602894eSEd Maste			exit 1; \
13021602894eSEd Maste		fi; \
1303c93073c2SYaroslav Tykhiy	    done); \
1304c93073c2SYaroslav Tykhiy	libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \
1305c93073c2SYaroslav Tykhiy	    while read line; do \
1306c93073c2SYaroslav Tykhiy		set -- $$line; \
1307c93073c2SYaroslav Tykhiy		if [ "$$2 $$3" != "not found" ]; then \
1308c93073c2SYaroslav Tykhiy			echo $$2; \
1309c93073c2SYaroslav Tykhiy		else \
1310c93073c2SYaroslav Tykhiy			echo "Required library $$1 not found." >&2; \
1311c93073c2SYaroslav Tykhiy			exit 1; \
1312c93073c2SYaroslav Tykhiy		fi; \
1313c93073c2SYaroslav Tykhiy	    done); \
1314c93073c2SYaroslav Tykhiy	cp $$libs $$progs ${INSTALLTMP}
1315519bc416SYaroslav Tykhiy	cp -R $${PATH_LOCALE:-"/usr/share/locale"} ${INSTALLTMP}/locale
13164a63ae11SBrooks Davis.if defined(NO_ROOT)
1317bd6daf52SBryan Drewery	-mkdir -p ${METALOG:H}
13184a63ae11SBrooks Davis	echo "#${MTREE_MAGIC}" > ${METALOG}
13194a63ae11SBrooks Davis.endif
132099ad39c8SNathan Whitehorn.if make(distributeworld)
132199ad39c8SNathan Whitehorn.for dist in ${EXTRA_DISTRIBUTIONS}
132299ad39c8SNathan Whitehorn	-mkdir ${DESTDIR}/${DISTDIR}/${dist}
132355a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.root.dist \
132499ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist} >/dev/null
132555a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
132699ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
132755a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
132899ad39c8SNathan Whitehorn	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null
132942f8c5b5SEd Maste.if ${MK_DEBUG_FILES} != "no"
133055a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
133142f8c5b5SEd Maste	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
133242f8c5b5SEd Maste.endif
1333dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
133455a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
133574c52c65SJulio Merino	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
133674c52c65SJulio Merino.if ${MK_DEBUG_FILES} != "no"
133755a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
133874c52c65SJulio Merino	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/usr >/dev/null
133974c52c65SJulio Merino.endif
134074c52c65SJulio Merino.endif
1341e8a34402SJulio Merino.if ${MK_TESTS} != "no" && ${dist} == "tests"
1342f703589eSEnji Cooper	-mkdir -p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE}
134355a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
1344f703589eSEnji Cooper	    -p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE} >/dev/null
134507670b30SEd Maste.if ${MK_DEBUG_FILES} != "no"
134655a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
134707670b30SEd Maste	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/${TESTSBASE} >/dev/null
134807670b30SEd Maste.endif
1349e8a34402SJulio Merino.endif
13504a63ae11SBrooks Davis.if defined(NO_ROOT)
135155a5b46aSAlex Richardson	${IMAKEENV} ${MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.root.dist | \
13524a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/#' >> ${METALOG}
135355a5b46aSAlex Richardson	${IMAKEENV} ${MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.usr.dist | \
13544a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
135555a5b46aSAlex Richardson	${IMAKEENV} ${MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.include.dist | \
13564a63ae11SBrooks Davis	    sed -e 's#^\./#./${dist}/usr/include/#' >> ${METALOG}
1357dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
135855a5b46aSAlex Richardson	${IMAKEENV} ${MTREE} -C -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist | \
135974c52c65SJulio Merino	    sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
136074c52c65SJulio Merino.endif
13614a63ae11SBrooks Davis.endif
136299ad39c8SNathan Whitehorn.endfor
136399ad39c8SNathan Whitehorn	-mkdir ${DESTDIR}/${DISTDIR}/base
1364d82fd861SBryan Drewery	${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
13654a63ae11SBrooks Davis	    METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \
13664a63ae11SBrooks Davis	    DISTBASE=/base DESTDIR=${DESTDIR}/${DISTDIR}/base \
136706362369SBryan Drewery	    LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs
136826ffc1abSLi-Wen Hsu	${INSTALL_SYMLINK} ${INSTALLFLAGS} usr/src/sys ${INSTALL_DDIR}/base/sys
136999ad39c8SNathan Whitehorn.endif
1370519bc416SYaroslav Tykhiy	${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \
1371519bc416SYaroslav Tykhiy	    ${IMAKEENV} rm -rf ${INSTALLTMP}
137299ad39c8SNathan Whitehorn.if make(distributeworld)
137399ad39c8SNathan Whitehorn.for dist in ${EXTRA_DISTRIBUTIONS}
137414009f5eSLi-Wen Hsu	find ${DESTDIR}/${DISTDIR}/${dist} -mindepth 1 -type d -empty -delete
137599ad39c8SNathan Whitehorn.endfor
13764a63ae11SBrooks Davis.if defined(NO_ROOT)
13774a63ae11SBrooks Davis.for dist in base ${EXTRA_DISTRIBUTIONS}
13784a63ae11SBrooks Davis	@# For each file that exists in this dist, print the corresponding
13794a63ae11SBrooks Davis	@# line from the METALOG.  This relies on the fact that
1380a1ff7af0SPedro F. Giffuni	@# a line containing only the filename will sort immediately before
13814a63ae11SBrooks Davis	@# the relevant mtree line.
13824a63ae11SBrooks Davis	cd ${DESTDIR}/${DISTDIR}; \
13834a63ae11SBrooks Davis	find ./${dist} | sort -u ${METALOG} - | \
13844a63ae11SBrooks Davis	awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
13854a63ae11SBrooks Davis	${DESTDIR}/${DISTDIR}/${dist}.meta
13864a63ae11SBrooks Davis.endfor
1387ffc6fb79SGlen Barber.for dist in ${DEBUG_DISTRIBUTIONS}
13882d0bcb76SEd Maste	@# For each file that exists in this dist, print the corresponding
13892d0bcb76SEd Maste	@# line from the METALOG.  This relies on the fact that
1390a1ff7af0SPedro F. Giffuni	@# a line containing only the filename will sort immediately before
13912d0bcb76SEd Maste	@# the relevant mtree line.
13922d0bcb76SEd Maste	cd ${DESTDIR}/${DISTDIR}; \
13932d0bcb76SEd Maste	find ./${dist}/usr/lib/debug | sort -u ${METALOG} - | \
13942d0bcb76SEd Maste	awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
13952d0bcb76SEd Maste	${DESTDIR}/${DISTDIR}/${dist}.debug.meta
13962d0bcb76SEd Maste.endfor
13972d0bcb76SEd Maste.endif
13984a63ae11SBrooks Davis.endif
139999ad39c8SNathan Whitehorn
1400c943a53eSBryan Drewerypackageworld: .PHONY
140199ad39c8SNathan Whitehorn.for dist in base ${EXTRA_DISTRIBUTIONS}
14024a63ae11SBrooks Davis.if defined(NO_ROOT)
14034a63ae11SBrooks Davis	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1404bd9cab6fSRui Paulo	    tar cvf - --exclude usr/lib/debug \
1405bd9cab6fSRui Paulo	    @${DESTDIR}/${DISTDIR}/${dist}.meta | \
14060a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}.txz
14074a63ae11SBrooks Davis.else
140899ad39c8SNathan Whitehorn	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1409bd9cab6fSRui Paulo	    tar cvf - --exclude usr/lib/debug . | \
14100a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}.txz
14114a63ae11SBrooks Davis.endif
141299ad39c8SNathan Whitehorn.endfor
141311fb97daSJohn Birrell
1414ffc6fb79SGlen Barber.for dist in ${DEBUG_DISTRIBUTIONS}
14152d0bcb76SEd Maste. if defined(NO_ROOT)
14162d0bcb76SEd Maste	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1417bd9cab6fSRui Paulo	    tar cvf - @${DESTDIR}/${DISTDIR}/${dist}.debug.meta | \
14180a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}-dbg.txz
14192d0bcb76SEd Maste. else
14202d0bcb76SEd Maste	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
1421bd9cab6fSRui Paulo	    tar cvLf - usr/lib/debug | \
14220a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/${dist}-dbg.txz
14232d0bcb76SEd Maste. endif
14242d0bcb76SEd Maste.endfor
14252d0bcb76SEd Maste
1426aa781e2dSBrooks Davis_sysent_dirs=	sys/kern
1427aa781e2dSBrooks Davis_sysent_dirs+=	sys/compat/freebsd32
1428aa781e2dSBrooks Davis_sysent_dirs+=	sys/i386/ibcs2
1429aa781e2dSBrooks Davis_sysent_dirs+=	sys/amd64/linux		\
1430aa781e2dSBrooks Davis		sys/amd64/linux32	\
1431aa781e2dSBrooks Davis		sys/arm64/linux		\
1432aa781e2dSBrooks Davis		sys/i386/linux
1433aa781e2dSBrooks Davissysent: .PHONY
1434aa781e2dSBrooks Davis.for _dir in ${_sysent_dirs}
1435aa781e2dSBrooks Davis	${_+_}${MAKE} -C ${.CURDIR}/${_dir} sysent
1436aa781e2dSBrooks Davis.endfor
1437aa781e2dSBrooks Davis
143811fb97daSJohn Birrell#
143911fb97daSJohn Birrell# reinstall
144011fb97daSJohn Birrell#
144111fb97daSJohn Birrell# If you have a build server, you can NFS mount the source and obj directories
144211fb97daSJohn Birrell# and do a 'make reinstall' on the *client* to install new binaries from the
144311fb97daSJohn Birrell# most recent server build.
144411fb97daSJohn Birrell#
1445ecb92e2dSBryan Dreweryrestage reinstall: .MAKE .PHONY
1446d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1447d4ca5483SGlen Barber	@echo ">>> Making hierarchy"
1448d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1449d4ca5483SGlen Barber	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
1450d4ca5483SGlen Barber	    LOCAL_MTREE=${LOCAL_MTREE:Q} hierarchy
1451ecb92e2dSBryan Drewery.if make(restage)
1452d4ca5483SGlen Barber	@echo "--------------------------------------------------------------"
1453ecb92e2dSBryan Drewery	@echo ">>> Making distribution"
1454c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1455c69a9896SBaptiste Daroussin	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
1456ecb92e2dSBryan Drewery	    LOCAL_MTREE=${LOCAL_MTREE:Q} distribution
1457ecb92e2dSBryan Drewery.endif
1458c69a9896SBaptiste Daroussin	@echo
1459c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1460d0338de5SWolfram Schneider	@echo ">>> Installing everything started on `LC_ALL=C date`"
1461c69a9896SBaptiste Daroussin	@echo "--------------------------------------------------------------"
1462c69a9896SBaptiste Daroussin	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
1463396f5ab6SBryan Drewery.if defined(LIBCOMPAT)
1464396f5ab6SBryan Drewery	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install${libcompat}
1465c69a9896SBaptiste Daroussin.endif
1466d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1467d0338de5SWolfram Schneider	@echo ">>> Installing everything completed on `LC_ALL=C date`"
1468d0338de5SWolfram Schneider	@echo "--------------------------------------------------------------"
1469b626f5a7SGlen Barber
1470d82fd861SBryan Dreweryredistribute: .MAKE .PHONY
14718f1f55e9SRuslan Ermilov	@echo "--------------------------------------------------------------"
1472e5b369afSRuslan Ermilov	@echo ">>> Distributing everything"
14738f1f55e9SRuslan Ermilov	@echo "--------------------------------------------------------------"
1474088cf0fbSHartmut Brandt	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
1475dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
1476dba75e9fSBryan Drewery	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute${libcompat} \
1477dba75e9fSBryan Drewery	    DISTRIBUTION=lib${libcompat}
1478ece6831dSRuslan Ermilov.endif
14790a0743b5SMarcel Moolenaar
1480db9ba9eeSBryan Drewerydistrib-dirs distribution: .MAKE .PHONY
1481d82fd861SBryan Drewery	${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
14824a63ae11SBrooks Davis	    ${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET}
1483db9ba9eeSBryan Drewery.if make(distribution)
14845d8d6498SBaptiste Daroussin	${_+_}cd ${.CURDIR}; ${CROSSENV} PATH=${TMPPATH} \
14855d8d6498SBaptiste Daroussin		${MAKE} -f Makefile.inc1 ${IMAKE_INSTALL} \
1486619a5d7bSBryan Drewery		METALOG=${METALOG} MK_TESTS=no installconfig
1487db9ba9eeSBryan Drewery.endif
1488dd985c8fSBaptiste Daroussin
14890a0743b5SMarcel Moolenaar#
1490f3bb8dbdSMarcel Moolenaar# buildkernel and installkernel
1491f3bb8dbdSMarcel Moolenaar#
1492f3bb8dbdSMarcel Moolenaar# Which kernels to build and/or install is specified by setting
1493c1ae5e3dSPeter Wemm# KERNCONF. If not defined a GENERIC kernel is built/installed.
1494444ff633SRuslan Ermilov# Only the existing (depending TARGET) config files are used
1495f3bb8dbdSMarcel Moolenaar# for building kernels and only the first of these is designated
1496f3bb8dbdSMarcel Moolenaar# as the one being installed.
1497f3bb8dbdSMarcel Moolenaar#
1498444ff633SRuslan Ermilov# Note that we have to use TARGET instead of TARGET_ARCH when
14994448c79eSRuslan Ermilov# we're in kernel-land. Since only TARGET_ARCH is (expected) to
1500444ff633SRuslan Ermilov# be set to cross-build, we have to make sure TARGET is set
1501f3bb8dbdSMarcel Moolenaar# properly.
1502f3bb8dbdSMarcel Moolenaar
150379177775SWarner Losh.if defined(KERNFAST)
150479177775SWarner LoshNO_KERNELCLEAN=	t
150579177775SWarner LoshNO_KERNELCONFIG=	t
150662012822SWarner LoshNO_KERNELOBJ=		t
1507b61a9dcfSWarner Losh# Shortcut for KERNCONF=Blah -DKERNFAST is now KERNFAST=Blah
1508b61a9dcfSWarner Losh.if !defined(KERNCONF) && ${KERNFAST} != "1"
1509b61a9dcfSWarner LoshKERNCONF=${KERNFAST}
1510b61a9dcfSWarner Losh.endif
151179177775SWarner Losh.endif
15128bb23971SNathan Whitehorn.if ${TARGET_ARCH} == "powerpc64"
15138bb23971SNathan WhitehornKERNCONF?=	GENERIC64
15148bb23971SNathan Whitehorn.else
1515c1ae5e3dSPeter WemmKERNCONF?=	GENERIC
15162f74661cSPeter Wemm.endif
1517ae78d52fSDavid E. O'BrienINSTKERNNAME?=	kernel
1518f3bb8dbdSMarcel Moolenaar
151969e74195SJohn BaldwinKERNSRCDIR?=	${.CURDIR}/sys
152069e74195SJohn BaldwinKRNLCONFDIR=	${KERNSRCDIR}/${TARGET}/conf
1521dfa09989SBryan DreweryKRNLOBJDIR=	${OBJTOP}${KERNSRCDIR:C,^${.CURDIR},,}
1522934372e2SPaul RichardsKERNCONFDIR?=	${KRNLCONFDIR}
1523f3bb8dbdSMarcel Moolenaar
1524f3bb8dbdSMarcel MoolenaarBUILDKERNELS=
1525f3bb8dbdSMarcel MoolenaarINSTALLKERNEL=
15266fa97020SBryan Drewery.if defined(NO_INSTALLKERNEL)
15276fa97020SBryan Drewery# All of the BUILDKERNELS loops start at index 1.
15286fa97020SBryan DreweryBUILDKERNELS+= dummy
15296fa97020SBryan Drewery.endif
1530c1ae5e3dSPeter Wemm.for _kernel in ${KERNCONF}
15316e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${KERNCONFDIR}/${_kernel})
1532f3bb8dbdSMarcel MoolenaarBUILDKERNELS+=	${_kernel}
15336fa97020SBryan Drewery.if empty(INSTALLKERNEL) && !defined(NO_INSTALLKERNEL)
1534f3bb8dbdSMarcel MoolenaarINSTALLKERNEL= ${_kernel}
1535f3bb8dbdSMarcel Moolenaar.endif
15360c059da3SCy Schubert.else
15370c059da3SCy Schubert.if make(buildkernel)
15380c059da3SCy Schubert.error Missing KERNCONF ${KERNCONFDIR}/${_kernel}
15390c059da3SCy Schubert.endif
1540f3bb8dbdSMarcel Moolenaar.endif
1541f3bb8dbdSMarcel Moolenaar.endfor
1542f3bb8dbdSMarcel Moolenaar
1543aa9ceac4SEd Maste_cleankernobj_fast_depend_hack: .PHONY
1544af94761aSEd Maste# 20180320 remove stale generated assym.s after renaming to .inc in r331254
15456e6be2bbSBryan Drewery	@if [ -e "${OBJTOP}/sys/${KERNCONF}/assym.s" ]; then \
15466e6be2bbSBryan Drewery		echo "Removing stale generated assym files"; \
15476e6be2bbSBryan Drewery		rm -f ${OBJTOP}/sys/${KERNCONF}/assym.* \
15486e6be2bbSBryan Drewery		    ${OBJTOP}/sys/${KERNCONF}/.depend.assym.*; \
15496e6be2bbSBryan Drewery	fi
1550aa9ceac4SEd Maste
1551dba75e9fSBryan Drewery${WMAKE_TGTS:N_worldtmp:Nbuild${libcompat}} ${.ALLTARGETS:M_*:N_worldtmp}: .MAKE .PHONY
1552bfbada6eSWarner Losh
1553f3bb8dbdSMarcel Moolenaar#
1554f3bb8dbdSMarcel Moolenaar# buildkernel
1555f3bb8dbdSMarcel Moolenaar#
1556f3bb8dbdSMarcel Moolenaar# Builds all kernels defined by BUILDKERNELS.
1557f3bb8dbdSMarcel Moolenaar#
1558d82fd861SBryan Drewerybuildkernel: .MAKE .PHONY
15596fa97020SBryan Drewery.if empty(BUILDKERNELS:Ndummy)
1560552b98b9SRuslan Ermilov	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \
15619565bbf3SBruce Evans	false
1562a62264fbSJoseph Koshy.endif
1563f3bb8dbdSMarcel Moolenaar	@echo
15646fa97020SBryan Drewery.for _kernel in ${BUILDKERNELS:Ndummy}
1565c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1566afcf05e4SRuslan Ermilov	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
1567c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1568f3bb8dbdSMarcel Moolenaar	@echo "===> ${_kernel}"
156968924308SSheldon Hearn	mkdir -p ${KRNLOBJDIR}
157059bb1d9cSBrian Somers.if !defined(NO_KERNELCONFIG)
1571ba3ae554SRuslan Ermilov	@echo
1572ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1573ba3ae554SRuslan Ermilov	@echo ">>> stage 1: configuring the kernel"
1574ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1575f3bb8dbdSMarcel Moolenaar	cd ${KRNLCONFDIR}; \
1576f3bb8dbdSMarcel Moolenaar		PATH=${TMPPATH} \
1577934372e2SPaul Richards		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
1578cf35c685SThomas Quinot			-I '${KERNCONFDIR}' '${KERNCONFDIR}/${_kernel}'
157959bb1d9cSBrian Somers.endif
1580f45a5bbdSRuslan Ermilov.if !defined(NO_CLEAN) && !defined(NO_KERNELCLEAN)
1581ba3ae554SRuslan Ermilov	@echo
1582ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1583ba3ae554SRuslan Ermilov	@echo ">>> stage 2.1: cleaning up the object tree"
1584ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1585d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR}
1586aa9ceac4SEd Maste.else
1587aa9ceac4SEd Maste	${_+_}cd ${.CURDIR}; ${WMAKE} _cleankernobj_fast_depend_hack
158851dfb947SPeter Wemm.endif
158962012822SWarner Losh.if !defined(NO_KERNELOBJ)
1590ba3ae554SRuslan Ermilov	@echo
1591ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1592ba3ae554SRuslan Ermilov	@echo ">>> stage 2.2: rebuilding the object tree"
1593ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1594d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj
159562012822SWarner Losh.endif
1596ba3ae554SRuslan Ermilov	@echo
1597ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1598ba3ae554SRuslan Ermilov	@echo ">>> stage 2.3: build tools"
1599ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1600d3109d39SIan Lepore	${_+_}cd ${.CURDIR}; ${KTMAKE} kernel-tools
1601ba3ae554SRuslan Ermilov	@echo
1602ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1603497e8091SBryan Drewery	@echo ">>> stage 3.1: building everything"
1604ba3ae554SRuslan Ermilov	@echo "--------------------------------------------------------------"
1605d82fd861SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ
1606c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1607afcf05e4SRuslan Ermilov	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
1608c80a5c4cSJordan K. Hubbard	@echo "--------------------------------------------------------------"
1609f3bb8dbdSMarcel Moolenaar.endfor
1610f3bb8dbdSMarcel Moolenaar
161179ccc589SEnji CooperNO_INSTALLEXTRAKERNELS?=	yes
1612c0fd4255SEnji Cooper
1613f3bb8dbdSMarcel Moolenaar#
16149565bbf3SBruce Evans# installkernel, etc.
1615f3bb8dbdSMarcel Moolenaar#
1616f3bb8dbdSMarcel Moolenaar# Install the kernel defined by INSTALLKERNEL
1617f3bb8dbdSMarcel Moolenaar#
1618afc6f086SGarance A Drosehninstallkernel installkernel.debug \
1619c943a53eSBryan Dreweryreinstallkernel reinstallkernel.debug: _installcheck_kernel .PHONY
16206fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
162107e5ffbaSJoseph Koshy.if empty(INSTALLKERNEL)
1622552b98b9SRuslan Ermilov	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
16239565bbf3SBruce Evans	false
162407e5ffbaSJoseph Koshy.endif
16252f00651dSRuslan Ermilov	@echo "--------------------------------------------------------------"
1626a564880cSWolfram Schneider	@echo ">>> Installing kernel ${INSTALLKERNEL} on $$(LC_ALL=C date)"
16272f00651dSRuslan Ermilov	@echo "--------------------------------------------------------------"
16283faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
1629fc599016SRuslan Ermilov	    ${CROSSENV} PATH=${TMPPATH} \
1630beb7ecadSBrooks Davis	    ${MAKE} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//}
1631a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1632a564880cSWolfram Schneider	@echo ">>> Installing kernel ${INSTALLKERNEL} completed on $$(LC_ALL=C date)"
1633a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
16346fa97020SBryan Drewery.endif
1635f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
1636f3c7b830SGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
1637f3c7b830SGleb Smirnoff	@echo "--------------------------------------------------------------"
1638a564880cSWolfram Schneider	@echo ">>> Installing kernel ${_kernel} $$(LC_ALL=C date)"
1639f3c7b830SGleb Smirnoff	@echo "--------------------------------------------------------------"
16403faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; \
1641f3c7b830SGleb Smirnoff	    ${CROSSENV} PATH=${TMPPATH} \
1642f3c7b830SGleb Smirnoff	    ${MAKE} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME}.${_kernel} ${.TARGET:S/kernel//}
1643a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1644a564880cSWolfram Schneider	@echo ">>> Installing kernel ${_kernel} completed on $$(LC_ALL=C date)"
1645a564880cSWolfram Schneider	@echo "--------------------------------------------------------------"
1646f3c7b830SGleb Smirnoff.endfor
164705f05f8bSGleb Smirnoff.endif
1648ae78d52fSDavid E. O'Brien
1649c943a53eSBryan Drewerydistributekernel distributekernel.debug: .PHONY
16506fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
165199ad39c8SNathan Whitehorn.if empty(INSTALLKERNEL)
165299ad39c8SNathan Whitehorn	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
165399ad39c8SNathan Whitehorn	false
165499ad39c8SNathan Whitehorn.endif
165539da820bSBrooks Davis	mkdir -p ${DESTDIR}/${DISTDIR}
165639da820bSBrooks Davis.if defined(NO_ROOT)
1657848f2374SGlen Barber	@echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.premeta
165839da820bSBrooks Davis.endif
16593faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
166039da820bSBrooks Davis	    ${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.premeta/} \
166139da820bSBrooks Davis	    ${IMAKE_MTREE} PATH=${TMPPATH} ${MAKE} KERNEL=${INSTKERNNAME} \
16626c461479SBrooks Davis	    DESTDIR=${INSTALL_DDIR}/kernel \
166399ad39c8SNathan Whitehorn	    ${.TARGET:S/distributekernel/install/}
166454cf6141SBrooks Davis.if defined(NO_ROOT)
1665848f2374SGlen Barber	@sed -e 's|^./kernel|.|' ${DESTDIR}/${DISTDIR}/kernel.premeta > \
166639da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.meta
166754cf6141SBrooks Davis.endif
16686fa97020SBryan Drewery.endif
1669f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
16706d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
167139da820bSBrooks Davis.if defined(NO_ROOT)
1672848f2374SGlen Barber	@echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta
167339da820bSBrooks Davis.endif
16743faecc70SBryan Drewery	${_+_}cd ${KRNLOBJDIR}/${_kernel}; \
167539da820bSBrooks Davis	    ${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.${_kernel}.premeta/} \
167639da820bSBrooks Davis	    ${IMAKE_MTREE} PATH=${TMPPATH} ${MAKE} \
1677d6ba7d93SGleb Smirnoff	    KERNEL=${INSTKERNNAME}.${_kernel} \
16786c461479SBrooks Davis	    DESTDIR=${INSTALL_DDIR}/kernel.${_kernel} \
1679d6ba7d93SGleb Smirnoff	    ${.TARGET:S/distributekernel/install/}
1680865f7779SJohn Baldwin.if defined(NO_ROOT)
1681848f2374SGlen Barber	@sed -e "s|^./kernel.${_kernel}|.|" \
168239da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta > \
168339da820bSBrooks Davis	    ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta
1684865f7779SJohn Baldwin.endif
1685d6ba7d93SGleb Smirnoff.endfor
168605f05f8bSGleb Smirnoff.endif
168799ad39c8SNathan Whitehorn
1688c943a53eSBryan Drewerypackagekernel: .PHONY
168939da820bSBrooks Davis.if defined(NO_ROOT)
16906fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
169139da820bSBrooks Davis	cd ${DESTDIR}/${DISTDIR}/kernel; \
169288343186SGlen Barber	    tar cvf - --exclude '*.debug' \
169388343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.meta | \
16940a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.txz
16956fa97020SBryan Drewery.endif
169633f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
169788343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel; \
169888343186SGlen Barber	    tar cvf - --include '*/*/*.debug' \
169988343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.meta | \
170088343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel-dbg.txz
170133f8570dSGlen Barber.endif
1702f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
17036d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
170439da820bSBrooks Davis	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
170588343186SGlen Barber	    tar cvf - --exclude '*.debug' \
170688343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta | \
17070a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.${_kernel}.txz
170833f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
170988343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
171088343186SGlen Barber	    tar cvf - --include '*/*/*.debug' \
171188343186SGlen Barber	    @${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta | \
171288343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}-dbg.txz
171333f8570dSGlen Barber.endif
171439da820bSBrooks Davis.endfor
171505f05f8bSGleb Smirnoff.endif
171639da820bSBrooks Davis.else
17176fa97020SBryan Drewery.if !defined(NO_INSTALLKERNEL)
1718d6ba7d93SGleb Smirnoff	cd ${DESTDIR}/${DISTDIR}/kernel; \
171988343186SGlen Barber	    tar cvf - --exclude '*.debug' . | \
17200a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.txz
17216fa97020SBryan Drewery.endif
172233f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
172388343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel; \
172488343186SGlen Barber	    tar cvf - --include '*/*/*.debug' $$(eval find .) | \
172588343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel-dbg.txz
172633f8570dSGlen Barber.endif
1727f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
17286d04a5adSGleb Smirnoff.for _kernel in ${BUILDKERNELS:[2..-1]}
1729d6ba7d93SGleb Smirnoff	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
173088343186SGlen Barber	    tar cvf - --exclude '*.debug' . | \
17310a63717cSBryan Drewery	    ${XZ_CMD} > ${PACKAGEDIR}/kernel.${_kernel}.txz
173233f8570dSGlen Barber.if ${MK_DEBUG_FILES} != "no"
173388343186SGlen Barber	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
173488343186SGlen Barber	    tar cvf - --include '*/*/*.debug' $$(eval find .) | \
173588343186SGlen Barber	    ${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}-dbg.txz
173633f8570dSGlen Barber.endif
1737d6ba7d93SGleb Smirnoff.endfor
173839da820bSBrooks Davis.endif
173905f05f8bSGleb Smirnoff.endif
174099ad39c8SNathan Whitehorn
1741c943a53eSBryan Drewerystagekernel: .PHONY
1742ae001499SBryan Drewery	${_+_}${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} distributekernel
17433d98f473SGlen Barber
174490963403SGlen BarberPORTSDIR?=	/usr/ports
1745dfa09989SBryan DreweryWSTAGEDIR?=	${OBJTOP}/worldstage
1746dfa09989SBryan DreweryKSTAGEDIR?=	${OBJTOP}/kernelstage
1747dfa09989SBryan DreweryREPODIR?=	${OBJROOT}repo
1748d46f0432SGlen BarberPKGSIGNKEY?=	# empty
1749f9371dcaSGlen Barber
175014cda706SGlen Barber.ORDER:		stage-packages create-packages
175114cda706SGlen Barber.ORDER:		create-packages create-world-packages
175214cda706SGlen Barber.ORDER:		create-packages create-kernel-packages
175314cda706SGlen Barber.ORDER:		create-packages sign-packages
175414cda706SGlen Barber
1755c943a53eSBryan Drewery_pkgbootstrap: .PHONY
17566e6be2bbSBryan Drewery.if make(*package*) && !exists(${LOCALBASE}/sbin/pkg)
1757f9371dcaSGlen Barber	@env ASSUME_ALWAYS_YES=YES pkg bootstrap
1758d7a8d386SGlen Barber.endif
1759f9371dcaSGlen Barber
1760c943a53eSBryan Drewerypackages: .PHONY
1761ae001499SBryan Drewery	${_+_}${MAKE} -C ${.CURDIR} PKG_VERSION=${PKG_VERSION} real-packages
1762a5395435SGlen Barber
1763c943a53eSBryan Drewerypackage-pkg: .PHONY
17643a3f435fSGlen Barber	rm -rf /tmp/ports.${TARGET} || :
176575a6cb4fSBryan Drewery	env ${WMAKEENV:Q} SRCDIR=${.CURDIR} PORTSDIR=${PORTSDIR} REVISION=${_REVISION} \
1766aeb76c0bSMatthew Seaman		PKG_CMD=${PKG_CMD} PKG_VERSION=${PKG_VERSION} REPODIR=${REPODIR} \
1767aeb76c0bSMatthew Seaman		WSTAGEDIR=${WSTAGEDIR} \
17683a3f435fSGlen Barber		sh ${.CURDIR}/release/scripts/make-pkg-package.sh
17693a3f435fSGlen Barber
1770c943a53eSBryan Dreweryreal-packages:	stage-packages create-packages sign-packages .PHONY
1771ee1627c4SDag-Erling Smørgrav
177200c44825SBryan Drewerystage-packages-world: .PHONY
177300c44825SBryan Drewery	@mkdir -p ${WSTAGEDIR}
1774f9371dcaSGlen Barber	${_+_}@cd ${.CURDIR}; \
177500c44825SBryan Drewery		${MAKE} DESTDIR=${WSTAGEDIR} -DNO_ROOT stageworld
177600c44825SBryan Drewery
177700c44825SBryan Drewerystage-packages-kernel: .PHONY
177800c44825SBryan Drewery	@mkdir -p ${KSTAGEDIR}
177900c44825SBryan Drewery	${_+_}@cd ${.CURDIR}; \
1780dd7b4c15SBryan Drewery		${MAKE} DESTDIR=${KSTAGEDIR} -DNO_ROOT stagekernel
1781ee1627c4SDag-Erling Smørgrav
178200c44825SBryan Drewerystage-packages: .PHONY stage-packages-world stage-packages-kernel
178300c44825SBryan Drewery
178448c22674SBryan Drewery_repodir: .PHONY
1785ee1627c4SDag-Erling Smørgrav	@mkdir -p ${REPODIR}
178648c22674SBryan Drewery
178748c22674SBryan Drewerycreate-packages-world:	_pkgbootstrap _repodir .PHONY
1788ee1627c4SDag-Erling Smørgrav	${_+_}@cd ${.CURDIR}; \
1789275219cfSBryan Drewery		${MAKE} -f Makefile.inc1 \
1790275219cfSBryan Drewery			DESTDIR=${WSTAGEDIR} \
179148c22674SBryan Drewery			PKG_VERSION=${PKG_VERSION} create-world-packages
179248c22674SBryan Drewery
179348c22674SBryan Drewerycreate-packages-kernel:	_pkgbootstrap _repodir .PHONY
179448c22674SBryan Drewery	${_+_}@cd ${.CURDIR}; \
1795275219cfSBryan Drewery		${MAKE} -f Makefile.inc1 \
1796275219cfSBryan Drewery			DESTDIR=${KSTAGEDIR} \
17971793d339SGlen Barber			PKG_VERSION=${PKG_VERSION} DISTDIR=kernel \
17981793d339SGlen Barber			create-kernel-packages
1799f9371dcaSGlen Barber
180048c22674SBryan Drewerycreate-packages: .PHONY create-packages-world create-packages-kernel
180148c22674SBryan Drewery
1802c943a53eSBryan Drewerycreate-world-packages:	_pkgbootstrap .PHONY
18037a888f32SGlen Barber	@rm -f ${WSTAGEDIR}/*.plist 2>/dev/null || :
18047a888f32SGlen Barber	@cd ${WSTAGEDIR} ; \
180549f1692aSBjoern A. Zeeb		env -i LC_COLLATE=C sort ${WSTAGEDIR}/${DISTDIR}/METALOG | \
180692b800ccSEd Maste		awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk
18077a888f32SGlen Barber	@for plist in ${WSTAGEDIR}/*.plist; do \
1808ca0abefbSBaptiste Daroussin	  plist=$${plist##*/} ; \
18095c52b2f5SGlen Barber	  pkgname=$${plist%.plist} ; \
1810f77b03aaSBryan Drewery	  echo "_PKGS+= $${pkgname}" ; \
1811f77b03aaSBryan Drewery	done > ${WSTAGEDIR}/packages.mk
1812f77b03aaSBryan Drewery	${_+_}@cd ${.CURDIR}; \
1813f77b03aaSBryan Drewery		${MAKE} -f Makefile.inc1 create-world-packages-jobs \
1814f77b03aaSBryan Drewery		.MAKE.JOB.PREFIX=
1815f77b03aaSBryan Drewery
1816f77b03aaSBryan Drewery.if make(create-world-packages-jobs)
1817f77b03aaSBryan Drewery.include "${WSTAGEDIR}/packages.mk"
1818f77b03aaSBryan Drewery.endif
1819f77b03aaSBryan Drewery
1820f77b03aaSBryan Drewerycreate-world-packages-jobs: .PHONY
1821f77b03aaSBryan Drewery.for pkgname in ${_PKGS}
1822f77b03aaSBryan Drewerycreate-world-packages-jobs: create-world-package-${pkgname}
1823f77b03aaSBryan Drewerycreate-world-package-${pkgname}: .PHONY
1824f77b03aaSBryan Drewery	@sh ${SRCDIR}/release/packages/generate-ucl.sh -o ${pkgname} \
1825f77b03aaSBryan Drewery		-s ${SRCDIR} -u ${WSTAGEDIR}/${pkgname}.ucl
1826f77b03aaSBryan Drewery	@awk -F\" ' \
18272cc77b79SBrad Davis		/^name/ { printf("===> Creating %s-", $$2); next } \
18282cc77b79SBrad Davis		/^version/ { print $$2; next } \
1829ebd2eeb3SGlen Barber		' ${WSTAGEDIR}/${pkgname}.ucl
183016398a11SGlen Barber	@if [ "${pkgname}" == "runtime" ]; then \
1831ebd2eeb3SGlen Barber		sed -i '' -e "s/%VCS_REVISION%/${VCS_REVISION}/" ${WSTAGEDIR}/${pkgname}.ucl ; \
183216398a11SGlen Barber	fi
1833ce3e7a9aSEmmanuel Vadot	${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/usr/bin/uname -o ALLOW_BASE_SHLIBS=yes \
1834f77b03aaSBryan Drewery		create -M ${WSTAGEDIR}/${pkgname}.ucl \
1835f77b03aaSBryan Drewery		-p ${WSTAGEDIR}/${pkgname}.plist \
18367a888f32SGlen Barber		-r ${WSTAGEDIR} \
1837ce3e7a9aSEmmanuel Vadot		-o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/usr/bin/uname config ABI)/${PKG_VERSION}
1838f77b03aaSBryan Drewery.endfor
1839ca0abefbSBaptiste Daroussin
184010c93529SBryan Drewery_default_flavor=	-default
18416e6be2bbSBryan Drewery.if make(*package*) && exists(${KSTAGEDIR}/kernel.meta)
184233f8570dSGlen Barber. if ${MK_DEBUG_FILES} != "no"
184333f8570dSGlen Barber_debug=-debug
184433f8570dSGlen Barber. endif
18450d26206dSBryan Drewerycreate-kernel-packages:	.PHONY
184633f8570dSGlen Barber. for flavor in "" ${_debug}
184710c93529SBryan Drewerycreate-kernel-packages: create-kernel-packages-flavor${flavor:C,^""$,${_default_flavor},}
184810c93529SBryan Drewerycreate-kernel-packages-flavor${flavor:C,^""$,${_default_flavor},}: _pkgbootstrap .PHONY
18497a888f32SGlen Barber	@cd ${KSTAGEDIR}/${DISTDIR} ; \
185092b800ccSEd Maste	env -i LC_COLLATE=C sort ${KSTAGEDIR}/kernel.meta | \
1851183a8eadSBaptiste Daroussin	awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk \
185292b800ccSEd Maste		-v kernel=yes -v _kernconf=${INSTALLKERNEL} ; \
18533d98f473SGlen Barber	sed -e "s/%VERSION%/${PKG_VERSION}/" \
1854b0bdd783SGlen Barber		-e "s/%PKGNAME%/kernel-${INSTALLKERNEL:tl}${flavor}/" \
1855fb6d3be5SKyle Evans		-e "s/%KERNELDIR%/kernel/" \
18564821f9edSGlen Barber		-e "s/%COMMENT%/FreeBSD ${INSTALLKERNEL} kernel ${flavor}/" \
18574821f9edSGlen Barber		-e "s/%DESC%/FreeBSD ${INSTALLKERNEL} kernel ${flavor}/" \
1858ebd2eeb3SGlen Barber		-e "s/ %VCS_REVISION%/${VCS_REVISION}/" \
18593d98f473SGlen Barber		${SRCDIR}/release/packages/kernel.ucl \
18607a888f32SGlen Barber		> ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl ; \
18613d98f473SGlen Barber	awk -F\" ' \
18623d98f473SGlen Barber		/name/ { printf("===> Creating %s-", $$2); next } \
18633d98f473SGlen Barber		/version/ {print $$2; next } ' \
18647a888f32SGlen Barber		${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl ; \
1865aeb76c0bSMatthew Seaman	${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh -o ALLOW_BASE_SHLIBS=yes \
18667a888f32SGlen Barber		create -M ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.ucl \
18677a888f32SGlen Barber		-p ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${flavor}.plist \
18687a888f32SGlen Barber		-r ${KSTAGEDIR}/${DISTDIR} \
1869aeb76c0bSMatthew Seaman		-o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION}
1870183a8eadSBaptiste Daroussin. endfor
18713d98f473SGlen Barber.endif
1872f4ae78bdSGleb Smirnoff.if ${BUILDKERNELS:[#]} > 1 && ${NO_INSTALLEXTRAKERNELS} != "yes"
18733d98f473SGlen Barber. for _kernel in ${BUILDKERNELS:[2..-1]}
18747a888f32SGlen Barber.  if exists(${KSTAGEDIR}/kernel.${_kernel}.meta)
187533f8570dSGlen Barber.   if ${MK_DEBUG_FILES} != "no"
187633f8570dSGlen Barber_debug=-debug
187733f8570dSGlen Barber.   endif
187833f8570dSGlen Barber.   for flavor in "" ${_debug}
1879f45c7805SBryan Drewerycreate-kernel-packages: create-kernel-packages-extra-flavor${flavor:C,^""$,${_default_flavor},}-${_kernel}
1880f45c7805SBryan Drewerycreate-kernel-packages-extra-flavor${flavor:C,^""$,${_default_flavor},}-${_kernel}: _pkgbootstrap .PHONY
18817a888f32SGlen Barber	@cd ${KSTAGEDIR}/kernel.${_kernel} ; \
188292b800ccSEd Maste	env -i LC_COLLATE=C sort ${KSTAGEDIR}/kernel.${_kernel}.meta | \
1883183a8eadSBaptiste Daroussin	awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk \
188492b800ccSEd Maste		-v kernel=yes -v _kernconf=${_kernel} ; \
18853d98f473SGlen Barber	sed -e "s/%VERSION%/${PKG_VERSION}/" \
1886b0bdd783SGlen Barber		-e "s/%PKGNAME%/kernel-${_kernel:tl}${flavor}/" \
1887fb6d3be5SKyle Evans		-e "s/%KERNELDIR%/kernel.${_kernel}/" \
1888f61b1691SGlen Barber		-e "s/%COMMENT%/FreeBSD ${_kernel} kernel ${flavor}/" \
1889f61b1691SGlen Barber		-e "s/%DESC%/FreeBSD ${_kernel} kernel ${flavor}/" \
1890ebd2eeb3SGlen Barber		-e "s/ %VCS_REVISION%/${VCS_REVISION}/" \
18913d98f473SGlen Barber		${SRCDIR}/release/packages/kernel.ucl \
18927a888f32SGlen Barber		> ${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl ; \
18933d98f473SGlen Barber	awk -F\" ' \
18943d98f473SGlen Barber		/name/ { printf("===> Creating %s-", $$2); next } \
18953d98f473SGlen Barber		/version/ {print $$2; next } ' \
18967a888f32SGlen Barber		${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl ; \
1897aeb76c0bSMatthew Seaman	${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh -o ALLOW_BASE_SHLIBS=yes \
18987a888f32SGlen Barber		create -M ${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.ucl \
18997a888f32SGlen Barber		-p ${KSTAGEDIR}/kernel.${_kernel}/kernel.${_kernel}${flavor}.plist \
19007a888f32SGlen Barber		-r ${KSTAGEDIR}/kernel.${_kernel} \
1901aeb76c0bSMatthew Seaman		-o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION}
19023d98f473SGlen Barber.   endfor
1903183a8eadSBaptiste Daroussin.  endif
1904183a8eadSBaptiste Daroussin. endfor
19053d98f473SGlen Barber.endif
1906183a8eadSBaptiste Daroussin
1907c943a53eSBryan Drewerysign-packages:	_pkgbootstrap .PHONY
1908aeb76c0bSMatthew Seaman	@[ -L "${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/latest" ] && \
1909aeb76c0bSMatthew Seaman		unlink ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/latest ; \
1910aeb76c0bSMatthew Seaman	${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh repo \
1911aeb76c0bSMatthew Seaman		-o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION} \
1912aeb76c0bSMatthew Seaman		${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION} \
1913a5395435SGlen Barber		${PKGSIGNKEY} ; \
19145e50a318SGlen Barber	cd ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI); \
19155e50a318SGlen Barber	ln -s ${PKG_VERSION} latest
1916d46f0432SGlen Barber
1917ae78d52fSDavid E. O'Brien#
191871b7fa12SEnji Cooper#
191971b7fa12SEnji Cooper# checkworld
192071b7fa12SEnji Cooper#
192171b7fa12SEnji Cooper# Run test suite on installed world.
192271b7fa12SEnji Cooper#
192371b7fa12SEnji Coopercheckworld: .PHONY
192466df1425SEnji Cooper	@if [ ! -x "${LOCALBASE}/bin/kyua" ]; then \
192571b7fa12SEnji Cooper		echo "You need kyua (devel/kyua) to run the test suite." | /usr/bin/fmt; \
192671b7fa12SEnji Cooper		exit 1; \
192771b7fa12SEnji Cooper	fi
192874464d3cSEnji Cooper	${_+_}PATH="$$PATH:${LOCALBASE}/bin" kyua test -k ${TESTSBASE}/Kyuafile
192971b7fa12SEnji Cooper
193071b7fa12SEnji Cooper#
193171b7fa12SEnji Cooper#
1932becc5c62SAlexander Leidinger# doxygen
1933becc5c62SAlexander Leidinger#
1934becc5c62SAlexander Leidinger# Build the API documentation with doxygen
1935becc5c62SAlexander Leidinger#
1936d82fd861SBryan Drewerydoxygen: .PHONY
193766df1425SEnji Cooper	@if [ ! -x "${LOCALBASE}/bin/doxygen" ]; then \
1938becc5c62SAlexander Leidinger		echo "You need doxygen (devel/doxygen) to generate the API documentation of the kernel." | /usr/bin/fmt; \
1939becc5c62SAlexander Leidinger		exit 1; \
1940becc5c62SAlexander Leidinger	fi
1941b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}/tools/kerneldoc/subsys; ${MAKE} obj all
1942becc5c62SAlexander Leidinger
1943becc5c62SAlexander Leidinger#
194411fb97daSJohn Birrell# update
194511fb97daSJohn Birrell#
1946527f7dc3SGlen Barber# Update the source tree(s), by running svn/svnup to update to the
194711fb97daSJohn Birrell# latest copy.
194811fb97daSJohn Birrell#
1949c943a53eSBryan Dreweryupdate: .PHONY
195051a8ff0cSMark Murray.if defined(SVN_UPDATE)
19514e02fd95SGlen Barber	@echo "--------------------------------------------------------------"
19524e02fd95SGlen Barber	@echo ">>> Updating ${.CURDIR} using Subversion"
19534e02fd95SGlen Barber	@echo "--------------------------------------------------------------"
19540f8995a9SBryan Drewery	@(cd ${.CURDIR}; ${SVN_CMD} update ${SVNFLAGS})
195511fb97daSJohn Birrell.endif
195611fb97daSJohn Birrell
195711fb97daSJohn Birrell#
195811fb97daSJohn Birrell# ------------------------------------------------------------------------
195911fb97daSJohn Birrell#
196011fb97daSJohn Birrell# From here onwards are utility targets used by the 'make world' and
196111fb97daSJohn Birrell# related targets.  If your 'world' breaks, you may like to try to fix
196211fb97daSJohn Birrell# the problem and manually run the following targets to attempt to
196311fb97daSJohn Birrell# complete the build.  Beware, this is *not* guaranteed to work, you
196411fb97daSJohn Birrell# need to have a pretty good grip on the current state of the system
196511fb97daSJohn Birrell# to attempt to manually finish it.  If in doubt, 'make world' again.
196611fb97daSJohn Birrell#
196711fb97daSJohn Birrell
196811fb97daSJohn Birrell#
1969d9933780SEd Maste# legacy: Build compatibility shims for the next three targets. This is a
1970d9933780SEd Maste# minimal set of tools and shims necessary to compensate for older systems
1971d9933780SEd Maste# which don't have the APIs required by the targets built in bootstrap-tools,
1972d9933780SEd Maste# build-tools or cross-tools.
197376762624SMarcel Moolenaar#
19748551ff3fSEd Maste
19758551ff3fSEd Maste# ELF Tool Chain libraries are needed for ELF tools and dtrace tools.
1976cb1469fdSEd Maste# r296685 fix cross-endian objcopy
19776d0ab078SRyan Libby# r310724 fixed PR 215350, a crash in libdwarf with objects built by GCC 6.2.
19788590505fSMark Johnston# r334881 added libdwarf constants used by ctfconvert.
19790c0c965aSJohn Baldwin# r338478 fixed a crash in objcopy for mips64el objects
19800c0c965aSJohn Baldwin.if ${BOOTSTRAPPING} < 1200084
19818551ff3fSEd Maste_elftoolchain_libs= lib/libelf lib/libdwarf
19828551ff3fSEd Maste.endif
19838551ff3fSEd Maste
19842b720021SKyle Evans# libnv and libl are both requirements for config(8), which is an unconditional
19852b720021SKyle Evans# bootstrap-tool.
19862b720021SKyle Evans_config_deps= lib/libnv usr.bin/lex/lib
19872b720021SKyle Evans
1988c943a53eSBryan Drewerylegacy: .PHONY
19894d40df1bSBryan Drewery.if ${BOOTSTRAPPING} < ${MINIMUM_SUPPORTED_OSREL} && ${BOOTSTRAPPING} != 0
19904d40df1bSBryan Drewery	@echo "ERROR: Source upgrades from versions prior to ${MINIMUM_SUPPORTED_REL} are not supported."; \
199151dc1e12SRuslan Ermilov	false
199251dc1e12SRuslan Ermilov.endif
199390136961SWarner Losh
19942b720021SKyle Evans.for _tool in tools/build ${_elftoolchain_libs} ${_config_deps}
1995497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,all,install)"; \
1996b67490a3SBryan Drewery	    cd ${.CURDIR}/${_tool}; \
19972abeba9dSBryan Drewery	    if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
1998dfa09989SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy includes; \
1999aa06dfc9SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no all; \
2000aa06dfc9SBryan Drewery	    ${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no \
2001dfa09989SBryan Drewery	        DESTDIR=${WORLDTMP}/legacy install
2002f7e19a98SWarner Losh.endfor
2003f7e19a98SWarner Losh
2004cfc236e8SRuslan Ermilov#
2005996d8a0dSWarner Losh# bootstrap-tools: Build tools needed for compatibility. These are binaries that
2006996d8a0dSWarner Losh# are built to build other binaries in the system. However, the focus of these
2007996d8a0dSWarner Losh# binaries is usually quite narrow. Bootstrap tools use the host's compiler and
2008996d8a0dSWarner Losh# libraries, augmented by -legacy.
2009cfc236e8SRuslan Ermilov#
2010aebc0e35SEnji Cooper_bt=		_bootstrap-tools
2011aebc0e35SEnji Cooper
2012e1fe3dbaSRuslan Ermilov.if ${MK_GAMES} != "no"
20136ae1554aSColin Percival_strfile=	usr.bin/fortune/strfile
2014cfc236e8SRuslan Ermilov.endif
2015cfc236e8SRuslan Ermilov
20160f20a3cdSBaptiste Daroussin.if ${MK_GCC} != "no" && ${MK_CXX} != "no"
2017652b5a75SDavid E. O'Brien_gperf=		gnu/usr.bin/gperf
2018007bf12eSRuslan Ermilov.endif
2019423102c6SUlrich Spörlein
2020824a9093SEd Maste.if ${MK_VT} != "no"
2021cce0f182SEd Maste_vtfontcvt=	usr.bin/vtfontcvt
2022cce0f182SEd Maste.endif
2023cce0f182SEd Maste
20248dc7b23aSBryan Drewery.if ${BOOTSTRAPPING} < 1000033
2025f5e4216eSBaptiste Daroussin_m4=		usr.bin/m4
20268dc7b23aSBryan Drewery_lex=		usr.bin/lex
2027ab76bc97SJung-uk Kim
2028a36eca08SCraig Rodrigues${_bt}-usr.bin/m4: ${_bt}-lib/libopenbsd
20298dc7b23aSBryan Drewery${_bt}-usr.bin/lex: ${_bt}-usr.bin/m4
203003bc68caSEd Schouten.endif
203103bc68caSEd Schouten
20320e4e8f1bSBryan Drewery# r245440 mtree -N support added
20330e4e8f1bSBryan Drewery# r313404 requires sha384.h for libnetbsd, added to libmd in r292782
203451c6e78dSBryan Drewery.if ${BOOTSTRAPPING} < 1100093
203551c6e78dSBryan Drewery_nmtree=	lib/libmd \
203651c6e78dSBryan Drewery		lib/libnetbsd \
203741a8e223SBrooks Davis		usr.sbin/nmtree
2038aebc0e35SEnji Cooper
203951c6e78dSBryan Drewery${_bt}-lib/libnetbsd: ${_bt}-lib/libmd
2040aebc0e35SEnji Cooper${_bt}-usr.sbin/nmtree: ${_bt}-lib/libnetbsd
204141a8e223SBrooks Davis.endif
204241a8e223SBrooks Davis
20436fc94bc4SWarner Losh# r246097: log addition login.conf.db, passwd, pwd.db, and spwd.db with cat -l
204464dc091fSBrooks Davis.if ${BOOTSTRAPPING} < 1000027
204564dc091fSBrooks Davis_cat=		bin/cat
204664dc091fSBrooks Davis.endif
204764dc091fSBrooks Davis
20487f36f2d0SEd Maste# r277259 crunchide: Correct 64-bit section header offset
20497f36f2d0SEd Maste# r281674 crunchide: always include both 32- and 64-bit ELF support
2050ad38a9d9SWarner Losh.if ${BOOTSTRAPPING} < 1100078
2051eb9b07bbSBryan Drewery_crunchide=	usr.sbin/crunch/crunchide
2052eb9b07bbSBryan Drewery.endif
2053eb9b07bbSBryan Drewery
2054eb9b07bbSBryan Drewery# r285986 crunchen: use STRIPBIN rather than STRIP
2055eb9b07bbSBryan Drewery# 1100113: Support MK_AUTO_OBJ
2056fcc803dfSBryan Drewery# 1200006: META_MODE fixes
2057eb9b07bbSBryan Drewery.if ${BOOTSTRAPPING} < 1100078 || \
2058fcc803dfSBryan Drewery    (${MK_AUTO_OBJ} == "yes" && ${BOOTSTRAPPING} < 1100114) || \
2059fcc803dfSBryan Drewery    (${MK_META_MODE} == "yes" && ${BOOTSTRAPPING} < 1200006)
2060eb9b07bbSBryan Drewery_crunchgen=	usr.sbin/crunch/crunchgen
20612d8d8e3cSEd Maste.endif
20622d8d8e3cSEd Maste
206397c316c6SEd Maste# r296926 -P keymap search path, MFC to stable/10 in r298297
206497c316c6SEd Maste.if ${BOOTSTRAPPING} < 1003501 || \
206597c316c6SEd Maste	(${BOOTSTRAPPING} >= 1100000 && ${BOOTSTRAPPING} < 1100103)
2066915d57aeSEd Maste_kbdcontrol=	usr.sbin/kbdcontrol
2067915d57aeSEd Maste.endif
2068915d57aeSEd Maste
20699c633debSJung-uk Kim_yacc=		lib/liby \
20709c633debSJung-uk Kim		usr.bin/yacc
2071aebc0e35SEnji Cooper
2072aebc0e35SEnji Cooper${_bt}-usr.bin/yacc: ${_bt}-lib/liby
20739c633debSJung-uk Kim
207451483c42SEnji Cooper.if ${MK_BSNMP} != "no"
2075d6acfaf5SRuslan Ermilov_gensnmptree=	usr.sbin/bsnmpd/gensnmptree
2076d6acfaf5SRuslan Ermilov.endif
2077d6acfaf5SRuslan Ermilov
2078c97e5167SAlex Richardson.if ${MK_LOCALES} != "no"
2079c97e5167SAlex Richardson_localedef=	usr.bin/localedef
2080c97e5167SAlex Richardson.endif
2081c97e5167SAlex Richardson
2082ffe63c8bSEd Maste# We need to build tblgen when we're building clang or lld, either as
2083ffe63c8bSEd Maste# bootstrap tools, or as the part of the normal build.
2084ffe63c8bSEd Maste.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_CLANG} != "no" || \
2085ffe63c8bSEd Maste    ${MK_LLD_BOOTSTRAP} != "no" || ${MK_LLD} != "no"
2086907eed1fSDimitry Andric_clang_tblgen= \
2087986e05bcSDimitry Andric	lib/clang/libllvmminimal \
208834cdd776SDimitry Andric	usr.bin/clang/llvm-tblgen \
2089907eed1fSDimitry Andric	usr.bin/clang/clang-tblgen
2090aebc0e35SEnji Cooper
2091986e05bcSDimitry Andric${_bt}-usr.bin/clang/clang-tblgen: ${_bt}-lib/clang/libllvmminimal
2092986e05bcSDimitry Andric${_bt}-usr.bin/clang/llvm-tblgen: ${_bt}-lib/clang/libllvmminimal
2093907eed1fSDimitry Andric.endif
2094907eed1fSDimitry Andric
2095eeb913c9SWarner Losh# Default to building the GPL DTC, but build the BSDL one if users explicitly
2096af0dd31fSDavid Chisnall# request it.
2097c3b739c7SDavid Chisnall_dtc= usr.bin/dtc
2098af0dd31fSDavid Chisnall.if ${MK_GPL_DTC} != "no"
20993c5326bfSRafal Jaworowski_dtc= gnu/usr.bin/dtc
21003c5326bfSRafal Jaworowski.endif
21013c5326bfSRafal Jaworowski
210284f54c4fSCy Schubert.if ${MK_KERBEROS} != "no"
210384f54c4fSCy Schubert_kerberos5_bootstrap_tools= \
210484f54c4fSCy Schubert	kerberos5/tools/make-roken \
210584f54c4fSCy Schubert	kerberos5/lib/libroken \
210684f54c4fSCy Schubert	kerberos5/lib/libvers \
210784f54c4fSCy Schubert	kerberos5/tools/asn1_compile \
210884f54c4fSCy Schubert	kerberos5/tools/slc \
210984f54c4fSCy Schubert	usr.bin/compile_et
211084f54c4fSCy Schubert
211184f54c4fSCy Schubert.ORDER: ${_kerberos5_bootstrap_tools:C/^/${_bt}-/g}
211284f54c4fSCy Schubert.endif
211384f54c4fSCy Schubert
21147666f500SBaptiste Daroussin${_bt}-usr.bin/mandoc: ${_bt}-lib/libopenbsd
21158faa40d1SBaptiste Daroussin
2116aebc0e35SEnji Cooperbootstrap-tools: .PHONY
2117aebc0e35SEnji Cooper
2118c79f2d97SDavid E. O'Brien#	Please document (add comment) why something is in 'bootstrap-tools'.
2119c79f2d97SDavid E. O'Brien#	Try to bound the building of the bootstrap-tool to just the
2120c79f2d97SDavid E. O'Brien#	FreeBSD versions that need the tool built at this stage of the build.
21213cc95654SRuslan Ermilov.for _tool in \
2122907eed1fSDimitry Andric    ${_clang_tblgen} \
212384f54c4fSCy Schubert    ${_kerberos5_bootstrap_tools} \
21243cc95654SRuslan Ermilov    ${_strfile} \
21253cc95654SRuslan Ermilov    ${_gperf} \
21263c5326bfSRafal Jaworowski    ${_dtc} \
212764dc091fSBrooks Davis    ${_cat} \
2128915d57aeSEd Maste    ${_kbdcontrol} \
2129eac161efSRuslan Ermilov    usr.bin/lorder \
2130a13a8505SBryan Drewery    lib/libopenbsd \
2131a13a8505SBryan Drewery    usr.bin/mandoc \
21323cc95654SRuslan Ermilov    usr.bin/rpcgen \
213303bc68caSEd Schouten    ${_yacc} \
2134ab76bc97SJung-uk Kim    ${_m4} \
21355bfe3851SDag-Erling Smørgrav    ${_lex} \
21363cc95654SRuslan Ermilov    usr.bin/xinstall \
213700602d09SGiorgos Keramidas    ${_gensnmptree} \
2138417d105fSKyle Evans    usr.sbin/config \
2139eb9b07bbSBryan Drewery    ${_crunchide} \
2140eb9b07bbSBryan Drewery    ${_crunchgen} \
2141cce0f182SEd Maste    ${_nmtree} \
214257df665aSBaptiste Daroussin    ${_vtfontcvt} \
2143c97e5167SAlex Richardson    ${_localedef}
2144aebc0e35SEnji Cooper${_bt}-${_tool}: .PHONY .MAKE
2145497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
2146b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
21472abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
2148b67490a3SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ all; \
2149dfa09989SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy install
2150aebc0e35SEnji Cooper
2151aebc0e35SEnji Cooperbootstrap-tools: ${_bt}-${_tool}
215276762624SMarcel Moolenaar.endfor
215376762624SMarcel Moolenaar
215476762624SMarcel Moolenaar#
215576762624SMarcel Moolenaar# build-tools: Build special purpose build tools
215676762624SMarcel Moolenaar#
2157ebe45c64SAlex Richardson.if !defined(NO_SHARE) && ${MK_SYSCONS} != "no"
215876762624SMarcel Moolenaar_share=	share/syscons/scrnmaps
215976762624SMarcel Moolenaar.endif
216076762624SMarcel Moolenaar
2161cff4243dSMarcel Moolenaar.if ${MK_GCC} != "no"
2162dfbaea83SDimitry Andric_gcc_tools= gnu/usr.bin/cc/cc_tools
2163dfbaea83SDimitry Andric.endif
2164dfbaea83SDimitry Andric
2165e1fe3dbaSRuslan Ermilov.if ${MK_RESCUE} != "no"
21669aca5cedSWarner Losh# rescue includes programs that have build-tools targets
2167a20c015cSGordon Tetlow_rescue=rescue/rescue
2168a20c015cSGordon Tetlow.endif
2169a20c015cSGordon Tetlow
2170e133ecbbSEnji Cooper.if ${MK_TCSH} != "no"
2171e133ecbbSEnji Cooper_tcsh=bin/csh
2172e133ecbbSEnji Cooper.endif
21737202739fSAlex Richardson.if ${MK_FILE} != "no"
21747202739fSAlex Richardson_libmagic=lib/libmagic
21757202739fSAlex Richardson.endif
2176e133ecbbSEnji Cooper
21776f1f2b19SBryan Drewery.if ${MK_PMC} != "no" && \
21786f1f2b19SBryan Drewery    (${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386")
2179959826caSMatt Macy_jevents=lib/libpmc/pmu-events
2180e98bbcf9SMatt Macy.endif
2181e98bbcf9SMatt Macy
21825a4121a8SBryan Drewery# kernel-toolchain skips _cleanobj, so handle cleaning up previous
21835a4121a8SBryan Drewery# build-tools directories if needed.
21845a4121a8SBryan Drewery.if !defined(NO_CLEAN) && make(kernel-toolchain)
21855a4121a8SBryan Drewery_bt_clean=	${CLEANDIR}
21865a4121a8SBryan Drewery.endif
21875a4121a8SBryan Drewery
21883cc95654SRuslan Ermilov.for _tool in \
2189e133ecbbSEnji Cooper    ${_tcsh} \
21903cc95654SRuslan Ermilov    bin/sh \
21919b428cfaSAdrian Chadd    ${LOCAL_TOOL_DIRS} \
2192e98bbcf9SMatt Macy    ${_jevents} \
2193af5b5a0fSRong-En Fan    lib/ncurses/ncurses \
219431b4134fSRong-En Fan    lib/ncurses/ncursesw \
2195572ec1c5SXin LI    ${_rescue} \
21963cc95654SRuslan Ermilov    ${_share} \
21973cc95654SRuslan Ermilov    usr.bin/awk \
21987202739fSAlex Richardson    ${_libmagic} \
2199ad30f8e7SGabor Kovesdan    usr.bin/mkesdb_static \
2200f0957ccaSPeter Wemm    usr.bin/mkcsmapper_static \
22017cd84b56SBryan Drewery    usr.bin/vi/catalog \
22027cd84b56SBryan Drewery    ${_gcc_tools}
220368847f14SBryan Drewerybuild-tools_${_tool}: .PHONY
22045a4121a8SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (${_bt_clean:D${_bt_clean},}obj,build-tools)"; \
2205b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
22065a4121a8SBryan Drewery		if [ -n "${_bt_clean}" ]; then ${MAKE} DIRPRFX=${_tool}/ ${_bt_clean}; fi; \
22072abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
22082ff31e0dSRuslan Ermilov		${MAKE} DIRPRFX=${_tool}/ build-tools
220968847f14SBryan Drewerybuild-tools: build-tools_${_tool}
221076762624SMarcel Moolenaar.endfor
221176762624SMarcel Moolenaar
221276762624SMarcel Moolenaar#
2213f382c38eSIan Lepore# kernel-tools: Build kernel-building tools
2214f382c38eSIan Lepore#
2215c943a53eSBryan Drewerykernel-tools: .PHONY
2216dfa09989SBryan Drewery	mkdir -p ${WORLDTMP}/usr
221755a5b46aSAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
2218dfa09989SBryan Drewery	    -p ${WORLDTMP}/usr >/dev/null
2219f382c38eSIan Lepore
2220f382c38eSIan Lepore#
2221996d8a0dSWarner Losh# cross-tools: All the tools needed to build the rest of the system after
2222996d8a0dSWarner Losh# we get done with the earlier stages. It is the last set of tools needed
2223996d8a0dSWarner Losh# to begin building the target binaries.
2224bfc59eb8SMarcel Moolenaar#
22252ed29669SWarner Losh.if ${TARGET_ARCH} != ${MACHINE_ARCH}
2226620b3a0cSRuslan Ermilov.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
22271d19afdeSMarcel Moolenaar_btxld=		usr.sbin/btxld
2228b501b9b5SRuslan Ermilov.endif
22293d42ee26SRuslan Ermilov.endif
2230bd42830fSRuslan Ermilov
2231b5512f3bSEd Maste# Rebuild ctfconvert and ctfmerge to avoid difficult-to-diagnose failures
2232b5512f3bSEd Maste# resulting from missing bug fixes or ELF Toolchain updates.
2233b5512f3bSEd Maste.if ${MK_CDDL} != "no"
22349875367bSAndriy Gapon_dtrace_tools= cddl/lib/libctf cddl/usr.bin/ctfconvert \
2235b5512f3bSEd Maste    cddl/usr.bin/ctfmerge
2236b5512f3bSEd Maste.endif
2237b5512f3bSEd Maste
22382bf36e7eSWarner Losh# If we're given an XAS, don't build binutils.
22397d612a43SEd Maste.if ${XAS:M/*} == ""
22407d612a43SEd Maste.if ${MK_BINUTILS_BOOTSTRAP} != "no"
22410163af23SWarner Losh_binutils=	gnu/usr.bin/binutils
22427d612a43SEd Maste.endif
224308474898SEd Maste.if ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
224431942939SEd Maste_elftctools=	lib/libelftc \
2245c1da2974SEd Maste		lib/libpe \
22469b844631SEd Maste		usr.bin/objcopy \
224731942939SEd Maste		usr.bin/nm \
224831942939SEd Maste		usr.bin/size \
224931942939SEd Maste		usr.bin/strings
225027051ca1SEd Maste# These are not required by the build, but can be useful for developers who
225127051ca1SEd Maste# cross-build on a FreeBSD 10 host:
225227051ca1SEd Maste_elftctools+=	usr.bin/addr2line
225331942939SEd Maste.endif
225408474898SEd Maste.elif ${TARGET_ARCH} != ${MACHINE_ARCH} && ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
2255a8bed44aSEd Maste# If cross-building with an external binutils we still need to build strip for
2256a8bed44aSEd Maste# the target (for at least crunchide).
2257a8bed44aSEd Maste_elftctools=	lib/libelftc \
2258c1da2974SEd Maste		lib/libpe \
22599b844631SEd Maste		usr.bin/objcopy
22600163af23SWarner Losh.endif
22610163af23SWarner Losh
22622bf36e7eSWarner Losh.if ${MK_CLANG_BOOTSTRAP} != "no"
2263338f97feSDimitry Andric_clang=		usr.bin/clang
2264ffe63c8bSEd Maste.endif
2265ffe63c8bSEd Maste.if ${MK_LLD_BOOTSTRAP} != "no"
2266ffe63c8bSEd Maste_lld=		usr.bin/clang/lld
2267ffe63c8bSEd Maste.endif
2268ffe63c8bSEd Maste.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_LLD_BOOTSTRAP} != "no"
2269907eed1fSDimitry Andric_clang_libs=	lib/clang
22700163af23SWarner Losh.endif
22712bf36e7eSWarner Losh.if ${MK_GCC_BOOTSTRAP} != "no"
227235070067SBryan Drewery_gcc=		gnu/usr.bin/cc
22733d2fb95aSYoshihiro Takahashi.endif
2274b61e5e48SEnji Cooper.if ${MK_USB} != "no"
2275ca987d46SWarner Losh_usb_tools=	stand/usb/tools
2276b61e5e48SEnji Cooper.endif
22770163af23SWarner Losh
2278d82fd861SBryan Drewerycross-tools: .MAKE .PHONY
22793cc95654SRuslan Ermilov.for _tool in \
22804143850bSBryan Drewery    ${LOCAL_XTOOL_DIRS} \
2281ad8a0e42SRui Paulo    ${_clang_libs} \
2282ad8a0e42SRui Paulo    ${_clang} \
2283737872e9SEd Maste    ${_lld} \
22840163af23SWarner Losh    ${_binutils} \
228531942939SEd Maste    ${_elftctools} \
2286b5512f3bSEd Maste    ${_dtrace_tools} \
228735070067SBryan Drewery    ${_gcc} \
22883cc95654SRuslan Ermilov    ${_btxld} \
2289b61e5e48SEnji Cooper    ${_usb_tools}
2290497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
2291b67490a3SBryan Drewery		cd ${.CURDIR}/${_tool}; \
22922abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
2293b67490a3SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ all; \
2294dfa09989SBryan Drewery		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP} install
2295894157f5SMarcel Moolenaar.endfor
2296894157f5SMarcel Moolenaar
2297ca95e9ddSBryan Drewery#
2298bf3befadSSean Bruno# native-xtools is the current target for qemu-user cross builds of ports
2299bf3befadSSean Bruno# via poudriere and the imgact_binmisc kernel module.
2300ca95e9ddSBryan Drewery# This target merely builds a toolchan/sysroot, then builds the tools it wants
2301ca95e9ddSBryan Drewery# with the options it wants in a special MAKEOBJDIRPREFIX, using the toolchain
2302ca95e9ddSBryan Drewery# already built.  It then installs the static tools to NXBDESTDIR for Poudriere
2303ca95e9ddSBryan Drewery# to pickup.
2304ca95e9ddSBryan Drewery#
23053d165b2fSBryan DreweryNXBOBJROOT=	${OBJROOT}${MACHINE}.${MACHINE_ARCH}/nxb/
23069cde684dSBryan DreweryNXBOBJTOP=	${NXBOBJROOT}${NXB_TARGET}.${NXB_TARGET_ARCH}
23075bd47cc5SBryan DreweryNXTP?=		/nxb-bin
23085bd47cc5SBryan Drewery.if ${NXTP:N/*}
23095bd47cc5SBryan Drewery.error NXTP variable should be an absolute path
23105bd47cc5SBryan Drewery.endif
23115bd47cc5SBryan DreweryNXBDESTDIR?=	${DESTDIR}${NXTP}
2312ca95e9ddSBryan Drewery
2313ca95e9ddSBryan Drewery# This is the list of tools to be built/installed as static and where
2314ca95e9ddSBryan Drewery# appropriate to build for the given TARGET.TARGET_ARCH.
2315ca95e9ddSBryan DreweryNXBDIRS+= \
2316e98c3c3fSSean Bruno    bin/cat \
2317e98c3c3fSSean Bruno    bin/chmod \
2318e98c3c3fSSean Bruno    bin/cp \
2319e133ecbbSEnji Cooper    ${_tcsh} \
2320e93397e5SSean Bruno    bin/echo \
2321e98c3c3fSSean Bruno    bin/expr \
2322e93397e5SSean Bruno    bin/hostname \
2323e98c3c3fSSean Bruno    bin/ln \
2324e98c3c3fSSean Bruno    bin/ls \
2325e98c3c3fSSean Bruno    bin/mkdir \
2326e93397e5SSean Bruno    bin/mv \
2327e98c3c3fSSean Bruno    bin/ps \
2328e98c3c3fSSean Bruno    bin/realpath \
2329e98c3c3fSSean Bruno    bin/rm \
2330e98c3c3fSSean Bruno    bin/rmdir \
23312c8c40a7SSean Bruno    bin/sh \
2332e98c3c3fSSean Bruno    bin/sleep \
23332c8c40a7SSean Bruno    sbin/md5 \
2334e98c3c3fSSean Bruno    sbin/sysctl \
2335ca95e9ddSBryan Drewery    usr.bin/addr2line \
2336ca95e9ddSBryan Drewery    usr.bin/ar \
233775872267SWarner Losh    usr.bin/awk \
2338e98c3c3fSSean Bruno    usr.bin/basename \
233975872267SWarner Losh    usr.bin/bmake \
23402c8c40a7SSean Bruno    usr.bin/bzip2 \
2341e98c3c3fSSean Bruno    usr.bin/cmp \
2342ca95e9ddSBryan Drewery    usr.bin/diff \
2343e98c3c3fSSean Bruno    usr.bin/dirname \
23449b844631SEd Maste    usr.bin/objcopy \
2345e98c3c3fSSean Bruno    usr.bin/env \
23462c8c40a7SSean Bruno    usr.bin/fetch \
2347e98c3c3fSSean Bruno    usr.bin/find \
2348e98c3c3fSSean Bruno    usr.bin/grep \
23492c8c40a7SSean Bruno    usr.bin/gzip \
2350e98c3c3fSSean Bruno    usr.bin/id \
235175872267SWarner Losh    usr.bin/lex \
2352111bf579SAntoine Brodin    usr.bin/limits \
235375872267SWarner Losh    usr.bin/lorder \
2354ca95e9ddSBryan Drewery    usr.bin/mandoc \
2355e98c3c3fSSean Bruno    usr.bin/mktemp \
2356e98c3c3fSSean Bruno    usr.bin/mt \
2357ca95e9ddSBryan Drewery    usr.bin/nm \
2358e98c3c3fSSean Bruno    usr.bin/patch \
235927f134b6SBryan Drewery    usr.bin/readelf \
236075872267SWarner Losh    usr.bin/sed \
2361ca95e9ddSBryan Drewery    usr.bin/size \
2362e98c3c3fSSean Bruno    usr.bin/sort \
2363ca95e9ddSBryan Drewery    usr.bin/strings \
23642c8c40a7SSean Bruno    usr.bin/tar \
2365e98c3c3fSSean Bruno    usr.bin/touch \
2366e98c3c3fSSean Bruno    usr.bin/tr \
2367e98c3c3fSSean Bruno    usr.bin/true \
2368e98c3c3fSSean Bruno    usr.bin/uniq \
23692c8c40a7SSean Bruno    usr.bin/unzip \
2370e98c3c3fSSean Bruno    usr.bin/xargs \
2371e98c3c3fSSean Bruno    usr.bin/xinstall \
23722c8c40a7SSean Bruno    usr.bin/xz \
2373e98c3c3fSSean Bruno    usr.bin/yacc \
2374e98c3c3fSSean Bruno    usr.sbin/chown
2375ca95e9ddSBryan Drewery
23769cde684dSBryan DrewerySUBDIR_DEPEND_usr.bin/clang=	lib/clang
2377ca95e9ddSBryan Drewery.if ${MK_CLANG} != "no"
2378ca95e9ddSBryan DreweryNXBDIRS+=	lib/clang
2379ca95e9ddSBryan DreweryNXBDIRS+=	usr.bin/clang
23809cde684dSBryan Drewery.endif
23819cde684dSBryan Drewery.if ${MK_GCC} != "no"
2382ca95e9ddSBryan DreweryNXBDIRS+=	gnu/usr.bin/cc
2383ca95e9ddSBryan Drewery.endif
2384ca95e9ddSBryan Drewery.if ${MK_BINUTILS} != "no"
2385ca95e9ddSBryan DreweryNXBDIRS+=	gnu/usr.bin/binutils
2386ca95e9ddSBryan Drewery.endif
23879cde684dSBryan Drewery# XXX: native-xtools passes along ${NXBDIRS} in SUBDIR_OVERRIDE that needs
23889cde684dSBryan Drewery# to be evaluated after NXBDIRS is set.
23899cde684dSBryan Drewery.if make(install) && !empty(SUBDIR_OVERRIDE)
23909cde684dSBryan DrewerySUBDIR=	${SUBDIR_OVERRIDE}
23919cde684dSBryan Drewery.endif
2392ca95e9ddSBryan Drewery
2393ca95e9ddSBryan DreweryNXBMAKEARGS+= \
2394dfa09989SBryan Drewery	OBJTOP=${NXBOBJTOP:Q} \
2395dfa09989SBryan Drewery	OBJROOT=${NXBOBJROOT:Q} \
23969cde684dSBryan Drewery	MAKEOBJDIRPREFIX= \
2397ca95e9ddSBryan Drewery	-DNO_SHARED \
2398ca95e9ddSBryan Drewery	-DNO_CPU_CFLAGS \
2399ca95e9ddSBryan Drewery	-DNO_PIC \
2400ca95e9ddSBryan Drewery	SSP_CFLAGS= \
2401ca95e9ddSBryan Drewery	MK_CLANG_EXTRAS=no \
2402ca95e9ddSBryan Drewery	MK_CLANG_FULL=no \
2403ca95e9ddSBryan Drewery	MK_CTF=no \
2404ca95e9ddSBryan Drewery	MK_DEBUG_FILES=no \
2405ca95e9ddSBryan Drewery	MK_GDB=no \
2406ca95e9ddSBryan Drewery	MK_HTML=no \
2407ca95e9ddSBryan Drewery	MK_LLDB=no \
2408ca95e9ddSBryan Drewery	MK_MAN=no \
2409ca95e9ddSBryan Drewery	MK_MAN_UTILS=yes \
2410ca95e9ddSBryan Drewery	MK_OFED=no \
2411ca95e9ddSBryan Drewery	MK_OPENSSH=no \
2412ca95e9ddSBryan Drewery	MK_PROFILE=no \
2413f8a6e93cSEd Maste	MK_RETPOLINE=no \
2414ca95e9ddSBryan Drewery	MK_SENDMAIL=no \
2415ca95e9ddSBryan Drewery	MK_SVNLITE=no \
2416ca95e9ddSBryan Drewery	MK_TESTS=no \
2417ca95e9ddSBryan Drewery	MK_WARNS=no \
2418ca95e9ddSBryan Drewery	MK_ZFS=no
2419ca95e9ddSBryan Drewery
24209cde684dSBryan Drewery.if make(native-xtools*) && \
24219cde684dSBryan Drewery    (!defined(NXB_TARGET) || !defined(NXB_TARGET_ARCH))
24229cde684dSBryan Drewery.error Missing NXB_TARGET / NXB_TARGET_ARCH
24239cde684dSBryan Drewery.endif
2424ca95e9ddSBryan Drewery# For 'toolchain' we want to produce native binaries that themselves generate
2425ca95e9ddSBryan Drewery# native binaries.
2426ca95e9ddSBryan DreweryNXBTMAKE=	${NXBMAKEENV} ${MAKE} ${NXBMAKEARGS:N-DNO_PIC:N-DNO_SHARED} \
2427ca95e9ddSBryan Drewery		TARGET=${MACHINE} TARGET_ARCH=${MACHINE_ARCH}
2428ca95e9ddSBryan Drewery# For 'everything' we want to produce native binaries (hence -target to
2429ca95e9ddSBryan Drewery# be MACHINE) that themselves generate TARGET.TARGET_ARCH binaries.
2430ca95e9ddSBryan Drewery# TARGET/TARGET_ARCH are still passed along from user.
24319cde684dSBryan Drewery#
24329cde684dSBryan Drewery# Use the toolchain we create as an external toolchain.
24339cde684dSBryan Drewery.if ${USING_SYSTEM_COMPILER} == "yes" || ${XCC:N${CCACHE_BIN}:M/*}
24349cde684dSBryan DreweryNXBMAKE+=	XCC="${XCC}" \
24359cde684dSBryan Drewery		XCXX="${XCXX}" \
24369cde684dSBryan Drewery		XCPP="${XCPP}"
24379cde684dSBryan Drewery.else
24389cde684dSBryan DreweryNXBMAKE+=	XCC="${NXBOBJTOP}/tmp/usr/bin/cc" \
24399cde684dSBryan Drewery		XCXX="${NXBOBJTOP}/tmp/usr/bin/c++" \
24409cde684dSBryan Drewery		XCPP="${NXBOBJTOP}/tmp/usr/bin/cpp"
24419cde684dSBryan Drewery.endif
24429cde684dSBryan DreweryNXBMAKE+=	${NXBMAKEENV} ${MAKE} -f Makefile.inc1 ${NXBMAKEARGS} \
24439cde684dSBryan Drewery		TARGET=${NXB_TARGET} TARGET_ARCH=${NXB_TARGET_ARCH} \
2444ca95e9ddSBryan Drewery		TARGET_TRIPLE=${MACHINE_TRIPLE:Q}
24459cde684dSBryan Drewery# NXBDIRS is improperly based on MACHINE rather than NXB_TARGET.  Need to
24469cde684dSBryan Drewery# invoke a sub-make to reevaluate MK_GCC, etc, for NXBDIRS.
24479cde684dSBryan DreweryNXBMAKE+=	SUBDIR_OVERRIDE='$${NXBDIRS:M*}'
24489cde684dSBryan Drewery# Need to avoid the -isystem logic when using clang as an external toolchain
24499cde684dSBryan Drewery# even if the TARGET being built for wants GCC.
24509cde684dSBryan DreweryNXBMAKE+=	WANT_COMPILER_TYPE='$${X_COMPILER_TYPE}'
2451ca95e9ddSBryan Drewerynative-xtools: .PHONY
24529b43e3daSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _cleanobj MK_GCC=yes
2453ca95e9ddSBryan Drewery	# Build the bootstrap/host/cross tools that produce native binaries
24549cde684dSBryan Drewery	# Pass along MK_GCC=yes to ensure GCC-needed build tools are built.
24559cde684dSBryan Drewery	# We don't quite know what the NXB_TARGET wants so just build it.
24569cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBTMAKE} kernel-toolchain MK_GCC=yes
2457ca95e9ddSBryan Drewery	# Populate includes/libraries sysroot that produce native binaries.
2458ca95e9ddSBryan Drewery	# This is split out from 'toolchain' above mostly so that target LLVM
2459ca95e9ddSBryan Drewery	# libraries have a proper LLVM_DEFAULT_TARGET_TRIPLE without
2460ca95e9ddSBryan Drewery	# polluting the cross-compiler build.  The LLVM/GCC libs are skipped
2461ca95e9ddSBryan Drewery	# here to avoid the problem but are kept in 'toolchain' so that
2462ca95e9ddSBryan Drewery	# needed build tools are built.
2463ca95e9ddSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _includes MK_CLANG=no MK_GCC=no
2464ca95e9ddSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBTMAKE} _libraries MK_CLANG=no MK_GCC=no
24654a51c708SBryan Drewery	# Clean out improper TARGET=MACHINE files
24664a51c708SBryan Drewery	${_+_}cd ${.CURDIR}/gnu/usr.bin/cc/cc_tools; ${NXBTMAKE} cleandir
24672abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
24689cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} _obj
2469ca95e9ddSBryan Drewery.endif
24709cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} everything
24715bd47cc5SBryan Drewery	@echo ">> native-xtools done.  Use 'make native-xtools-install' to install to a given DESTDIR"
24725bd47cc5SBryan Drewery
24735bd47cc5SBryan Drewerynative-xtools-install: .PHONY
2474ca95e9ddSBryan Drewery	mkdir -p ${NXBDESTDIR}/bin ${NXBDESTDIR}/sbin ${NXBDESTDIR}/usr
247555a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
2476ca95e9ddSBryan Drewery	    -p ${NXBDESTDIR}/usr >/dev/null
247755a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
2478ca95e9ddSBryan Drewery	    -p ${NXBDESTDIR}/usr/include >/dev/null
24799cde684dSBryan Drewery	${_+_}cd ${.CURDIR}; ${NXBMAKE} \
2480ca95e9ddSBryan Drewery	    DESTDIR=${NXBDESTDIR} \
2481ca95e9ddSBryan Drewery	    -DNO_ROOT \
2482ca95e9ddSBryan Drewery	    install
248375872267SWarner Losh
2484894157f5SMarcel Moolenaar#
248511fb97daSJohn Birrell# hierarchy - ensure that all the needed directories are present
248611fb97daSJohn Birrell#
2487d82fd861SBryan Dreweryhierarchy hier: .MAKE .PHONY
2488b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}/etc; ${HMAKE} distrib-dirs
248911fb97daSJohn Birrell
249011fb97daSJohn Birrell#
2491894157f5SMarcel Moolenaar# libraries - build all libraries, and install them under ${DESTDIR}.
249211fb97daSJohn Birrell#
24934d8bba46SRuslan Ermilov# The list of libraries with dependents (${_prebuild_libs}) and their
24944d8bba46SRuslan Ermilov# interdependencies (__L) are built automatically by the
24954d8bba46SRuslan Ermilov# ${.CURDIR}/tools/make_libdeps.sh script.
249611fb97daSJohn Birrell#
2497d82fd861SBryan Drewerylibraries: .MAKE .PHONY
2498b67490a3SBryan Drewery	${_+_}cd ${.CURDIR}; \
2499b67490a3SBryan Drewery	    ${MAKE} -f Makefile.inc1 _prereq_libs; \
2500b67490a3SBryan Drewery	    ${MAKE} -f Makefile.inc1 _startup_libs; \
2501b67490a3SBryan Drewery	    ${MAKE} -f Makefile.inc1 _prebuild_libs; \
2502bb6d7d0eSSimon J. Gerraty	    ${MAKE} -f Makefile.inc1 _generic_libs
25034d8bba46SRuslan Ermilov
250425a362d7SAlexander Kabaev#
250525a362d7SAlexander Kabaev# static libgcc.a prerequisite for shared libc
250625a362d7SAlexander Kabaev#
2507c7fbd772SEd Maste_prereq_libs= lib/libcompiler_rt
2508c615275cSEd Maste.if ${MK_SSP} != "no"
2509c615275cSEd Maste_prereq_libs+= gnu/lib/libssp/libssp_nonshared
2510c615275cSEd Maste.endif
251125a362d7SAlexander Kabaev
251292815c0cSRuslan Ermilov# These dependencies are not automatically generated:
251392815c0cSRuslan Ermilov#
251425a362d7SAlexander Kabaev# gnu/lib/csu, gnu/lib/libgcc, lib/csu and lib/libc must be built before
251525a362d7SAlexander Kabaev# all shared libraries for ELF.
251692815c0cSRuslan Ermilov#
2517*68762cd7SAndrew Turner_startup_libs=	lib/csu
2518*68762cd7SAndrew Turner.if ${MK_BSD_CRTBEGIN} == "no"
2519*68762cd7SAndrew Turner_startup_libs+=	gnu/lib/csu
2520*68762cd7SAndrew Turner.endif
252139cd938cSEd Schouten_startup_libs+=	lib/libcompiler_rt
252225a362d7SAlexander Kabaev_startup_libs+=	lib/libc
2523091b8336SPeter Wemm_startup_libs+=	lib/libc_nonshared
252449c8e5e7SDimitry Andric.if ${MK_LIBCPLUSPLUS} != "no"
25257a984708SDavid Chisnall_startup_libs+=	lib/libcxxrt
25267a984708SDavid Chisnall.endif
252725a362d7SAlexander Kabaev
2528c7fbd772SEd Maste.if ${MK_LLVM_LIBUNWIND} != "no"
2529c7fbd772SEd Maste_prereq_libs+=	lib/libgcc_eh lib/libgcc_s
2530c7fbd772SEd Maste_startup_libs+=	lib/libgcc_eh lib/libgcc_s
2531c7fbd772SEd Maste
2532c7fbd772SEd Mastelib/libgcc_s__L: lib/libc__L
2533c7fbd772SEd Mastelib/libgcc_s__L: lib/libc_nonshared__L
2534c7fbd772SEd Maste.if ${MK_LIBCPLUSPLUS} != "no"
2535c7fbd772SEd Mastelib/libcxxrt__L: lib/libgcc_s__L
2536c7fbd772SEd Maste.endif
2537c7fbd772SEd Maste
2538c7fbd772SEd Maste.else # MK_LLVM_LIBUNWIND == no
2539c7fbd772SEd Maste
2540c7fbd772SEd Maste_prereq_libs+=	gnu/lib/libgcc
2541c7fbd772SEd Maste_startup_libs+=	gnu/lib/libgcc
2542c7fbd772SEd Maste
254325a362d7SAlexander Kabaevgnu/lib/libgcc__L: lib/libc__L
2544091b8336SPeter Wemmgnu/lib/libgcc__L: lib/libc_nonshared__L
254515d321c5SPeter Wemm.if ${MK_LIBCPLUSPLUS} != "no"
254615d321c5SPeter Wemmlib/libcxxrt__L: gnu/lib/libgcc__L
254715d321c5SPeter Wemm.endif
2548c7fbd772SEd Maste.endif
254911fb97daSJohn Birrell
2550ae771770SStanislav Sedov_prebuild_libs=	${_kerberos5_lib_libasn1} \
2551ae771770SStanislav Sedov		${_kerberos5_lib_libhdb} \
2552ae771770SStanislav Sedov		${_kerberos5_lib_libheimbase} \
2553611ff617SStanislav Sedov		${_kerberos5_lib_libheimntlm} \
2554f3dba867SBaptiste Daroussin		${_libsqlite3} \
2555ae771770SStanislav Sedov		${_kerberos5_lib_libheimipcc} \
25560f49f7ebSRuslan Ermilov		${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \
25570f49f7ebSRuslan Ermilov		${_kerberos5_lib_libroken} \
2558ae771770SStanislav Sedov		${_kerberos5_lib_libwind} \
25590e46933cSStanislav Sedov		lib/libbz2 ${_libcom_err} lib/libcrypt \
2560b18ddb2aSMikolaj Golub		lib/libelf lib/libexpat \
25612b293f6aSDevin Teske		lib/libfigpar \
25622c284d93SGleb Smirnoff		${_lib_libgssapi} \
256342a85952SPawel Jakub Dawidek		lib/libkiconv lib/libkvm lib/liblzma lib/libmd lib/libnv \
2564c501d73cSMariusz Zaborski		${_lib_casper} \
256531b4134fSRong-En Fan		lib/ncurses/ncurses lib/ncurses/ncursesw \
25667cbd0a29SBryan Drewery		lib/libopie lib/libpam/libpam ${_lib_libthr} \
256731a741f4SEnji Cooper		${_lib_libradius} lib/libsbuf lib/libtacplus \
2568c36047bdSXin LI		lib/libgeom \
2569e9832bb1SMartin Matuska		${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
2570c36047bdSXin LI		${_cddl_lib_libuutil} \
2571e00e69abSXin LI		${_cddl_lib_libavl} \
2572f335e41bSKyle Evans		${_cddl_lib_libzfs_core} ${_cddl_lib_libzfs} \
257306429175SMark Johnston		${_cddl_lib_libctf} \
2574e4b0a90eSBrooks Davis		lib/libufs \
25752f02600aSPawel Jakub Dawidek		lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
2576d97bf519SDag-Erling Smørgrav		${_secure_lib_libcrypto} ${_secure_lib_libssl} \
2577d97bf519SDag-Erling Smørgrav		${_lib_libldns} ${_secure_lib_libssh}
25787cbd0a29SBryan Drewery
25799e88096eSWarner Losh.if ${MK_GNUCXX} != "no"
258053eff78aSWarner Losh_prebuild_libs+= gnu/lib/libstdc++ gnu/lib/libsupc++
258152cb8b8fSWarner Loshgnu/lib/libstdc++__L: lib/msun__L
258222cbbf9dSSean Brunognu/lib/libsupc++__L: gnu/lib/libstdc++__L
258353eff78aSWarner Losh.endif
258449e62f1cSRuslan Ermilov
2585f987297fSEd Maste.if ${MK_DIALOG} != "no"
2586f987297fSEd Maste_prebuild_libs+= gnu/lib/libdialog
2587f987297fSEd Mastegnu/lib/libdialog__L: lib/msun__L lib/ncurses/ncursesw__L
2588f987297fSEd Maste.endif
2589f987297fSEd Maste
2590215d02b7SBryan Drewery.if ${MK_LIBCPLUSPLUS} != "no"
2591215d02b7SBryan Drewery_prebuild_libs+= lib/libc++
2592215d02b7SBryan Drewery.endif
2593215d02b7SBryan Drewery
2594c36047bdSXin LIlib/libgeom__L: lib/libexpat__L
25957f911abeSJohn Baldwinlib/libkvm__L: lib/libelf__L
2596c36047bdSXin LI
2597dbdb679cSRuslan Ermilov.if ${MK_LIBTHR} != "no"
2598dbdb679cSRuslan Ermilov_lib_libthr=	lib/libthr
2599152f2a4aSRuslan Ermilov.endif
2600152f2a4aSRuslan Ermilov
260131a741f4SEnji Cooper.if ${MK_RADIUS_SUPPORT} != "no"
260231a741f4SEnji Cooper_lib_libradius=	lib/libradius
260331a741f4SEnji Cooper.endif
260431a741f4SEnji Cooper
2605aa0a1e58SJeff Roberson.if ${MK_OFED} != "no"
2606f39bffc6SKonstantin Belousov_prebuild_libs+= \
2607f39bffc6SKonstantin Belousov	lib/ofed/libibverbs \
2608f39bffc6SKonstantin Belousov	lib/ofed/libibmad \
2609f39bffc6SKonstantin Belousov	lib/ofed/libibumad \
2610f39bffc6SKonstantin Belousov	lib/ofed/complib \
2611f39bffc6SKonstantin Belousov	lib/ofed/libmlx5
2612400b94bbSBryan Drewery
2613f39bffc6SKonstantin Belousovlib/ofed/libibmad__L:	lib/ofed/libibumad__L
2614f39bffc6SKonstantin Belousovlib/ofed/complib__L:	lib/libthr__L
2615f39bffc6SKonstantin Belousovlib/ofed/libmlx5__L:	lib/ofed/libibverbs__L lib/libthr__L
2616aa0a1e58SJeff Roberson.endif
2617aa0a1e58SJeff Roberson
261842a85952SPawel Jakub Dawidek.if ${MK_CASPER} != "no"
2619c501d73cSMariusz Zaborski_lib_casper=	lib/libcasper
262042a85952SPawel Jakub Dawidek.endif
262142a85952SPawel Jakub Dawidek
26222f02600aSPawel Jakub Dawideklib/libpjdlog__L: lib/libutil__L
2623c501d73cSMariusz Zaborskilib/libcasper__L: lib/libnv__L
262453200025SRui Paulolib/liblzma__L: lib/libthr__L
26252f02600aSPawel Jakub Dawidek
2626f39bffc6SKonstantin Belousov_generic_libs=	${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib} usr.bin/lex/lib
2627ae9f7248SBryan Drewery.if ${MK_IPFILTER} != "no"
2628ae9f7248SBryan Drewery_generic_libs+=	sbin/ipf/libipf
2629ae9f7248SBryan Drewery.endif
26306e4ee6ddSBrooks Davis.for _DIR in ${LOCAL_LIB_DIRS}
2631e93e5bb0SIan Lepore.if ${_DIR} == ".WAIT"  || (empty(_generic_libs:M${_DIR}) && exists(${.CURDIR}/${_DIR}/Makefile))
26326e4ee6ddSBrooks Davis_generic_libs+= ${_DIR}
26336e4ee6ddSBrooks Davis.endif
26346e4ee6ddSBrooks Davis.endfor
263511fb97daSJohn Birrell
2636b4b831efSRuslan Ermilovlib/libopie__L lib/libtacplus__L: lib/libmd__L
2637127a2cfaSJohn Polstra
2638ceef0c31SPawel Jakub Dawidek.if ${MK_CDDL} != "no"
26396be04ba6SPawel Jakub Dawidek_cddl_lib_libumem= cddl/lib/libumem
2640e9832bb1SMartin Matuska_cddl_lib_libnvpair= cddl/lib/libnvpair
2641e00e69abSXin LI_cddl_lib_libavl= cddl/lib/libavl
2642c36047bdSXin LI_cddl_lib_libuutil= cddl/lib/libuutil
2643b7c6a063SBryan Drewery.if ${MK_ZFS} != "no"
2644dce1a726SMartin Matuska_cddl_lib_libzfs_core= cddl/lib/libzfs_core
2645f335e41bSKyle Evans_cddl_lib_libzfs= cddl/lib/libzfs
264635d2028fSKyle Evans
2647b7c6a063SBryan Drewerycddl/lib/libzfs_core__L: cddl/lib/libnvpair__L
264835d2028fSKyle Evans
264935d2028fSKyle Evanscddl/lib/libzfs__L: cddl/lib/libzfs_core__L lib/msun__L lib/libutil__L
265035d2028fSKyle Evanscddl/lib/libzfs__L: lib/libthr__L lib/libmd__L lib/libz__L cddl/lib/libumem__L
265135d2028fSKyle Evanscddl/lib/libzfs__L: cddl/lib/libuutil__L cddl/lib/libavl__L lib/libgeom__L
265235d2028fSKyle Evans
26537920ad94SKyle Evanslib/libbe__L: cddl/lib/libzfs__L
2654b7c6a063SBryan Drewery.endif
265506429175SMark Johnston_cddl_lib_libctf= cddl/lib/libctf
2656ceef0c31SPawel Jakub Dawidek_cddl_lib= cddl/lib
265706429175SMark Johnstoncddl/lib/libctf__L: lib/libz__L
2658ceef0c31SPawel Jakub Dawidek.endif
26593f480759SEnji Cooper# cddl/lib/libdtrace requires lib/libproc and lib/librtld_db; it's only built
26603f480759SEnji Cooper# on select architectures though (see cddl/lib/Makefile)
2661c404eb64SWarner Losh.if ${MACHINE_CPUARCH} != "sparc64"
2662a7e13d50SMark Johnston_prebuild_libs+=	lib/libprocstat lib/libproc lib/librtld_db
266387ae8210SMark Johnstonlib/libprocstat__L: lib/libelf__L lib/libkvm__L lib/libutil__L
2664a7e13d50SMark Johnstonlib/libproc__L: lib/libprocstat__L
2665a7e13d50SMark Johnstonlib/librtld_db__L: lib/libprocstat__L
26663f480759SEnji Cooper.endif
2667ceef0c31SPawel Jakub Dawidek
2668e1fe3dbaSRuslan Ermilov.if ${MK_CRYPT} != "no"
2669e1fe3dbaSRuslan Ermilov.if ${MK_OPENSSL} != "no"
267049e62f1cSRuslan Ermilov_secure_lib_libcrypto= secure/lib/libcrypto
267149e62f1cSRuslan Ermilov_secure_lib_libssl= secure/lib/libssl
2672e4a93f1eSRuslan Ermilovlib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L
2673e4a41be5SDag-Erling Smørgravsecure/lib/libcrypto__L: lib/libthr__L
26749cfa8b3fSDag-Erling Smørgrav.if ${MK_LDNS} != "no"
26759cfa8b3fSDag-Erling Smørgrav_lib_libldns= lib/libldns
2676e4a41be5SDag-Erling Smørgravlib/libldns__L: secure/lib/libssl__L
26779cfa8b3fSDag-Erling Smørgrav.endif
2678c1f5e730SAntoine Brodin.if ${MK_OPENSSH} != "no"
2679c1f5e730SAntoine Brodin_secure_lib_libssh= secure/lib/libssh
2680c1f5e730SAntoine Brodinsecure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L
26819cfa8b3fSDag-Erling Smørgrav.if ${MK_LDNS} != "no"
26829cfa8b3fSDag-Erling Smørgravsecure/lib/libssh__L: lib/libldns__L
26839cfa8b3fSDag-Erling Smørgrav.endif
268494ef145eSEnji Cooper.if ${MK_GSSAPI} != "no" && ${MK_KERBEROS_SUPPORT} != "no"
26850f49f7ebSRuslan Ermilovsecure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \
26860f49f7ebSRuslan Ermilov    kerberos5/lib/libhx509__L kerberos5/lib/libasn1__L lib/libcom_err__L \
26870f49f7ebSRuslan Ermilov    lib/libmd__L kerberos5/lib/libroken__L
2688466b960fSRuslan Ermilov.endif
26894d8bba46SRuslan Ermilov.endif
2690072f6798SRuslan Ermilov.endif
269149e62f1cSRuslan Ermilov_secure_lib=	secure/lib
269249e62f1cSRuslan Ermilov.endif
269349e62f1cSRuslan Ermilov
2694611ff617SStanislav Sedov.if ${MK_KERBEROS} != "no"
2695611ff617SStanislav Sedovkerberos5/lib/libasn1__L: lib/libcom_err__L kerberos5/lib/libroken__L
2696611ff617SStanislav Sedovkerberos5/lib/libhdb__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
2697ae771770SStanislav Sedov    kerberos5/lib/libkrb5__L kerberos5/lib/libroken__L \
2698f3dba867SBaptiste Daroussin    kerberos5/lib/libwind__L lib/libsqlite3__L
2699ae771770SStanislav Sedovkerberos5/lib/libheimntlm__L: secure/lib/libcrypto__L kerberos5/lib/libkrb5__L \
2700ae771770SStanislav Sedov    kerberos5/lib/libroken__L lib/libcom_err__L
2701611ff617SStanislav Sedovkerberos5/lib/libhx509__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
2702ae771770SStanislav Sedov    secure/lib/libcrypto__L kerberos5/lib/libroken__L kerberos5/lib/libwind__L
2703611ff617SStanislav Sedovkerberos5/lib/libkrb5__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
2704611ff617SStanislav Sedov    lib/libcrypt__L secure/lib/libcrypto__L kerberos5/lib/libhx509__L \
2705ae771770SStanislav Sedov    kerberos5/lib/libroken__L kerberos5/lib/libwind__L \
2706ae771770SStanislav Sedov    kerberos5/lib/libheimbase__L kerberos5/lib/libheimipcc__L
2707611ff617SStanislav Sedovkerberos5/lib/libroken__L: lib/libcrypt__L
2708ae771770SStanislav Sedovkerberos5/lib/libwind__L: kerberos5/lib/libroken__L lib/libcom_err__L
2709ae771770SStanislav Sedovkerberos5/lib/libheimbase__L: lib/libthr__L
2710ae771770SStanislav Sedovkerberos5/lib/libheimipcc__L: kerberos5/lib/libroken__L kerberos5/lib/libheimbase__L lib/libthr__L
2711611ff617SStanislav Sedov.endif
2712611ff617SStanislav Sedov
2713645acf41SBaptiste Daroussinlib/libsqlite3__L: lib/libthr__L
2714645acf41SBaptiste Daroussin
2715c1f5e730SAntoine Brodin.if ${MK_GSSAPI} != "no"
2716c1f5e730SAntoine Brodin_lib_libgssapi=	lib/libgssapi
2717c1f5e730SAntoine Brodin.endif
2718c1f5e730SAntoine Brodin
271949e62f1cSRuslan Ermilov.if ${MK_KERBEROS} != "no"
272049e62f1cSRuslan Ermilov_kerberos5_lib=	kerberos5/lib
272149e62f1cSRuslan Ermilov_kerberos5_lib_libasn1= kerberos5/lib/libasn1
2722611ff617SStanislav Sedov_kerberos5_lib_libhdb= kerberos5/lib/libhdb
2723ae771770SStanislav Sedov_kerberos5_lib_libheimbase= kerberos5/lib/libheimbase
272449e62f1cSRuslan Ermilov_kerberos5_lib_libkrb5= kerberos5/lib/libkrb5
272533f12199SDoug Rabson_kerberos5_lib_libhx509= kerberos5/lib/libhx509
272649e62f1cSRuslan Ermilov_kerberos5_lib_libroken= kerberos5/lib/libroken
272733f12199SDoug Rabson_kerberos5_lib_libheimntlm= kerberos5/lib/libheimntlm
2728f3dba867SBaptiste Daroussin_libsqlite3= lib/libsqlite3
2729ae771770SStanislav Sedov_kerberos5_lib_libheimipcc= kerberos5/lib/libheimipcc
2730ae771770SStanislav Sedov_kerberos5_lib_libwind= kerberos5/lib/libwind
27310e46933cSStanislav Sedov_libcom_err= lib/libcom_err
273249e62f1cSRuslan Ermilov.endif
273349e62f1cSRuslan Ermilov
273449e62f1cSRuslan Ermilov.if ${MK_NIS} != "no"
273549e62f1cSRuslan Ermilov_lib_libypclnt=	lib/libypclnt
273692815c0cSRuslan Ermilov.endif
27374d8bba46SRuslan Ermilov
2738e1fe3dbaSRuslan Ermilov.if ${MK_OPENSSL} == "no"
27392eb4b00cSFlorent Thoumielib/libradius__L: lib/libmd__L
2740b4b831efSRuslan Ermilov.endif
2741b4b831efSRuslan Ermilov
27422b42dcf7SEnji Cooperlib/libproc__L: \
27432b42dcf7SEnji Cooper    ${_cddl_lib_libctf:D${_cddl_lib_libctf}__L} lib/libelf__L lib/librtld_db__L lib/libutil__L
27442b42dcf7SEnji Cooper.if ${MK_CXX} != "no"
27452b42dcf7SEnji Cooper.if ${MK_LIBCPLUSPLUS} != "no"
27462b42dcf7SEnji Cooperlib/libproc__L: lib/libcxxrt__L
27472b42dcf7SEnji Cooper.else # This implies MK_GNUCXX != "no"; see lib/libproc
27482b42dcf7SEnji Cooperlib/libproc__L: gnu/lib/libsupc++__L
27492b42dcf7SEnji Cooper.endif
27502b42dcf7SEnji Cooper.endif
27512b42dcf7SEnji Cooper
275225a362d7SAlexander Kabaev.for _lib in ${_prereq_libs}
2753bb6d7d0eSSimon J. Gerraty${_lib}__PL: .PHONY .MAKE
27546e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${.CURDIR}/${_lib})
2755497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_lib} (obj,all,install)"; \
2756b67490a3SBryan Drewery		cd ${.CURDIR}/${_lib}; \
27572abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
275898407b8bSWarner Losh		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
2759b67490a3SBryan Drewery		    DIRPRFX=${_lib}/ all; \
276098407b8bSWarner Losh		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
276157028ca4SJulio Merino		    DIRPRFX=${_lib}/ install
276225a362d7SAlexander Kabaev.endif
276325a362d7SAlexander Kabaev.endfor
276425a362d7SAlexander Kabaev
27657cbd0a29SBryan Drewery.for _lib in ${_startup_libs} ${_prebuild_libs} ${_generic_libs}
2766bb6d7d0eSSimon J. Gerraty${_lib}__L: .PHONY .MAKE
27676e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${.CURDIR}/${_lib})
2768497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_lib} (obj,all,install)"; \
2769b67490a3SBryan Drewery		cd ${.CURDIR}/${_lib}; \
27702abeba9dSBryan Drewery		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
2771b67490a3SBryan Drewery		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ all; \
277215eee895SWarner Losh		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ install
277330fdccdcSDavid E. O'Brien.endif
277430fdccdcSDavid E. O'Brien.endfor
277530fdccdcSDavid E. O'Brien
277625a362d7SAlexander Kabaev_prereq_libs: ${_prereq_libs:S/$/__PL/}
27774d8bba46SRuslan Ermilov_startup_libs: ${_startup_libs:S/$/__L/}
27784d8bba46SRuslan Ermilov_prebuild_libs: ${_prebuild_libs:S/$/__L/}
27794d8bba46SRuslan Ermilov_generic_libs: ${_generic_libs:S/$/__L/}
27804d8bba46SRuslan Ermilov
278103173d2fSBryan Drewery# Enable SUBDIR_PARALLEL when not calling 'make all', unless called from
27821c2a618bSBryan Drewery# 'everything' with _PARALLEL_SUBDIR_OK set.  This is because it is unlikely
278303173d2fSBryan Drewery# that running 'make all' from the top-level, especially with a SUBDIR_OVERRIDE
278403173d2fSBryan Drewery# or LOCAL_DIRS set, will have a reliable build if SUBDIRs are built in
278503173d2fSBryan Drewery# parallel.  This is safe for the world stage of buildworld though since it has
278603173d2fSBryan Drewery# already built libraries in a proper order and installed includes into
278703173d2fSBryan Drewery# WORLDTMP. Special handling is done for SUBDIR ordering for 'install*' to
278803173d2fSBryan Drewery# avoid trashing a system if it crashes mid-install.
27891c2a618bSBryan Drewery.if !make(all) || defined(_PARALLEL_SUBDIR_OK)
2790fb84a99eSBryan DrewerySUBDIR_PARALLEL=
2791fb84a99eSBryan Drewery.endif
279211fb97daSJohn Birrell
279311fb97daSJohn Birrell.include <bsd.subdir.mk>
2794e2a36081SAlexander Leidinger
279532cd239bSDag-Erling Smørgrav.if make(check-old) || make(check-old-dirs) || \
279632cd239bSDag-Erling Smørgrav    make(check-old-files) || make(check-old-libs) || \
279732cd239bSDag-Erling Smørgrav    make(delete-old) || make(delete-old-dirs) || \
279832cd239bSDag-Erling Smørgrav    make(delete-old-files) || make(delete-old-libs)
27991b24254bSAlexander Leidinger
2800e2a36081SAlexander Leidinger#
2801e2a36081SAlexander Leidinger# check for / delete old files section
2802e2a36081SAlexander Leidinger#
2803e2a36081SAlexander Leidinger
2804e2a36081SAlexander Leidinger.include "ObsoleteFiles.inc"
2805e2a36081SAlexander Leidinger
2806e2a36081SAlexander LeidingerOLD_LIBS_MESSAGE="Please be sure no application still uses those libraries, \
2807e2a36081SAlexander Leidingerelse you can not start such an application. Consult UPDATING for more \
2808e2a36081SAlexander Leidingerinformation regarding how to cope with the removal/revision bump of a \
2809e2a36081SAlexander Leidingerspecific library."
2810e2a36081SAlexander Leidinger
2811e2a36081SAlexander Leidinger.if !defined(BATCH_DELETE_OLD_FILES)
2812e2a36081SAlexander LeidingerRM_I=-i
28131b24254bSAlexander Leidinger.else
28141b24254bSAlexander LeidingerRM_I=-v
2815e2a36081SAlexander Leidinger.endif
2816e2a36081SAlexander Leidinger
2817c943a53eSBryan Drewerydelete-old-files: .PHONY
2818e2a36081SAlexander Leidinger	@echo ">>> Removing old files (only deletes safe to delete libs)"
2819e2a36081SAlexander Leidinger# Ask for every old file if the user really wants to remove it.
2820188a72eeSBrian Somers# It's annoying, but better safe than sorry.
282186be7546SUlrich Spörlein# NB: We cannot pass the list of OLD_FILES as a parameter because the
282286be7546SUlrich Spörlein# argument list will get too long. Using .for/.endfor make "loops" will make
282386be7546SUlrich Spörlein# the Makefile parser segfault.
282486be7546SUlrich Spörlein	@exec 3<&0; \
28258b78b15bSXin LI	cd ${.CURDIR}; \
282686be7546SUlrich Spörlein	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
28275bab7367SXin LI	    -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \
282886be7546SUlrich Spörlein	while read file; do \
2829d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
283098a0900aSDag-Erling Smørgrav			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
283186be7546SUlrich Spörlein			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
28328a32134cSAlexander Leidinger		fi; \
2833651e2703SBryan Drewery		for ext in debug symbols; do \
2834651e2703SBryan Drewery		  if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
2835651e2703SBryan Drewery		      "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
2836651e2703SBryan Drewery			  rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
2837651e2703SBryan Drewery			      <&3; \
2838651e2703SBryan Drewery		  fi; \
2839651e2703SBryan Drewery		done; \
2840f27f8258SDag-Erling Smørgrav	done
2841edd04c6fSAlexander Leidinger# Remove catpages without corresponding manpages.
28426f7be14aSJilles Tjoelker	@exec 3<&0; \
2843b505dd63SBaptiste Daroussin	find ${DESTDIR}/usr/share/man/cat* ! -type d 2>/dev/null | \
2844006846f7SRuslan Ermilov	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
2845006846f7SRuslan Ermilov	while read catpage; do \
2846006846f7SRuslan Ermilov		read manpage; \
2847006846f7SRuslan Ermilov		if [ ! -e "$${manpage}" ]; then \
2848006846f7SRuslan Ermilov			rm ${RM_I} $${catpage} <&3; \
2849006846f7SRuslan Ermilov	        fi; \
2850edd04c6fSAlexander Leidinger	done
2851e2a36081SAlexander Leidinger	@echo ">>> Old files removed"
2852e2a36081SAlexander Leidinger
2853c943a53eSBryan Drewerycheck-old-files: .PHONY
2854e2a36081SAlexander Leidinger	@echo ">>> Checking for old files"
28558b78b15bSXin LI	@cd ${.CURDIR}; \
28568b78b15bSXin LI	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
285786be7546SUlrich Spörlein	    -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \
285886be7546SUlrich Spörlein	while read file; do \
2859d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
286061305271SDag-Erling Smørgrav		 	echo "${DESTDIR}/$${file}"; \
286161305271SDag-Erling Smørgrav		fi; \
2862651e2703SBryan Drewery		for ext in debug symbols; do \
2863651e2703SBryan Drewery		  if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
2864651e2703SBryan Drewery			  echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
2865651e2703SBryan Drewery		  fi; \
2866651e2703SBryan Drewery		done; \
2867f27f8258SDag-Erling Smørgrav	done
2868edd04c6fSAlexander Leidinger# Check for catpages without corresponding manpages.
286971a6afa2SBaptiste Daroussin	@find ${DESTDIR}/usr/share/man/cat* ! -type d 2>/dev/null | \
2870006846f7SRuslan Ermilov	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
2871006846f7SRuslan Ermilov	while read catpage; do \
2872006846f7SRuslan Ermilov		read manpage; \
2873006846f7SRuslan Ermilov		if [ ! -e "$${manpage}" ]; then \
2874006846f7SRuslan Ermilov			echo $${catpage}; \
2875006846f7SRuslan Ermilov	        fi; \
2876edd04c6fSAlexander Leidinger	done
2877e2a36081SAlexander Leidinger
2878c943a53eSBryan Drewerydelete-old-libs: .PHONY
2879e2a36081SAlexander Leidinger	@echo ">>> Removing old libraries"
2880e2a36081SAlexander Leidinger	@echo "${OLD_LIBS_MESSAGE}" | fmt
288186be7546SUlrich Spörlein	@exec 3<&0; \
28828b78b15bSXin LI	cd ${.CURDIR}; \
288386be7546SUlrich Spörlein	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
288486be7546SUlrich Spörlein	    -V OLD_LIBS | xargs -n1 | \
288586be7546SUlrich Spörlein	while read file; do \
2886d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
288798a0900aSDag-Erling Smørgrav			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
288886be7546SUlrich Spörlein			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
28898a32134cSAlexander Leidinger		fi; \
2890e45e2255SBryan Drewery		for ext in debug symbols; do \
2891e45e2255SBryan Drewery		  if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
2892e45e2255SBryan Drewery		      "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
2893e45e2255SBryan Drewery			  rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
2894e45e2255SBryan Drewery			      <&3; \
2895e45e2255SBryan Drewery		  fi; \
2896e45e2255SBryan Drewery		done; \
2897f27f8258SDag-Erling Smørgrav	done
2898e2a36081SAlexander Leidinger	@echo ">>> Old libraries removed"
2899e2a36081SAlexander Leidinger
2900c943a53eSBryan Drewerycheck-old-libs: .PHONY
2901e2a36081SAlexander Leidinger	@echo ">>> Checking for old libraries"
29028b78b15bSXin LI	@cd ${.CURDIR}; \
29038b78b15bSXin LI	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
290486be7546SUlrich Spörlein	    -V OLD_LIBS | xargs -n1 | \
290586be7546SUlrich Spörlein	while read file; do \
2906d1e75b81SDag-Erling Smørgrav		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
290761305271SDag-Erling Smørgrav			echo "${DESTDIR}/$${file}"; \
290861305271SDag-Erling Smørgrav		fi; \
2909e45e2255SBryan Drewery		for ext in debug symbols; do \
2910e45e2255SBryan Drewery		  if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
2911e45e2255SBryan Drewery			  echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
2912e45e2255SBryan Drewery		  fi; \
2913e45e2255SBryan Drewery		done; \
2914f27f8258SDag-Erling Smørgrav	done
2915e2a36081SAlexander Leidinger
2916c943a53eSBryan Drewerydelete-old-dirs: .PHONY
2917e2a36081SAlexander Leidinger	@echo ">>> Removing old directories"
29188b78b15bSXin LI	@cd ${.CURDIR}; \
29198b78b15bSXin LI	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
29205bab7367SXin LI	    -V OLD_DIRS | xargs -n1 | sort -r | \
292186be7546SUlrich Spörlein	while read dir; do \
2922d1e75b81SDag-Erling Smørgrav		if [ -d "${DESTDIR}/$${dir}" ]; then \
2923d1e75b81SDag-Erling Smørgrav			rmdir -v "${DESTDIR}/$${dir}" || true; \
2924d1e75b81SDag-Erling Smørgrav		elif [ -L "${DESTDIR}/$${dir}" ]; then \
2925d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
29268a32134cSAlexander Leidinger		fi; \
292726e28783SDimitry Andric		if [ -d "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
292826e28783SDimitry Andric			rmdir -v "${DESTDIR}${DEBUGDIR}/$${dir}" || true; \
292926e28783SDimitry Andric		elif [ -L "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
293026e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir} is a link, please remove everything manually."; \
293126e28783SDimitry Andric		fi; \
2932f27f8258SDag-Erling Smørgrav	done
2933e2a36081SAlexander Leidinger	@echo ">>> Old directories removed"
2934e2a36081SAlexander Leidinger
2935c943a53eSBryan Drewerycheck-old-dirs: .PHONY
2936e2a36081SAlexander Leidinger	@echo ">>> Checking for old directories"
29378b78b15bSXin LI	@cd ${.CURDIR}; \
29388b78b15bSXin LI	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
293986be7546SUlrich Spörlein	    -V OLD_DIRS | xargs -n1 | \
294086be7546SUlrich Spörlein	while read dir; do \
2941d1e75b81SDag-Erling Smørgrav		if [ -d "${DESTDIR}/$${dir}" ]; then \
2942d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir}"; \
2943d1e75b81SDag-Erling Smørgrav		elif [ -L "${DESTDIR}/$${dir}" ]; then \
2944d1e75b81SDag-Erling Smørgrav			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
29458a32134cSAlexander Leidinger		fi; \
294626e28783SDimitry Andric		if [ -d "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
294726e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir}"; \
294826e28783SDimitry Andric		elif [ -L "${DESTDIR}${DEBUGDIR}/$${dir}" ]; then \
294926e28783SDimitry Andric			echo "${DESTDIR}${DEBUGDIR}/$${dir} is a link, please remove everything manually."; \
295026e28783SDimitry Andric		fi; \
2951f27f8258SDag-Erling Smørgrav	done
2952e2a36081SAlexander Leidinger
2953c943a53eSBryan Drewerydelete-old: delete-old-files delete-old-dirs .PHONY
2954c8de0c57SBryan Drewery	@echo "To remove old libraries run '${MAKE_CMD} delete-old-libs'."
2955e2a36081SAlexander Leidinger
2956c943a53eSBryan Drewerycheck-old: check-old-files check-old-libs check-old-dirs .PHONY
2957c8de0c57SBryan Drewery	@echo "To remove old files and directories run '${MAKE_CMD} delete-old'."
2958c8de0c57SBryan Drewery	@echo "To remove old libraries run '${MAKE_CMD} delete-old-libs'."
2959e2a36081SAlexander Leidinger
29601b24254bSAlexander Leidinger.endif
29611b24254bSAlexander Leidinger
2962c3ed02cfSRuslan Ermilov#
2963c3ed02cfSRuslan Ermilov# showconfig - show build configuration.
2964c3ed02cfSRuslan Ermilov#
2965c943a53eSBryan Dreweryshowconfig: .PHONY
296669db9346SBaptiste Daroussin	@(${MAKE} -n -f ${.CURDIR}/sys/conf/kern.opts.mk -V dummy -dg1 UPDATE_DEPENDFILE=no NO_OBJ=yes; \
296769db9346SBaptiste Daroussin	  ${MAKE} -n -f ${.CURDIR}/share/mk/src.opts.mk -V dummy -dg1 UPDATE_DEPENDFILE=no NO_OBJ=yes) 2>&1 | grep ^MK_ | sort -u
296825bacc78SWarner Losh
2969f263e792SWarner Losh.if !empty(KRNLOBJDIR) && !empty(KERNCONF)
2970f263e792SWarner LoshDTBOUTPUTPATH= ${KRNLOBJDIR}/${KERNCONF}/
2971f263e792SWarner Losh
2972f263e792SWarner Losh.if !defined(FDT_DTS_FILE) || empty(FDT_DTS_FILE)
29736e6be2bbSBryan Drewery.if !defined(_MKSHOWCONFIG) && exists(${KERNCONFDIR}/${KERNCONF})
2974f263e792SWarner LoshFDT_DTS_FILE!= awk 'BEGIN {FS="="} /^makeoptions[[:space:]]+FDT_DTS_FILE/ {print $$2}' \
2975cf35c685SThomas Quinot	'${KERNCONFDIR}/${KERNCONF}' ; echo
2976f263e792SWarner Losh.endif
2977f263e792SWarner Losh.endif
2978f263e792SWarner Losh
2979f263e792SWarner Losh.endif
2980f263e792SWarner Losh
2981f263e792SWarner Losh.if !defined(DTBOUTPUTPATH) || !exists(${DTBOUTPUTPATH})
2982f263e792SWarner LoshDTBOUTPUTPATH= ${.CURDIR}
2983f263e792SWarner Losh.endif
2984f263e792SWarner Losh
2985f263e792SWarner Losh#
2986f263e792SWarner Losh# Build 'standalone' Device Tree Blob
2987f263e792SWarner Losh#
2988c943a53eSBryan Drewerybuilddtb: .PHONY
29890edb7351SWarner Losh	@PATH=${TMPPATH} MACHINE=${TARGET} \
2990eeb913c9SWarner Losh	${.CURDIR}/sys/tools/fdt/make_dtb.sh ${.CURDIR}/sys \
29910edb7351SWarner Losh	    "${FDT_DTS_FILE}" ${DTBOUTPUTPATH}
299225bacc78SWarner Losh
299325bacc78SWarner Losh###############
299425bacc78SWarner Losh
29952753ba1aSBryan Drewery# cleanworld
29962753ba1aSBryan Drewery# In the following, the first 'rm' in a series will usually remove all
29972753ba1aSBryan Drewery# files and directories.  If it does not, then there are probably some
29982753ba1aSBryan Drewery# files with file flags set, so this unsets them and tries the 'rm' a
29992753ba1aSBryan Drewery# second time.  There are situations where this target will be cleaning
30002753ba1aSBryan Drewery# some directories via more than one method, but that duplication is
30012753ba1aSBryan Drewery# needed to correctly handle all the possible situations.  Removing all
30022753ba1aSBryan Drewery# files without file flags set in the first 'rm' instance saves time,
30032753ba1aSBryan Drewery# because 'chflags' will need to operate on fewer files afterwards.
30042753ba1aSBryan Drewery#
30052753ba1aSBryan Drewery# It is expected that BW_CANONICALOBJDIR == the CANONICALOBJDIR as would be
30062753ba1aSBryan Drewery# created by bsd.obj.mk, except that we don't want to .include that file
3007601594edSBryan Drewery# in this makefile.  We don't do a cleandir walk if MK_AUTO_OBJ is yes
3008601594edSBryan Drewery# since it is not possible for files to land in the wrong place.
30092753ba1aSBryan Drewery#
3010c10062b9SBryan Drewery.if make(cleanworld)
3011c10062b9SBryan DreweryBW_CANONICALOBJDIR:=${OBJTOP}/
3012c10062b9SBryan Drewery.elif make(cleanuniverse)
3013c10062b9SBryan DreweryBW_CANONICALOBJDIR:=${OBJROOT}
3014c10062b9SBryan Drewery.if ${MK_UNIFIED_OBJDIR} == "no"
3015c10062b9SBryan Drewery.error ${.TARGETS} only supported with WITH_UNIFIED_OBJDIR enabled.
30162753ba1aSBryan Drewery.endif
3017c10062b9SBryan Drewery.endif
3018c10062b9SBryan Drewerycleanworld cleanuniverse: .PHONY
3019fa65e3a5SBryan Drewery.if !empty(BW_CANONICALOBJDIR) && exists(${BW_CANONICALOBJDIR}) && \
3020fa65e3a5SBryan Drewery    ${.CURDIR:tA} != ${BW_CANONICALOBJDIR:tA}
3021c10062b9SBryan Drewery	-rm -rf ${BW_CANONICALOBJDIR}*
3022c10062b9SBryan Drewery	-chflags -R 0 ${BW_CANONICALOBJDIR}
3023c10062b9SBryan Drewery	rm -rf ${BW_CANONICALOBJDIR}*
3024c10062b9SBryan Drewery.endif
3025f649ab27SBryan Drewery.if make(cleanworld) && ${MK_AUTO_OBJ} == "no" && \
3026f649ab27SBryan Drewery    (empty(BW_CANONICALOBJDIR) || ${.CURDIR:tA} == ${BW_CANONICALOBJDIR:tA})
3027ddd945c7SBryan Drewery.if ${.CURDIR} == ${.OBJDIR} || ${.CURDIR}/obj == ${.OBJDIR}
30282753ba1aSBryan Drewery	#   To be safe in this case, fall back to a 'make cleandir'
30292753ba1aSBryan Drewery	${_+_}@cd ${.CURDIR}; ${MAKE} cleandir
30302753ba1aSBryan Drewery.endif
3031601594edSBryan Drewery.endif
30322753ba1aSBryan Drewery
303322cbbf9dSSean Bruno.if ${TARGET} == ${MACHINE} && ${TARGET_ARCH} == ${MACHINE_ARCH}
3034f263e792SWarner LoshXDEV_CPUTYPE?=${CPUTYPE}
3035f263e792SWarner Losh.else
3036f263e792SWarner LoshXDEV_CPUTYPE?=${TARGET_CPUTYPE}
3037f263e792SWarner Losh.endif
3038f263e792SWarner Losh
30392d281361SBaptiste DaroussinNOFUN=-DNO_FSCHG MK_HTML=no -DNO_LINT \
304098407b8bSWarner Losh	MK_MAN=no MK_NLS=no MK_PROFILE=no \
3041ab72ce6bSWarner Losh	MK_KERBEROS=no MK_RESCUE=no MK_TESTS=no MK_WARNS=no \
304222cbbf9dSSean Bruno	TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
3043f263e792SWarner Losh	CPUTYPE=${XDEV_CPUTYPE}
30449b3d9914SWarner Losh
304522cbbf9dSSean BrunoXDDIR=${TARGET_ARCH}-freebsd
304662c4a462SBaptiste DaroussinXDTP?=/usr/${XDDIR}
304762c4a462SBaptiste Daroussin.if ${XDTP:N/*}
304862c4a462SBaptiste Daroussin.error XDTP variable should be an absolute path
304962c4a462SBaptiste Daroussin.endif
305062c4a462SBaptiste Daroussin
30513d165b2fSBryan DreweryCDBOBJROOT=	${OBJROOT}${MACHINE}.${MACHINE_ARCH}/xdev/
30523d165b2fSBryan DreweryCDBOBJTOP=	${CDBOBJROOT}${XDDIR}
30533d165b2fSBryan DreweryCDBENV= \
30541dc56acdSAndrew Turner	INSTALL="sh ${.CURDIR}/tools/install.sh"
305525bacc78SWarner LoshCDENV= ${CDBENV} \
3056cf44c89bSBaptiste Daroussin	TOOLS_PREFIX=${XDTP}
30573d165b2fSBryan DreweryCDMAKEARGS= \
30583d165b2fSBryan Drewery	OBJTOP=${CDBOBJTOP:Q} \
30593d165b2fSBryan Drewery	OBJROOT=${CDBOBJROOT:Q}
30603d165b2fSBryan DreweryCD2MAKEARGS= ${CDMAKEARGS}
306168a558ecSBryan Drewery
306268a558ecSBryan Drewery.if ${WANT_COMPILER_TYPE} == gcc || \
306368a558ecSBryan Drewery    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
306468a558ecSBryan Drewery# GCC requires -isystem and -L when using a cross-compiler.  --sysroot
306568a558ecSBryan Drewery# won't set header path and -L is used to ensure the base library path
306668a558ecSBryan Drewery# is added before the port PREFIX library path.
306768a558ecSBryan DreweryCD2CFLAGS+=	-isystem ${XDDESTDIR}/usr/include -L${XDDESTDIR}/usr/lib
306868a558ecSBryan Drewery# GCC requires -B to find /usr/lib/crti.o when using a cross-compiler
306968a558ecSBryan Drewery# combined with --sysroot.
307068a558ecSBryan DreweryCD2CFLAGS+=	-B${XDDESTDIR}/usr/lib
307168a558ecSBryan Drewery# Force using libc++ for external GCC.
30721c0cac23SBryan Drewery.if defined(X_COMPILER_TYPE) && \
30731c0cac23SBryan Drewery    ${X_COMPILER_TYPE} == gcc && ${X_COMPILER_VERSION} >= 40800
307468a558ecSBryan DreweryCD2CXXFLAGS+=	-isystem ${XDDESTDIR}/usr/include/c++/v1 -std=c++11 \
307568a558ecSBryan Drewery		-nostdinc++
307668a558ecSBryan Drewery.endif
307768a558ecSBryan Drewery.endif
307868a558ecSBryan DreweryCD2CFLAGS+=	--sysroot=${XDDESTDIR}/
307968a558ecSBryan DreweryCD2ENV=${CDENV} CC="${CC} ${CD2CFLAGS}" CXX="${CXX} ${CD2CXXFLAGS} ${CD2CFLAGS}" \
3080cf44c89bSBaptiste Daroussin	CPP="${CPP} ${CD2CFLAGS}" \
308122cbbf9dSSean Bruno	MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH}
308225bacc78SWarner Losh
3083dfa09989SBryan DreweryCDTMP=	${OBJTOP}/${XDDIR}/tmp
30843d165b2fSBryan DreweryCDMAKE=${CDENV} PATH=${CDTMP}/usr/bin:${PATH} ${MAKE} ${CDMAKEARGS} ${NOFUN}
30853d165b2fSBryan DreweryCD2MAKE=${CD2ENV} PATH=${CDTMP}/usr/bin:${XDDESTDIR}/usr/bin:${PATH} \
30863d165b2fSBryan Drewery	${MAKE} ${CD2MAKEARGS} ${NOFUN}
30879e580940SBryan Drewery.if ${MK_META_MODE} != "no"
30889e580940SBryan Drewery# Don't rebuild build-tools targets during normal build.
3089dbbb03c2SBryan DreweryCD2MAKE+=	BUILD_TOOLS_META=.NOMETA
30909e580940SBryan Drewery.endif
309186c4ac99SBryan DreweryXDDESTDIR=${DESTDIR}${XDTP}
309225bacc78SWarner Losh
30939e488366SWarner Losh.ORDER: xdev-build xdev-install xdev-links
3094c943a53eSBryan Dreweryxdev: xdev-build xdev-install .PHONY
309525bacc78SWarner Losh
309645fab5d8SAndrew Turner.ORDER: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools
3097c943a53eSBryan Dreweryxdev-build: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools .PHONY
309845fab5d8SAndrew Turner
3099d82fd861SBryan Drewery_xb-worldtmp: .PHONY
310045fab5d8SAndrew Turner	mkdir -p ${CDTMP}/usr
310155a5b46aSAlex Richardson	${WORLDTMP_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
310245fab5d8SAndrew Turner	    -p ${CDTMP}/usr >/dev/null
310345fab5d8SAndrew Turner
3104d82fd861SBryan Drewery_xb-bootstrap-tools: .PHONY
310545fab5d8SAndrew Turner.for _tool in \
31062bc62d50SEnji Cooper    ${_clang_tblgen} \
3107e36b831fSBryan Drewery    ${_gperf} \
3108e36b831fSBryan Drewery    ${_yacc}
3109497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> ${_tool} (obj,all,install)"; \
3110b67490a3SBryan Drewery	cd ${.CURDIR}/${_tool}; \
31112abeba9dSBryan Drewery	if [ -z "${NO_OBJWALK}" ]; then ${CDMAKE} DIRPRFX=${_tool}/ obj; fi; \
3112b67490a3SBryan Drewery	${CDMAKE} DIRPRFX=${_tool}/ all; \
311345fab5d8SAndrew Turner	${CDMAKE} DIRPRFX=${_tool}/ DESTDIR=${CDTMP} install
311445fab5d8SAndrew Turner.endfor
311525bacc78SWarner Losh
3116d82fd861SBryan Drewery_xb-build-tools: .PHONY
31179b3d9914SWarner Losh	${_+_}@cd ${.CURDIR}; \
31183d165b2fSBryan Drewery	${CDBENV} ${MAKE} ${CDMAKEARGS} -f Makefile.inc1 ${NOFUN} build-tools
311925bacc78SWarner Losh
3120be1ef37bSBryan DreweryXDEVDIRS= \
3121f0696740SBryan Drewery    ${_clang_libs} \
3122c16a698bSBryan Drewery    ${_lld} \
3123ae85a489SBaptiste Daroussin    ${_binutils} \
312431942939SEd Maste    ${_elftctools} \
312545fab5d8SAndrew Turner    usr.bin/ar \
3126ae85a489SBaptiste Daroussin    ${_clang} \
312735070067SBryan Drewery    ${_gcc}
3128be1ef37bSBryan Drewery
3129be1ef37bSBryan Drewery_xb-cross-tools: .PHONY
3130be1ef37bSBryan Drewery.for _tool in ${XDEVDIRS}
3131497e8091SBryan Drewery	${_+_}@${ECHODIR} "===> xdev ${_tool} (obj,all)"; \
3132b67490a3SBryan Drewery	cd ${.CURDIR}/${_tool}; \
31332abeba9dSBryan Drewery	if [ -z "${NO_OBJWALK}" ]; then ${CDMAKE} DIRPRFX=${_tool}/ obj; fi; \
313425bacc78SWarner Losh	${CDMAKE} DIRPRFX=${_tool}/ all
313525bacc78SWarner Losh.endfor
313625bacc78SWarner Losh
3137d82fd861SBryan Drewery_xi-mtree: .PHONY
313825bacc78SWarner Losh	${_+_}@${ECHODIR} "mtree populating ${XDDESTDIR}"
313925bacc78SWarner Losh	mkdir -p ${XDDESTDIR}
314055a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.root.dist \
314125bacc78SWarner Losh	    -p ${XDDESTDIR} >/dev/null
314255a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
314325bacc78SWarner Losh	    -p ${XDDESTDIR}/usr >/dev/null
314455a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
314525bacc78SWarner Losh	    -p ${XDDESTDIR}/usr/include >/dev/null
3146dba75e9fSBryan Drewery.if defined(LIBCOMPAT)
314755a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
314874c52c65SJulio Merino	    -p ${XDDESTDIR}/usr >/dev/null
314974c52c65SJulio Merino.endif
31501782c649SDimitry Andric.if ${MK_TESTS} != "no"
3151f703589eSEnji Cooper	mkdir -p ${XDDESTDIR}${TESTSBASE}
315255a5b46aSAlex Richardson	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
3153f703589eSEnji Cooper	    -p ${XDDESTDIR}${TESTSBASE} >/dev/null
31541782c649SDimitry Andric.endif
315525bacc78SWarner Losh
31569e488366SWarner Losh.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
3157c943a53eSBryan Dreweryxdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries .PHONY
315825bacc78SWarner Losh
3159d82fd861SBryan Drewery_xi-cross-tools: .PHONY
316025bacc78SWarner Losh	@echo "_xi-cross-tools"
3161be1ef37bSBryan Drewery.for _tool in ${XDEVDIRS}
316225bacc78SWarner Losh	${_+_}@${ECHODIR} "===> xdev ${_tool} (install)"; \
316325bacc78SWarner Losh	cd ${.CURDIR}/${_tool}; \
316425bacc78SWarner Losh	${CDMAKE} DIRPRFX=${_tool}/ install DESTDIR=${XDDESTDIR}
316525bacc78SWarner Losh.endfor
316625bacc78SWarner Losh
3167d82fd861SBryan Drewery_xi-includes: .PHONY
31682abeba9dSBryan Drewery.if !defined(NO_OBJWALK)
316957820ca8SBryan Drewery	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 _obj \
317057820ca8SBryan Drewery		DESTDIR=${XDDESTDIR}
317157820ca8SBryan Drewery.endif
317203173d2fSBryan Drewery	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 includes \
317325bacc78SWarner Losh		DESTDIR=${XDDESTDIR}
317425bacc78SWarner Losh
3175d82fd861SBryan Drewery_xi-libraries: .PHONY
317625bacc78SWarner Losh	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \
317725bacc78SWarner Losh		DESTDIR=${XDDESTDIR}
317825bacc78SWarner Losh
3179d82fd861SBryan Dreweryxdev-links: .PHONY
318025bacc78SWarner Losh	${_+_}cd ${XDDESTDIR}/usr/bin; \
3181923cfb89SIan Lepore	mkdir -p ../../../../usr/bin; \
318225bacc78SWarner Losh		for i in *; do \
318325bacc78SWarner Losh			ln -sf ../../${XDTP}/usr/bin/$$i \
318425bacc78SWarner Losh			    ../../../../usr/bin/${XDDIR}-$$i; \
318525bacc78SWarner Losh			ln -sf ../../${XDTP}/usr/bin/$$i \
3186dca576beSIan Lepore			    ../../../../usr/bin/${XDDIR}${_REVISION}-$$i; \
318725bacc78SWarner Losh		done
3188