1241823Smarcel# $FreeBSD: stable/11/share/mk/bsd.progs.mk 346919 2019-04-29 19:35:34Z ngie $
2242710Ssjg# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $
3242710Ssjg#
4242710Ssjg#	@(#) Copyright (c) 2006, Simon J. Gerraty
5242710Ssjg#
6242710Ssjg#	This file is provided in the hope that it will
7242710Ssjg#	be of use.  There is absolutely NO WARRANTY.
8242710Ssjg#	Permission to copy, redistribute or otherwise
9242710Ssjg#	use this file is hereby granted provided that 
10242710Ssjg#	the above copyright notice and this notice are
11242710Ssjg#	left intact. 
12242710Ssjg#      
13242710Ssjg#	Please send copies of changes and bug-fixes to:
14242710Ssjg#	sjg@crufty.net
15242710Ssjg#
16241823Smarcel
17242710Ssjg.MAIN: all
18241823Smarcel
19258095Ssjg.if defined(PROGS) || defined(PROGS_CXX)
20258095Ssjg# we really only use PROGS below...
21258095SsjgPROGS += ${PROGS_CXX}
22241823Smarcel
23242710Ssjg.if defined(PROG)
24242710Ssjg# just one of many
25290870SngiePROG_OVERRIDE_VARS +=	BINDIR BINGRP BINOWN BINMODE DPSRCS MAN NO_WERROR \
26298012Sngie			PROGNAME SRCS STRIP WARNS
27304144SbdreweryPROG_VARS +=	CFLAGS CXXFLAGS DEBUG_FLAGS DPADD INTERNALPROG LDADD LIBADD \
28304144Sbdrewery		LINKS LDFLAGS MLINKS ${PROG_OVERRIDE_VARS}
29242710Ssjg.for v in ${PROG_VARS:O:u}
30272055Sngie.if empty(${PROG_OVERRIDE_VARS:M$v})
31272055Sngie.if defined(${v}.${PROG})
32272055Sngie$v += ${${v}.${PROG}}
33272055Sngie.elif defined(${v}_${PROG})
34272055Sngie$v += ${${v}_${PROG}}
35272055Sngie.endif
36258095Ssjg.else
37346919Sngie.if defined(${v}.${PROG})
38346919Sngie$v = ${${v}.${PROG}}
39346919Sngie.elif defined(${v}_${PROG})
40346919Sngie$v = ${${v}_${PROG}}
41346919Sngie.endif
42258095Ssjg$v ?=
43249770Ssjg.endif
44242710Ssjg.endfor
45241823Smarcel
46296553Sbdrewery.if ${MK_DIRDEPS_BUILD} == "yes"
47296553Sbdrewery# Leave updating the Makefile.depend to the parent.
48296553SbdreweryUPDATE_DEPENDFILE = NO
49296553Sbdrewery
50296553Sbdrewery# Record our meta files for the parent to use.
51296553SbdreweryCLEANFILES+= ${PROG}.meta_files
52296553Sbdrewery${PROG}.meta_files: .NOMETA $${.MAKE.META.CREATED} ${_this}
53296553Sbdrewery	@echo "Updating ${.TARGET}: ${.OODATE:T:[1..8]}"
54296553Sbdrewery	@echo ${.MAKE.META.FILES} > ${.TARGET}
55296553Sbdrewery
56296553Sbdrewery.if !defined(_SKIP_BUILD)
57296553Sbdrewery.END: ${PROG}.meta_files
58241823Smarcel.endif
59296553Sbdrewery.endif	# ${MK_DIRDEPS_BUILD} == "yes"
60241823Smarcel
61242710Ssjg# prog.mk will do the rest
62289289Sbdrewery.else # !defined(PROG)
63296121Sbdrewery.if !defined(_SKIP_BUILD)
64288158Sbdreweryall: ${PROGS}
65296121Sbdrewery.endif
66241823Smarcel
67296553SbdreweryMETA_XTRAS+=	${cat ${PROGS:S/$/*.meta_files/} 2>/dev/null || true:L:sh}
68296122Sbdrewery
69296555Sbdrewery.if ${MK_STAGING} != "no" && !empty(PROGS)
70296555Sbdrewery# Stage from parent while respecting PROGNAME and BINDIR overrides.
71296555Sbdrewery.for _prog in ${PROGS}
72296555SbdrewerySTAGE_DIR.prog.${_prog}= ${STAGE_OBJTOP}${BINDIR.${_prog}:UBINDIR_${_prog}:U${BINDIR}}
73296555SbdrewerySTAGE_AS_SETS+=	prog.${_prog}
74296555SbdrewerySTAGE_AS_prog.${_prog}=	${PROGNAME.${_prog}:UPROGNAME_${_prog}:U${_prog}}
75296555Sbdrewerystage_as.prog.${_prog}: ${_prog}
76296555Sbdrewery.endfor
77296555Sbdrewery.endif	# ${MK_STAGING} != "no" && !empty(PROGS)
78241823Smarcel.endif
79288158Sbdrewery.endif	# PROGS || PROGS_CXX
80241823Smarcel
81288158Sbdrewery# These are handled by the main make process.
82274079Sngie.ifdef _RECURSING_PROGS
83296122SbdreweryMK_STAGING= no
84296122Sbdrewery
85296000Sbdrewery_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS CONFGROUPS FILESGROUPS INCSGROUPS \
86296000Sbdrewery		    SCRIPTS
87288158Sbdrewery.for v in ${_PROGS_GLOBAL_VARS}
88288158Sbdrewery$v =
89288158Sbdrewery.endfor
90274079Sngie.endif
91274079Sngie
92242710Ssjg# handle being called [bsd.]progs.mk
93258095Ssjg.include <bsd.prog.mk>
94241823Smarcel
95318332Sbdrewery# Find common sources among the PROGS to depend on them before building
96289286Sbdrewery# anything.  This allows parallelization without them each fighting over
97289286Sbdrewery# the same objects.
98289286Sbdrewery_PROGS_COMMON_SRCS=
99289286Sbdrewery_PROGS_ALL_SRCS=
100242710Ssjg.for p in ${PROGS}
101289286Sbdrewery.for s in ${SRCS.${p}}
102289286Sbdrewery.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}}
103289286Sbdrewery_PROGS_COMMON_SRCS+=	${s}
104289286Sbdrewery.else
105289286Sbdrewery_PROGS_ALL_SRCS+=	${s}
106289286Sbdrewery.endif
107289286Sbdrewery.endfor
108289286Sbdrewery.endfor
109289286Sbdrewery.if !empty(_PROGS_COMMON_SRCS)
110291340Sbdrewery_PROGS_COMMON_OBJS=	${_PROGS_COMMON_SRCS:M*.[dhly]}
111291340Sbdrewery.if !empty(_PROGS_COMMON_SRCS:N*.[dhly])
112291340Sbdrewery_PROGS_COMMON_OBJS+=	${_PROGS_COMMON_SRCS:N*.[dhly]:R:S/$/.o/g}
113291338Sbdrewery.endif
114318332Sbdrewery.endif
115318332Sbdrewery
116318332Sbdrewery# When recursing, ensure common sources are not rebuilt in META_MODE.
117318332Sbdrewery.if defined(_RECURSING_PROGS) && !empty(_PROGS_COMMON_OBJS) && \
118318332Sbdrewery    !empty(.MAKE.MODE:Mmeta)
119318332Sbdrewery${_PROGS_COMMON_OBJS}: .NOMETA
120318332Sbdrewery.endif
121318332Sbdrewery
122318332Sbdrewery.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
123318332Sbdrewery# tell progs.mk we might want to install things
124335643SbdreweryPROGS_TARGETS+= checkdpadd clean depend install
125335643Sbdrewery# Only handle removing depend files from the main process.
126335643Sbdrewery_PROG_MK.cleandir=	CLEANDEPENDFILES= CLEANDEPENDDIRS=
127335643Sbdrewery_PROG_MK.cleanobj=	CLEANDEPENDFILES= CLEANDEPENDDIRS=
128335643Sbdrewery# Only recurse on these if there is no objdir, meaning a normal
129335643Sbdrewery# 'clean' gets ran via the target defined in bsd.obj.mk.
130335643Sbdrewery# Same check from cleanobj: in bsd.obj.mk
131335643Sbdrewery.if ${CANONICALOBJDIR} == ${.CURDIR} || !exists(${CANONICALOBJDIR}/)
132335643SbdreweryPROGS_TARGETS+=	cleandir cleanobj
133335643Sbdrewery.endif
134318332Sbdrewery
135318332Sbdrewery# Ensure common objects are built before recursing.
136318332Sbdrewery.if !empty(_PROGS_COMMON_OBJS)
137289286Sbdrewery${PROGS}: ${_PROGS_COMMON_OBJS}
138289286Sbdrewery.endif
139289286Sbdrewery
140289286Sbdrewery.for p in ${PROGS}
141242710Ssjg.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
142242710Ssjg# bsd.prog.mk may need to know this
143242710Ssjgx.$p= PROG_CXX=$p
144241823Smarcel.endif
145241823Smarcel
146288158Sbdrewery# Main PROG target
147242710Ssjg$p ${p}_p: .PHONY .MAKE
148284288Ssjg	(cd ${.CURDIR} && \
149284288Ssjg	    DEPENDFILE=.depend.$p \
150294873Sbdrewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \
151289669Sbdrewery	    PROG=$p ${x.$p})
152241823Smarcel
153288158Sbdrewery# Pseudo targets for PROG, such as 'install'.
154242710Ssjg.for t in ${PROGS_TARGETS:O:u}
155242710Ssjg$p.$t: .PHONY .MAKE
156284288Ssjg	(cd ${.CURDIR} && \
157284288Ssjg	    DEPENDFILE=.depend.$p \
158294873Sbdrewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \
159335643Sbdrewery	    ${_PROG_MK.${t}} PROG=$p ${x.$p} ${@:E})
160241823Smarcel.endfor
161241823Smarcel.endfor
162241823Smarcel
163288158Sbdrewery# Depend main pseudo targets on all PROG.pseudo targets too.
164242710Ssjg.for t in ${PROGS_TARGETS:O:u}
165295976Sbdrewery.if make(${t})
166242710Ssjg$t: ${PROGS:%=%.$t}
167295976Sbdrewery.endif
168241823Smarcel.endfor
169289289Sbdrewery.endif	# !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
170