9160419c7a
ccache is mostly beneficial for frequent builds where -DNO_CLEAN is not used to achieve a safe pseudo-incremental build. This is explained in more detail upstream [1] [2]. It incurs about a 20%-28% hit to populate the cache, but with a full cache saves 30-50% in build times. When combined with the WITH_FAST_DEPEND feature it saves up to 65% since ccache does cache the resulting dependency file, which it does not do when using mkdep(1)/'CC -E'. Stats are provided at the end of this message. This removes the need to modify /etc/make.conf with the CC:= and CXX:= lines which conflicted with external compiler support [3] (causing the bootstrap compiler to not be built which lead to obscure failures [4]), incorrectly invoked ccache in various stages, required CCACHE_CPP2 to avoid Clang errors with parenthesis, and did not work with META_MODE. The option name was picked to match the existing option in ports. This feature is available for both in-src and out-of-src builds that use /usr/share/mk. Linking, assembly compiles, and pre-processing avoid using ccache since it is only overhead. ccache does nothing special in these modes, although there is no harm in calling it for them. CCACHE_COMPILERCHECK is set to 'content' when using the in-tree bootstrap compiler to hash the content of the compiler binary to determine if it should be a cache miss. For external compilers the 'mtime' option is used as it is more efficient and likely to be correct. Future work may optimize the 'content' check using the same checks as whether a bootstrap compiler is needed to be built. The CCACHE_CPP2 pessimization is currently default in our devel/ccache port due to Clang requiring it. Clang's -Wparentheses-equality, -Wtautological-compare, and -Wself-assign warnings do not mix well with compiling already-pre-processed code that may have expanded macros that trigger the warnings. GCC has so far not had this issue so it is allowed to disable the CCACHE_CPP2 default in our port. Sharing a cache between multiple checkouts, or systems, is explained in the ccache manual. Sharing a cache over NFS would likely not be worth it, but syncing cache directories between systems may be useful for an organization. There is also a memcached backend available [5]. Due to using an object directory outside of the source directory though you will need to ensure that both are in the same prefix and all users use the same layout. A possible working layout is as follows: Source: /some/prefix/src1 Source: /some/prefix/src2 Source: /some/prefix/src3 Objdir: /some/prefix/obj Environment: CCACHE_BASEDIR='${SRCTOP:H}' MAKEOBJDIRPREFIX='${SRCTOP:H}/obj' This will use src*/../obj as the MAKEOBJDIRPREFIX and tells ccache to replace all absolute paths to be relative. Using something like this is required due to -I and -o flags containing both SRC and OBJDIR absolute paths that ccache adds into its hash for the object without CCACHE_BASEDIR. distcc can be hooked into by setting CCACHE_PREFIX=/usr/local/bin/distcc. I have not personally tested this and assume it will not mix well with using the bootstrap compiler. The cache from buildworld can be reused in a subdir by first running 'make buildenv' (from r290424). Note that the cache is currently different depending on whether -j is used or not due to ccache enabling -fdiagnostics-color automatically if stderr is a TTY, which bmake only does if not using -j. The system I used for testing was: WITNESS Build options: -j20 WITH_LLDB=yes WITH_DEBUG_FILES=yes WITH_CCACHE_BUILD=yes DISK: ZFS 3-way mirror with very slow disks using SSD l2arc/log. The arc was fully populated with src tree files and ccache objects. RAM: 76GiB CPU: Intel(R) Xeon(R) CPU L5520 @2.27GHz 2 package(s) x 4 core(s) x 2 SMT threads = hw.ncpu=16 The WITH_FAST_DEPEND feature was used for comparison here as well to show the dramatic time savings with a full cache. buildworld: x buildworld-before + buildworld-ccache-empty * buildworld-ccache-full % buildworld-ccache-full-fastdep # buildworld-fastdep +-------------------------------------------------------------------------------+ |% * # +| |% * # +| |% * # xxx +| | |A | | A| | A | |A | | A | +-------------------------------------------------------------------------------+ N Min Max Median Avg Stddev x 3 3744.13 3794.31 3752.25 3763.5633 26.935139 + 3 4519 4525.04 4520.73 4521.59 3.1104823 Difference at 95.0% confidence 758.027 +/- 43.4565 20.1412% +/- 1.15466% (Student's t, pooled s = 19.1726) * 3 1823.08 1827.2 1825.62 1825.3 2.0785572 Difference at 95.0% confidence -1938.26 +/- 43.298 -51.5007% +/- 1.15045% (Student's t, pooled s = 19.1026) % 3 1266.96 1279.37 1270.47 1272.2667 6.3971113 Difference at 95.0% confidence -2491.3 +/- 44.3704 -66.1952% +/- 1.17895% (Student's t, pooled s = 19.5758) # 3 3153.34 3155.16 3154.2 3154.2333 0.91045776 Difference at 95.0% confidence -609.33 +/- 43.1943 -16.1902% +/- 1.1477% (Student's t, pooled s = 19.0569) buildkernel: x buildkernel-before + buildkernel-ccache-empty * buildkernel-ccache-empty-fastdep % buildkernel-ccache-full # buildkernel-ccache-full-fastdep @ buildkernel-fastdep +-------------------------------------------------------------------------------+ |# @ % * | |# @ % * x + | |# @ % * xx ++| | MA | | MA| | A | | A | |A | | A | +-------------------------------------------------------------------------------+ N Min Max Median Avg Stddev x 3 571.57 573.94 571.79 572.43333 1.3094401 + 3 727.97 731.91 728.06 729.31333 2.2492295 Difference at 95.0% confidence 156.88 +/- 4.17129 27.4058% +/- 0.728695% (Student's t, pooled s = 1.84034) * 3 527.1 528.29 528.08 527.82333 0.63516402 Difference at 95.0% confidence -44.61 +/- 2.33254 -7.79305% +/- 0.407478% (Student's t, pooled s = 1.02909) % 3 400.4 401.05 400.62 400.69 0.3306055 Difference at 95.0% confidence -171.743 +/- 2.16453 -30.0023% +/- 0.378128% (Student's t, pooled s = 0.954969) # 3 201.94 203.34 202.28 202.52 0.73020545 Difference at 95.0% confidence -369.913 +/- 2.40293 -64.6212% +/- 0.419774% (Student's t, pooled s = 1.06015) @ 3 369.12 370.57 369.3 369.66333 0.79033748 Difference at 95.0% confidence -202.77 +/- 2.45131 -35.4225% +/- 0.428227% (Student's t, pooled s = 1.0815) [1] https://ccache.samba.org/performance.html [2] http://www.mail-archive.com/ccache@lists.samba.org/msg00576.html [3] https://reviews.freebsd.org/D3484 [5] https://github.com/jrosdahl/ccache/pull/30 PR: 182944 [4] MFC after: 3 weeks Sponsored by: EMC / Isilon Storage Division Relnotes: yes
2348 lines
73 KiB
Makefile
2348 lines
73 KiB
Makefile
#
|
|
# $FreeBSD$
|
|
#
|
|
# Make command line options:
|
|
# -DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
|
|
# -DNO_CLEAN do not clean at all
|
|
# -DDB_FROM_SRC use the user/group databases in src/etc instead of
|
|
# the system database when installing.
|
|
# -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_ROOT install without using root privilege
|
|
# -DNO_DOCUPDATE do not update doc in ${MAKE} update
|
|
# -DWITHOUT_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_ITOOLS="list of tools" to add additional tools to the ITOOLS list
|
|
# LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
|
|
# LOCAL_MTREE="list of mtree files" to process to allow local directories
|
|
# to be created before files are installed
|
|
# LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools
|
|
# list
|
|
# METALOG="path to metadata log" to write permission and ownership
|
|
# when NO_ROOT is set. (default: ${DESTDIR}/METALOG)
|
|
# 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:${SHELL})
|
|
# WORLD_FLAGS= additional flags to pass to make(1) during buildworld
|
|
# KERNEL_FLAGS= additional flags to pass to make(1) during buildkernel
|
|
# SUBDIR_OVERRIDE="list of dirs" to build rather than everything.
|
|
# All libraries and includes, and some build tools will still build.
|
|
|
|
#
|
|
# 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: svn/svnup)
|
|
#
|
|
# Standard targets (not defined here) are documented in the makefiles in
|
|
# /usr/share/mk. These include:
|
|
# obj depend all install clean cleandepend cleanobj
|
|
|
|
.if !defined(TARGET) || !defined(TARGET_ARCH)
|
|
.error "Both TARGET and TARGET_ARCH must be defined."
|
|
.endif
|
|
|
|
# Cross toolchain changes must be in effect before bsd.compiler.mk
|
|
# so that gets the right CC, and pass CROSS_TOOLCHAIN to submakes.
|
|
.if defined(CROSS_TOOLCHAIN)
|
|
LOCALBASE?= /usr/local
|
|
.include "${LOCALBASE}/share/toolchains/${CROSS_TOOLCHAIN}.mk"
|
|
CROSSENV+=CROSS_TOOLCHAIN="${CROSS_TOOLCHAIN}"
|
|
.endif
|
|
.include <bsd.compiler.mk> # don't depend on src.opts.mk doing it
|
|
.include "share/mk/src.opts.mk"
|
|
|
|
# We must do lib/ and libexec/ before bin/ in case of a mid-install error to
|
|
# keep the users system reasonably usable. For static->dynamic root upgrades,
|
|
# we don't want to install a dynamic binary without rtld and the needed
|
|
# libraries. More commonly, for dynamic root, we don't want to install a
|
|
# binary that requires a newer library version that hasn't been installed yet.
|
|
# This ordering is not a guarantee though. The only guarantee of a working
|
|
# system here would require fine-grained ordering of all components based
|
|
# on their dependencies.
|
|
SRCDIR?= ${.CURDIR}
|
|
.if !empty(SUBDIR_OVERRIDE)
|
|
SUBDIR= ${SUBDIR_OVERRIDE}
|
|
.else
|
|
SUBDIR= lib libexec
|
|
.if make(install*)
|
|
# Ensure libraries are installed before progressing.
|
|
SUBDIR+=.WAIT
|
|
.endif
|
|
SUBDIR+=bin
|
|
.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_TESTS} != "no"
|
|
SUBDIR+= tests
|
|
.endif
|
|
.if ${MK_OFED} != "no"
|
|
SUBDIR+=contrib/ofed
|
|
.endif
|
|
|
|
# Local directories 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
|
|
# Add LOCAL_LIB_DIRS, but only if they will not be picked up as a SUBDIR
|
|
# of a LOCAL_DIRS directory. This allows LOCAL_DIRS=foo and
|
|
# LOCAL_LIB_DIRS=foo/lib to behave as expected.
|
|
.for _DIR in ${LOCAL_DIRS:M*/} ${LOCAL_DIRS:N*/:S|$|/|}
|
|
_REDUNDENT_LIB_DIRS+= ${LOCAL_LIB_DIRS:M${_DIR}*}
|
|
.endfor
|
|
.for _DIR in ${LOCAL_LIB_DIRS}
|
|
.if empty(_REDUNDENT_LIB_DIRS:M${_DIR}) && exists(${.CURDIR}/${_DIR}/Makefile)
|
|
SUBDIR+= ${_DIR}
|
|
.else
|
|
.warning ${_DIR} not added to SUBDIR list. See UPDATING 20141121.
|
|
.endif
|
|
.endfor
|
|
|
|
# We must do etc/ last as it hooks into building the man whatis file
|
|
# by calling 'makedb' in share/man. This is only relevant for
|
|
# install/distribute so they build the whatis file after every manpage is
|
|
# installed.
|
|
.if make(install*)
|
|
SUBDIR+=.WAIT
|
|
.endif
|
|
SUBDIR+=etc
|
|
|
|
.endif # !empty(SUBDIR_OVERRIDE)
|
|
|
|
.if defined(NOCLEAN)
|
|
.warning NOCLEAN option is deprecated. Use NO_CLEAN instead.
|
|
NO_CLEAN= ${NOCLEAN}
|
|
.endif
|
|
.if defined(NO_CLEANDIR)
|
|
CLEANDIR= clean cleandepend
|
|
.else
|
|
CLEANDIR= cleandir
|
|
.endif
|
|
|
|
LOCAL_TOOL_DIRS?=
|
|
|
|
BUILDENV_SHELL?=${SHELL}
|
|
|
|
SVN?= /usr/local/bin/svn
|
|
SVNFLAGS?= -r HEAD
|
|
|
|
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
|
|
.export OSRELDATE
|
|
.endif
|
|
|
|
# Set VERSION for CTFMERGE to use via the default CTFFLAGS=-L VERSION.
|
|
.if !defined(VERSION)
|
|
REVISION!= ${MAKE} -C ${SRCDIR}/release -V REVISION
|
|
BRANCH!= ${MAKE} -C ${SRCDIR}/release -V BRANCH
|
|
SRCRELDATE!= awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
|
|
${SRCDIR}/sys/sys/param.h
|
|
VERSION= FreeBSD ${REVISION}-${BRANCH:C/-p[0-9]+$//} ${TARGET_ARCH} ${SRCRELDATE}
|
|
.export VERSION
|
|
.endif
|
|
|
|
KNOWN_ARCHES?= aarch64/arm64 amd64 arm armeb/arm armv6/arm armv6hf/arm i386 i386/pc98 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/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
|
|
BPATH= ${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin
|
|
XPATH= ${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin
|
|
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. These are generally
|
|
# APIs that tools from one of those three stages need to
|
|
# build that aren't present on the host.
|
|
# 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. Some programs are listed during
|
|
# this phase because they build binaries to generate
|
|
# files needed to build these programs. This stage also
|
|
# builds the 'build-tools' target rather than 'all'.
|
|
# 3. cross-tools stage [XMAKE]
|
|
# This stage is responsible for creating any tools that
|
|
# are needed for building the system. A cross-compiler is one
|
|
# of them. This differs from build tools in two ways:
|
|
# 1. the 'all' target is built rather than 'build-tools'
|
|
# 2. these tools are installed into TMPPATH for stage 4.
|
|
# 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 ${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
|
|
.if defined(TARGET_CFLAGS)
|
|
CROSSENV+= ${TARGET_CFLAGS}
|
|
.endif
|
|
|
|
# bootstrap-tools stage
|
|
BMAKEENV= INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
|
PATH=${BPATH}:${PATH} \
|
|
WORLDTMP=${WORLDTMP} \
|
|
MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
|
|
# need to keep this in sync with targets/pseudo/bootstrap-tools/Makefile
|
|
BSARGS= DESTDIR= \
|
|
BOOTSTRAPPING=${OSRELDATE} \
|
|
SSP_CFLAGS= \
|
|
MK_HTML=no NO_LINT=yes MK_MAN=no \
|
|
-DNO_PIC MK_PROFILE=no -DNO_SHARED \
|
|
-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
|
MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
|
|
MK_LLDB=no MK_TESTS=no \
|
|
MK_INCLUDES=yes
|
|
|
|
BMAKE= MAKEOBJDIRPREFIX=${WORLDTMP} \
|
|
${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
|
|
${BSARGS}
|
|
|
|
# build-tools stage
|
|
TMAKE= MAKEOBJDIRPREFIX=${OBJTREE} \
|
|
${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
|
|
TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
|
|
DESTDIR= \
|
|
BOOTSTRAPPING=${OSRELDATE} \
|
|
SSP_CFLAGS= \
|
|
-DNO_LINT \
|
|
-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
|
MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
|
|
MK_LLDB=no MK_TESTS=no
|
|
|
|
# cross-tools stage
|
|
XMAKE= TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \
|
|
TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
|
|
MK_GDB=no MK_TESTS=no
|
|
|
|
# kernel-tools stage
|
|
KTMAKEENV= INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
|
PATH=${BPATH}:${PATH} \
|
|
WORLDTMP=${WORLDTMP}
|
|
KTMAKE= TOOLS_PREFIX=${WORLDTMP} MAKEOBJDIRPREFIX=${WORLDTMP} \
|
|
${KTMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
|
|
DESTDIR= \
|
|
BOOTSTRAPPING=${OSRELDATE} \
|
|
SSP_CFLAGS= \
|
|
MK_HTML=no -DNO_LINT MK_MAN=no \
|
|
-DNO_PIC MK_PROFILE=no -DNO_SHARED \
|
|
-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no
|
|
|
|
# world stage
|
|
WMAKEENV= ${CROSSENV} \
|
|
_LDSCRIPTROOT= \
|
|
INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
|
PATH=${TMPPATH}
|
|
|
|
# make hierarchy
|
|
HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q}
|
|
.if defined(NO_ROOT)
|
|
HMAKE+= PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT
|
|
.endif
|
|
|
|
.if defined(CROSS_TOOLCHAIN_PREFIX)
|
|
CROSS_COMPILER_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
|
|
CROSS_BINUTILS_PREFIX?=${CROSS_TOOLCHAIN_PREFIX}
|
|
.endif
|
|
|
|
# If we do not have a bootstrap binutils (because the in-tree one does not
|
|
# support the target architecture), provide a default cross-binutils prefix.
|
|
# This allows aarch64 builds, for example, to automatically use the
|
|
# aarch64-binutils port or package.
|
|
.if !make(showconfig)
|
|
.if !empty(BROKEN_OPTIONS:MBINUTILS_BOOTSTRAP) && \
|
|
!defined(CROSS_BINUTILS_PREFIX)
|
|
CROSS_BINUTILS_PREFIX=/usr/local/${TARGET_ARCH}-freebsd/bin/
|
|
.if !exists(${CROSS_BINUTILS_PREFIX})
|
|
.error In-tree binutils does not support the ${TARGET_ARCH} architecture. Install the ${TARGET_ARCH}-binutils port or package or set CROSS_BINUTILS_PREFIX.
|
|
.endif
|
|
.endif
|
|
.endif
|
|
|
|
XCOMPILERS= CC CXX CPP
|
|
.for COMPILER in ${XCOMPILERS}
|
|
.if defined(CROSS_COMPILER_PREFIX)
|
|
X${COMPILER}?= ${CROSS_COMPILER_PREFIX}${${COMPILER}}
|
|
.else
|
|
X${COMPILER}?= ${${COMPILER}}
|
|
.endif
|
|
.endfor
|
|
XBINUTILS= AS AR LD NM OBJCOPY OBJDUMP RANLIB SIZE STRINGS
|
|
.for BINUTIL in ${XBINUTILS}
|
|
.if defined(CROSS_BINUTILS_PREFIX) && \
|
|
exists(${CROSS_BINUTILS_PREFIX}${${BINUTIL}})
|
|
X${BINUTIL}?= ${CROSS_BINUTILS_PREFIX}${${BINUTIL}}
|
|
.else
|
|
X${BINUTIL}?= ${${BINUTIL}}
|
|
.endif
|
|
.endfor
|
|
CROSSENV+= CC="${XCC} ${XCFLAGS}" CXX="${XCXX} ${XCFLAGS} ${XCXXFLAGS}" \
|
|
DEPFLAGS="${DEPFLAGS}" \
|
|
CPP="${XCPP} ${XCFLAGS}" \
|
|
AS="${XAS}" AR="${XAR}" LD="${XLD}" NM=${XNM} \
|
|
OBJDUMP=${XOBJDUMP} OBJCOPY="${XOBJCOPY}" \
|
|
RANLIB=${XRANLIB} STRINGS=${XSTRINGS} \
|
|
SIZE="${XSIZE}"
|
|
|
|
.if ${XCC:N${CCACHE_BIN}:M/*}
|
|
.if defined(CROSS_BINUTILS_PREFIX)
|
|
# In the case of xdev-build tools, CROSS_BINUTILS_PREFIX won't be a
|
|
# directory, but the compiler will look in the right place for it's
|
|
# tools so we don't need to tell it where to look.
|
|
.if exists(${CROSS_BINUTILS_PREFIX})
|
|
BFLAGS+= -B${CROSS_BINUTILS_PREFIX}
|
|
.endif
|
|
.else
|
|
BFLAGS+= -B${WORLDTMP}/usr/bin
|
|
.endif
|
|
.if ${TARGET} == "arm"
|
|
.if ${TARGET_ARCH:M*hf*} != ""
|
|
TARGET_ABI= gnueabihf
|
|
.else
|
|
TARGET_ABI= gnueabi
|
|
.endif
|
|
.endif
|
|
.if defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc
|
|
XCFLAGS+= -isystem ${WORLDTMP}/usr/include -L${WORLDTMP}/usr/lib
|
|
XCXXFLAGS+= -I${WORLDTMP}/usr/include/c++/v1 -std=gnu++11 -L${WORLDTMP}/../lib/libc++
|
|
# XXX: DEPFLAGS is a workaround for not properly passing CXXFLAGS to sub-makes
|
|
# due to CXX="${XCXX} ${XCXXFLAGS}". bsd.dep.mk does use CXXFLAGS when
|
|
# building C++ files so this can come out if passing CXXFLAGS down is fixed.
|
|
DEPFLAGS+= -I${WORLDTMP}/usr/include/c++/v1
|
|
.else
|
|
TARGET_ABI?= unknown
|
|
TARGET_TRIPLE?= ${TARGET_ARCH:C/amd64/x86_64/}-${TARGET_ABI}-freebsd11.0
|
|
XCFLAGS+= -target ${TARGET_TRIPLE}
|
|
.endif
|
|
XCFLAGS+= --sysroot=${WORLDTMP} ${BFLAGS}
|
|
XCXXFLAGS+= --sysroot=${WORLDTMP} ${BFLAGS}
|
|
.else
|
|
.if defined(CROSS_BINUTILS_PREFIX) && exists(${CROSS_BINUTILS_PREFIX})
|
|
BFLAGS+= -B${CROSS_BINUTILS_PREFIX}
|
|
XCFLAGS+= ${BFLAGS}
|
|
XCXXFLAGS+= ${BFLAGS}
|
|
.endif
|
|
.endif # ${XCC:M/*}
|
|
|
|
WMAKE= ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 DESTDIR=${WORLDTMP}
|
|
|
|
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64"
|
|
# 32 bit world
|
|
LIB32_OBJTREE= ${OBJTREE}${.CURDIR}/world32
|
|
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"
|
|
LIB32WMAKEFLAGS= \
|
|
AS="${XAS} --32" \
|
|
LD="${XLD} -m elf_i386_fbsd -Y P,${LIB32TMP}/usr/lib32" \
|
|
OBJCOPY="${XOBJCOPY}"
|
|
|
|
.elif ${TARGET_ARCH} == "powerpc64"
|
|
.if empty(TARGET_CPUTYPE)
|
|
LIB32CPUFLAGS= -mcpu=powerpc
|
|
.else
|
|
LIB32CPUFLAGS= -mcpu=${TARGET_CPUTYPE}
|
|
.endif
|
|
LIB32WMAKEENV= MACHINE=powerpc MACHINE_ARCH=powerpc
|
|
LIB32WMAKEFLAGS= \
|
|
LD="${XLD} -m elf32ppc_fbsd" \
|
|
OBJCOPY="${XOBJCOPY}"
|
|
.endif
|
|
|
|
|
|
LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \
|
|
-isystem ${LIB32TMP}/usr/include/ \
|
|
-L${LIB32TMP}/usr/lib32 \
|
|
-B${LIB32TMP}/usr/lib32
|
|
.if ${XCC:N${CCACHE_BIN}:M/*}
|
|
LIB32FLAGS+= --sysroot=${WORLDTMP}
|
|
.endif
|
|
|
|
# Yes, the flags are redundant.
|
|
LIB32WMAKEENV+= MAKEOBJDIRPREFIX=${LIB32_OBJTREE} \
|
|
_LDSCRIPTROOT=${LIB32TMP} \
|
|
INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
|
PATH=${TMPPATH} \
|
|
LIBDIR=/usr/lib32 \
|
|
SHLIBDIR=/usr/lib32 \
|
|
DTRACE="${DTRACE} -32"
|
|
LIB32WMAKEFLAGS+= CC="${XCC} ${LIB32FLAGS}" \
|
|
CXX="${XCXX} ${LIB32FLAGS}" \
|
|
DESTDIR=${LIB32TMP} \
|
|
-DCOMPAT_32BIT \
|
|
-DLIBRARIES_ONLY \
|
|
-DNO_CPU_CFLAGS \
|
|
MK_CTF=no \
|
|
-DNO_LINT \
|
|
MK_TESTS=no
|
|
|
|
LIB32WMAKE= ${LIB32WMAKEENV} ${MAKE} ${LIB32WMAKEFLAGS} \
|
|
MK_MAN=no MK_HTML=no
|
|
LIB32IMAKE= ${LIB32WMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} \
|
|
MK_TOOLCHAIN=no ${IMAKE_INSTALL}
|
|
.endif
|
|
|
|
IMAKEENV= ${CROSSENV:N_LDSCRIPTROOT=*}
|
|
IMAKE= ${IMAKEENV} ${MAKE} -f Makefile.inc1 \
|
|
${IMAKE_INSTALL} ${IMAKE_MTREE}
|
|
.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
|
|
.if defined(DB_FROM_SRC)
|
|
INSTALLFLAGS+= -N ${.CURDIR}/etc
|
|
MTREEFLAGS+= -N ${.CURDIR}/etc
|
|
.endif
|
|
_INSTALL_DDIR= ${DESTDIR}/${DISTDIR}
|
|
INSTALL_DDIR= ${_INSTALL_DDIR:S://:/:g:C:/$::}
|
|
.if defined(NO_ROOT)
|
|
METALOG?= ${DESTDIR}/${DISTDIR}/METALOG
|
|
IMAKE+= -DNO_ROOT METALOG=${METALOG}
|
|
INSTALLFLAGS+= -U -M ${METALOG} -D ${INSTALL_DDIR}
|
|
MTREEFLAGS+= -W
|
|
.endif
|
|
.if defined(DB_FROM_SRC) || defined(NO_ROOT)
|
|
IMAKE_INSTALL= INSTALL="install ${INSTALLFLAGS}"
|
|
IMAKE_MTREE= MTREE_CMD="mtree ${MTREEFLAGS}"
|
|
.endif
|
|
|
|
# kernel stage
|
|
KMAKEENV= ${WMAKEENV}
|
|
KMAKE= ${KMAKEENV} ${MAKE} ${.MAKEFLAGS} ${KERNEL_FLAGS} KERNEL=${INSTKERNNAME}
|
|
|
|
#
|
|
# buildworld
|
|
#
|
|
# Attempt to rebuild the entire system, with reasonable chance of
|
|
# success, regardless of how old your existing system is.
|
|
#
|
|
_worldtmp: .PHONY
|
|
.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/bin 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_DEBUG_FILES} != "no"
|
|
# We could instead disable debug files for these build stages
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
|
-p ${WORLDTMP}/legacy/usr/lib >/dev/null
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
|
-p ${WORLDTMP}/usr/lib >/dev/null
|
|
.endif
|
|
.if ${MK_LIB32} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${WORLDTMP}/usr >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${WORLDTMP}/legacy/usr/lib/debug/usr >/dev/null
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${WORLDTMP}/usr/lib/debug/usr >/dev/null
|
|
.endif
|
|
.endif
|
|
.if ${MK_TESTS} != "no"
|
|
mkdir -p ${WORLDTMP}${TESTSBASE}
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
|
|
-p ${WORLDTMP}${TESTSBASE} >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mkdir -p ${WORLDTMP}/usr/lib/debug/${TESTSBASE}
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
|
|
-p ${WORLDTMP}/usr/lib/debug/${TESTSBASE} >/dev/null
|
|
.endif
|
|
.endif
|
|
.for _mtree in ${LOCAL_MTREE}
|
|
mtree -deU -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
|
|
.endfor
|
|
_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}
|
|
.if defined(LIB32TMP)
|
|
${_+_}cd ${.CURDIR}; ${LIB32WMAKE} -f Makefile.inc1 ${CLEANDIR}
|
|
.endif
|
|
.endif
|
|
_obj:
|
|
@echo
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> stage 2.2: rebuilding the object tree"
|
|
@echo "--------------------------------------------------------------"
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} 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
|
|
${_+_}cd ${.CURDIR}; ${XMAKE} kernel-tools
|
|
_includes:
|
|
@echo
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> stage 4.1: building includes"
|
|
@echo "--------------------------------------------------------------"
|
|
# Special handling for SUBDIR_OVERRIDE in buildworld as they most likely need
|
|
# headers from default SUBDIR. Do SUBDIR_OVERRIDE includes last.
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} SUBDIR_OVERRIDE= SHARED=symlinks \
|
|
buildincludes
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} SUBDIR_OVERRIDE= SHARED=symlinks \
|
|
installincludes
|
|
.if !empty(SUBDIR_OVERRIDE) && make(buildworld)
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks buildincludes
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks installincludes
|
|
.endif
|
|
_libraries:
|
|
@echo
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> stage 4.2: building libraries"
|
|
@echo "--------------------------------------------------------------"
|
|
${_+_}cd ${.CURDIR}; \
|
|
${WMAKE} -DNO_FSCHG MK_HTML=no -DNO_LINT MK_MAN=no \
|
|
MK_PROFILE=no MK_TESTS=no MK_TESTS_SUPPORT=${MK_TESTS} libraries
|
|
_depend:
|
|
@echo
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> stage 4.3: make dependencies"
|
|
@echo "--------------------------------------------------------------"
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} depend
|
|
everything:
|
|
@echo
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> stage 4.4: building everything"
|
|
@echo "--------------------------------------------------------------"
|
|
${_+_}cd ${.CURDIR}; ${WMAKE} par-all
|
|
.if defined(LIB32TMP)
|
|
build32: .PHONY
|
|
@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
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${LIB32TMP}/usr >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
|
-p ${LIB32TMP}/usr/lib >/dev/null
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${LIB32TMP}/usr/lib/debug/usr >/dev/null
|
|
.endif
|
|
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}; \
|
|
WORLDTMP=${WORLDTMP} \
|
|
MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
|
|
MAKEOBJDIRPREFIX=${LIB32_OBJTREE} ${MAKE} SSP_CFLAGS= DESTDIR= \
|
|
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
|
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: .MAKE .PHONY
|
|
${_+_}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=
|
|
WMAKE_TGTS+= _worldtmp _legacy
|
|
.if empty(SUBDIR_OVERRIDE)
|
|
WMAKE_TGTS+= _bootstrap-tools
|
|
.endif
|
|
WMAKE_TGTS+= _cleanobj _obj _build-tools _cross-tools
|
|
WMAKE_TGTS+= _includes _libraries _depend everything
|
|
.if defined(LIB32TMP) && ${MK_LIB32} != "no" && empty(SUBDIR_OVERRIDE)
|
|
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: .PHONY
|
|
@echo ${WMAKEENV:Q} ${.MAKE.EXPORTED:@v@$v=\"${$v}\"@}
|
|
|
|
.if ${.TARGETS:Mbuildenv}
|
|
.if ${.MAKEFLAGS:M-j}
|
|
.error The buildenv target is incompatible with -j
|
|
.endif
|
|
.endif
|
|
BUILDENV_DIR?= ${.CURDIR}
|
|
buildenv: .PHONY
|
|
@echo Entering world for ${TARGET_ARCH}:${TARGET}
|
|
.if ${BUILDENV_SHELL:M*zsh*}
|
|
@echo For ZSH you must run: export CPUTYPE=${TARGET_CPUTYPE}
|
|
.endif
|
|
@cd ${BUILDENV_DIR} && env ${WMAKEENV} BUILDENV=1 ${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: _installcheck_world _installcheck_kernel
|
|
_installcheck_world:
|
|
_installcheck_kernel:
|
|
|
|
#
|
|
# Require DESTDIR to be set if installing for a different architecture or
|
|
# using the user/group database in the source tree.
|
|
#
|
|
.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE} || \
|
|
defined(DB_FROM_SRC)
|
|
.if !make(distributeworld)
|
|
_installcheck_world: __installcheck_DESTDIR
|
|
_installcheck_kernel: __installcheck_DESTDIR
|
|
__installcheck_DESTDIR:
|
|
.if !defined(DESTDIR) || empty(DESTDIR)
|
|
@echo "ERROR: Please set DESTDIR!"; \
|
|
false
|
|
.endif
|
|
.endif
|
|
.endif
|
|
|
|
.if !defined(DB_FROM_SRC)
|
|
#
|
|
# Check for missing UIDs/GIDs.
|
|
#
|
|
CHECK_UIDS= auditdistd
|
|
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
|
|
.if ${MK_UNBOUND} != "no"
|
|
CHECK_UIDS+= unbound
|
|
CHECK_GIDS+= unbound
|
|
.endif
|
|
_installcheck_world: __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
|
|
.endif
|
|
|
|
#
|
|
# Required install tools to be saved in a scratch dir for safety.
|
|
#
|
|
.if ${MK_ZONEINFO} != "no"
|
|
_zoneinfo= zic tzsetup
|
|
.endif
|
|
|
|
ITOOLS= [ awk cap_mkdb cat chflags chmod chown cmp cp \
|
|
date echo egrep find grep id install ${_install-info} \
|
|
ln make mkdir mtree mv pwd_mkdb \
|
|
rm sed services_mkdb sh strip sysctl test true uname wc ${_zoneinfo} \
|
|
${LOCAL_ITOOLS}
|
|
|
|
# Needed for share/man
|
|
.if ${MK_MAN} != "no"
|
|
ITOOLS+=makewhatis
|
|
.endif
|
|
|
|
#
|
|
# 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
|
|
.if defined(LIB32TMP) && ${MK_LIB32} != "no"
|
|
EXTRA_DISTRIBUTIONS+= lib32
|
|
.endif
|
|
.if ${MK_TESTS} != "no"
|
|
EXTRA_DISTRIBUTIONS+= tests
|
|
.endif
|
|
|
|
DEBUG_DISTRIBUTIONS=
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
DEBUG_DISTRIBUTIONS+= base ${EXTRA_DISTRIBUTIONS:S,doc,,:S,tests,,}
|
|
.endif
|
|
|
|
MTREE_MAGIC?= mtree 2.0
|
|
|
|
distributeworld installworld: _installcheck_world
|
|
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 defined(NO_ROOT)
|
|
echo "#${MTREE_MAGIC}" > ${METALOG}
|
|
.endif
|
|
.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
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
|
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
|
|
.endif
|
|
.if ${MK_LIB32} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/usr >/dev/null
|
|
.endif
|
|
.endif
|
|
.if ${MK_TESTS} != "no" && ${dist} == "tests"
|
|
-mkdir -p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE}
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
|
|
-p ${DESTDIR}/${DISTDIR}/${dist}${TESTSBASE} >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
|
|
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/${TESTSBASE} >/dev/null
|
|
.endif
|
|
.endif
|
|
.if defined(NO_ROOT)
|
|
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.root.dist | \
|
|
sed -e 's#^\./#./${dist}/#' >> ${METALOG}
|
|
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.usr.dist | \
|
|
sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
|
|
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.include.dist | \
|
|
sed -e 's#^\./#./${dist}/usr/include/#' >> ${METALOG}
|
|
.if ${MK_LIB32} != "no"
|
|
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.lib32.dist | \
|
|
sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
|
|
.endif
|
|
.endif
|
|
.endfor
|
|
-mkdir ${DESTDIR}/${DISTDIR}/base
|
|
${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
|
|
METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \
|
|
DISTBASE=/base DESTDIR=${DESTDIR}/${DISTDIR}/base \
|
|
LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs
|
|
.endif
|
|
${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \
|
|
${IMAKEENV} rm -rf ${INSTALLTMP}
|
|
.if make(distributeworld)
|
|
.for dist in ${EXTRA_DISTRIBUTIONS}
|
|
find ${DESTDIR}/${DISTDIR}/${dist} -mindepth 1 -empty -delete
|
|
.endfor
|
|
.if defined(NO_ROOT)
|
|
.for dist in base ${EXTRA_DISTRIBUTIONS}
|
|
@# For each file that exists in this dist, print the corresponding
|
|
@# line from the METALOG. This relies on the fact that
|
|
@# a line containing only the filename will sort immediatly before
|
|
@# the relevant mtree line.
|
|
cd ${DESTDIR}/${DISTDIR}; \
|
|
find ./${dist} | sort -u ${METALOG} - | \
|
|
awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
|
|
${DESTDIR}/${DISTDIR}/${dist}.meta
|
|
.endfor
|
|
.for dist in ${DEBUG_DISTRIBUTIONS}
|
|
@# For each file that exists in this dist, print the corresponding
|
|
@# line from the METALOG. This relies on the fact that
|
|
@# a line containing only the filename will sort immediatly before
|
|
@# the relevant mtree line.
|
|
cd ${DESTDIR}/${DISTDIR}; \
|
|
find ./${dist}/usr/lib/debug | sort -u ${METALOG} - | \
|
|
awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
|
|
${DESTDIR}/${DISTDIR}/${dist}.debug.meta
|
|
.endfor
|
|
.endif
|
|
.endif
|
|
|
|
packageworld:
|
|
.for dist in base ${EXTRA_DISTRIBUTIONS}
|
|
.if defined(NO_ROOT)
|
|
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
|
|
tar cvf - --exclude usr/lib/debug \
|
|
@${DESTDIR}/${DISTDIR}/${dist}.meta | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/${dist}.txz
|
|
.else
|
|
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
|
|
tar cvf - --exclude usr/lib/debug . | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/${dist}.txz
|
|
.endif
|
|
.endfor
|
|
|
|
.for dist in ${DEBUG_DISTRIBUTIONS}
|
|
. if defined(NO_ROOT)
|
|
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
|
|
tar cvf - @${DESTDIR}/${DISTDIR}/${dist}.debug.meta | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/${dist}-dbg.txz
|
|
. else
|
|
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
|
|
tar cvLf - usr/lib/debug | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/${dist}-dbg.txz
|
|
. endif
|
|
.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: .MAKE .PHONY
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> Making hierarchy"
|
|
@echo "--------------------------------------------------------------"
|
|
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
|
|
LOCAL_MTREE=${LOCAL_MTREE:Q} 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: .MAKE .PHONY
|
|
@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: .MAKE .PHONY
|
|
${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
|
|
${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET}
|
|
|
|
distribution: .MAKE .PHONY
|
|
${_+_}cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
|
|
${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET}
|
|
${_+_}cd ${.CURDIR}; ${CROSSENV} PATH=${TMPPATH} \
|
|
${MAKE} -f Makefile.inc1 ${IMAKE_INSTALL} \
|
|
METALOG=${METALOG} installconfig
|
|
|
|
#
|
|
# 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 ${TARGET_ARCH} == "powerpc64"
|
|
KERNCONF?= GENERIC64
|
|
.else
|
|
KERNCONF?= GENERIC
|
|
.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
|
|
|
|
${WMAKE_TGTS:N_worldtmp:Nbuild32} ${.ALLTARGETS:M_*:N_worldtmp}: .MAKE .PHONY
|
|
|
|
#
|
|
# buildkernel
|
|
#
|
|
# Builds all kernels defined by BUILDKERNELS.
|
|
#
|
|
buildkernel: .MAKE .PHONY
|
|
.if empty(BUILDKERNELS)
|
|
@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \
|
|
false
|
|
.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} \
|
|
-I '${KERNCONFDIR}' '${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 ${.CURDIR}; ${KTMAKE} kernel-tools
|
|
.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_kernel
|
|
.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} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//}
|
|
.if ${BUILDKERNELS:[#]} > 1
|
|
.for _kernel in ${BUILDKERNELS:[2..-1]}
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> Installing kernel ${_kernel}"
|
|
@echo "--------------------------------------------------------------"
|
|
cd ${KRNLOBJDIR}/${_kernel}; \
|
|
${CROSSENV} PATH=${TMPPATH} \
|
|
${MAKE} ${IMAKE_INSTALL} KERNEL=${INSTKERNNAME}.${_kernel} ${.TARGET:S/kernel//}
|
|
.endfor
|
|
.endif
|
|
|
|
distributekernel distributekernel.debug:
|
|
.if empty(INSTALLKERNEL)
|
|
@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
|
|
false
|
|
.endif
|
|
mkdir -p ${DESTDIR}/${DISTDIR}
|
|
.if defined(NO_ROOT)
|
|
echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.premeta
|
|
.endif
|
|
cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
|
|
${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.premeta/} \
|
|
${IMAKE_MTREE} PATH=${TMPPATH} ${MAKE} KERNEL=${INSTKERNNAME} \
|
|
DESTDIR=${INSTALL_DDIR}/kernel \
|
|
${.TARGET:S/distributekernel/install/}
|
|
.if defined(NO_ROOT)
|
|
sed -e 's|^./kernel|.|' ${DESTDIR}/${DISTDIR}/kernel.premeta > \
|
|
${DESTDIR}/${DISTDIR}/kernel.meta
|
|
.endif
|
|
.if ${BUILDKERNELS:[#]} > 1
|
|
.for _kernel in ${BUILDKERNELS:[2..-1]}
|
|
.if defined(NO_ROOT)
|
|
echo "#${MTREE_MAGIC}" > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta
|
|
.endif
|
|
cd ${KRNLOBJDIR}/${_kernel}; \
|
|
${IMAKEENV} ${IMAKE_INSTALL:S/METALOG/kernel.${_kernel}.premeta/} \
|
|
${IMAKE_MTREE} PATH=${TMPPATH} ${MAKE} \
|
|
KERNEL=${INSTKERNNAME}.${_kernel} \
|
|
DESTDIR=${INSTALL_DDIR}/kernel.${_kernel} \
|
|
${.TARGET:S/distributekernel/install/}
|
|
.if defined(NO_ROOT)
|
|
sed -e 's|^./kernel|.|' \
|
|
${DESTDIR}/${DISTDIR}/kernel.${_kernel}.premeta > \
|
|
${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta
|
|
.endif
|
|
.endfor
|
|
.endif
|
|
|
|
packagekernel:
|
|
.if defined(NO_ROOT)
|
|
cd ${DESTDIR}/${DISTDIR}/kernel; \
|
|
tar cvf - @${DESTDIR}/${DISTDIR}/kernel.meta | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.txz
|
|
.if ${BUILDKERNELS:[#]} > 1
|
|
.for _kernel in ${BUILDKERNELS:[2..-1]}
|
|
cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
|
|
tar cvf - @${DESTDIR}/${DISTDIR}/kernel.${_kernel}.meta | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.txz
|
|
.endfor
|
|
.endif
|
|
.else
|
|
cd ${DESTDIR}/${DISTDIR}/kernel; \
|
|
tar cvf - . | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.txz
|
|
.if ${BUILDKERNELS:[#]} > 1
|
|
.for _kernel in ${BUILDKERNELS:[2..-1]}
|
|
cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
|
|
tar cvf - . | \
|
|
${XZ_CMD} > ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.txz
|
|
.endfor
|
|
.endif
|
|
.endif
|
|
|
|
#
|
|
# doxygen
|
|
#
|
|
# Build the API documentation with doxygen
|
|
#
|
|
doxygen: .PHONY
|
|
@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 svn/svnup to update to the
|
|
# latest copy.
|
|
#
|
|
update:
|
|
.if (defined(CVS_UPDATE) || defined(SUP_UPDATE)) && !defined(SVN_UPDATE)
|
|
@echo "--------------------------------------------------------------"
|
|
@echo "CVS_UPDATE and SUP_UPDATE are no longer supported."
|
|
@echo "Please see: https://wiki.freebsd.org/CvsIsDeprecated"
|
|
@echo "--------------------------------------------------------------"
|
|
@exit 1
|
|
.endif
|
|
.if defined(SVN_UPDATE)
|
|
@echo "--------------------------------------------------------------"
|
|
@echo ">>> Updating ${.CURDIR} using Subversion"
|
|
@echo "--------------------------------------------------------------"
|
|
@(cd ${.CURDIR} && ${SVN} update ${SVNFLAGS})
|
|
.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. This is a
|
|
# minimal set of tools and shims necessary to compensate for older systems
|
|
# which don't have the APIs required by the targets built in bootstrap-tools,
|
|
# build-tools or cross-tools.
|
|
#
|
|
|
|
# ELF Tool Chain libraries are needed for ELF tools and dtrace tools.
|
|
.if ${BOOTSTRAPPING} < 1100006
|
|
_elftoolchain_libs= lib/libelf lib/libdwarf
|
|
.endif
|
|
|
|
legacy:
|
|
.if ${BOOTSTRAPPING} < 800107 && ${BOOTSTRAPPING} != 0
|
|
@echo "ERROR: Source upgrades from versions prior to 8.0 are not supported."; \
|
|
false
|
|
.endif
|
|
.for _tool in tools/build ${_elftoolchain_libs}
|
|
${_+_}@${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. These are binaries that
|
|
# are built to build other binaries in the system. However, the focus of these
|
|
# binaries is usually quite narrow. Bootstrap tools use the host's compiler and
|
|
# libraries, augmented by -legacy.
|
|
#
|
|
_bt= _bootstrap-tools
|
|
|
|
.if ${MK_GAMES} != "no"
|
|
_strfile= usr.bin/fortune/strfile
|
|
.endif
|
|
|
|
.if ${MK_GCC} != "no" && ${MK_CXX} != "no"
|
|
_gperf= gnu/usr.bin/gperf
|
|
.endif
|
|
|
|
.if ${MK_GROFF} != "no"
|
|
_groff= gnu/usr.bin/groff \
|
|
usr.bin/soelim
|
|
.endif
|
|
|
|
.if ${MK_VT} != "no"
|
|
_vtfontcvt= usr.bin/vtfontcvt
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} < 900002
|
|
_sed= usr.bin/sed
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} < 1000002
|
|
_libopenbsd= lib/libopenbsd
|
|
_m4= usr.bin/m4
|
|
|
|
${_bt}-usr.bin/m4: ${_bt}-lib/libopenbsd
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} < 1000026
|
|
_nmtree= lib/libnetbsd \
|
|
usr.sbin/nmtree
|
|
|
|
${_bt}-usr.sbin/nmtree: ${_bt}-lib/libnetbsd
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} < 1000027
|
|
_cat= bin/cat
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} < 1000033
|
|
_lex= usr.bin/lex
|
|
|
|
${_bt}-usr.bin/lex: ${_bt}-usr.bin/m4
|
|
.endif
|
|
|
|
# r277259 crunchide: Correct 64-bit section header offset
|
|
# r281674 crunchide: always include both 32- and 64-bit ELF support
|
|
# r285986 crunchen: use STRIPBIN rather than STRIP
|
|
.if ${BOOTSTRAPPING} < 1100078
|
|
_crunch= usr.sbin/crunch
|
|
.endif
|
|
|
|
.if ${BOOTSTRAPPING} >= 900040 && ${BOOTSTRAPPING} < 900041
|
|
_awk= usr.bin/awk
|
|
.endif
|
|
|
|
_yacc= lib/liby \
|
|
usr.bin/yacc
|
|
|
|
${_bt}-usr.bin/yacc: ${_bt}-lib/liby
|
|
|
|
.if ${MK_BSNMP} != "no"
|
|
_gensnmptree= usr.sbin/bsnmpd/gensnmptree
|
|
.endif
|
|
|
|
# We need to build tblgen when we're building clang either as
|
|
# the bootstrap compiler, or as the part of the normal build.
|
|
.if ${MK_CLANG_BOOTSTRAP} != "no" || ${MK_CLANG} != "no"
|
|
_clang_tblgen= \
|
|
lib/clang/libllvmsupport \
|
|
lib/clang/libllvmtablegen \
|
|
usr.bin/clang/tblgen \
|
|
usr.bin/clang/clang-tblgen
|
|
|
|
${_bt}-usr.bin/clang/clang-tblgen: ${_bt}-lib/clang/libllvmtablegen ${_bt}-lib/clang/libllvmsupport
|
|
${_bt}-usr.bin/clang/tblgen: ${_bt}-lib/clang/libllvmtablegen ${_bt}-lib/clang/libllvmsupport
|
|
.endif
|
|
|
|
# Default to building the GPL DTC, but build the BSDL one if users explicitly
|
|
# request it.
|
|
_dtc= usr.bin/dtc
|
|
.if ${MK_GPL_DTC} != "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 \
|
|
usr.bin/compile_et
|
|
|
|
.ORDER: ${_kerberos5_bootstrap_tools:C/^/${_bt}-/g}
|
|
.endif
|
|
|
|
.if ${MK_MANDOCDB} != "no"
|
|
_libopenbsd?= lib/libopenbsd
|
|
_makewhatis= lib/libsqlite3 \
|
|
usr.bin/mandoc
|
|
${_bt}-usr.bin/mandoc: ${_bt}-lib/libopenbsd ${_bt}-lib/libsqlite3
|
|
.else
|
|
_makewhatis=usr.bin/makewhatis
|
|
.endif
|
|
|
|
# Rebuild up-to-date libmd for xinstall
|
|
${_bt}-usr.bin/xinstall: ${_bt}-lib/libmd
|
|
|
|
bootstrap-tools: .PHONY
|
|
|
|
# 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.
|
|
.for _tool in \
|
|
${_clang_tblgen} \
|
|
${_kerberos5_bootstrap_tools} \
|
|
${_strfile} \
|
|
${_gperf} \
|
|
${_groff} \
|
|
${_dtc} \
|
|
${_awk} \
|
|
${_cat} \
|
|
usr.bin/lorder \
|
|
${_libopenbsd} \
|
|
${_makewhatis} \
|
|
usr.bin/rpcgen \
|
|
${_sed} \
|
|
${_yacc} \
|
|
${_m4} \
|
|
${_lex} \
|
|
lib/libmd \
|
|
usr.bin/xinstall \
|
|
${_gensnmptree} \
|
|
usr.sbin/config \
|
|
${_crunch} \
|
|
${_nmtree} \
|
|
${_vtfontcvt} \
|
|
usr.bin/localedef
|
|
${_bt}-${_tool}: .PHONY .MAKE
|
|
${_+_}@${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
|
|
|
|
bootstrap-tools: ${_bt}-${_tool}
|
|
.endfor
|
|
|
|
#
|
|
# build-tools: Build special purpose build tools
|
|
#
|
|
.if !defined(NO_SHARE)
|
|
_share= share/syscons/scrnmaps
|
|
.endif
|
|
|
|
.if ${MK_GCC} != "no"
|
|
_gcc_tools= gnu/usr.bin/cc/cc_tools
|
|
.endif
|
|
|
|
.if ${MK_RESCUE} != "no"
|
|
# rescue includes programs that have build-tools targets
|
|
_rescue=rescue/rescue
|
|
.endif
|
|
|
|
.for _tool in \
|
|
bin/csh \
|
|
bin/sh \
|
|
${LOCAL_TOOL_DIRS} \
|
|
lib/ncurses/ncurses \
|
|
lib/ncurses/ncursesw \
|
|
${_rescue} \
|
|
${_share} \
|
|
usr.bin/awk \
|
|
lib/libmagic \
|
|
usr.bin/mkesdb_static \
|
|
usr.bin/mkcsmapper_static \
|
|
usr.bin/vi/catalog
|
|
build-tools_${_tool}: .PHONY
|
|
${_+_}@${ECHODIR} "===> ${_tool} (obj,build-tools)"; \
|
|
cd ${.CURDIR}/${_tool} && \
|
|
${MAKE} DIRPRFX=${_tool}/ obj && \
|
|
${MAKE} DIRPRFX=${_tool}/ build-tools
|
|
build-tools: build-tools_${_tool}
|
|
.endfor
|
|
.for _tool in \
|
|
${_gcc_tools}
|
|
build-tools_${_tool}: .PHONY
|
|
${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all)"; \
|
|
cd ${.CURDIR}/${_tool} && \
|
|
${MAKE} DIRPRFX=${_tool}/ obj && \
|
|
${MAKE} DIRPRFX=${_tool}/ depend && \
|
|
${MAKE} DIRPRFX=${_tool}/ all
|
|
build-tools: build-tools_${_tool}
|
|
.endfor
|
|
|
|
#
|
|
# kernel-tools: Build kernel-building tools
|
|
#
|
|
kernel-tools:
|
|
mkdir -p ${MAKEOBJDIRPREFIX}/usr
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
|
|
-p ${MAKEOBJDIRPREFIX}/usr >/dev/null
|
|
|
|
#
|
|
# cross-tools: All the tools needed to build the rest of the system after
|
|
# we get done with the earlier stages. It is the last set of tools needed
|
|
# to begin building the target binaries.
|
|
#
|
|
.if ${TARGET_ARCH} != ${MACHINE_ARCH}
|
|
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
|
|
_btxld= usr.sbin/btxld
|
|
.endif
|
|
.endif
|
|
|
|
# Rebuild ctfconvert and ctfmerge to avoid difficult-to-diagnose failures
|
|
# resulting from missing bug fixes or ELF Toolchain updates.
|
|
.if ${MK_CDDL} != "no"
|
|
_dtrace_tools= cddl/lib/libctf cddl/usr.bin/ctfconvert \
|
|
cddl/usr.bin/ctfmerge
|
|
.endif
|
|
|
|
# If we're given an XAS, don't build binutils.
|
|
.if ${XAS:M/*} == ""
|
|
.if ${MK_BINUTILS_BOOTSTRAP} != "no"
|
|
_binutils= gnu/usr.bin/binutils
|
|
.endif
|
|
.if ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
|
|
_elftctools= lib/libelftc \
|
|
usr.bin/elfcopy \
|
|
usr.bin/nm \
|
|
usr.bin/size \
|
|
usr.bin/strings
|
|
# These are not required by the build, but can be useful for developers who
|
|
# cross-build on a FreeBSD 10 host:
|
|
_elftctools+= usr.bin/addr2line
|
|
.endif
|
|
.elif ${TARGET_ARCH} != ${MACHINE_ARCH} && ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
|
|
# If cross-building with an external binutils we still need to build strip for
|
|
# the target (for at least crunchide).
|
|
_elftctools= lib/libelftc \
|
|
usr.bin/elfcopy
|
|
.endif
|
|
|
|
# If an full path to an external cross compiler is given, don't build
|
|
# a cross compiler.
|
|
.if ${XCC:N${CCACHE_BIN}:M/*} == "" && ${MK_CROSS_COMPILER} != "no"
|
|
.if ${MK_CLANG_BOOTSTRAP} != "no"
|
|
_clang= usr.bin/clang
|
|
_clang_libs= lib/clang
|
|
.endif
|
|
.if ${MK_GCC_BOOTSTRAP} != "no"
|
|
_cc= gnu/usr.bin/cc
|
|
.endif
|
|
.endif
|
|
.if ${MK_USB} != "no"
|
|
_usb_tools= sys/boot/usb/tools
|
|
.endif
|
|
|
|
cross-tools: .MAKE .PHONY
|
|
.for _tool in \
|
|
${_clang_libs} \
|
|
${_clang} \
|
|
${_binutils} \
|
|
${_elftctools} \
|
|
${_dtrace_tools} \
|
|
${_cc} \
|
|
${_btxld} \
|
|
${_crunchide} \
|
|
${_usb_tools}
|
|
${_+_}@${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
|
|
|
|
NXBDESTDIR= ${OBJTREE}/nxb-bin
|
|
NXBENV= MAKEOBJDIRPREFIX=${OBJTREE}/nxb \
|
|
INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
|
PATH=${PATH}:${OBJTREE}/gperf_for_gcc/usr/bin
|
|
NXBMAKE= ${NXBENV} ${MAKE} \
|
|
TBLGEN=${NXBDESTDIR}/usr/bin/tblgen \
|
|
CLANG_TBLGEN=${NXBDESTDIR}/usr/bin/clang-tblgen \
|
|
MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH} \
|
|
MK_GDB=no MK_TESTS=no \
|
|
SSP_CFLAGS= \
|
|
MK_HTML=no NO_LINT=yes MK_MAN=no \
|
|
-DNO_PIC MK_PROFILE=no -DNO_SHARED \
|
|
-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
|
MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
|
|
MK_LLDB=no
|
|
|
|
# native-xtools is the current target for qemu-user cross builds of ports
|
|
# via poudriere and the imgact_binmisc kernel module.
|
|
# For non-clang enabled targets that are still using the in tree gcc
|
|
# we must build a gperf binary for one instance of its Makefiles. On
|
|
# clang-enabled systems, the gperf binary is obsolete.
|
|
native-xtools: .PHONY
|
|
.if ${MK_GCC_BOOTSTRAP} != "no"
|
|
mkdir -p ${OBJTREE}/gperf_for_gcc/usr/bin
|
|
${_+_}@${ECHODIR} "===> ${_gperf} (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/${_gperf} && \
|
|
${NXBMAKE} DIRPRFX=${_gperf}/ obj && \
|
|
${NXBMAKE} DIRPRFX=${_gperf}/ depend && \
|
|
${NXBMAKE} DIRPRFX=${_gperf}/ all && \
|
|
${NXBMAKE} DIRPRFX=${_gperf}/ DESTDIR=${OBJTREE}/gperf_for_gcc install
|
|
.endif
|
|
mkdir -p ${NXBDESTDIR}/bin ${NXBDESTDIR}/sbin ${NXBDESTDIR}/usr
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
|
|
-p ${NXBDESTDIR}/usr >/dev/null
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
|
|
-p ${NXBDESTDIR}/usr/include >/dev/null
|
|
.if ${MK_DEBUG_FILES} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
|
-p ${NXBDESTDIR}/usr/lib >/dev/null
|
|
.endif
|
|
.for _tool in \
|
|
bin/cat \
|
|
bin/chmod \
|
|
bin/cp \
|
|
bin/csh \
|
|
bin/echo \
|
|
bin/expr \
|
|
bin/hostname \
|
|
bin/ln \
|
|
bin/ls \
|
|
bin/mkdir \
|
|
bin/mv \
|
|
bin/ps \
|
|
bin/realpath \
|
|
bin/rm \
|
|
bin/rmdir \
|
|
bin/sh \
|
|
bin/sleep \
|
|
${_clang_tblgen} \
|
|
usr.bin/ar \
|
|
${_binutils} \
|
|
${_elftctools} \
|
|
${_cc} \
|
|
${_gcc_tools} \
|
|
${_clang_libs} \
|
|
${_clang} \
|
|
sbin/md5 \
|
|
sbin/sysctl \
|
|
gnu/usr.bin/diff \
|
|
usr.bin/awk \
|
|
usr.bin/basename \
|
|
usr.bin/bmake \
|
|
usr.bin/bzip2 \
|
|
usr.bin/cmp \
|
|
usr.bin/dirname \
|
|
usr.bin/env \
|
|
usr.bin/fetch \
|
|
usr.bin/find \
|
|
usr.bin/grep \
|
|
usr.bin/gzip \
|
|
usr.bin/id \
|
|
usr.bin/lex \
|
|
usr.bin/lorder \
|
|
usr.bin/mktemp \
|
|
usr.bin/mt \
|
|
usr.bin/patch \
|
|
usr.bin/sed \
|
|
usr.bin/sort \
|
|
usr.bin/tar \
|
|
usr.bin/touch \
|
|
usr.bin/tr \
|
|
usr.bin/true \
|
|
usr.bin/uniq \
|
|
usr.bin/unzip \
|
|
usr.bin/xargs \
|
|
usr.bin/xinstall \
|
|
usr.bin/xz \
|
|
usr.bin/yacc \
|
|
usr.sbin/chown
|
|
${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/${_tool} && \
|
|
${NXBMAKE} DIRPRFX=${_tool}/ obj && \
|
|
${NXBMAKE} DIRPRFX=${_tool}/ depend && \
|
|
${NXBMAKE} DIRPRFX=${_tool}/ all && \
|
|
${NXBMAKE} DIRPRFX=${_tool}/ DESTDIR=${NXBDESTDIR} install
|
|
.endfor
|
|
|
|
#
|
|
# hierarchy - ensure that all the needed directories are present
|
|
#
|
|
hierarchy hier: .MAKE .PHONY
|
|
${_+_}cd ${.CURDIR}/etc && ${HMAKE} 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: .MAKE .PHONY
|
|
${_+_}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
|
|
_startup_libs+= lib/csu
|
|
_startup_libs+= gnu/lib/libgcc
|
|
_startup_libs+= lib/libcompiler_rt
|
|
_startup_libs+= lib/libc
|
|
_startup_libs+= lib/libc_nonshared
|
|
.if ${MK_LIBCPLUSPLUS} != "no"
|
|
_startup_libs+= lib/libcxxrt
|
|
.endif
|
|
|
|
gnu/lib/libgcc__L: lib/libc__L
|
|
gnu/lib/libgcc__L: lib/libc_nonshared__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} \
|
|
${_libsqlite3} \
|
|
${_kerberos5_lib_libheimipcc} \
|
|
${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \
|
|
${_kerberos5_lib_libroken} \
|
|
${_kerberos5_lib_libwind} \
|
|
lib/libbz2 ${_libcom_err} lib/libcrypt \
|
|
lib/libelf lib/libexpat \
|
|
lib/libfigpar \
|
|
${_lib_libgssapi} \
|
|
lib/libkiconv lib/libkvm lib/liblzma lib/libmd lib/libnv \
|
|
${_lib_libcapsicum} \
|
|
lib/ncurses/ncurses lib/ncurses/ncursesw \
|
|
lib/libopie lib/libpam ${_lib_libthr} \
|
|
${_lib_libradius} lib/libsbuf lib/libtacplus \
|
|
lib/libgeom \
|
|
${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
|
|
${_cddl_lib_libuutil} \
|
|
${_cddl_lib_libavl} \
|
|
${_cddl_lib_libzfs_core} \
|
|
${_cddl_lib_libctf} \
|
|
lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
|
|
${_secure_lib_libcrypto} ${_lib_libldns} \
|
|
${_secure_lib_libssh} ${_secure_lib_libssl} \
|
|
gnu/lib/libdialog
|
|
.if ${MK_GNUCXX} != "no"
|
|
_prebuild_libs+= gnu/lib/libstdc++ gnu/lib/libsupc++
|
|
gnu/lib/libstdc++__L: lib/msun__L
|
|
gnu/lib/libsupc++__L: gnu/lib/libstdc++__L
|
|
.endif
|
|
|
|
.if ${MK_LIBCPLUSPLUS} != "no"
|
|
_prebuild_libs+= lib/libc++
|
|
.endif
|
|
|
|
lib/libgeom__L: lib/libexpat__L
|
|
|
|
.if ${MK_LIBTHR} != "no"
|
|
_lib_libthr= lib/libthr
|
|
.endif
|
|
|
|
.if ${MK_RADIUS_SUPPORT} != "no"
|
|
_lib_libradius= lib/libradius
|
|
.endif
|
|
|
|
.if ${MK_OFED} != "no"
|
|
_ofed_lib= contrib/ofed/usr.lib/
|
|
.endif
|
|
|
|
.if ${MK_CASPER} != "no"
|
|
_lib_libcapsicum=lib/libcapsicum
|
|
.endif
|
|
|
|
lib/libcapsicum__L: lib/libnv__L
|
|
lib/libpjdlog__L: lib/libutil__L
|
|
lib/liblzma__L: lib/libthr__L
|
|
|
|
_generic_libs= ${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib} usr.bin/lex/lib ${_ofed_lib}
|
|
.for _DIR in ${LOCAL_LIB_DIRS}
|
|
.if exists(${.CURDIR}/${_DIR}/Makefile)
|
|
_generic_libs+= ${_DIR}
|
|
.endif
|
|
.endfor
|
|
|
|
lib/libopie__L lib/libtacplus__L: lib/libmd__L
|
|
|
|
.if ${MK_CDDL} != "no"
|
|
_cddl_lib_libumem= cddl/lib/libumem
|
|
_cddl_lib_libnvpair= cddl/lib/libnvpair
|
|
_cddl_lib_libavl= cddl/lib/libavl
|
|
_cddl_lib_libuutil= cddl/lib/libuutil
|
|
_cddl_lib_libzfs_core= cddl/lib/libzfs_core
|
|
_cddl_lib_libctf= cddl/lib/libctf
|
|
_cddl_lib= cddl/lib
|
|
cddl/lib/libzfs_core__L: cddl/lib/libnvpair__L
|
|
cddl/lib/libzfs__L: lib/libgeom__L
|
|
cddl/lib/libctf__L: lib/libz__L
|
|
.endif
|
|
# cddl/lib/libdtrace requires lib/libproc and lib/librtld_db; it's only built
|
|
# on select architectures though (see cddl/lib/Makefile)
|
|
.if ${MACHINE_CPUARCH} != "sparc64"
|
|
_prebuild_libs+= lib/libproc lib/librtld_db
|
|
.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_LDNS} != "no"
|
|
_lib_libldns= lib/libldns
|
|
lib/libldns__L: secure/lib/libcrypto__L
|
|
.endif
|
|
.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_LDNS} != "no"
|
|
secure/lib/libssh__L: lib/libldns__L
|
|
.endif
|
|
.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 lib/libsqlite3__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
|
|
.endif
|
|
|
|
lib/libsqlite3__L: lib/libthr__L
|
|
|
|
.if ${MK_GSSAPI} != "no"
|
|
_lib_libgssapi= lib/libgssapi
|
|
.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
|
|
_libsqlite3= lib/libsqlite3
|
|
_kerberos5_lib_libheimipcc= kerberos5/lib/libheimipcc
|
|
_kerberos5_lib_libwind= kerberos5/lib/libwind
|
|
_libcom_err= lib/libcom_err
|
|
.endif
|
|
|
|
.if ${MK_NIS} != "no"
|
|
_lib_libypclnt= lib/libypclnt
|
|
.endif
|
|
|
|
.if ${MK_OPENSSL} == "no"
|
|
lib/libradius__L: lib/libmd__L
|
|
.endif
|
|
|
|
lib/libproc__L: \
|
|
${_cddl_lib_libctf:D${_cddl_lib_libctf}__L} lib/libelf__L lib/librtld_db__L lib/libutil__L
|
|
.if ${MK_CXX} != "no"
|
|
.if ${MK_LIBCPLUSPLUS} != "no"
|
|
lib/libproc__L: lib/libcxxrt__L
|
|
.else # This implies MK_GNUCXX != "no"; see lib/libproc
|
|
lib/libproc__L: gnu/lib/libsupc++__L
|
|
.endif
|
|
.endif
|
|
|
|
gnu/lib/libdialog__L: lib/msun__L lib/ncurses/ncursesw__L
|
|
|
|
.for _lib in ${_prereq_libs}
|
|
${_lib}__PL: .PHONY .MAKE
|
|
.if exists(${.CURDIR}/${_lib})
|
|
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/${_lib} && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ depend && \
|
|
${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
|
|
DIRPRFX=${_lib}/ all && \
|
|
${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
|
|
DIRPRFX=${_lib}/ install
|
|
.endif
|
|
.endfor
|
|
|
|
.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
|
|
${_lib}__L: .PHONY .MAKE
|
|
.if exists(${.CURDIR}/${_lib})
|
|
${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/${_lib} && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ depend && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ all && \
|
|
${MAKE} MK_TESTS=no 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 .MAKE
|
|
${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/lib/libpam && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=lib/libpam/ obj && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=lib/libpam/ depend && \
|
|
${MAKE} MK_TESTS=no DIRPRFX=lib/libpam/ \
|
|
-D_NO_LIBPAM_SO_YET all && \
|
|
${MAKE} MK_TESTS=no 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/}
|
|
|
|
# Enable SUBDIR_PARALLEL when not calling 'make all', unless called as
|
|
# 'par-all'. This is because it is unlikely that running 'make all' from
|
|
# the top-level, especially with a SUBDIR_OVERRIDE or LOCAL_DIRS set,
|
|
# will have a reliable build if SUBDIRs are built in parallel. This is
|
|
# safe for the world stage of buildworld though since it has already
|
|
# built libraries in a proper order and installed includes into WORLDTMP.
|
|
# Special handling is done for SUBDIR ordering for 'install*' to avoid
|
|
# trashing a system if it crashes mid-install.
|
|
par-all: all .PHONY
|
|
.if !make(all)
|
|
SUBDIR_PARALLEL=
|
|
.endif
|
|
|
|
.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; \
|
|
cd ${.CURDIR}; \
|
|
${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; \
|
|
for ext in debug symbols; do \
|
|
if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
|
|
"${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
|
|
rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
|
|
<&3; \
|
|
fi; \
|
|
done; \
|
|
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"
|
|
@cd ${.CURDIR}; \
|
|
${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; \
|
|
for ext in debug symbols; do \
|
|
if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
|
|
echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
|
|
fi; \
|
|
done; \
|
|
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; \
|
|
cd ${.CURDIR}; \
|
|
${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; \
|
|
for ext in debug symbols; do \
|
|
if ! [ -e "${DESTDIR}/$${file}" ] && [ -f \
|
|
"${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
|
|
rm ${RM_I} "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" \
|
|
<&3; \
|
|
fi; \
|
|
done; \
|
|
done
|
|
@echo ">>> Old libraries removed"
|
|
|
|
check-old-libs:
|
|
@echo ">>> Checking for old libraries"
|
|
@cd ${.CURDIR}; \
|
|
${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; \
|
|
for ext in debug symbols; do \
|
|
if [ -f "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}" ]; then \
|
|
echo "${DESTDIR}${DEBUGDIR}/$${file}.$${ext}"; \
|
|
fi; \
|
|
done; \
|
|
done
|
|
|
|
delete-old-dirs:
|
|
@echo ">>> Removing old directories"
|
|
@cd ${.CURDIR}; \
|
|
${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
|
|
-V OLD_DIRS | xargs -n1 | sort -r | \
|
|
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"
|
|
@cd ${.CURDIR}; \
|
|
${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 ${.CURDIR}/sys/conf/kern.opts.mk -V dummy -dg1; \
|
|
${MAKE} -n -f ${.CURDIR}/share/mk/src.opts.mk -V dummy -dg1) 2>&1 | grep ^MK_ | sort -u
|
|
|
|
.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}' ; echo
|
|
.endif
|
|
.endif
|
|
|
|
.endif
|
|
|
|
.if !defined(DTBOUTPUTPATH) || !exists(${DTBOUTPUTPATH})
|
|
DTBOUTPUTPATH= ${.CURDIR}
|
|
.endif
|
|
|
|
#
|
|
# Build 'standalone' Device Tree Blob
|
|
#
|
|
builddtb:
|
|
@PATH=${TMPPATH} MACHINE=${TARGET} \
|
|
${.CURDIR}/sys/tools/fdt/make_dtb.sh ${.CURDIR}/sys \
|
|
"${FDT_DTS_FILE}" ${DTBOUTPUTPATH}
|
|
|
|
###############
|
|
|
|
.if defined(TARGET) && defined(TARGET_ARCH)
|
|
|
|
.if ${TARGET} == ${MACHINE} && ${TARGET_ARCH} == ${MACHINE_ARCH}
|
|
XDEV_CPUTYPE?=${CPUTYPE}
|
|
.else
|
|
XDEV_CPUTYPE?=${TARGET_CPUTYPE}
|
|
.endif
|
|
|
|
NOFUN=-DNO_FSCHG MK_HTML=no -DNO_LINT \
|
|
MK_MAN=no MK_NLS=no MK_PROFILE=no \
|
|
MK_KERBEROS=no MK_RESCUE=no MK_TESTS=no MK_WARNS=no \
|
|
TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
|
|
CPUTYPE=${XDEV_CPUTYPE}
|
|
|
|
XDDIR=${TARGET_ARCH}-freebsd
|
|
XDTP?=/usr/${XDDIR}
|
|
.if ${XDTP:N/*}
|
|
.error XDTP variable should be an absolute path
|
|
.endif
|
|
|
|
CDBENV=MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/${XDDIR} \
|
|
INSTALL="sh ${.CURDIR}/tools/install.sh"
|
|
CDENV= ${CDBENV} \
|
|
TOOLS_PREFIX=${XDTP}
|
|
CD2CFLAGS=-isystem ${XDDESTDIR}/usr/include -L${XDDESTDIR}/usr/lib \
|
|
--sysroot=${XDDESTDIR}/ -B${XDDESTDIR}/usr/libexec \
|
|
-B${XDDESTDIR}/usr/bin -B${XDDESTDIR}/usr/lib
|
|
CD2ENV=${CDENV} CC="${CC} ${CD2CFLAGS}" CXX="${CXX} ${CD2CFLAGS}" \
|
|
CPP="${CPP} ${CD2CFLAGS}" \
|
|
MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH}
|
|
|
|
CDTMP= ${MAKEOBJDIRPREFIX}/${XDDIR}/${.CURDIR}/tmp
|
|
CDMAKE=${CDENV} PATH=${CDTMP}/usr/bin:${PATH} ${MAKE} ${NOFUN}
|
|
CD2MAKE=${CD2ENV} PATH=${CDTMP}/usr/bin:${XDDESTDIR}/usr/bin:${PATH} ${MAKE} ${NOFUN}
|
|
XDDESTDIR=${DESTDIR}/${XDTP}
|
|
.if !defined(OSREL)
|
|
OSREL!= uname -r | sed -e 's/[-(].*//'
|
|
.endif
|
|
|
|
.ORDER: xdev-build xdev-install xdev-links
|
|
xdev: xdev-build xdev-install
|
|
|
|
.ORDER: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools
|
|
xdev-build: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools
|
|
|
|
_xb-worldtmp: .PHONY
|
|
mkdir -p ${CDTMP}/usr
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
|
|
-p ${CDTMP}/usr >/dev/null
|
|
|
|
_xb-bootstrap-tools: .PHONY
|
|
.for _tool in \
|
|
${_clang_tblgen} \
|
|
${_gperf}
|
|
${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
|
|
cd ${.CURDIR}/${_tool} && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ obj && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ depend && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ all && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ DESTDIR=${CDTMP} install
|
|
.endfor
|
|
|
|
_xb-build-tools: .PHONY
|
|
${_+_}@cd ${.CURDIR}; \
|
|
${CDBENV} ${MAKE} -f Makefile.inc1 ${NOFUN} build-tools
|
|
|
|
_xb-cross-tools: .PHONY
|
|
.for _tool in \
|
|
${_binutils} \
|
|
${_elftctools} \
|
|
usr.bin/ar \
|
|
${_clang_libs} \
|
|
${_clang} \
|
|
${_cc}
|
|
${_+_}@${ECHODIR} "===> xdev ${_tool} (obj,depend,all)"; \
|
|
cd ${.CURDIR}/${_tool} && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ obj && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ depend && \
|
|
${CDMAKE} DIRPRFX=${_tool}/ all
|
|
.endfor
|
|
|
|
_xi-mtree: .PHONY
|
|
${_+_}@${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
|
|
.if ${MK_LIB32} != "no"
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
|
-p ${XDDESTDIR}/usr >/dev/null
|
|
.endif
|
|
.if ${MK_TESTS} != "no"
|
|
mkdir -p ${XDDESTDIR}${TESTSBASE}
|
|
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
|
|
-p ${XDDESTDIR}${TESTSBASE} >/dev/null
|
|
.endif
|
|
|
|
.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
|
|
xdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
|
|
|
|
_xi-cross-tools: .PHONY
|
|
@echo "_xi-cross-tools"
|
|
.for _tool in \
|
|
${_binutils} \
|
|
${_elftctools} \
|
|
usr.bin/ar \
|
|
${_clang_libs} \
|
|
${_clang} \
|
|
${_cc}
|
|
${_+_}@${ECHODIR} "===> xdev ${_tool} (install)"; \
|
|
cd ${.CURDIR}/${_tool}; \
|
|
${CDMAKE} DIRPRFX=${_tool}/ install DESTDIR=${XDDESTDIR}
|
|
.endfor
|
|
|
|
_xi-includes: .PHONY
|
|
${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 buildincludes \
|
|
DESTDIR=${XDDESTDIR}
|
|
${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 installincludes \
|
|
DESTDIR=${XDDESTDIR}
|
|
|
|
_xi-libraries: .PHONY
|
|
${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \
|
|
DESTDIR=${XDDESTDIR}
|
|
|
|
xdev-links: .PHONY
|
|
${_+_}cd ${XDDESTDIR}/usr/bin; \
|
|
mkdir -p ../../../../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-build xdev-install xdev-links:
|
|
@echo "*** Error: Both TARGET and TARGET_ARCH must be defined for \"${.TARGET}\" target"
|
|
.endif
|