diff options
Diffstat (limited to 'Makefile.inc1')
-rw-r--r-- | Makefile.inc1 | 1682 |
1 files changed, 1682 insertions, 0 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1 new file mode 100644 index 0000000..d225474 --- /dev/null +++ b/Makefile.inc1 @@ -0,0 +1,1682 @@ +# +# $FreeBSD$ +# +# Make command line options: +# -DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir +# -DNO_CLEAN do not clean at all +# -DNO_SHARE do not go into share subdir +# -DKERNFAST define NO_KERNEL{CONFIG,CLEAN,DEPEND,OBJ} +# -DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel +# -DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel +# -DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel +# -DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel +# -DNO_PORTSUPDATE do not update ports in ${MAKE} update +# -DNO_DOCUPDATE do not update doc in ${MAKE} update +# -DNO_WWWUPDATE do not update www in ${MAKE} update +# -DNO_CTF do not run the DTrace CTF conversion tools on built objects +# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list +# LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools +# list +# TARGET="machine" to crossbuild world for a different machine type +# TARGET_ARCH= may be required when a TARGET supports multiple endians +# BUILDENV_SHELL= shell to launch for the buildenv target (def:/bin/sh) + +# +# The intended user-driven targets are: +# buildworld - rebuild *everything*, including glue to help do upgrades +# installworld- install everything built by "buildworld" +# doxygen - build API documentation of the kernel +# update - convenient way to update your source tree (eg: cvsup/cvs) +# +# Standard targets (not defined here) are documented in the makefiles in +# /usr/share/mk. These include: +# obj depend all install clean cleandepend cleanobj + +# You are supposed to define both of these when calling Makefile.inc1 +# directly. However, some old scripts don't. Cope for the moment, but +# issue a new warning for a transition period. +.if defined(TARGET) && !defined(TARGET_ARCH) +.warning "You must pass both TARGET and TARGET_ARCH to Makefile.inc1. Setting TARGET_ARCH=${TARGET}." +TARGET_ARCH=${TARGET} +.endif +.if !defined(TARGET) || !defined(TARGET_ARCH) +.error "Both TARGET and TARGET_ARCH must be defined." +.endif + +.include <bsd.own.mk> +.include <bsd.arch.inc.mk> + +# We must do share/info early so that installation of info `dir' +# entries works correctly. Do it first since it is less likely to +# grow dependencies on include and lib than vice versa. +# +# We must do lib/ and libexec/ before bin/, because if installworld +# installs a new /bin/sh, the 'make' command will *immediately* +# use that new version. And the new (dynamically-linked) /bin/sh +# will expect to find appropriate libraries in /lib and /libexec. +# +SUBDIR= share/info lib libexec +SUBDIR+=bin +.if ${MK_GAMES} != "no" +SUBDIR+=games +.endif +.if ${MK_CDDL} != "no" +SUBDIR+=cddl +.endif +SUBDIR+=gnu include +.if ${MK_KERBEROS} != "no" +SUBDIR+=kerberos5 +.endif +.if ${MK_RESCUE} != "no" +SUBDIR+=rescue +.endif +SUBDIR+=sbin +.if ${MK_CRYPT} != "no" +SUBDIR+=secure +.endif +.if !defined(NO_SHARE) +SUBDIR+=share +.endif +SUBDIR+=sys usr.bin usr.sbin +.if ${MK_OFED} != "no" +SUBDIR+=contrib/ofed +.endif +# +# We must do etc/ last for install/distribute to work. +# +SUBDIR+=etc + +# These are last, since it is nice to at least get the base system +# rebuilt before you do them. +.for _DIR in ${LOCAL_DIRS} +.if exists(${.CURDIR}/${_DIR}/Makefile) +SUBDIR+= ${_DIR} +.endif +.endfor + +.if defined(SUBDIR_OVERRIDE) +SUBDIR= ${SUBDIR_OVERRIDE} +.endif + +.if defined(NOCLEAN) +NO_CLEAN= ${NOCLEAN} +.endif +.if defined(NO_CLEANDIR) +CLEANDIR= clean cleandepend +.else +CLEANDIR= cleandir +.endif + +LOCAL_TOOL_DIRS?= + +BUILDENV_SHELL?=/bin/sh + +CVS?= cvs +CVSFLAGS?= -A -P -d -I! +SVN?= svn +SVNFLAGS?= -r HEAD +SUP?= /usr/bin/csup +SUPFLAGS?= -g -L 2 +.if defined(SUPHOST) +SUPFLAGS+= -h ${SUPHOST} +.endif + +MAKEOBJDIRPREFIX?= /usr/obj +.if !defined(OSRELDATE) +.if exists(/usr/include/osreldate.h) +OSRELDATE!= awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \ + /usr/include/osreldate.h +.else +OSRELDATE= 0 +.endif +.endif + +.if !defined(VERSION) +VERSION!= uname -srp +VERSION+= ${OSRELDATE} +.endif + +KNOWN_ARCHES?= amd64 arm armeb/arm i386 i386/pc98 ia64 mipsel/mips mipseb/mips mips64el/mips mips64eb/mips mipsn32el/mips mipsn32eb/mips powerpc powerpc64/powerpc sparc64 +.if ${TARGET} == ${TARGET_ARCH} +_t= ${TARGET} +.else +_t= ${TARGET_ARCH}/${TARGET} +.endif +.for _t in ${_t} +.if empty(KNOWN_ARCHES:M${_t}) +.error Unknown target ${TARGET_ARCH}:${TARGET}. +.endif +.endfor + +.if ${TARGET} == ${MACHINE} +TARGET_CPUTYPE?=${CPUTYPE} +.else +TARGET_CPUTYPE?= +.endif + +.if !empty(TARGET_CPUTYPE) +_TARGET_CPUTYPE=${TARGET_CPUTYPE} +.else +_TARGET_CPUTYPE=dummy +.endif +_CPUTYPE!= MAKEFLAGS= CPUTYPE=${_TARGET_CPUTYPE} ${MAKE} \ + -f /dev/null -m ${.CURDIR}/share/mk -V CPUTYPE +.if ${_CPUTYPE} != ${_TARGET_CPUTYPE} +.error CPUTYPE global should be set with ?=. +.endif +.if make(buildworld) +BUILD_ARCH!= uname -p +.if ${MACHINE_ARCH} != ${BUILD_ARCH} +.error To cross-build, set TARGET_ARCH. +.endif +.endif +.if ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && !defined(CROSS_BUILD_TESTING) +OBJTREE= ${MAKEOBJDIRPREFIX} +.else +OBJTREE= ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH} +.endif +WORLDTMP= ${OBJTREE}${.CURDIR}/tmp +# /usr/games added for fortune which depend on strfile +BPATH= ${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/usr/games +XPATH= ${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games +STRICTTMPPATH= ${BPATH}:${XPATH} +TMPPATH= ${STRICTTMPPATH}:${PATH} + +# +# Avoid running mktemp(1) unless actually needed. +# It may not be functional, e.g., due to new ABI +# when in the middle of installing over this system. +# +.if make(distributeworld) || make(installworld) +INSTALLTMP!= /usr/bin/mktemp -d -u -t install +.endif + +# +# Building a world goes through the following stages +# +# 1. legacy stage [BMAKE] +# This stage is responsible for creating compatibility +# shims that are needed by the bootstrap-tools, +# build-tools and cross-tools stages. +# 1. bootstrap-tools stage [BMAKE] +# This stage is responsible for creating programs that +# are needed for backward compatibility reasons. They +# are not built as cross-tools. +# 2. build-tools stage [TMAKE] +# This stage is responsible for creating the object +# tree and building any tools that are needed during +# the build process. +# 3. cross-tools stage [XMAKE] +# This stage is responsible for creating any tools that +# are needed for cross-builds. A cross-compiler is one +# of them. +# 4. world stage [WMAKE] +# This stage actually builds the world. +# 5. install stage (optional) [IMAKE] +# This stage installs a previously built world. +# + +BOOTSTRAPPING?= 0 + +# Common environment for world related stages +CROSSENV= MAKEOBJDIRPREFIX=${OBJTREE} \ + MACHINE_ARCH=${TARGET_ARCH} \ + MACHINE=${TARGET} \ + CPUTYPE=${TARGET_CPUTYPE} +.if ${OSRELDATE} < 700044 +CROSSENV+= AR=gnu-ar RANLIB=gnu-ranlib +.endif +.if ${MK_GROFF} != "no" +CROSSENV+= GROFF_BIN_PATH=${WORLDTMP}/legacy/usr/bin \ + GROFF_FONT_PATH=${WORLDTMP}/legacy/usr/share/groff_font \ + GROFF_TMAC_PATH=${WORLDTMP}/legacy/usr/share/tmac +.endif + +# bootstrap-tools stage +BMAKEENV= INSTALL="sh ${.CURDIR}/tools/install.sh" \ + PATH=${BPATH}:${PATH} \ + WORLDTMP=${WORLDTMP} \ + VERSION="${VERSION}" \ + MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" +BMAKE= MAKEOBJDIRPREFIX=${WORLDTMP} \ + ${BMAKEENV} ${MAKE} -f Makefile.inc1 \ + DESTDIR= \ + BOOTSTRAPPING=${OSRELDATE} \ + SSP_CFLAGS= \ + -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT -DWITHOUT_MAN \ + -DNO_PIC -DNO_PROFILE -DNO_SHARED \ + -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF + +# build-tools stage +TMAKE= MAKEOBJDIRPREFIX=${OBJTREE} \ + ${BMAKEENV} ${MAKE} -f Makefile.inc1 \ + TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \ + DESTDIR= \ + BOOTSTRAPPING=${OSRELDATE} \ + SSP_CFLAGS= \ + -DNO_LINT \ + -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF + +# cross-tools stage +XMAKE= TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \ + TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \ + -DWITHOUT_GDB + +# world stage +WMAKEENV= ${CROSSENV} \ + _SHLIBDIRPREFIX=${WORLDTMP} \ + VERSION="${VERSION}" \ + INSTALL="sh ${.CURDIR}/tools/install.sh" \ + PATH=${TMPPATH} +.if ${MK_CDDL} == "no" +WMAKEENV+= NO_CTF=1 +.endif +WMAKE= ${WMAKEENV} ${MAKE} -f Makefile.inc1 DESTDIR=${WORLDTMP} + +.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64" +# 32 bit world +LIB32TMP= ${OBJTREE}${.CURDIR}/lib32 + +.if ${TARGET_ARCH} == "amd64" +.if empty(TARGET_CPUTYPE) +LIB32CPUFLAGS= -march=i686 -mmmx -msse -msse2 +.else +LIB32CPUFLAGS= -march=${TARGET_CPUTYPE} +.endif +LIB32WMAKEENV= MACHINE=i386 MACHINE_ARCH=i386 \ + MACHINE_CPU="i686 mmx sse sse2" \ + LD="${LD} -m elf_i386_fbsd -Y P,${LIB32TMP}/usr/lib32" \ + AS="${AS} --32" + +.elif ${TARGET_ARCH} == "powerpc64" +.if empty(TARGET_CPUTYPE) +LIB32CPUFLAGS= -mcpu=powerpc +.else +LIB32CPUFLAGS= -mcpu=${TARGET_CPUTYPE} +.endif +LIB32WMAKEENV= MACHINE=powerpc MACHINE_ARCH=powerpc \ + LD="${LD} -m elf32ppc_fbsd" +.endif + + +LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \ + -isystem ${LIB32TMP}/usr/include/ \ + -L${LIB32TMP}/usr/lib32 \ + -B${LIB32TMP}/usr/lib32 + +# Yes, the flags are redundant. +LIB32WMAKEENV+= MAKEOBJDIRPREFIX=${OBJTREE}/lib32 \ + _SHLIBDIRPREFIX=${LIB32TMP} \ + VERSION="${VERSION}" \ + INSTALL="sh ${.CURDIR}/tools/install.sh" \ + PATH=${TMPPATH} \ + CC="${CC} ${LIB32FLAGS}" \ + CXX="${CXX} ${LIB32FLAGS}" \ + LIBDIR=/usr/lib32 \ + SHLIBDIR=/usr/lib32 + +LIB32WMAKE= ${LIB32WMAKEENV} ${MAKE} -DNO_CPU_CFLAGS -DCOMPAT_32BIT \ + -DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_INFO \ + -DWITHOUT_HTML -DNO_CTF -DNO_LINT -ECC -ECXX -EAS -ELD \ + DESTDIR=${LIB32TMP} +LIB32IMAKE= ${LIB32WMAKE:NINSTALL=*:NDESTDIR=*} -DNO_INCS +.endif + +# install stage +IMAKEENV= ${CROSSENV} +IMAKE= ${IMAKEENV} ${MAKE} -f Makefile.inc1 +.if empty(.MAKEFLAGS:M-n) +IMAKEENV+= PATH=${STRICTTMPPATH}:${INSTALLTMP} \ + LD_LIBRARY_PATH=${INSTALLTMP} \ + PATH_LOCALE=${INSTALLTMP}/locale +IMAKE+= __MAKE_SHELL=${INSTALLTMP}/sh +.else +IMAKEENV+= PATH=${TMPPATH}:${INSTALLTMP} +.endif + +# kernel stage +KMAKEENV= ${WMAKEENV} +KMAKE= ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} + +# +# buildworld +# +# Attempt to rebuild the entire system, with reasonable chance of +# success, regardless of how old your existing system is. +# +_worldtmp: +.if ${.CURDIR:C/[^,]//g} != "" +# The m4 build of sendmail files doesn't like it if ',' is used +# anywhere in the path of it's files. + @echo + @echo "*** Error: path to source tree contains a comma ','" + @echo + false +.endif + @echo + @echo "--------------------------------------------------------------" + @echo ">>> Rebuilding the temporary build tree" + @echo "--------------------------------------------------------------" +.if !defined(NO_CLEAN) + rm -rf ${WORLDTMP} +.if defined(LIB32TMP) + rm -rf ${LIB32TMP} +.endif +.else + rm -rf ${WORLDTMP}/legacy/usr/include +# XXX - These three can depend on any header file. + rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/ioctl.c + rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/kdump_subr.c + rm -f ${OBJTREE}${.CURDIR}/usr.bin/truss/ioctl.c +.endif +.for _dir in \ + lib usr legacy/usr + mkdir -p ${WORLDTMP}/${_dir} +.endfor + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${WORLDTMP}/legacy/usr >/dev/null +.if ${MK_GROFF} != "no" + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.groff.dist \ + -p ${WORLDTMP}/legacy/usr >/dev/null +.endif + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${WORLDTMP}/usr >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${WORLDTMP}/usr/include >/dev/null + ln -sf ${.CURDIR}/sys ${WORLDTMP} +.if ${MK_BIND_LIBS} != "no" + mtree -deU -f ${.CURDIR}/etc/mtree/BIND.include.dist \ + -p ${WORLDTMP}/usr/include >/dev/null +.endif +_legacy: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 1.1: legacy release compatibility shims" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${BMAKE} legacy +_bootstrap-tools: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 1.2: bootstrap tools" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools +_cleanobj: +.if !defined(NO_CLEAN) + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.1: cleaning up the object tree" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR:S/^/par-/} +.if defined(LIB32TMP) + ${_+_}cd ${.CURDIR}; ${LIB32WMAKE} -f Makefile.inc1 ${CLEANDIR:S/^/par-/} +.endif +.endif +_obj: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.2: rebuilding the object tree" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${WMAKE} par-obj +_build-tools: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.3: build tools" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${TMAKE} build-tools +_cross-tools: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 3: cross tools" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools +_includes: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 4.1: building includes" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks par-includes +_libraries: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 4.2: building libraries" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; \ + ${WMAKE} -DNO_FSCHG -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT \ + -DWITHOUT_MAN -DNO_PROFILE libraries +_depend: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 4.3: make dependencies" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${WMAKE} par-depend +everything: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 4.4: building everything" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${WMAKE} par-all +.if defined(LIB32TMP) +build32: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 5.1: building 32 bit shim libraries" + @echo "--------------------------------------------------------------" + mkdir -p ${LIB32TMP}/usr/include + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${LIB32TMP}/usr >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${LIB32TMP}/usr/include >/dev/null + mkdir -p ${WORLDTMP} + ln -sf ${.CURDIR}/sys ${WORLDTMP} +.for _t in obj includes + cd ${.CURDIR}/include; ${LIB32WMAKE} DIRPRFX=include/ ${_t} + cd ${.CURDIR}/lib; ${LIB32WMAKE} DIRPRFX=lib/ ${_t} +.if ${MK_CDDL} != "no" + cd ${.CURDIR}/cddl/lib; ${LIB32WMAKE} DIRPRFX=cddl/lib/ ${_t} +.endif + cd ${.CURDIR}/gnu/lib; ${LIB32WMAKE} DIRPRFX=gnu/lib/ ${_t} +.if ${MK_CRYPT} != "no" + cd ${.CURDIR}/secure/lib; ${LIB32WMAKE} DIRPRFX=secure/lib/ ${_t} +.endif +.if ${MK_KERBEROS} != "no" + cd ${.CURDIR}/kerberos5/lib; ${LIB32WMAKE} DIRPRFX=kerberos5/lib ${_t} +.endif +.endfor +.for _dir in usr.bin/lex/lib + cd ${.CURDIR}/${_dir}; ${LIB32WMAKE} DIRPRFX=${_dir}/ obj +.endfor +.for _dir in lib/ncurses/ncurses lib/ncurses/ncursesw lib/libmagic + cd ${.CURDIR}/${_dir}; \ + MAKEOBJDIRPREFIX=${OBJTREE}/lib32 ${MAKE} SSP_CFLAGS= DESTDIR= \ + DIRPRFX=${_dir}/ build-tools +.endfor + cd ${.CURDIR}; \ + ${LIB32WMAKE} -f Makefile.inc1 libraries +.for _t in obj depend all + cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIB32WMAKE} \ + DIRPRFX=libexec/rtld-elf/ ${_t} + cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32WMAKE} \ + DIRPRFX=usr.bin/ldd ${_t} +.endfor + +distribute32 install32: + cd ${.CURDIR}/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} +.if ${MK_CDDL} != "no" + cd ${.CURDIR}/cddl/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} +.endif + cd ${.CURDIR}/gnu/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} +.if ${MK_CRYPT} != "no" + cd ${.CURDIR}/secure/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} +.endif +.if ${MK_KERBEROS} != "no" + cd ${.CURDIR}/kerberos5/lib; ${LIB32IMAKE} ${.TARGET:S/32$//} +.endif + cd ${.CURDIR}/libexec/rtld-elf; \ + PROG=ld-elf32.so.1 ${LIB32IMAKE} ${.TARGET:S/32$//} + cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32IMAKE} ${.TARGET:S/32$//} +.endif + +WMAKE_TGTS= +.if !defined(SUBDIR_OVERRIDE) +WMAKE_TGTS+= _worldtmp _legacy _bootstrap-tools +.endif +WMAKE_TGTS+= _cleanobj _obj _build-tools +.if !defined(SUBDIR_OVERRIDE) +WMAKE_TGTS+= _cross-tools +.endif +WMAKE_TGTS+= _includes _libraries _depend everything +.if defined(LIB32TMP) && ${MK_LIB32} != "no" +WMAKE_TGTS+= build32 +.endif + +buildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue +.ORDER: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue + +buildworld_prologue: + @echo "--------------------------------------------------------------" + @echo ">>> World build started on `LC_ALL=C date`" + @echo "--------------------------------------------------------------" + +buildworld_epilogue: + @echo + @echo "--------------------------------------------------------------" + @echo ">>> World build completed on `LC_ALL=C date`" + @echo "--------------------------------------------------------------" + +# +# We need to have this as a target because the indirection between Makefile +# and Makefile.inc1 causes the correct PATH to be used, rather than a +# modification of the current environment's PATH. In addition, we need +# to quote multiword values. +# +buildenvvars: + @echo ${WMAKEENV:Q} + +buildenv: + @echo Entering world for ${TARGET_ARCH}:${TARGET} + @cd ${.CURDIR} && env ${WMAKEENV} ${BUILDENV_SHELL} || true + +TOOLCHAIN_TGTS= ${WMAKE_TGTS:N_depend:Neverything:Nbuild32} +toolchain: ${TOOLCHAIN_TGTS} +kernel-toolchain: ${TOOLCHAIN_TGTS:N_includes:N_libraries} + +# +# installcheck +# +# Checks to be sure system is ready for installworld/installkernel. +# +installcheck: + +# +# Require DESTDIR to be set if installing for a different architecture. +# +.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE} +.if !make(distributeworld) +installcheck: installcheck_DESTDIR +installcheck_DESTDIR: +.if !defined(DESTDIR) || empty(DESTDIR) + @echo "ERROR: Please set DESTDIR!"; \ + false +.endif +.endif +.endif + +# +# Check for missing UIDs/GIDs. +# +CHECK_UIDS= +CHECK_GIDS= audit +.if ${MK_SENDMAIL} != "no" +CHECK_UIDS+= smmsp +CHECK_GIDS+= smmsp +.endif +.if ${MK_PF} != "no" +CHECK_UIDS+= proxy +CHECK_GIDS+= proxy authpf +.endif +installcheck: installcheck_UGID +installcheck_UGID: +.for uid in ${CHECK_UIDS} + @if ! `id -u ${uid} >/dev/null 2>&1`; then \ + echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \ + false; \ + fi +.endfor +.for gid in ${CHECK_GIDS} + @if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \ + echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \ + false; \ + fi +.endfor + +# +# Required install tools to be saved in a scratch dir for safety. +# +.if ${MK_INFO} != "no" +_install-info= install-info +.endif +.if ${MK_ZONEINFO} != "no" +_zoneinfo= zic tzsetup +.endif + +ITOOLS= [ awk cap_mkdb cat chflags chmod chown \ + date echo egrep find grep ${_install-info} \ + ln lockf make mkdir mtree mv pwd_mkdb rm sed sh sysctl \ + test true uname wc ${_zoneinfo} + +# +# distributeworld +# +# Distributes everything compiled by a `buildworld'. +# +# installworld +# +# Installs everything compiled by a 'buildworld'. +# + +# Non-base distributions produced by the base system +EXTRA_DISTRIBUTIONS= doc games +.if defined(LIB32TMP) && ${MK_LIB32} != "no" +EXTRA_DISTRIBUTIONS+= lib32 +.endif + +distributeworld installworld: installcheck + mkdir -p ${INSTALLTMP} + progs=$$(for prog in ${ITOOLS}; do \ + if progpath=`which $$prog`; then \ + echo $$progpath; \ + else \ + echo "Required tool $$prog not found in PATH." >&2; \ + exit 1; \ + fi; \ + done); \ + libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \ + while read line; do \ + set -- $$line; \ + if [ "$$2 $$3" != "not found" ]; then \ + echo $$2; \ + else \ + echo "Required library $$1 not found." >&2; \ + exit 1; \ + fi; \ + done); \ + cp $$libs $$progs ${INSTALLTMP} + cp -R $${PATH_LOCALE:-"/usr/share/locale"} ${INSTALLTMP}/locale +.if make(distributeworld) +.for dist in ${EXTRA_DISTRIBUTIONS} + -mkdir ${DESTDIR}/${DISTDIR}/${dist} + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.root.dist \ + -p ${DESTDIR}/${DISTDIR}/${dist} >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null +.endfor + -mkdir ${DESTDIR}/${DISTDIR}/base + ${_+_}cd ${.CURDIR}; ${IMAKE} distrib-dirs \ + DESTDIR=${DESTDIR}/${DISTDIR}/base +.endif + ${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \ + ${IMAKEENV} rm -rf ${INSTALLTMP} +.if make(distributeworld) +.for dist in ${EXTRA_DISTRIBUTIONS} + find ${DESTDIR}/${DISTDIR}/${dist} -empty -delete +.endfor +.endif + +packageworld: +.for dist in base ${EXTRA_DISTRIBUTIONS} + ${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \ + tar cvJf ${DESTDIR}/${DISTDIR}/${dist}.txz . +.endfor + +# +# reinstall +# +# If you have a build server, you can NFS mount the source and obj directories +# and do a 'make reinstall' on the *client* to install new binaries from the +# most recent server build. +# +reinstall: + @echo "--------------------------------------------------------------" + @echo ">>> Making hierarchy" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 hierarchy + @echo + @echo "--------------------------------------------------------------" + @echo ">>> Installing everything" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install +.if defined(LIB32TMP) && ${MK_LIB32} != "no" + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install32 +.endif + +redistribute: + @echo "--------------------------------------------------------------" + @echo ">>> Distributing everything" + @echo "--------------------------------------------------------------" + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute +.if defined(LIB32TMP) && ${MK_LIB32} != "no" + ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute32 \ + DISTRIBUTION=lib32 +.endif + +distrib-dirs distribution: + cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} ${.TARGET} + +# +# buildkernel and installkernel +# +# Which kernels to build and/or install is specified by setting +# KERNCONF. If not defined a GENERIC kernel is built/installed. +# Only the existing (depending TARGET) config files are used +# for building kernels and only the first of these is designated +# as the one being installed. +# +# Note that we have to use TARGET instead of TARGET_ARCH when +# we're in kernel-land. Since only TARGET_ARCH is (expected) to +# be set to cross-build, we have to make sure TARGET is set +# properly. + +.if defined(KERNFAST) +NO_KERNELCLEAN= t +NO_KERNELCONFIG= t +NO_KERNELDEPEND= t +NO_KERNELOBJ= t +# Shortcut for KERNCONF=Blah -DKERNFAST is now KERNFAST=Blah +.if !defined(KERNCONF) && ${KERNFAST} != "1" +KERNCONF=${KERNFAST} +.endif +.endif +.if !defined(KERNCONF) && defined(KERNEL) +KERNCONF= ${KERNEL} +KERNWARN= +.else +.if ${TARGET_ARCH} == "powerpc64" +KERNCONF?= GENERIC64 +.else +KERNCONF?= GENERIC +.endif +.endif +INSTKERNNAME?= kernel + +KERNSRCDIR?= ${.CURDIR}/sys +KRNLCONFDIR= ${KERNSRCDIR}/${TARGET}/conf +KRNLOBJDIR= ${OBJTREE}${KERNSRCDIR} +KERNCONFDIR?= ${KRNLCONFDIR} + +BUILDKERNELS= +INSTALLKERNEL= +.for _kernel in ${KERNCONF} +.if exists(${KERNCONFDIR}/${_kernel}) +BUILDKERNELS+= ${_kernel} +.if empty(INSTALLKERNEL) +INSTALLKERNEL= ${_kernel} +.endif +.endif +.endfor + +# +# buildkernel +# +# Builds all kernels defined by BUILDKERNELS. +# +buildkernel: +.if empty(BUILDKERNELS) + @echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \ + false +.endif +.if defined(KERNWARN) + @echo "--------------------------------------------------------------" + @echo ">>> WARNING: KERNEL= setting should be changed to KERNCONF=" + @echo "--------------------------------------------------------------" + @sleep 3 +.endif + @echo +.for _kernel in ${BUILDKERNELS} + @echo "--------------------------------------------------------------" + @echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`" + @echo "--------------------------------------------------------------" + @echo "===> ${_kernel}" + mkdir -p ${KRNLOBJDIR} +.if !defined(NO_KERNELCONFIG) + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 1: configuring the kernel" + @echo "--------------------------------------------------------------" + cd ${KRNLCONFDIR}; \ + PATH=${TMPPATH} \ + config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \ + ${KERNCONFDIR}/${_kernel} +.endif +.if !defined(NO_CLEAN) && !defined(NO_KERNELCLEAN) + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.1: cleaning up the object tree" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR} +.endif +.if !defined(NO_KERNELOBJ) + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.2: rebuilding the object tree" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj +.endif + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 2.3: build tools" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${_kernel}; \ + PATH=${BPATH}:${PATH} \ + MAKESRCPATH=${KERNSRCDIR}/dev/aic7xxx/aicasm \ + ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF \ + -f ${KERNSRCDIR}/dev/aic7xxx/aicasm/Makefile +# XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case. +.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KERNSRCDIR}/modules) +.for target in obj depend all + cd ${KERNSRCDIR}/modules/aic7xxx/aicasm; \ + PATH=${BPATH}:${PATH} \ + MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \ + ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF ${target} +.endfor +.endif +.if !defined(NO_KERNELDEPEND) + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 3.1: making dependencies" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} depend -DNO_MODULES_OBJ +.endif + @echo + @echo "--------------------------------------------------------------" + @echo ">>> stage 3.2: building everything" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ + @echo "--------------------------------------------------------------" + @echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`" + @echo "--------------------------------------------------------------" +.endfor + +# +# installkernel, etc. +# +# Install the kernel defined by INSTALLKERNEL +# +installkernel installkernel.debug \ +reinstallkernel reinstallkernel.debug: installcheck +.if empty(INSTALLKERNEL) + @echo "ERROR: No kernel \"${KERNCONF}\" to install."; \ + false +.endif + @echo "--------------------------------------------------------------" + @echo ">>> Installing kernel ${INSTALLKERNEL}" + @echo "--------------------------------------------------------------" + cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \ + ${CROSSENV} PATH=${TMPPATH} \ + ${MAKE} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//} + +distributekernel distributekernel.debug: +.if empty(INSTALLKERNEL) + @echo "ERROR: No kernel \"${KERNCONF}\" to install."; \ + false +.endif + cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \ + ${CROSSENV} PATH=${TMPPATH} ${MAKE} KERNEL=${INSTKERNNAME} \ + DESTDIR=${DESTDIR}/${DISTDIR}/kernel \ + ${.TARGET:S/distributekernel/install/} +.for _kernel in ${BUILDKERNELS:S/${INSTALLKERNEL}//} + cd ${KRNLOBJDIR}/${_kernel}; \ + ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ + KERNEL=${INSTKERNNAME}.${_kernel} \ + DESTDIR=${DESTDIR}/${DISTDIR}/kernel.${_kernel} \ + ${.TARGET:S/distributekernel/install/} +.endfor + +packagekernel: + cd ${DESTDIR}/${DISTDIR}/kernel; \ + tar cvJf ${DESTDIR}/${DISTDIR}/kernel.txz . +.for _kernel in ${BUILDKERNELS:S/${INSTALLKERNEL}//} + cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \ + tar cvJf ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.txz . +.endfor + +# +# doxygen +# +# Build the API documentation with doxygen +# +doxygen: + @if [ ! -x `/usr/bin/which doxygen` ]; then \ + echo "You need doxygen (devel/doxygen) to generate the API documentation of the kernel." | /usr/bin/fmt; \ + exit 1; \ + fi + cd ${.CURDIR}/tools/kerneldoc/subsys && ${MAKE} obj all + +# +# update +# +# Update the source tree(s), by running cvsup/cvs/svn to update to the +# latest copy. +# +update: +.if defined(SUP_UPDATE) + @echo "--------------------------------------------------------------" + @echo ">>> Running ${SUP}" + @echo "--------------------------------------------------------------" +.if defined(SUPFILE) + @${SUP} ${SUPFLAGS} ${SUPFILE} +.endif +.if defined(SUPFILE1) + @${SUP} ${SUPFLAGS} ${SUPFILE1} +.endif +.if defined(SUPFILE2) + @${SUP} ${SUPFLAGS} ${SUPFILE2} +.endif +.if defined(PORTSSUPFILE) && !defined(NO_PORTSUPDATE) + @${SUP} ${SUPFLAGS} ${PORTSSUPFILE} +.endif +.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE) + @${SUP} ${SUPFLAGS} ${DOCSUPFILE} +.endif +.if defined(WWWSUPFILE) && !defined(NO_WWWUPDATE) + @${SUP} ${SUPFLAGS} ${WWWSUPFILE} +.endif +.endif +.if defined(CVS_UPDATE) + @cd ${.CURDIR} ; \ + if [ -d CVS ] ; then \ + echo "--------------------------------------------------------------" ; \ + echo ">>> Updating ${.CURDIR} from CVS repository" ${CVSROOT} ; \ + echo "--------------------------------------------------------------" ; \ + echo ${CVS} -R -q update ${CVSFLAGS} ; \ + ${CVS} -R -q update ${CVSFLAGS} ; \ + fi +.endif +.if defined(SVN_UPDATE) + @cd ${.CURDIR} ; \ + if [ -d .svn ] ; then \ + echo "--------------------------------------------------------------" ; \ + echo ">>> Updating ${.CURDIR} using Subversion" ; \ + echo "--------------------------------------------------------------" ; \ + echo ${SVN} update ${SVNFLAGS} ; \ + ${SVN} update ${SVNFLAGS} ; \ + fi +.endif + +# +# ------------------------------------------------------------------------ +# +# From here onwards are utility targets used by the 'make world' and +# related targets. If your 'world' breaks, you may like to try to fix +# the problem and manually run the following targets to attempt to +# complete the build. Beware, this is *not* guaranteed to work, you +# need to have a pretty good grip on the current state of the system +# to attempt to manually finish it. If in doubt, 'make world' again. +# + +# +# legacy: Build compatibility shims for the next three targets +# +legacy: +.if ${BOOTSTRAPPING} < 600034 && ${BOOTSTRAPPING} != 0 + @echo "ERROR: Source upgrades from versions prior to 6.0 not supported."; \ + false +.endif +.for _tool in tools/build + ${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,depend,all,install)"; \ + cd ${.CURDIR}/${_tool}; \ + ${MAKE} DIRPRFX=${_tool}/ obj; \ + ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy includes; \ + ${MAKE} DIRPRFX=${_tool}/ depend; \ + ${MAKE} DIRPRFX=${_tool}/ all; \ + ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install +.endfor + +# +# bootstrap-tools: Build tools needed for compatibility +# +.if ${MK_GAMES} != "no" +_strfile= games/fortune/strfile +.endif + +.if ${MK_CXX} != "no" +_gperf= gnu/usr.bin/gperf +.endif + +.if ${MK_GROFF} != "no" +_groff= gnu/usr.bin/groff +.endif + +.if ${BOOTSTRAPPING} >= 700044 && ${BOOTSTRAPPING} < 800022 +_ar= usr.bin/ar +.endif + +.if ${BOOTSTRAPPING} < 800013 +_mklocale= usr.bin/mklocale +.endif + +.if ${BOOTSTRAPPING} < 900002 +_sed= usr.bin/sed +.endif + +.if ${BOOTSTRAPPING} < 900006 +_lex= usr.bin/lex +_yacc= usr.bin/yacc +.endif + +.if ${BOOTSTRAPPING} >= 900040 && ${BOOTSTRAPPING} < 900041 +_awk= usr.bin/awk +.endif + +.if ${MK_BSNMP} != "no" && \ + (${BOOTSTRAPPING} < 700018 || !exists(/usr/sbin/gensnmptree)) +_gensnmptree= usr.sbin/bsnmpd/gensnmptree +.endif + +.if ${MK_RESCUE} != "no" && \ + ${BOOTSTRAPPING} < 700026 +_crunchgen= usr.sbin/crunch/crunchgen +.endif + +.if ${MK_CLANG} != "no" +_clang_tblgen= \ + lib/clang/libllvmsupport \ + lib/clang/libllvmtablegen \ + usr.bin/clang/tblgen \ + usr.bin/clang/clang-tblgen +.endif + +.if ${MK_CDDL} != "no" && \ + ${BOOTSTRAPPING} < 800038 && \ + !(${BOOTSTRAPPING} >= 700112 && ${BOOTSTRAPPING} < 799999) +_dtrace_tools= cddl/usr.bin/sgsmsg cddl/lib/libctf lib/libelf \ + lib/libdwarf cddl/usr.bin/ctfconvert cddl/usr.bin/ctfmerge +.endif + +.if ${MK_FDT} != "no" +_dtc= gnu/usr.bin/dtc +.endif + +.if ${MK_KERBEROS} != "no" +_kerberos5_bootstrap_tools= \ + kerberos5/tools/make-roken \ + kerberos5/lib/libroken \ + kerberos5/lib/libvers \ + kerberos5/tools/asn1_compile \ + kerberos5/tools/slc +.endif + +# Please document (add comment) why something is in 'bootstrap-tools'. +# Try to bound the building of the bootstrap-tool to just the +# FreeBSD versions that need the tool built at this stage of the build. +bootstrap-tools: +.for _tool in \ + ${_clang_tblgen} \ + ${_kerberos5_bootstrap_tools} \ + ${_dtrace_tools} \ + ${_strfile} \ + ${_gperf} \ + ${_groff} \ + ${_ar} \ + ${_dtc} \ + ${_awk} \ + usr.bin/lorder \ + usr.bin/makewhatis \ + ${_mklocale} \ + usr.bin/rpcgen \ + ${_sed} \ + ${_lex} \ + ${_yacc} \ + usr.bin/xinstall \ + ${_gensnmptree} \ + usr.sbin/config \ + ${_crunchgen} + ${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \ + cd ${.CURDIR}/${_tool}; \ + ${MAKE} DIRPRFX=${_tool}/ obj; \ + ${MAKE} DIRPRFX=${_tool}/ depend; \ + ${MAKE} DIRPRFX=${_tool}/ all; \ + ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install +.endfor + +# +# build-tools: Build special purpose build tools +# +.if defined(MODULES_WITH_WORLD) && exists(${KERNSRCDIR}/modules) +_aicasm= sys/modules/aic7xxx/aicasm +.endif + +.if !defined(NO_SHARE) +_share= share/syscons/scrnmaps +.endif + +.if ${MK_GCC} != "no" && ${MK_CLANG_IS_CC} == "no" +_gcc_tools= gnu/usr.bin/cc/cc_tools +.endif + +.if ${MK_RESCUE} != "no" +_rescue= rescue/rescue +.endif + +build-tools: +.for _tool in \ + bin/csh \ + bin/sh \ + ${_rescue} \ + ${LOCAL_TOOL_DIRS} \ + lib/ncurses/ncurses \ + lib/ncurses/ncursesw \ + ${_share} \ + ${_aicasm} \ + usr.bin/awk \ + lib/libmagic \ + usr.bin/mkesdb_static \ + usr.bin/mkcsmapper_static + ${_+_}@${ECHODIR} "===> ${_tool} (obj,build-tools)"; \ + cd ${.CURDIR}/${_tool}; \ + ${MAKE} DIRPRFX=${_tool}/ obj; \ + ${MAKE} DIRPRFX=${_tool}/ build-tools +.endfor +.for _tool in \ + ${_gcc_tools} + ${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all)"; \ + cd ${.CURDIR}/${_tool}; \ + ${MAKE} DIRPRFX=${_tool}/ obj; \ + ${MAKE} DIRPRFX=${_tool}/ depend; \ + ${MAKE} DIRPRFX=${_tool}/ all +.endfor + +# +# cross-tools: Build cross-building tools +# +.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${BOOTSTRAPPING} < 800035 +.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" +_btxld= usr.sbin/btxld +.endif +.endif +.if ${TARGET_ARCH} != ${MACHINE_ARCH} +.if ${MK_RESCUE} != "no" || defined(RELEASEDIR) +_crunchide= usr.sbin/crunch/crunchide +.endif +.if ${TARGET_ARCH} == "i386" && defined(RELEASEDIR) +_kgzip= usr.sbin/kgzip +.endif +.endif + +.if ${MK_BINUTILS} != "no" +_binutils= gnu/usr.bin/binutils +.endif + +.if ${MK_CLANG} != "no" && (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang") +_clang= usr.bin/clang +_clang_libs= lib/clang +.endif + +.if ${MK_GCC} != "no" && ${MK_CLANG_IS_CC} == "no" +_cc= gnu/usr.bin/cc +.endif + +cross-tools: +.for _tool in \ + ${_clang_libs} \ + ${_clang} \ + ${_binutils} \ + ${_cc} \ + usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \ + ${_btxld} \ + ${_crunchide} \ + ${_kgzip} + ${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \ + cd ${.CURDIR}/${_tool}; \ + ${MAKE} DIRPRFX=${_tool}/ obj; \ + ${MAKE} DIRPRFX=${_tool}/ depend; \ + ${MAKE} DIRPRFX=${_tool}/ all; \ + ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install +.endfor + +# +# hierarchy - ensure that all the needed directories are present +# +hierarchy: + cd ${.CURDIR}/etc; ${MAKE} distrib-dirs + +# +# libraries - build all libraries, and install them under ${DESTDIR}. +# +# The list of libraries with dependents (${_prebuild_libs}) and their +# interdependencies (__L) are built automatically by the +# ${.CURDIR}/tools/make_libdeps.sh script. +# +libraries: + cd ${.CURDIR}; \ + ${MAKE} -f Makefile.inc1 _prereq_libs; \ + ${MAKE} -f Makefile.inc1 _startup_libs; \ + ${MAKE} -f Makefile.inc1 _prebuild_libs; \ + ${MAKE} -f Makefile.inc1 _generic_libs; + +# +# static libgcc.a prerequisite for shared libc +# +_prereq_libs= gnu/lib/libssp/libssp_nonshared gnu/lib/libgcc lib/libcompiler_rt + +# These dependencies are not automatically generated: +# +# gnu/lib/csu, gnu/lib/libgcc, lib/csu and lib/libc must be built before +# all shared libraries for ELF. +# +_startup_libs= gnu/lib/csu +.if exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}-elf) +_startup_libs+= lib/csu/${MACHINE_ARCH}-elf +.elif exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}) +_startup_libs+= lib/csu/${MACHINE_ARCH} +.else +_startup_libs+= lib/csu/${MACHINE_CPUARCH} +.endif +_startup_libs+= gnu/lib/libgcc +_startup_libs+= lib/libcompiler_rt +_startup_libs+= lib/libc +.if ${MK_LIBCPLUSPLUS} != "no" +_startup_libs+= lib/libcxxrt +.endif + +gnu/lib/libgcc__L: lib/libc__L +.if ${MK_LIBCPLUSPLUS} != "no" +lib/libcxxrt__L: gnu/lib/libgcc__L +.endif + +_prebuild_libs= ${_kerberos5_lib_libasn1} \ + ${_kerberos5_lib_libhdb} \ + ${_kerberos5_lib_libheimbase} \ + ${_kerberos5_lib_libheimntlm} \ + ${_kerberos5_lib_libheimsqlite} \ + ${_kerberos5_lib_libheimipcc} \ + ${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \ + ${_kerberos5_lib_libroken} \ + ${_kerberos5_lib_libwind} \ + lib/libbz2 lib/libcom_err lib/libcrypt \ + lib/libexpat \ + ${_lib_libgssapi} ${_lib_libipx} \ + lib/libkiconv lib/libkvm lib/liblzma lib/libmd \ + lib/ncurses/ncurses lib/ncurses/ncursesw \ + lib/libopie lib/libpam ${_lib_libthr} \ + lib/libradius lib/libsbuf lib/libtacplus \ + ${_cddl_lib_libumem} \ + lib/libutil ${_lib_libypclnt} lib/libz lib/msun \ + ${_secure_lib_libcrypto} ${_secure_lib_libssh} \ + ${_secure_lib_libssl} + +.if ${MK_LIBTHR} != "no" +_lib_libthr= lib/libthr +.endif + +.if ${MK_OFED} != "no" +_ofed_lib= contrib/ofed/usr.lib/ +.endif + +_generic_libs= ${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib} usr.bin/lex/lib ${_ofed_lib} + +lib/libopie__L lib/libtacplus__L: lib/libmd__L + +.if ${MK_CDDL} != "no" +_cddl_lib_libumem= cddl/lib/libumem +_cddl_lib= cddl/lib +.endif + +.if ${MK_CRYPT} != "no" +.if ${MK_OPENSSL} != "no" +_secure_lib_libcrypto= secure/lib/libcrypto +_secure_lib_libssl= secure/lib/libssl +lib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L +.if ${MK_OPENSSH} != "no" +_secure_lib_libssh= secure/lib/libssh +secure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L +.if ${MK_KERBEROS_SUPPORT} != "no" +secure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \ + kerberos5/lib/libhx509__L kerberos5/lib/libasn1__L lib/libcom_err__L \ + lib/libmd__L kerberos5/lib/libroken__L +.endif +.endif +.endif +_secure_lib= secure/lib +.endif + +.if ${MK_KERBEROS} != "no" +kerberos5/lib/libasn1__L: lib/libcom_err__L kerberos5/lib/libroken__L +kerberos5/lib/libhdb__L: kerberos5/lib/libasn1__L lib/libcom_err__L \ + kerberos5/lib/libkrb5__L kerberos5/lib/libroken__L \ + kerberos5/lib/libwind__L kerberos5/lib/libheimsqlite__L +kerberos5/lib/libheimntlm__L: secure/lib/libcrypto__L kerberos5/lib/libkrb5__L \ + kerberos5/lib/libroken__L lib/libcom_err__L +kerberos5/lib/libhx509__L: kerberos5/lib/libasn1__L lib/libcom_err__L \ + secure/lib/libcrypto__L kerberos5/lib/libroken__L kerberos5/lib/libwind__L +kerberos5/lib/libkrb5__L: kerberos5/lib/libasn1__L lib/libcom_err__L \ + lib/libcrypt__L secure/lib/libcrypto__L kerberos5/lib/libhx509__L \ + kerberos5/lib/libroken__L kerberos5/lib/libwind__L \ + kerberos5/lib/libheimbase__L kerberos5/lib/libheimipcc__L +kerberos5/lib/libroken__L: lib/libcrypt__L +kerberos5/lib/libwind__L: kerberos5/lib/libroken__L lib/libcom_err__L +kerberos5/lib/libheimbase__L: lib/libthr__L +kerberos5/lib/libheimipcc__L: kerberos5/lib/libroken__L kerberos5/lib/libheimbase__L lib/libthr__L +kerberos5/lib/libheimsqlite__L: lib/libthr__L +.endif + +.if ${MK_GSSAPI} != "no" +_lib_libgssapi= lib/libgssapi +.endif + +.if ${MK_IPX} != "no" +_lib_libipx= lib/libipx +.endif + +.if ${MK_KERBEROS} != "no" +_kerberos5_lib= kerberos5/lib +_kerberos5_lib_libasn1= kerberos5/lib/libasn1 +_kerberos5_lib_libhdb= kerberos5/lib/libhdb +_kerberos5_lib_libheimbase= kerberos5/lib/libheimbase +_kerberos5_lib_libkrb5= kerberos5/lib/libkrb5 +_kerberos5_lib_libhx509= kerberos5/lib/libhx509 +_kerberos5_lib_libroken= kerberos5/lib/libroken +_kerberos5_lib_libheimntlm= kerberos5/lib/libheimntlm +_kerberos5_lib_libheimsqlite= kerberos5/lib/libheimsqlite +_kerberos5_lib_libheimipcc= kerberos5/lib/libheimipcc +_kerberos5_lib_libwind= kerberos5/lib/libwind +.endif + +.if ${MK_NIS} != "no" +_lib_libypclnt= lib/libypclnt +.endif + +.if ${MK_OPENSSL} == "no" +lib/libradius__L: lib/libmd__L +.endif + +.for _lib in ${_prereq_libs} +${_lib}__PL: .PHONY +.if exists(${.CURDIR}/${_lib}) + ${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \ + cd ${.CURDIR}/${_lib}; \ + ${MAKE} DIRPRFX=${_lib}/ obj; \ + ${MAKE} DIRPRFX=${_lib}/ depend; \ + ${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ all; \ + ${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ install +.endif +.endfor + +.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs} +${_lib}__L: .PHONY +.if exists(${.CURDIR}/${_lib}) + ${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \ + cd ${.CURDIR}/${_lib}; \ + ${MAKE} DIRPRFX=${_lib}/ obj; \ + ${MAKE} DIRPRFX=${_lib}/ depend; \ + ${MAKE} DIRPRFX=${_lib}/ all; \ + ${MAKE} DIRPRFX=${_lib}/ install +.endif +.endfor + +# libpam is special: we need to build static PAM modules before +# static PAM library, and dynamic PAM library before dynamic PAM +# modules. +lib/libpam__L: .PHONY + ${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \ + cd ${.CURDIR}/lib/libpam; \ + ${MAKE} DIRPRFX=lib/libpam/ obj; \ + ${MAKE} DIRPRFX=lib/libpam/ depend; \ + ${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all; \ + ${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install + +_prereq_libs: ${_prereq_libs:S/$/__PL/} +_startup_libs: ${_startup_libs:S/$/__L/} +_prebuild_libs: ${_prebuild_libs:S/$/__L/} +_generic_libs: ${_generic_libs:S/$/__L/} + +.for __target in all clean cleandepend cleandir depend includes obj +.for entry in ${SUBDIR} +${entry}.${__target}__D: .PHONY + ${_+_}@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \ + ${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH} (${__target})"; \ + edir=${entry}.${MACHINE_ARCH}; \ + cd ${.CURDIR}/$${edir}; \ + else \ + ${ECHODIR} "===> ${DIRPRFX}${entry} (${__target})"; \ + edir=${entry}; \ + cd ${.CURDIR}/$${edir}; \ + fi; \ + ${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/ +.endfor +par-${__target}: ${SUBDIR:S/$/.${__target}__D/} +.endfor + +.include <bsd.subdir.mk> + +.if make(check-old) || make(check-old-dirs) || \ + make(check-old-files) || make(check-old-libs) || \ + make(delete-old) || make(delete-old-dirs) || \ + make(delete-old-files) || make(delete-old-libs) + +# +# check for / delete old files section +# + +.include "ObsoleteFiles.inc" + +OLD_LIBS_MESSAGE="Please be sure no application still uses those libraries, \ +else you can not start such an application. Consult UPDATING for more \ +information regarding how to cope with the removal/revision bump of a \ +specific library." + +.if !defined(BATCH_DELETE_OLD_FILES) +RM_I=-i +.else +RM_I=-v +.endif + +delete-old-files: + @echo ">>> Removing old files (only deletes safe to delete libs)" +# Ask for every old file if the user really wants to remove it. +# It's annoying, but better safe than sorry. +# NB: We cannot pass the list of OLD_FILES as a parameter because the +# argument list will get too long. Using .for/.endfor make "loops" will make +# the Makefile parser segfault. + @exec 3<&0; \ + ${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \ + while read file; do \ + if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \ + chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \ + rm ${RM_I} "${DESTDIR}/$${file}" <&3; \ + fi; \ + done +# Remove catpages without corresponding manpages. + @exec 3<&0; \ + find ${DESTDIR}/usr/share/man/cat* ! -type d | \ + sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \ + while read catpage; do \ + read manpage; \ + if [ ! -e "$${manpage}" ]; then \ + rm ${RM_I} $${catpage} <&3; \ + fi; \ + done + @echo ">>> Old files removed" + +check-old-files: + @echo ">>> Checking for old files" + @${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \ + while read file; do \ + if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \ + echo "${DESTDIR}/$${file}"; \ + fi; \ + done +# Check for catpages without corresponding manpages. + @find ${DESTDIR}/usr/share/man/cat* ! -type d | \ + sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \ + while read catpage; do \ + read manpage; \ + if [ ! -e "$${manpage}" ]; then \ + echo $${catpage}; \ + fi; \ + done + +delete-old-libs: + @echo ">>> Removing old libraries" + @echo "${OLD_LIBS_MESSAGE}" | fmt + @exec 3<&0; \ + ${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_LIBS | xargs -n1 | \ + while read file; do \ + if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \ + chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \ + rm ${RM_I} "${DESTDIR}/$${file}" <&3; \ + fi; \ + done + @echo ">>> Old libraries removed" + +check-old-libs: + @echo ">>> Checking for old libraries" + @${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_LIBS | xargs -n1 | \ + while read file; do \ + if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \ + echo "${DESTDIR}/$${file}"; \ + fi; \ + done + +delete-old-dirs: + @echo ">>> Removing old directories" + @${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_DIRS | xargs -n1 | \ + while read dir; do \ + if [ -d "${DESTDIR}/$${dir}" ]; then \ + rmdir -v "${DESTDIR}/$${dir}" || true; \ + elif [ -L "${DESTDIR}/$${dir}" ]; then \ + echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \ + fi; \ + done + @echo ">>> Old directories removed" + +check-old-dirs: + @echo ">>> Checking for old directories" + @${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \ + -V OLD_DIRS | xargs -n1 | \ + while read dir; do \ + if [ -d "${DESTDIR}/$${dir}" ]; then \ + echo "${DESTDIR}/$${dir}"; \ + elif [ -L "${DESTDIR}/$${dir}" ]; then \ + echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \ + fi; \ + done + +delete-old: delete-old-files delete-old-dirs + @echo "To remove old libraries run '${MAKE} delete-old-libs'." + +check-old: check-old-files check-old-libs check-old-dirs + @echo "To remove old files and directories run '${MAKE} delete-old'." + @echo "To remove old libraries run '${MAKE} delete-old-libs'." + +.endif + +# +# showconfig - show build configuration. +# +showconfig: + @${MAKE} -n -f bsd.own.mk -V dummy -dg1 | grep ^MK_ | sort + +.if !empty(KRNLOBJDIR) && !empty(KERNCONF) +DTBOUTPUTPATH= ${KRNLOBJDIR}/${KERNCONF}/ + +.if !defined(FDT_DTS_FILE) || empty(FDT_DTS_FILE) +.if exists(${KERNCONFDIR}/${KERNCONF}) +FDT_DTS_FILE!= awk 'BEGIN {FS="="} /^makeoptions[[:space:]]+FDT_DTS_FILE/ {print $$2}' \ + ${KERNCONFDIR}/${KERNCONF} +.endif +.endif + +.endif + +.if !defined(DTBOUTPUTPATH) || !exists(${DTBOUTPUTPATH}) +DTBOUTPUTPATH= ${.CURDIR} +.endif + +# +# Build 'standalone' Device Tree Blob +# +builddtb: + @if [ "${FDT_DTS_FILE}" = "" ]; then \ + echo "ERROR: FDT_DTS_FILE must be specified!"; \ + exit 1; \ + fi; \ + if [ ! -f ${.CURDIR}/sys/boot/fdt/dts/${FDT_DTS_FILE} ]; then \ + echo "ERROR: Specified DTS file (${FDT_DTS_FILE}) does not \ + exist!"; \ + exit 1; \ + fi; \ + if [ "${DTBOUTPUTPATH}" = "${.CURDIR}" ]; then \ + echo "WARNING: DTB will be placed in the current working \ + directory"; \ + fi + @PATH=${TMPPATH} \ + dtc -O dtb -o \ + ${DTBOUTPUTPATH}/`echo ${FDT_DTS_FILE} | cut -d. -f1`.dtb -b 0 \ + -p 1024 ${.CURDIR}/sys/boot/fdt/dts/${FDT_DTS_FILE} + +############### + +.if defined(XDEV) && defined(XDEV_ARCH) + +.if ${XDEV} == ${MACHINE} && ${XDEV_ARCH} == ${MACHINE_ARCH} +XDEV_CPUTYPE?=${CPUTYPE} +.else +XDEV_CPUTYPE?=${TARGET_CPUTYPE} +.endif + +NOFUN=-DNO_FSCHG -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT \ + -DWITHOUT_MAN -DWITHOUT_NLS -DNO_PROFILE \ + -DWITHOUT_KERBEROS -DWITHOUT_RESCUE -DNO_WARNS \ + TARGET=${XDEV} TARGET_ARCH=${XDEV_ARCH} \ + CPUTYPE=${XDEV_CPUTYPE} + +XDDIR=${XDEV_ARCH}-freebsd +XDTP=/usr/${XDDIR} +CDBENV=MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/${XDDIR} +CDENV= ${CDBENV} \ + _SHLIBDIRPREFIX=${XDTP} \ + TOOLS_PREFIX=${XDTP} +CD2ENV=${CDENV} \ + MACHINE=${XDEV} MACHINE_ARCH=${XDEV_ARCH} + +CDTMP= ${MAKEOBJDIRPREFIX}/${XDEV}/${.CURDIR}/tmp +CDMAKE=${CDENV} ${MAKE} ${NOFUN} +CD2MAKE=${CD2ENV} PATH=${CDTMP}/usr/bin:${XDTP}/usr/bin:${PATH} ${MAKE} ${NOFUN} +XDDESTDIR=${DESTDIR}${XDTP} +.if !defined(OSREL) +OSREL!= uname -r | sed -e 's/[-(].*//' +.endif + +.ORDER: xdev-build xdev-install +xdev: xdev-build xdev-install + +.ORDER: _xb-build-tools _xb-cross-tools +xdev-build: _xb-build-tools _xb-cross-tools + +_xb-build-tools: + ${_+_}@cd ${.CURDIR}; \ + ${CDBENV} ${MAKE} -f Makefile.inc1 ${NOFUN} build-tools + +_xb-cross-tools: +.for _tool in \ + gnu/usr.bin/binutils \ + gnu/usr.bin/cc \ + usr.bin/ar + ${_+_}@${ECHODIR} "===> xdev ${_tool} (obj,depend,all)"; \ + cd ${.CURDIR}/${_tool}; \ + ${CDMAKE} DIRPRFX=${_tool}/ obj; \ + ${CDMAKE} DIRPRFX=${_tool}/ depend; \ + ${CDMAKE} DIRPRFX=${_tool}/ all +.endfor + +_xi-mtree: + ${_+_}@${ECHODIR} "mtree populating ${XDDESTDIR}" + mkdir -p ${XDDESTDIR} + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.root.dist \ + -p ${XDDESTDIR} >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \ + -p ${XDDESTDIR}/usr >/dev/null + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${XDDESTDIR}/usr/include >/dev/null + +.ORDER: _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links +xdev-install: _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links + +_xi-cross-tools: + @echo "_xi-cross-tools" +.for _tool in \ + gnu/usr.bin/binutils \ + gnu/usr.bin/cc \ + usr.bin/ar + ${_+_}@${ECHODIR} "===> xdev ${_tool} (install)"; \ + cd ${.CURDIR}/${_tool}; \ + ${CDMAKE} DIRPRFX=${_tool}/ install DESTDIR=${XDDESTDIR} +.endfor + +_xi-includes: + ${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 par-includes \ + DESTDIR=${XDDESTDIR} + +_xi-libraries: + ${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \ + DESTDIR=${XDDESTDIR} + +_xi-links: + ${_+_}cd ${XDDESTDIR}/usr/bin; \ + for i in *; do \ + ln -sf ../../${XDTP}/usr/bin/$$i \ + ../../../../usr/bin/${XDDIR}-$$i; \ + ln -sf ../../${XDTP}/usr/bin/$$i \ + ../../../../usr/bin/${XDDIR}${OSREL}-$$i; \ + done +.else +xdev xdev-buil xdev-install: + @echo "*** Error: Both XDEV and XDEV_ARCH must be defined for \"${.TARGET}\" target" +.endif |