13585b293SGarrett Wollman# from: @(#)bsd.subdir.mk 5.9 (Berkeley) 2/1/91 27f3dea24SPeter Wemm# $FreeBSD$ 3f5d738c8SWolfram Schneider# 4f5d738c8SWolfram Schneider# The include file <bsd.subdir.mk> contains the default targets 5400f992eSWolfram Schneider# for building subdirectories. 6f5d738c8SWolfram Schneider# 7f5d738c8SWolfram Schneider# For all of the directories listed in the variable SUBDIRS, the 8f5d738c8SWolfram Schneider# specified directory will be visited and the target made. There is 9f5d738c8SWolfram Schneider# also a default target which allows the command "make subdir" where 10f5d738c8SWolfram Schneider# subdir is any directory listed in the variable SUBDIRS. 11f5d738c8SWolfram Schneider# 12f5d738c8SWolfram Schneider# 13f5d738c8SWolfram Schneider# +++ variables +++ 14f5d738c8SWolfram Schneider# 1501df2ec3SDavid E. O'Brien# DISTRIBUTION Name of distribution. [base] 16f5d738c8SWolfram Schneider# 17f5d738c8SWolfram Schneider# SUBDIR A list of subdirectories that should be built as well. 18f5d738c8SWolfram Schneider# Each of the targets will execute the same target in the 19ca7f4027SPedro F. Giffuni# subdirectories. SUBDIR.yes is automatically appended 20e0be2e9bSWarner Losh# to this list. 21f5d738c8SWolfram Schneider# 22f5d738c8SWolfram Schneider# +++ targets +++ 23f5d738c8SWolfram Schneider# 24f5d738c8SWolfram Schneider# distribute: 25f5d738c8SWolfram Schneider# This is a variant of install, which will 26f5d738c8SWolfram Schneider# put the stuff into the right "distribution". 27f5d738c8SWolfram Schneider# 28b69c69e0SBryan Drewery# See SUBDIR_TARGETS for list of targets that will recurse. 29f5d738c8SWolfram Schneider# 30ccfb12d6SBryan Drewery# Targets defined in STANDALONE_SUBDIR_TARGETS will always be ran 31ccfb12d6SBryan Drewery# with SUBDIR_PARALLEL and will not respect .WAIT or SUBDIR_DEPEND_ 32ccfb12d6SBryan Drewery# values. 33ccfb12d6SBryan Drewery# 34b69c69e0SBryan Drewery# SUBDIR_TARGETS and STANDALONE_SUBDIR_TARGETS can be appended to 35b69c69e0SBryan Drewery# via make.conf or src.conf. 36b69c69e0SBryan Drewery# 37f5d738c8SWolfram Schneider 3850c5d27bSSimon J. Gerraty.if !target(__<bsd.subdir.mk>__) 3950c5d27bSSimon J. Gerraty__<bsd.subdir.mk>__: 4050c5d27bSSimon J. Gerraty 41f8b15066SBryan Drewery.if ${MK_AUTO_OBJ} == "no" 42f8b15066SBryan Drewery_obj= obj 43f8b15066SBryan Drewery.endif 44f8b15066SBryan Drewery 45b69c69e0SBryan DrewerySUBDIR_TARGETS+= \ 46aae63957SBryan Drewery all all-man analyze buildconfig buildfiles buildincludes \ 4703173d2fSBryan Drewery checkdpadd clean cleandepend cleandir cleanilinks \ 4803173d2fSBryan Drewery cleanobj depend distribute files includes installconfig \ 49*ebd2a662SBryan Drewery installdirs \ 501cbb5888SWarner Losh installfiles installincludes print-dir realinstall \ 51f8b15066SBryan Drewery maninstall manlint ${_obj} objlink tags \ 520b2580beSBryan Drewery 53ccfb12d6SBryan Drewery# Described above. 54b69c69e0SBryan DrewerySTANDALONE_SUBDIR_TARGETS+= \ 55b9c6f316SBryan Drewery all-man buildconfig buildfiles buildincludes check checkdpadd \ 56b9c6f316SBryan Drewery clean cleandepend cleandir cleanilinks cleanobj files includes \ 57*ebd2a662SBryan Drewery installconfig installdirs installincludes installfiles print-dir \ 589e2f435fSBryan Drewery maninstall manlint obj objlink 59b9c6f316SBryan Drewery 60b9c6f316SBryan Drewery# It is safe to install in parallel when staging. 61cd19ecdbSBryan Drewery.if defined(NO_ROOT) || !empty(SYSROOT) 62b9c6f316SBryan DrewerySTANDALONE_SUBDIR_TARGETS+= realinstall 63b9c6f316SBryan Drewery.endif 64ccfb12d6SBryan Drewery 652bdaf7e8SRuslan Ermilov.include <bsd.init.mk> 66afe61c15SRodney W. Grimes 679e2f435fSBryan Drewery.if make(print-dir) 689e2f435fSBryan DreweryNEED_SUBDIR= 1 699e2f435fSBryan DreweryECHODIR= : 709e2f435fSBryan Drewery.SILENT: 719e2f435fSBryan Drewery.if ${RELDIR:U.} != "." 729e2f435fSBryan Dreweryprint-dir: .PHONY 739e2f435fSBryan Drewery @echo ${RELDIR} 749e2f435fSBryan Drewery.endif 759e2f435fSBryan Drewery.endif 769e2f435fSBryan Drewery 77f8b15066SBryan Drewery.if ${MK_AUTO_OBJ} == "yes" && !target(obj) 78f8b15066SBryan Dreweryobj: .PHONY 79f8b15066SBryan Drewery.endif 80f8b15066SBryan Drewery 81f5374544SSimon J. Gerraty.if !defined(NEED_SUBDIR) 8234d39d2cSBryan Drewery# .MAKE.DEPENDFILE==/dev/null is set by bsd.dep.mk to avoid reading 8334d39d2cSBryan Drewery# Makefile.depend 8434d39d2cSBryan Drewery.if ${.MAKE.LEVEL} == 0 && ${MK_DIRDEPS_BUILD} == "yes" && !empty(SUBDIR) && \ 8534d39d2cSBryan Drewery ${.MAKE.DEPENDFILE} != "/dev/null" 867750ad47SMarcel Moolenaar.include <meta.subdir.mk> 877750ad47SMarcel Moolenaar# ignore this 887750ad47SMarcel Moolenaar_SUBDIR: 897750ad47SMarcel Moolenaar.endif 907750ad47SMarcel Moolenaar.endif 91e0be2e9bSWarner Losh 928f463ff4SRuslan ErmilovDISTRIBUTION?= base 938f463ff4SRuslan Ermilov.if !target(distribute) 94a7e08b46SSimon J. Gerratydistribute: .MAKE 958f463ff4SRuslan Ermilov.for dist in ${DISTRIBUTION} 96acabf29aSHartmut Brandt ${_+_}cd ${.CURDIR}; \ 97ea580d0bSGlen Barber ${MAKE} install installconfig -DNO_SUBDIR DESTDIR=${DISTDIR}/${dist} SHARED=copies 988f463ff4SRuslan Ermilov.endfor 998f463ff4SRuslan Ermilov.endif 10003173d2fSBryan Drewery# Convenience targets to run 'build${target}' and 'install${target}' when 10103173d2fSBryan Drewery# calling 'make ${target}'. 10203173d2fSBryan Drewery.for __target in files includes 10303173d2fSBryan Drewery.if !target(${__target}) 10403173d2fSBryan Drewery${__target}: build${__target} install${__target} 10503173d2fSBryan Drewery.ORDER: build${__target} install${__target} 10603173d2fSBryan Drewery.endif 10703173d2fSBryan Drewery.endfor 10803173d2fSBryan Drewery 10903173d2fSBryan Drewery# Make 'install' supports a before and after target. Actual install 11003173d2fSBryan Drewery# hooks are placed in 'realinstall'. 11103173d2fSBryan Drewery.if !target(install) 11203173d2fSBryan Drewery.for __stage in before real after 11303173d2fSBryan Drewery.if !target(${__stage}install) 11403173d2fSBryan Drewery${__stage}install: 11503173d2fSBryan Drewery.endif 11603173d2fSBryan Drewery.endfor 11703173d2fSBryan Dreweryinstall: beforeinstall realinstall afterinstall 11803173d2fSBryan Drewery.ORDER: beforeinstall realinstall afterinstall 11903173d2fSBryan Drewery.endif 12058857dfcSBryan Drewery.ORDER: all install 12103173d2fSBryan Drewery 1222231cd21SBryan Drewery# SUBDIR recursing may be disabled for MK_DIRDEPS_BUILD 1232231cd21SBryan Drewery.if !target(_SUBDIR) 1242231cd21SBryan Drewery 1251c32eff5SEd Maste.if defined(SUBDIR) || defined(SUBDIR.yes) 1262231cd21SBryan DrewerySUBDIR:=${SUBDIR} ${SUBDIR.yes} 1272231cd21SBryan DrewerySUBDIR:=${SUBDIR:u} 1282231cd21SBryan Drewery.endif 1292231cd21SBryan Drewery 13065d88005SBryan Drewery# Subdir code shared among 'make <subdir>', 'make <target>' and SUBDIR_PARALLEL. 13165d88005SBryan Drewery_SUBDIR_SH= \ 13265d88005SBryan Drewery if test -d ${.CURDIR}/$${dir}.${MACHINE_ARCH}; then \ 13365d88005SBryan Drewery dir=$${dir}.${MACHINE_ARCH}; \ 13465d88005SBryan Drewery fi; \ 13565d88005SBryan Drewery ${ECHODIR} "===> ${DIRPRFX}$${dir} ($${target})"; \ 13665d88005SBryan Drewery cd ${.CURDIR}/$${dir}; \ 13765d88005SBryan Drewery ${MAKE} $${target} DIRPRFX=${DIRPRFX}$${dir}/ 13865d88005SBryan Drewery 139e54caebeSBryan Drewery# This is kept for compatibility only. The normal handling of attaching to 140e54caebeSBryan Drewery# SUBDIR_TARGETS will create a target for each directory. 1417f5f4b44SBryan Drewery_SUBDIR: .USEBEFORE 1428f463ff4SRuslan Ermilov.if defined(SUBDIR) && !empty(SUBDIR) && !defined(NO_SUBDIR) 14385874b56SBryan Drewery @${_+_}target=${.TARGET:realinstall=install}; \ 1440edd2832SBryan Drewery for dir in ${SUBDIR:N.WAIT}; do ( ${_SUBDIR_SH} ); done 145b25a566dSRuslan Ermilov.endif 146afe61c15SRodney W. Grimes 14734ce63e5SBryan Drewery# Create 'make subdir' targets to run the real 'all' target. 14834ce63e5SBryan Drewery.for __dir in ${SUBDIR:N.WAIT} 14934ce63e5SBryan Drewery${__dir}: all_subdir_${DIRPRFX}${__dir} .PHONY 15034ce63e5SBryan Drewery.endfor 151afe61c15SRodney W. Grimes 152b69c69e0SBryan Drewery.for __target in ${SUBDIR_TARGETS} 153ccfb12d6SBryan Drewery# Can ordering be skipped for this and SUBDIR_PARALLEL forced? 154b4f9ba38SBryan Drewery.if ${STANDALONE_SUBDIR_TARGETS:M${__target}} 155ccfb12d6SBryan Drewery_is_standalone_target= 1 15661018287SBryan Drewery_subdir_filter= N.WAIT 157ccfb12d6SBryan Drewery.else 158ccfb12d6SBryan Drewery_is_standalone_target= 0 15961018287SBryan Drewery_subdir_filter= 160ccfb12d6SBryan Drewery.endif 161b4bb98edSIan Lepore__subdir_targets= 16261018287SBryan Drewery.for __dir in ${SUBDIR:${_subdir_filter}} 1630368d219SBryan Drewery.if ${__dir} == .WAIT 164b4bb98edSIan Lepore__subdir_targets+= .WAIT 165b4bb98edSIan Lepore.else 166a1c70d69SIan Lepore__deps= 167ccfb12d6SBryan Drewery.if ${_is_standalone_target} == 0 168e54caebeSBryan Drewery.if defined(SUBDIR_PARALLEL) 169e54caebeSBryan Drewery# Apply SUBDIR_DEPEND dependencies for SUBDIR_PARALLEL. 170a1c70d69SIan Lepore.for __dep in ${SUBDIR_DEPEND_${__dir}} 171a540ec75SBryan Drewery__deps+= ${__target}_subdir_${DIRPRFX}${__dep} 172a1c70d69SIan Lepore.endfor 173e54caebeSBryan Drewery.else 174e54caebeSBryan Drewery# For non-parallel builds, directories depend on all targets before them. 175e54caebeSBryan Drewery__deps:= ${__subdir_targets} 176e54caebeSBryan Drewery.endif # defined(SUBDIR_PARALLEL) 177e54caebeSBryan Drewery.endif # ${_is_standalone_target} == 0 17857b5a844SBryan Drewery${__target}_subdir_${DIRPRFX}${__dir}: .PHONY .MAKE .SILENT ${__deps} 17985874b56SBryan Drewery @${_+_}target=${__target:realinstall=install}; \ 18065d88005SBryan Drewery dir=${__dir}; \ 18165d88005SBryan Drewery ${_SUBDIR_SH}; 182e54caebeSBryan Drewery__subdir_targets+= ${__target}_subdir_${DIRPRFX}${__dir} 183e54caebeSBryan Drewery.endif # ${__dir} == .WAIT 184ccfb12d6SBryan Drewery.endfor # __dir in ${SUBDIR} 185d9bb4215SBryan Drewery 186d9bb4215SBryan Drewery# Attach the subdir targets to the real target. 187d9bb4215SBryan Drewery# Only recurse on directly-called targets. I.e., don't recurse on dependencies 188d9bb4215SBryan Drewery# such as 'install' becoming {before,real,after}install, just recurse 189d9bb4215SBryan Drewery# 'install'. Despite that, 'realinstall' is special due to ordering issues 190d9bb4215SBryan Drewery# with 'afterinstall'. 191d9bb4215SBryan Drewery.if !defined(NO_SUBDIR) && (make(${__target}) || \ 192d9bb4215SBryan Drewery (${__target} == realinstall && make(install))) 193997ffab7SBryan Drewery${__target}: ${__subdir_targets} .PHONY 19403173d2fSBryan Drewery.endif # make(${__target}) 195b69c69e0SBryan Drewery.endfor # __target in ${SUBDIR_TARGETS} 19655ff8fb1SPoul-Henning Kamp 19703173d2fSBryan Drewery.endif # !target(_SUBDIR) 19850c5d27bSSimon J. Gerraty 1992231cd21SBryan Drewery# Ensure all targets exist 200b69c69e0SBryan Drewery.for __target in ${SUBDIR_TARGETS} 2012231cd21SBryan Drewery.if !target(${__target}) 2022231cd21SBryan Drewery${__target}: 2032231cd21SBryan Drewery.endif 2042231cd21SBryan Drewery.endfor 2052231cd21SBryan Drewery 20650c5d27bSSimon J. Gerraty.endif 207