xref: /freebsd/share/mk/local.dirdeps.mk (revision 2008043f386721d58158e37e0d7e50df8095942d)
13d0fb7cfSSimon J. Gerraty.if !target(_DIRDEP_USE)
23d0fb7cfSSimon J. Gerraty# we are the 1st makefile
37750ad47SMarcel Moolenaar
4ee7b0571SSimon J. Gerraty.if !defined(MK_CLANG)
5ea14011cSSimon J. Gerraty.include "${SRCTOP}/share/mk/src.opts.mk"
6e86ede0dSSimon J. Gerraty.endif
7e86ede0dSSimon J. Gerraty
8*2008043fSStephen J. Kiernan# Machine-specific MK settings needed for Makefile.dirdeps.options usage
9*2008043fSStephen J. KiernanMK_FDT.i386 = no
10*2008043fSStephen J. KiernanMK_FDT.amd64 = no
11*2008043fSStephen J. Kiernan
1261ad1ff5SSimon J. Gerraty# making universe is special
1361ad1ff5SSimon J. Gerraty.if defined(UNIVERSE_GUARD)
1461ad1ff5SSimon J. Gerraty# these should be done by now
1561ad1ff5SSimon J. GerratyDIRDEPS_FILTER+= N*.host
1661ad1ff5SSimon J. Gerraty.endif
1761ad1ff5SSimon J. Gerraty
183d0fb7cfSSimon J. Gerraty# pseudo machines get no qualification
19d489b2a3SSimon J. Gerraty.for m in ${PSEUDO_MACHINE_LIST:Nhost*}
203d0fb7cfSSimon J. GerratyM_dep_qual_fixes += C;($m),[^/.,]*$$;\1;
213d0fb7cfSSimon J. Gerraty.endfor
223d0fb7cfSSimon J. Gerraty#.info M_dep_qual_fixes=${M_dep_qual_fixes}
234aa63711SBryan Drewery
24e5e345a4SSimon J. Gerraty# Some things we never want to build for host
256c5406e4SSimon J. GerratyDIRDEPS_FILTER.host = \
2600140433SSimon J. Gerraty	Ninclude* \
27cb9c7ed1SSimon J. Gerraty	Nlib/csu* \
28a6589ab7SSimon J. Gerraty	Nlib/libc \
29f9df6097SSimon J. Gerraty	Nlib/libcompiler_rt \
30cb9c7ed1SSimon J. Gerraty	Nlib/[mn]* \
31f9df6097SSimon J. Gerraty	Nlib/lib[t]* \
32cb9c7ed1SSimon J. Gerraty	Ngnu/lib/lib[a-r]* \
33a0c640c2SBryan Drewery	Nsecure/lib* \
344113aa90SSimon J. Gerraty	Nusr.bin/xinstall* \
3500140433SSimon J. Gerraty
36e5e345a4SSimon J. Gerraty.if ${.MAKE.OS} == "FreeBSD"
37e5e345a4SSimon J. Gerraty# Host libraries should mostly be excluded from the build so the
38e5e345a4SSimon J. Gerraty# host version in /usr/lib is used.
39e5e345a4SSimon J. Gerraty# Internal libraries need to be allowed to be built though
40e5e345a4SSimon J. Gerraty# since they are never installed.
41e5e345a4SSimon J. Gerraty
42e5e345a4SSimon J. Gerraty# Cheat for including src.libnames.mk
43e5e345a4SSimon J. Gerraty__<bsd.init.mk>__:
44e5e345a4SSimon J. Gerraty# Pull in _INTERNALLIBS
45e5e345a4SSimon J. Gerraty.include <src.libnames.mk>
46e5e345a4SSimon J. Gerraty
47e5e345a4SSimon J. Gerraty_need_host_libs=
48e5e345a4SSimon J. Gerraty.for lib in ${_INTERNALLIBS}
49e5e345a4SSimon J. Gerraty_need_host_libs+= ${LIB${lib:tu}DIR:S,^${OBJTOP}/,,}
50e5e345a4SSimon J. Gerraty.endfor
51e5e345a4SSimon J. Gerraty.if ${MK_host_egacy} == "yes"
52e5e345a4SSimon J. Gerraty_need_host_libs+= lib/libmd
53e5e345a4SSimon J. Gerraty.endif
54e5e345a4SSimon J. Gerraty
55e5e345a4SSimon J. GerratyN_host_libs:= ${cd ${SRCTOP} && echo lib/lib*:L:sh:${_need_host_libs:${M_ListToSkip}}:${M_ListToSkip}}
56e5e345a4SSimon J. GerratyDIRDEPS_FILTER.host+= ${N_host_libs}
57e5e345a4SSimon J. Gerraty.endif
583d0fb7cfSSimon J. Gerraty
59f9df6097SSimon J. GerratyDIRDEPS_FILTER.host32 = ${DIRDEPS_FILTER.host}
60f9df6097SSimon J. Gerraty
61c65ae8f9SSimon J. GerratyDIRDEPS_FILTER+= \
62704b4cacSSimon J. Gerraty	Nbin/cat.host \
63c65ae8f9SSimon J. Gerraty	${DIRDEPS_FILTER.xtras:U}
6489bd07e9SBryan Drewery
6589bd07e9SBryan Drewery# Cleanup a buildworld's WORLDTMP so that any files generated from it
6689bd07e9SBryan Drewery# or using it will rebuild with the DIRDEPS SYSROOT.  Otherwise existing
6789bd07e9SBryan Drewery# object .meta files may still reference those directories and not be
6889bd07e9SBryan Drewery# rebuilt and lead to incorrect Makefile.depend files due to lack of
6989bd07e9SBryan Drewery# .dirdep files.
7089bd07e9SBryan Drewery.if !defined(NO_CLEANUP_WORLDTMP) && exists(${OBJTOP}/tmp/_worldtmp)
7189bd07e9SBryan Drewerycleanup_worldtmp: .PHONY .NOMETA
7289bd07e9SBryan Drewery	@echo "Cleaning leftover WORLDTMP from buildworld."
7389bd07e9SBryan Drewery	-rm -rf ${OBJTOP}/tmp/*
7489bd07e9SBryan Drewery	-chflags -R 0 ${OBJTOP}/tmp/*
7589bd07e9SBryan Drewery	rm -rf ${OBJTOP}/tmp
7689bd07e9SBryan Drewerybeforedirdeps: cleanup_worldtmp
7789bd07e9SBryan Drewery.endif
788561d0b2SSimon J. Gerraty
798561d0b2SSimon J. Gerraty# pseudo option for building host tools on old or non-FreeBSD host
808561d0b2SSimon J. Gerraty# allows us to leverage Makefile.depend.options with
818561d0b2SSimon J. Gerraty# DIRDEPS_OPTIONS = host_egacy
828561d0b2SSimon J. Gerraty# dirdeps-options.mk will qualify with ${DEP_MACHINE} (and others)
838561d0b2SSimon J. Gerraty# before looking at the bare option.
848561d0b2SSimon J. GerratyMK_host_egacy.host= ${MK_host_egacy}
858561d0b2SSimon J. Gerraty
868561d0b2SSimon J. Gerraty.endif				# !target(_DIRDEP_USE)
87c65ae8f9SSimon J. Gerraty
88c65ae8f9SSimon J. Gerraty# reset this each time
89c65ae8f9SSimon J. GerratyDIRDEPS_FILTER.xtras=
90c65ae8f9SSimon J. Gerraty.if ${DEP_MACHINE:Npkgs*} != ""
91c65ae8f9SSimon J. GerratyDIRDEPS_FILTER.xtras+= Nusr.bin/clang/clang.host
923d0fb7cfSSimon J. Gerraty.endif
933d0fb7cfSSimon J. Gerraty
9493ac817fSSimon J. Gerraty.if ${DEP_MACHINE:Nhost*} == ""
9593ac817fSSimon J. Gerraty.if ${MK_host_egacy} == "yes" && ${DEP_RELDIR:Ntools/build:Ntargets/*:N*/stage} != ""
9693ac817fSSimon J. GerratyDIRDEPS += tools/build
9793ac817fSSimon J. Gerraty.endif
9893ac817fSSimon J. Gerraty.else
998561d0b2SSimon J. GerratyMK_host_egacy.${DEP_MACHINE}= no
1003d0fb7cfSSimon J. Gerraty
1013d0fb7cfSSimon J. Gerraty# this is how we can handle optional dependencies
102c65ae8f9SSimon J. Gerraty.if ${DEP_RELDIR} == "lib/libc"
103c65ae8f9SSimon J. GerratyDIRDEPS += lib/libc_nonshared
104c65ae8f9SSimon J. Gerraty.if ${MK_SSP:Uno} != "no"
105cd0d51baSKyle EvansDIRDEPS += lib/libssp_nonshared
1063d0fb7cfSSimon J. Gerraty.endif
107c65ae8f9SSimon J. Gerraty.else
108c65ae8f9SSimon J. GerratyDIRDEPS_FILTER.xtras+= Nlib/libc_nonshared
109c65ae8f9SSimon J. Gerraty.endif
1103d0fb7cfSSimon J. Gerraty
1113d0fb7cfSSimon J. Gerraty# some optional things
112c65ae8f9SSimon J. Gerraty.if ${MK_CTF} == "yes" && ${DEP_RELDIR:Mcddl/usr.bin/ctf*} == ""
1133d0fb7cfSSimon J. GerratyDIRDEPS += \
1143d0fb7cfSSimon J. Gerraty	cddl/usr.bin/ctfconvert.host \
1153d0fb7cfSSimon J. Gerraty	cddl/usr.bin/ctfmerge.host
1163d0fb7cfSSimon J. Gerraty.endif
1173d0fb7cfSSimon J. Gerraty
118f9df6097SSimon J. Gerraty.if ${DEP_MACHINE:Nhost*} != ""
119a160cbfaSBryan Drewery# Add in proper libgcc (gnu or LLVM) if not building libcc and libc is needed.
120a160cbfaSBryan Drewery# Add both gcc_s and gcc_eh as dependencies as the decision to build
121a160cbfaSBryan Drewery# -static or not is not known here.
122a6589ab7SSimon J. Gerraty.if ${DEP_RELDIR:M*libgcc*} == "" && ${DIRDEPS:U:Mlib/libc} != ""
123a160cbfaSBryan DreweryDIRDEPS+= \
124a160cbfaSBryan Drewery	lib/libgcc_eh \
125a160cbfaSBryan Drewery	lib/libgcc_s
126a160cbfaSBryan Drewery.endif
127f9df6097SSimon J. Gerraty.endif
128a160cbfaSBryan Drewery
1294902050fSBryan Drewery# Bootstrap support.  Give hints to DIRDEPS if there is no Makefile.depend*
1304902050fSBryan Drewery# generated yet.  This can be based on things such as SRC files and LIBADD.
1314902050fSBryan Drewery# These hints will not factor into the final Makefile.depend as only what is
1324902050fSBryan Drewery# used will be added in and handled via [local.]gendirdeps.mk.  This is not
1334902050fSBryan Drewery# done for MACHINE=host builds.
1344902050fSBryan Drewery# XXX: Include this in local.autodep.mk as well for gendirdeps without filemon.
13595931790SBryan Drewery# Only do this for main build target
13695931790SBryan Drewery.if ${RELDIR} == ${DEP_RELDIR} && !defined(_RECURSING_PROGS)
1374902050fSBryan Drewery.for _depfile in ${.MAKE.DEPENDFILE_PREFERENCE:T}
1384902050fSBryan Drewery.if !defined(_have_depfile) && exists(${.CURDIR}/${_depfile})
1394902050fSBryan Drewery_have_depfile=
1403d0fb7cfSSimon J. Gerraty.endif
1414902050fSBryan Drewery.endfor
1424902050fSBryan Drewery.if !defined(_have_depfile)
14354f8ee88SBryan Drewery# KMOD does not use any stdlibs.
14454f8ee88SBryan Drewery.if !defined(KMOD)
14595931790SBryan Drewery# Gather PROGS dependencies first
14695931790SBryan Drewery.if !empty(PROGS)
14795931790SBryan Drewery_PROGS_LIBADD=
14895931790SBryan Drewery_PROGS_DPADD=
14995931790SBryan Drewery_PROGS_SRCS=
15095931790SBryan Drewery.for _prog in ${PROGS}
15195931790SBryan Drewery.for s in . _
15295931790SBryan Drewery.if !empty(LIBADD${s}${_prog})
15395931790SBryan Drewery_PROGS_LIBADD+=	${LIBADD${s}${_prog}}
15495931790SBryan Drewery.endif
15595931790SBryan Drewery.if !empty(DPADD${s}${_prog})
15695931790SBryan Drewery_PROGS_DPADD+=	${DPADD${s}${_prog}}
15795931790SBryan Drewery.endif
15895931790SBryan Drewery.if !empty(SRCS${s}${_prog})
15995931790SBryan Drewery_PROGS_SRCS+=	${SRCS${s}${_prog}}
16095931790SBryan Drewery.endif
16195931790SBryan Drewery.endfor	# .for s in . _
16295931790SBryan Drewery# Add in assumed source (bsd.prog.mk)
16395931790SBryan Drewery.if !target(${_prog})
16495931790SBryan Drewery.if defined(PROG_CXX)
16595931790SBryan Drewery_PROGS_SRCS+=	${_prog}.cc
16695931790SBryan Drewery.else
16795931790SBryan Drewery_PROGS_SRCS+=	${_prog}.c
16895931790SBryan Drewery.endif
16995931790SBryan Drewery.endif	# !target(${_prog})
17095931790SBryan Drewery.endfor	# .for _prog in ${PROGS}
17195931790SBryan Drewery.endif	# !empty(PROGS)
17295931790SBryan Drewery_SRCS= ${SRCS} ${_PROGS_SRCS}
17395931790SBryan Drewery
1744902050fSBryan Drewery# Has C files. The C_DIRDEPS are shared with C++ files as well.
1754902050fSBryan DreweryC_DIRDEPS= \
1764902050fSBryan Drewery	include \
17749e66890SBryan Drewery	include/arpa \
17849e66890SBryan Drewery	include/protocols \
17949e66890SBryan Drewery	include/rpc  \
18049e66890SBryan Drewery	include/rpcsvc \
1814902050fSBryan Drewery	include/xlocale \
1824902050fSBryan Drewery	lib/${CSU_DIR} \
1834902050fSBryan Drewery	lib/libc \
1844902050fSBryan Drewery	lib/libcompiler_rt \
1854902050fSBryan Drewery
186a160cbfaSBryan Drewery# libgcc is needed as well but is added later.
18749e66890SBryan Drewery
18849e66890SBryan Drewery.if ${MK_GSSAPI} != "no"
18949e66890SBryan DreweryC_DIRDEPS+=  include/gssapi
19049e66890SBryan Drewery.endif
19149e66890SBryan Drewery
19295931790SBryan Drewery.if !empty(_SRCS:M*.c)
1934902050fSBryan DreweryDIRDEPS+= ${C_DIRDEPS}
1944902050fSBryan Drewery.endif
1954902050fSBryan Drewery# Has C++ files
19695931790SBryan Drewery.if !empty(_SRCS:M*.cc) || !empty(_SRCS:M*.C) || !empty(_SRCS:M*.cpp) || \
19795931790SBryan Drewery    !empty(_SRCS:M*.cxx)
1984902050fSBryan DreweryDIRDEPS+= ${C_DIRDEPS}
1994902050fSBryan Drewery.if ${MK_CLANG} == "yes"
2004902050fSBryan DreweryDIRDEPS+= lib/libc++ lib/libcxxrt
2014902050fSBryan Drewery.endif
2024902050fSBryan Drewery# XXX: Clang and GCC always adds -lm currently, even when not needed.
2034902050fSBryan DreweryDIRDEPS+= lib/msun
20454f8ee88SBryan Drewery.endif	# CXX
20554f8ee88SBryan Drewery.endif	# !defined(KMOD)
2064902050fSBryan Drewery# Has yacc files.
20795931790SBryan Drewery.if !empty(_SRCS:M*.y)
2084902050fSBryan DreweryDIRDEPS+=	usr.bin/yacc.host
2094902050fSBryan Drewery.endif
21095931790SBryan Drewery_DPADD= ${DPADD} ${_PROGS_DPADD}
21195931790SBryan Drewery.if !empty(_DPADD)
2124902050fSBryan Drewery# This only works for DPADD with full OBJ/SRC paths, which is mostly just
2134902050fSBryan Drewery# _INTERNALLIBS.
21492cc2837SBryan Drewery_DP_DIRDEPS= \
21566f96a13SBryan Drewery	${_DPADD:O:u:M${OBJTOP}*:H:N.:tA:C,${OBJTOP}[^/]*/,,:N.:O:u} \
21666f96a13SBryan Drewery	${_DPADD:O:u:M${OBJROOT}*:N${OBJTOP}*:N${STAGE_ROOT}/*:H:S,${OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u}
217bd1944caSBryan Drewery# Resolve the paths to RELDIRs
218a09a83caSBryan Drewery.if !empty(_DP_DIRDEPS)
219bd1944caSBryan DreweryDIRDEPS+= ${_DP_DIRDEPS:C,^,${SRCTOP}/,:tA:C,^${SRCTOP}/,,}
2204902050fSBryan Drewery.endif
221a09a83caSBryan Drewery.endif	# !empty(DPADD)
22266f96a13SBryan Drewery_ALL_LIBADD= ${LIBADD} ${_PROGS_LIBADD}
22395931790SBryan Drewery.if !empty(_ALL_LIBADD)
22495931790SBryan Drewery# Also handle LIBADD for non-internal libraries.
22566f96a13SBryan Drewery.for _lib in ${_ALL_LIBADD:O:u}
2264902050fSBryan Drewery_lib${_lib}reldir= ${LIB${_lib:tu}DIR:C,${OBJTOP}/,,}
2274902050fSBryan Drewery.if defined(LIB${_lib:tu}DIR) && ${DIRDEPS:M${_lib${_lib}reldir}} == "" && \
2284902050fSBryan Drewery    exists(${SRCTOP}/${_lib${_lib}reldir})
2294902050fSBryan DreweryDIRDEPS+= ${_lib${_lib}reldir}
2304902050fSBryan Drewery.endif
2314902050fSBryan Drewery.endfor
2324902050fSBryan Drewery.endif	# !empty(LIBADD)
2334902050fSBryan Drewery.endif	# no Makefile.depend*
2344902050fSBryan Drewery.endif	# ${RELDIR} == ${DEP_RELDIR}
2354902050fSBryan Drewery
2364902050fSBryan Drewery.endif	# ${DEP_MACHINE} != "host"
2373d0fb7cfSSimon J. Gerraty
2384113aa90SSimon J. Gerraty.if ${MK_STAGING} == "yes"
23961ad1ff5SSimon J. Gerraty# we need targets/pseudo/stage to prep the stage tree
240f957a32dSSimon J. Gerraty.if ${DEP_RELDIR:N.:N${SRCTOP}:N*pseudo/stage} != ""
24161ad1ff5SSimon J. GerratyDIRDEPS += targets/pseudo/stage
2423d0fb7cfSSimon J. Gerraty.endif
2434113aa90SSimon J. Gerraty.endif
2443d0fb7cfSSimon J. Gerraty
2453d0fb7cfSSimon J. GerratyDEP_MACHINE_ARCH = ${MACHINE_ARCH.${DEP_MACHINE}}
246f957a32dSSimon J. GerratyDEP_MACHINE_CPUARCH = ${DEP_MACHINE_ARCH:${__TO_CPUARCH}}
2473d0fb7cfSSimon J. GerratyCSU_DIR.${DEP_MACHINE_ARCH} ?= csu/${DEP_MACHINE_ARCH}
2483d0fb7cfSSimon J. GerratyCSU_DIR := ${CSU_DIR.${DEP_MACHINE_ARCH}}
2493d0fb7cfSSimon J. GerratyBOOT_MACHINE_DIR:= ${BOOT_MACHINE_DIR.${DEP_MACHINE}}
2503d0fb7cfSSimon J. GerratyKERNEL_NAME:= ${KERNEL_NAME.${DEP_MACHINE}}
251073ccb9dSSimon J. Gerraty
252073ccb9dSSimon J. Gerraty.-include <site.dirdeps.mk>
253