1# $FreeBSD$ 2.if !target(_DIRDEP_USE) 3# we are the 1st makefile 4 5.if !defined(MK_CLANG) 6.include "${SRCTOP}/share/mk/src.opts.mk" 7.endif 8 9# making universe is special 10.if defined(UNIVERSE_GUARD) 11# these should be done by now 12DIRDEPS_FILTER+= N*.host 13.endif 14 15# pseudo machines get no qualification 16.for m in host common 17M_dep_qual_fixes += C;($m),[^/.,]*$$;\1; 18.endfor 19#.info M_dep_qual_fixes=${M_dep_qual_fixes} 20 21# Cheat for including src.libnames.mk 22__<bsd.init.mk>__: 23# Pull in _INTERNALLIBS 24.include <src.libnames.mk> 25 26# Host libraries should mostly be excluded from the build so the 27# host version in /usr/lib is used. Internal libraries need to be 28# allowed to be built though since they are never installed. 29_need_host_libs= 30.for lib in ${_INTERNALLIBS} 31_need_host_libs+= ${LIB${lib:tu}DIR:S,^${OBJTOP}/,,} 32.endfor 33 34N_host_libs:= ${cd ${SRCTOP} && echo lib/lib*:L:sh:${_need_host_libs:${M_ListToSkip}}:${M_ListToSkip}} 35DIRDEPS_FILTER.host = \ 36 ${N_host_libs} \ 37 Ninclude* \ 38 Nlib/csu* \ 39 Nlib/libc \ 40 Nlib/[mn]* \ 41 Ngnu/lib/lib[a-r]* \ 42 Nsecure/lib* \ 43 Nusr.bin/xinstall* \ 44 45 46DIRDEPS_FILTER+= \ 47 Nbin/cat.host \ 48 ${DIRDEPS_FILTER.xtras:U} 49 50# Cleanup a buildworld's WORLDTMP so that any files generated from it 51# or using it will rebuild with the DIRDEPS SYSROOT. Otherwise existing 52# object .meta files may still reference those directories and not be 53# rebuilt and lead to incorrect Makefile.depend files due to lack of 54# .dirdep files. 55.if !defined(NO_CLEANUP_WORLDTMP) && exists(${OBJTOP}/tmp/_worldtmp) 56cleanup_worldtmp: .PHONY .NOMETA 57 @echo "Cleaning leftover WORLDTMP from buildworld." 58 -rm -rf ${OBJTOP}/tmp/* 59 -chflags -R 0 ${OBJTOP}/tmp/* 60 rm -rf ${OBJTOP}/tmp 61beforedirdeps: cleanup_worldtmp 62.endif 63.endif 64 65# reset this each time 66DIRDEPS_FILTER.xtras= 67.if ${DEP_MACHINE:Npkgs*} != "" 68DIRDEPS_FILTER.xtras+= Nusr.bin/clang/clang.host 69.endif 70 71.if ${DEP_MACHINE} != "host" 72 73# this is how we can handle optional dependencies 74.if ${DEP_RELDIR} == "lib/libc" 75DIRDEPS += lib/libc_nonshared 76.if ${MK_SSP:Uno} != "no" 77DIRDEPS += lib/libssp_nonshared 78.endif 79.else 80DIRDEPS_FILTER.xtras+= Nlib/libc_nonshared 81.endif 82 83# some optional things 84.if ${MK_CTF} == "yes" && ${DEP_RELDIR:Mcddl/usr.bin/ctf*} == "" 85DIRDEPS += \ 86 cddl/usr.bin/ctfconvert.host \ 87 cddl/usr.bin/ctfmerge.host 88.endif 89 90# Add in proper libgcc (gnu or LLVM) if not building libcc and libc is needed. 91# Add both gcc_s and gcc_eh as dependencies as the decision to build 92# -static or not is not known here. 93.if ${DEP_RELDIR:M*libgcc*} == "" && ${DIRDEPS:U:Mlib/libc} != "" 94DIRDEPS+= \ 95 lib/libgcc_eh \ 96 lib/libgcc_s 97.endif 98 99# Bootstrap support. Give hints to DIRDEPS if there is no Makefile.depend* 100# generated yet. This can be based on things such as SRC files and LIBADD. 101# These hints will not factor into the final Makefile.depend as only what is 102# used will be added in and handled via [local.]gendirdeps.mk. This is not 103# done for MACHINE=host builds. 104# XXX: Include this in local.autodep.mk as well for gendirdeps without filemon. 105# Only do this for main build target 106.if ${RELDIR} == ${DEP_RELDIR} && !defined(_RECURSING_PROGS) 107.for _depfile in ${.MAKE.DEPENDFILE_PREFERENCE:T} 108.if !defined(_have_depfile) && exists(${.CURDIR}/${_depfile}) 109_have_depfile= 110.endif 111.endfor 112.if !defined(_have_depfile) 113# KMOD does not use any stdlibs. 114.if !defined(KMOD) 115# Gather PROGS dependencies first 116.if !empty(PROGS) 117_PROGS_LIBADD= 118_PROGS_DPADD= 119_PROGS_SRCS= 120.for _prog in ${PROGS} 121.for s in . _ 122.if !empty(LIBADD${s}${_prog}) 123_PROGS_LIBADD+= ${LIBADD${s}${_prog}} 124.endif 125.if !empty(DPADD${s}${_prog}) 126_PROGS_DPADD+= ${DPADD${s}${_prog}} 127.endif 128.if !empty(SRCS${s}${_prog}) 129_PROGS_SRCS+= ${SRCS${s}${_prog}} 130.endif 131.endfor # .for s in . _ 132# Add in assumed source (bsd.prog.mk) 133.if !target(${_prog}) 134.if defined(PROG_CXX) 135_PROGS_SRCS+= ${_prog}.cc 136.else 137_PROGS_SRCS+= ${_prog}.c 138.endif 139.endif # !target(${_prog}) 140.endfor # .for _prog in ${PROGS} 141.endif # !empty(PROGS) 142_SRCS= ${SRCS} ${_PROGS_SRCS} 143 144# Has C files. The C_DIRDEPS are shared with C++ files as well. 145C_DIRDEPS= \ 146 include \ 147 include/arpa \ 148 include/protocols \ 149 include/rpc \ 150 include/rpcsvc \ 151 include/xlocale \ 152 lib/${CSU_DIR} \ 153 lib/libc \ 154 lib/libcompiler_rt \ 155 156# libgcc is needed as well but is added later. 157 158.if ${MK_GSSAPI} != "no" 159C_DIRDEPS+= include/gssapi 160.endif 161 162.if !empty(_SRCS:M*.c) 163DIRDEPS+= ${C_DIRDEPS} 164.endif 165# Has C++ files 166.if !empty(_SRCS:M*.cc) || !empty(_SRCS:M*.C) || !empty(_SRCS:M*.cpp) || \ 167 !empty(_SRCS:M*.cxx) 168DIRDEPS+= ${C_DIRDEPS} 169.if ${MK_CLANG} == "yes" 170DIRDEPS+= lib/libc++ lib/libcxxrt 171.endif 172# XXX: Clang and GCC always adds -lm currently, even when not needed. 173DIRDEPS+= lib/msun 174.endif # CXX 175.endif # !defined(KMOD) 176# Has yacc files. 177.if !empty(_SRCS:M*.y) 178DIRDEPS+= usr.bin/yacc.host 179.endif 180_DPADD= ${DPADD} ${_PROGS_DPADD} 181.if !empty(_DPADD) 182# Taken from meta.autodep.mk (where it only does something with 183# BUILD_AT_LEVEL0, which we don't use). 184# This only works for DPADD with full OBJ/SRC paths, which is mostly just 185# _INTERNALLIBS. 186_DP_DIRDEPS= \ 187 ${_DPADD:O:u:M${OBJTOP}*:H:N.:tA:C,${OBJTOP}[^/]*/,,:N.:O:u} \ 188 ${_DPADD:O:u:M${OBJROOT}*:N${OBJTOP}*:N${STAGE_ROOT}/*:H:S,${OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u} 189# Resolve the paths to RELDIRs 190.if !empty(_DP_DIRDEPS) 191DIRDEPS+= ${_DP_DIRDEPS:C,^,${SRCTOP}/,:tA:C,^${SRCTOP}/,,} 192.endif 193.endif # !empty(DPADD) 194_ALL_LIBADD= ${LIBADD} ${_PROGS_LIBADD} 195.if !empty(_ALL_LIBADD) 196# Also handle LIBADD for non-internal libraries. 197.for _lib in ${_ALL_LIBADD:O:u} 198_lib${_lib}reldir= ${LIB${_lib:tu}DIR:C,${OBJTOP}/,,} 199.if defined(LIB${_lib:tu}DIR) && ${DIRDEPS:M${_lib${_lib}reldir}} == "" && \ 200 exists(${SRCTOP}/${_lib${_lib}reldir}) 201DIRDEPS+= ${_lib${_lib}reldir} 202.endif 203.endfor 204.endif # !empty(LIBADD) 205.endif # no Makefile.depend* 206.endif # ${RELDIR} == ${DEP_RELDIR} 207 208.endif # ${DEP_MACHINE} != "host" 209 210.if ${MK_STAGING} == "yes" 211# we need targets/pseudo/stage to prep the stage tree 212.if ${DEP_RELDIR} != "targets/pseudo/stage" 213DIRDEPS += targets/pseudo/stage 214.endif 215.endif 216 217DEP_MACHINE_ARCH = ${MACHINE_ARCH.${DEP_MACHINE}} 218CSU_DIR.${DEP_MACHINE_ARCH} ?= csu/${DEP_MACHINE_ARCH} 219CSU_DIR := ${CSU_DIR.${DEP_MACHINE_ARCH}} 220BOOT_MACHINE_DIR:= ${BOOT_MACHINE_DIR.${DEP_MACHINE}} 221KERNEL_NAME:= ${KERNEL_NAME.${DEP_MACHINE}} 222