bsd.subdir.mk revision 295380
1107120Sjulian#	from: @(#)bsd.subdir.mk	5.9 (Berkeley) 2/1/91
2107120Sjulian# $FreeBSD: head/share/mk/bsd.subdir.mk 295380 2016-02-07 18:40:04Z ngie $
3107120Sjulian#
4107120Sjulian# The include file <bsd.subdir.mk> contains the default targets
5107120Sjulian# for building subdirectories.
6107120Sjulian#
7107120Sjulian# For all of the directories listed in the variable SUBDIRS, the
8107120Sjulian# specified directory will be visited and the target made. There is
9107120Sjulian# also a default target which allows the command "make subdir" where
10107120Sjulian# subdir is any directory listed in the variable SUBDIRS.
11107120Sjulian#
12107120Sjulian#
13107120Sjulian# +++ variables +++
14107120Sjulian#
15107120Sjulian# DISTRIBUTION	Name of distribution. [base]
16107120Sjulian#
17107120Sjulian# SUBDIR	A list of subdirectories that should be built as well.
18107120Sjulian#		Each of the targets will execute the same target in the
19107120Sjulian#		subdirectories. SUBDIR.yes is automatically appeneded
20107120Sjulian#		to this list.
21107120Sjulian#
22107120Sjulian# +++ targets +++
23107120Sjulian#
24107120Sjulian#	distribute:
25107120Sjulian# 		This is a variant of install, which will
26107120Sjulian# 		put the stuff into the right "distribution".
27107120Sjulian#
28114878Sjulian# 	See SUBDIR_TARGETS for list of targets that will recurse.
29107120Sjulian#
30107120Sjulian# 	Targets defined in STANDALONE_SUBDIR_TARGETS will always be ran
31107120Sjulian# 	with SUBDIR_PARALLEL and will not respect .WAIT or SUBDIR_DEPEND_
32107120Sjulian# 	values.
33122634Semax#
34107120Sjulian# 	SUBDIR_TARGETS and STANDALONE_SUBDIR_TARGETS can be appended to
35107120Sjulian# 	via make.conf or src.conf.
36107120Sjulian#
37107120Sjulian
38107120Sjulian.if !target(__<bsd.subdir.mk>__)
39107120Sjulian__<bsd.subdir.mk>__:
40107120Sjulian
41107120SjulianSUBDIR_TARGETS+= \
42107120Sjulian		all all-man buildconfig buildfiles buildincludes \
43107120Sjulian		checkdpadd clean cleandepend cleandir cleanilinks \
44107120Sjulian		cleanobj depend distribute files includes installconfig \
45107120Sjulian		installfiles installincludes realinstall lint maninstall \
46107120Sjulian		manlint obj objlink tags \
47107120Sjulian
48107120Sjulian# Described above.
49107120SjulianSTANDALONE_SUBDIR_TARGETS+= \
50107120Sjulian		obj check checkdpadd clean cleandepend cleandir \
51107120Sjulian		cleanilinks cleanobj installconfig \
52107120Sjulian
53107120Sjulian.include <bsd.init.mk>
54107120Sjulian
55107120Sjulian.if !defined(NEED_SUBDIR)
56107120Sjulian.if ${.MAKE.LEVEL} == 0 && ${MK_DIRDEPS_BUILD} == "yes" && !empty(SUBDIR) && !(make(clean*) || make(destroy*))
57107120Sjulian.include <meta.subdir.mk>
58107120Sjulian# ignore this
59107120Sjulian_SUBDIR:
60107120Sjulian.endif
61107120Sjulian.endif
62107120Sjulian
63107120SjulianDISTRIBUTION?=	base
64107120Sjulian.if !target(distribute)
65107120Sjuliandistribute: .MAKE
66107120Sjulian.for dist in ${DISTRIBUTION}
67107120Sjulian	${_+_}cd ${.CURDIR}; \
68107120Sjulian	    ${MAKE} install -DNO_SUBDIR DESTDIR=${DISTDIR}/${dist} SHARED=copies
69107120Sjulian.endfor
70107120Sjulian.endif
71107120Sjulian
72107120Sjulian# Convenience targets to run 'build${target}' and 'install${target}' when
73107120Sjulian# calling 'make ${target}'.
74107120Sjulian.for __target in files includes
75107120Sjulian.if !target(${__target})
76107120Sjulian${__target}:	build${__target} install${__target}
77107120Sjulian.ORDER:		build${__target} install${__target}
78107120Sjulian.endif
79107120Sjulian.endfor
80107120Sjulian
81107120Sjulian# Make 'install' supports a before and after target.  Actual install
82107120Sjulian# hooks are placed in 'realinstall'.
83107120Sjulian.if !target(install)
84107120Sjulian.for __stage in before real after
85107120Sjulian.if !target(${__stage}install)
86107120Sjulian${__stage}install:
87107120Sjulian.endif
88107120Sjulian.endfor
89107120Sjulianinstall:	beforeinstall realinstall afterinstall
90107120Sjulian.ORDER:		beforeinstall realinstall afterinstall
91107120Sjulian.endif
92107120Sjulian
93107120Sjulian# SUBDIR recursing may be disabled for MK_DIRDEPS_BUILD
94107120Sjulian.if !target(_SUBDIR)
95107120Sjulian
96107120Sjulian.if defined(SUBDIR)
97107120SjulianSUBDIR:=${SUBDIR} ${SUBDIR.yes}
98107120SjulianSUBDIR:=${SUBDIR:u}
99107120Sjulian.endif
100107120Sjulian
101107120Sjulian# Subdir code shared among 'make <subdir>', 'make <target>' and SUBDIR_PARALLEL.
102107120Sjulian_SUBDIR_SH=	\
103107120Sjulian		if test -d ${.CURDIR}/$${dir}.${MACHINE_ARCH}; then \
104107120Sjulian			dir=$${dir}.${MACHINE_ARCH}; \
105107120Sjulian		fi; \
106107120Sjulian		${ECHODIR} "===> ${DIRPRFX}$${dir} ($${target})"; \
107107120Sjulian		cd ${.CURDIR}/$${dir}; \
108107120Sjulian		${MAKE} $${target} DIRPRFX=${DIRPRFX}$${dir}/
109107120Sjulian
110107120Sjulian_SUBDIR: .USEBEFORE
111107120Sjulian.if defined(SUBDIR) && !empty(SUBDIR) && !defined(NO_SUBDIR)
112107120Sjulian	@${_+_}target=${.TARGET:realinstall=install}; \
113107120Sjulian	    for dir in ${SUBDIR:N.WAIT}; do ( ${_SUBDIR_SH} ); done
114107120Sjulian.endif
115107120Sjulian
116107120Sjulian${SUBDIR:N.WAIT}: .PHONY .MAKE
117107120Sjulian	${_+_}@target=all; \
118107120Sjulian	    dir=${.TARGET}; \
119107120Sjulian	    ${_SUBDIR_SH};
120107120Sjulian
121107120Sjulian.for __target in ${SUBDIR_TARGETS}
122107120Sjulian# Only recurse on directly-called targets.  I.e., don't recurse on dependencies
123107120Sjulian# such as 'install' becoming {before,real,after}install, just recurse
124107120Sjulian# 'install'.  Despite that, 'realinstall' is special due to ordering issues
125107120Sjulian# with 'afterinstall'.
126107120Sjulian.if make(${__target}) || (${__target} == realinstall && make(install))
127107120Sjulian# Can ordering be skipped for this and SUBDIR_PARALLEL forced?
128107120Sjulian.if ${STANDALONE_SUBDIR_TARGETS:M${__target}}
129107120Sjulian_is_standalone_target=	1
130107120SjulianSUBDIR:=	${SUBDIR:N.WAIT}
131107120Sjulian.else
132107120Sjulian_is_standalone_target=	0
133107120Sjulian.endif
134107120Sjulian.if defined(SUBDIR_PARALLEL) || ${_is_standalone_target} == 1
135107120Sjulian__subdir_targets=
136114878Sjulian.for __dir in ${SUBDIR}
137107120Sjulian.if ${__dir} == .WAIT
138107120Sjulian__subdir_targets+= .WAIT
139107120Sjulian.else
140107120Sjulian__subdir_targets+= ${__target}_subdir_${__dir}
141107120Sjulian__deps=
142107120Sjulian.if ${_is_standalone_target} == 0
143107120Sjulian.for __dep in ${SUBDIR_DEPEND_${__dir}}
144107120Sjulian__deps+= ${__target}_subdir_${__dep}
145107120Sjulian.endfor
146107120Sjulian.endif
147107120Sjulian${__target}_subdir_${__dir}: .PHONY .MAKE ${__deps}
148107120Sjulian.if !defined(NO_SUBDIR)
149107120Sjulian	@${_+_}target=${__target:realinstall=install}; \
150107120Sjulian	    dir=${__dir}; \
151107120Sjulian	    ${_SUBDIR_SH};
152107120Sjulian.endif
153107120Sjulian.endif
154107120Sjulian.endfor	# __dir in ${SUBDIR}
155107120Sjulian${__target}: ${__subdir_targets}
156107120Sjulian.else
157107120Sjulian${__target}: _SUBDIR
158107120Sjulian.endif	# SUBDIR_PARALLEL || _is_standalone_target
159107120Sjulian.endif	# make(${__target})
160107120Sjulian.endfor	# __target in ${SUBDIR_TARGETS}
161107120Sjulian
162107120Sjulian.endif	# !target(_SUBDIR)
163107120Sjulian
164107120Sjulian# Ensure all targets exist
165107120Sjulian.for __target in ${SUBDIR_TARGETS}
166107120Sjulian.if !target(${__target})
167107120Sjulian${__target}:
168107120Sjulian.endif
169107120Sjulian.endfor
170107120Sjulian
171107120Sjulian.endif
172107120Sjulian