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