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