xref: /freebsd/share/mk/bsd.progs.mk (revision 19597c02338a01bf1ab3b25409528a1765b13a74)
181e68641SSimon J. Gerraty# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $
281e68641SSimon J. Gerraty#
381e68641SSimon J. Gerraty#	@(#) Copyright (c) 2006, Simon J. Gerraty
481e68641SSimon J. Gerraty#
581e68641SSimon J. Gerraty#	This file is provided in the hope that it will
681e68641SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
781e68641SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
881e68641SSimon J. Gerraty#	use this file is hereby granted provided that
981e68641SSimon J. Gerraty#	the above copyright notice and this notice are
1081e68641SSimon J. Gerraty#	left intact.
1181e68641SSimon J. Gerraty#
1281e68641SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
1381e68641SSimon J. Gerraty#	sjg@crufty.net
1481e68641SSimon J. Gerraty#
15c175365cSMarcel Moolenaar
1681e68641SSimon J. Gerraty.MAIN: all
17c175365cSMarcel Moolenaar
18b4ffe103SSimon J. Gerraty.if defined(PROGS) || defined(PROGS_CXX)
19b4ffe103SSimon J. Gerraty# we really only use PROGS below...
20b4ffe103SSimon J. GerratyPROGS += ${PROGS_CXX}
21c175365cSMarcel Moolenaar
22c175365cSMarcel Moolenaar.if defined(PROG)
2381e68641SSimon J. Gerraty# just one of many
240eb97ccaSEnji CooperPROG_OVERRIDE_VARS +=	BINDIR BINGRP BINOWN BINMODE CSTD CXXSTD DPSRCS MAN \
254ea5e107SVexedUXR			NO_SHARED MK_WERROR PROGNAME STRIP WARNS MK_ASAN MK_UBSAN
264ea5e107SVexedUXRPROG_VARS +=	SRCS CFLAGS CXXFLAGS DEBUG_FLAGS DPADD INTERNALPROG LDADD \
274ea5e107SVexedUXR		LIBADD LINKS LDFLAGS MLINKS ${PROG_OVERRIDE_VARS}
2881e68641SSimon J. Gerraty.for v in ${PROG_VARS:O:u}
2968e69f73SEnji Cooper.if empty(${PROG_OVERRIDE_VARS:M$v})
3068e69f73SEnji Cooper.if defined(${v}.${PROG})
3168e69f73SEnji Cooper$v += ${${v}.${PROG}}
3268e69f73SEnji Cooper.elif defined(${v}_${PROG})
3368e69f73SEnji Cooper$v += ${${v}_${PROG}}
3468e69f73SEnji Cooper.endif
35b4ffe103SSimon J. Gerraty.else
36b89cf12cSEnji Cooper.if defined(${v}.${PROG})
37b89cf12cSEnji Cooper$v = ${${v}.${PROG}}
38b89cf12cSEnji Cooper.elif defined(${v}_${PROG})
39b89cf12cSEnji Cooper$v = ${${v}_${PROG}}
40b89cf12cSEnji Cooper.endif
41b4ffe103SSimon J. Gerraty$v ?=
42628257b4SSimon J. Gerraty.endif
43c175365cSMarcel Moolenaar.endfor
44c175365cSMarcel Moolenaar
453655b043SBryan Drewery.if ${MK_DIRDEPS_BUILD} == "yes"
463655b043SBryan Drewery# Leave updating the Makefile.depend to the parent.
473655b043SBryan DreweryUPDATE_DEPENDFILE = NO
483655b043SBryan Drewery
493655b043SBryan Drewery# Record our meta files for the parent to use.
503655b043SBryan DreweryCLEANFILES+= ${PROG}.meta_files
513655b043SBryan Drewery${PROG}.meta_files: .NOMETA $${.MAKE.META.CREATED} ${_this}
523655b043SBryan Drewery	@echo "Updating ${.TARGET}: ${.OODATE:T:[1..8]}"
533655b043SBryan Drewery	@echo ${.MAKE.META.FILES} > ${.TARGET}
543655b043SBryan Drewery
553655b043SBryan Drewery.if !defined(_SKIP_BUILD)
563655b043SBryan Drewery.END: ${PROG}.meta_files
5781e68641SSimon J. Gerraty.endif
583655b043SBryan Drewery.endif	# ${MK_DIRDEPS_BUILD} == "yes"
59c175365cSMarcel Moolenaar
6081e68641SSimon J. Gerraty# prog.mk will do the rest
61add9ac40SBryan Drewery.else # !defined(PROG)
62db74470bSBryan Drewery.if !defined(_SKIP_BUILD)
63abb02fa2SBryan Dreweryall: ${PROGS}
64db74470bSBryan Drewery.endif
65c175365cSMarcel Moolenaar
663655b043SBryan DreweryMETA_XTRAS+=	${cat ${PROGS:S/$/*.meta_files/} 2>/dev/null || true:L:sh}
676647af9bSSimon J. Gerraty# the above does no use unless we pass it on to gendirdeps.mk
686647af9bSSimon J. GerratyGENDIRDEPS_ENV += META_XTRAS='${META_XTRAS}'
69342863e7SBryan Drewery
703cf3d039SBryan Drewery.if ${MK_STAGING} != "no" && !empty(PROGS)
713cf3d039SBryan Drewery# Stage from parent while respecting PROGNAME and BINDIR overrides.
723cf3d039SBryan Drewery.for _prog in ${PROGS}
733cf3d039SBryan DrewerySTAGE_DIR.prog.${_prog}= ${STAGE_OBJTOP}${BINDIR.${_prog}:UBINDIR_${_prog}:U${BINDIR}}
743cf3d039SBryan DrewerySTAGE_AS_SETS+=	prog.${_prog}
753cf3d039SBryan DrewerySTAGE_AS_prog.${_prog}=	${PROGNAME.${_prog}:UPROGNAME_${_prog}:U${_prog}}
763cf3d039SBryan Drewerystage_as.prog.${_prog}: ${_prog}
773cf3d039SBryan Drewery.endfor
783cf3d039SBryan Drewery.endif	# ${MK_STAGING} != "no" && !empty(PROGS)
79c175365cSMarcel Moolenaar.endif
80abb02fa2SBryan Drewery.endif	# PROGS || PROGS_CXX
81c175365cSMarcel Moolenaar
82abb02fa2SBryan Drewery# These are handled by the main make process.
83068ebf32SEnji Cooper.ifdef _RECURSING_PROGS
84342863e7SBryan DreweryMK_STAGING= no
85342863e7SBryan Drewery
86c86ac319SBryan Drewery_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS CONFGROUPS DIRS FILESGROUPS INCSGROUPS \
871fdc8e0eSBryan Drewery		    SCRIPTS
88abb02fa2SBryan Drewery.for v in ${_PROGS_GLOBAL_VARS}
89abb02fa2SBryan Drewery$v =
90abb02fa2SBryan Drewery.endfor
91068ebf32SEnji Cooper.endif
92068ebf32SEnji Cooper
93b4ffe103SSimon J. Gerraty.include <bsd.prog.mk>
9481e68641SSimon J. Gerraty
955d0866bcSBryan Drewery.if !defined(_SKIP_BUILD)
96f59d3d55SBryan Drewery# Find common sources among the PROGS to depend on them before building
973be00685SBryan Drewery# anything.  This allows parallelization without them each fighting over
983be00685SBryan Drewery# the same objects.
994ea5e107SVexedUXR_PROGS_COMMON_SRCS= ${DPSRCS} ${SRCS}
1004ea5e107SVexedUXR_PROGS_ALL_SRCS= ${SRCS}
1013be00685SBryan Drewery.for p in ${PROGS}
1023be00685SBryan Drewery.for s in ${SRCS.${p}}
1033be00685SBryan Drewery.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}}
1043be00685SBryan Drewery_PROGS_COMMON_SRCS+=	${s}
1053be00685SBryan Drewery.else
1063be00685SBryan Drewery_PROGS_ALL_SRCS+=	${s}
1073be00685SBryan Drewery.endif
1083be00685SBryan Drewery.endfor
1093be00685SBryan Drewery.endfor
1103be00685SBryan Drewery.if !empty(_PROGS_COMMON_SRCS)
1118ffe95d6SBryan Drewery_PROGS_COMMON_OBJS=	${_PROGS_COMMON_SRCS:M*.[dhly]}
1128ffe95d6SBryan Drewery.if !empty(_PROGS_COMMON_SRCS:N*.[dhly])
113a2f16e53SBryan Drewery_PROGS_COMMON_OBJS+=	${_PROGS_COMMON_SRCS:N*.[dhly]:${OBJS_SRCS_FILTER:ts:}:S/$/.o/g}
114c3d4829eSBryan Drewery.endif
115f59d3d55SBryan Drewery.endif
116f59d3d55SBryan Drewery
117f59d3d55SBryan Drewery# When recursing, ensure common sources are not rebuilt in META_MODE.
118f59d3d55SBryan Drewery.if defined(_RECURSING_PROGS) && !empty(_PROGS_COMMON_OBJS) && \
119f59d3d55SBryan Drewery    !empty(.MAKE.MODE:Mmeta)
120f59d3d55SBryan Drewery${_PROGS_COMMON_OBJS}: .NOMETA
121f59d3d55SBryan Drewery.endif
1225d0866bcSBryan Drewery.endif
123f59d3d55SBryan Drewery
124f59d3d55SBryan Drewery.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
125f59d3d55SBryan Drewery# tell progs.mk we might want to install things
12613353986SBryan DreweryPROGS_TARGETS+= checkdpadd clean depend install
12713353986SBryan Drewery# Only handle removing depend files from the main process.
12813353986SBryan Drewery_PROG_MK.cleandir=	CLEANDEPENDFILES= CLEANDEPENDDIRS=
12913353986SBryan Drewery_PROG_MK.cleanobj=	CLEANDEPENDFILES= CLEANDEPENDDIRS=
13013353986SBryan Drewery# Only recurse on these if there is no objdir, meaning a normal
13113353986SBryan Drewery# 'clean' gets ran via the target defined in bsd.obj.mk.
13213353986SBryan Drewery# Same check from cleanobj: in bsd.obj.mk
13313353986SBryan Drewery.if ${CANONICALOBJDIR} == ${.CURDIR} || !exists(${CANONICALOBJDIR}/)
13413353986SBryan DreweryPROGS_TARGETS+=	cleandir cleanobj
13513353986SBryan Drewery.endif
136f59d3d55SBryan Drewery
13781e68641SSimon J. Gerraty.for p in ${PROGS}
13881e68641SSimon J. Gerraty.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
13981e68641SSimon J. Gerraty# bsd.prog.mk may need to know this
14081e68641SSimon J. Gerratyx.$p= PROG_CXX=$p
14181e68641SSimon J. Gerraty.endif
14281e68641SSimon J. Gerraty
143abb02fa2SBryan Drewery# Main PROG target
1445d0866bcSBryan Drewery$p ${p}_p: .PHONY .MAKE ${_PROGS_COMMON_OBJS}
145ab21b9abSSimon J. Gerraty	(cd ${.CURDIR} && \
146ab21b9abSSimon J. Gerraty	    DEPENDFILE=.depend.$p \
147dab13282SBryan Drewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \
1485d6be39aSBryan Drewery	    PROG=$p ${x.$p})
14981e68641SSimon J. Gerraty
150abb02fa2SBryan Drewery# Pseudo targets for PROG, such as 'install'.
15181e68641SSimon J. Gerraty.for t in ${PROGS_TARGETS:O:u}
1525d0866bcSBryan Drewery$p.$t: .PHONY .MAKE ${_PROGS_COMMON_OBJS}
153ab21b9abSSimon J. Gerraty	(cd ${.CURDIR} && \
154ab21b9abSSimon J. Gerraty	    DEPENDFILE=.depend.$p \
155dab13282SBryan Drewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \
15613353986SBryan Drewery	    ${_PROG_MK.${t}} PROG=$p ${x.$p} ${@:E})
15781e68641SSimon J. Gerraty.endfor
158*19597c02SColin Percival.ORDER: installdirs $p.install
159c175365cSMarcel Moolenaar.endfor
160c175365cSMarcel Moolenaar
161abb02fa2SBryan Drewery# Depend main pseudo targets on all PROG.pseudo targets too.
16281e68641SSimon J. Gerraty.for t in ${PROGS_TARGETS:O:u}
163a65a0e56SBryan Drewery.if make(${t})
16481e68641SSimon J. Gerraty$t: ${PROGS:%=%.$t}
165a65a0e56SBryan Drewery.endif
166c175365cSMarcel Moolenaar.endfor
167add9ac40SBryan Drewery.endif	# !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
168