1# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $ 2# 3# @(#) Copyright (c) 2006, Simon J. Gerraty 4# 5# This file is provided in the hope that it will 6# be of use. There is absolutely NO WARRANTY. 7# Permission to copy, redistribute or otherwise 8# use this file is hereby granted provided that 9# the above copyright notice and this notice are 10# left intact. 11# 12# Please send copies of changes and bug-fixes to: 13# sjg@crufty.net 14# 15 16.MAIN: all 17 18.if defined(PROGS) || defined(PROGS_CXX) 19# we really only use PROGS below... 20PROGS += ${PROGS_CXX} 21 22.if defined(PROG) 23# just one of many 24PROG_OVERRIDE_VARS += BINDIR BINGRP BINOWN BINMODE CSTD CXXSTD DPSRCS MAN \ 25 NO_SHARED MK_WERROR PROGNAME STRIP WARNS MK_ASAN MK_UBSAN 26PROG_VARS += SRCS CFLAGS CXXFLAGS DEBUG_FLAGS DPADD INTERNALPROG LDADD \ 27 LIBADD LINKS LDFLAGS MLINKS ${PROG_OVERRIDE_VARS} 28.for v in ${PROG_VARS:O:u} 29.if empty(${PROG_OVERRIDE_VARS:M$v}) 30.if defined(${v}.${PROG}) 31$v += ${${v}.${PROG}} 32.elif defined(${v}_${PROG}) 33$v += ${${v}_${PROG}} 34.endif 35.else 36.if defined(${v}.${PROG}) 37$v = ${${v}.${PROG}} 38.elif defined(${v}_${PROG}) 39$v = ${${v}_${PROG}} 40.endif 41$v ?= 42.endif 43.endfor 44 45.if ${MK_DIRDEPS_BUILD} == "yes" 46# Leave updating the Makefile.depend to the parent. 47UPDATE_DEPENDFILE = NO 48 49# Record our meta files for the parent to use. 50CLEANFILES+= ${PROG}.meta_files 51${PROG}.meta_files: .NOMETA $${.MAKE.META.CREATED} ${_this} 52 @echo "Updating ${.TARGET}: ${.OODATE:T:[1..8]}" 53 @echo ${.MAKE.META.FILES} > ${.TARGET} 54 55.if !defined(_SKIP_BUILD) 56.END: ${PROG}.meta_files 57.endif 58.endif # ${MK_DIRDEPS_BUILD} == "yes" 59 60# prog.mk will do the rest 61.else # !defined(PROG) 62.if !defined(_SKIP_BUILD) 63all: ${PROGS} 64.endif 65 66META_XTRAS+= ${cat ${PROGS:S/$/*.meta_files/} 2>/dev/null || true:L:sh} 67# the above does no use unless we pass it on to gendirdeps.mk 68GENDIRDEPS_ENV += META_XTRAS='${META_XTRAS}' 69 70.if ${MK_STAGING} != "no" && !empty(PROGS) 71# Stage from parent while respecting PROGNAME and BINDIR overrides. 72.for _prog in ${PROGS} 73STAGE_DIR.prog.${_prog}= ${STAGE_OBJTOP}${BINDIR.${_prog}:UBINDIR_${_prog}:U${BINDIR}} 74STAGE_AS_SETS+= prog.${_prog} 75STAGE_AS_prog.${_prog}= ${PROGNAME.${_prog}:UPROGNAME_${_prog}:U${_prog}} 76stage_as.prog.${_prog}: ${_prog} 77.endfor 78.endif # ${MK_STAGING} != "no" && !empty(PROGS) 79.endif 80.endif # PROGS || PROGS_CXX 81 82# These are handled by the main make process. 83.ifdef _RECURSING_PROGS 84MK_STAGING= no 85 86_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS CONFGROUPS DIRS FILESGROUPS INCSGROUPS \ 87 SCRIPTS 88.for v in ${_PROGS_GLOBAL_VARS} 89$v = 90.endfor 91.endif 92 93.include <bsd.prog.mk> 94 95.if !defined(_SKIP_BUILD) 96# Find common sources among the PROGS to depend on them before building 97# anything. This allows parallelization without them each fighting over 98# the same objects. 99_PROGS_COMMON_SRCS= ${DPSRCS} ${SRCS} 100_PROGS_ALL_SRCS= ${SRCS} 101.for p in ${PROGS} 102.for s in ${SRCS.${p}} 103.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}} 104_PROGS_COMMON_SRCS+= ${s} 105.else 106_PROGS_ALL_SRCS+= ${s} 107.endif 108.endfor 109.endfor 110.if !empty(_PROGS_COMMON_SRCS) 111_PROGS_COMMON_OBJS= ${_PROGS_COMMON_SRCS:M*.[dhly]} 112.if !empty(_PROGS_COMMON_SRCS:N*.[dhly]) 113_PROGS_COMMON_OBJS+= ${_PROGS_COMMON_SRCS:N*.[dhly]:${OBJS_SRCS_FILTER:ts:}:S/$/.o/g} 114.endif 115.endif 116 117# When recursing, ensure common sources are not rebuilt in META_MODE. 118.if defined(_RECURSING_PROGS) && !empty(_PROGS_COMMON_OBJS) && \ 119 !empty(.MAKE.MODE:Mmeta) 120${_PROGS_COMMON_OBJS}: .NOMETA 121.endif 122.endif 123 124.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 125# tell progs.mk we might want to install things 126PROGS_TARGETS+= checkdpadd clean depend install 127# Only handle removing depend files from the main process. 128_PROG_MK.cleandir= CLEANDEPENDFILES= CLEANDEPENDDIRS= 129_PROG_MK.cleanobj= CLEANDEPENDFILES= CLEANDEPENDDIRS= 130# Only recurse on these if there is no objdir, meaning a normal 131# 'clean' gets ran via the target defined in bsd.obj.mk. 132# Same check from cleanobj: in bsd.obj.mk 133.if ${CANONICALOBJDIR} == ${.CURDIR} || !exists(${CANONICALOBJDIR}/) 134PROGS_TARGETS+= cleandir cleanobj 135.endif 136 137.for p in ${PROGS} 138.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p) 139# bsd.prog.mk may need to know this 140x.$p= PROG_CXX=$p 141.endif 142 143# Main PROG target 144$p ${p}_p: .PHONY .MAKE ${_PROGS_COMMON_OBJS} 145 (cd ${.CURDIR} && \ 146 DEPENDFILE=.depend.$p \ 147 NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \ 148 PROG=$p ${x.$p}) 149 150# Pseudo targets for PROG, such as 'install'. 151.for t in ${PROGS_TARGETS:O:u} 152$p.$t: .PHONY .MAKE ${_PROGS_COMMON_OBJS} 153 (cd ${.CURDIR} && \ 154 DEPENDFILE=.depend.$p \ 155 NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \ 156 ${_PROG_MK.${t}} PROG=$p ${x.$p} ${@:E}) 157.endfor 158.ORDER: installdirs $p.install 159.endfor 160 161# Depend main pseudo targets on all PROG.pseudo targets too. 162.for t in ${PROGS_TARGETS:O:u} 163.if make(${t}) 164$t: ${PROGS:%=%.$t} 165.endif 166.endfor 167.endif # !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 168