bsd.progs.mk revision 335643
1241823Smarcel# $FreeBSD: stable/11/share/mk/bsd.progs.mk 335643 2018-06-25 18:53:06Z bdrewery $ 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 37258095Ssjg$v ?= 38249770Ssjg.endif 39242710Ssjg.endfor 40241823Smarcel 41296553Sbdrewery.if ${MK_DIRDEPS_BUILD} == "yes" 42296553Sbdrewery# Leave updating the Makefile.depend to the parent. 43296553SbdreweryUPDATE_DEPENDFILE = NO 44296553Sbdrewery 45296553Sbdrewery# Record our meta files for the parent to use. 46296553SbdreweryCLEANFILES+= ${PROG}.meta_files 47296553Sbdrewery${PROG}.meta_files: .NOMETA $${.MAKE.META.CREATED} ${_this} 48296553Sbdrewery @echo "Updating ${.TARGET}: ${.OODATE:T:[1..8]}" 49296553Sbdrewery @echo ${.MAKE.META.FILES} > ${.TARGET} 50296553Sbdrewery 51296553Sbdrewery.if !defined(_SKIP_BUILD) 52296553Sbdrewery.END: ${PROG}.meta_files 53241823Smarcel.endif 54296553Sbdrewery.endif # ${MK_DIRDEPS_BUILD} == "yes" 55241823Smarcel 56242710Ssjg# prog.mk will do the rest 57289289Sbdrewery.else # !defined(PROG) 58296121Sbdrewery.if !defined(_SKIP_BUILD) 59288158Sbdreweryall: ${PROGS} 60296121Sbdrewery.endif 61241823Smarcel 62296553SbdreweryMETA_XTRAS+= ${cat ${PROGS:S/$/*.meta_files/} 2>/dev/null || true:L:sh} 63296122Sbdrewery 64296555Sbdrewery.if ${MK_STAGING} != "no" && !empty(PROGS) 65296555Sbdrewery# Stage from parent while respecting PROGNAME and BINDIR overrides. 66296555Sbdrewery.for _prog in ${PROGS} 67296555SbdrewerySTAGE_DIR.prog.${_prog}= ${STAGE_OBJTOP}${BINDIR.${_prog}:UBINDIR_${_prog}:U${BINDIR}} 68296555SbdrewerySTAGE_AS_SETS+= prog.${_prog} 69296555SbdrewerySTAGE_AS_prog.${_prog}= ${PROGNAME.${_prog}:UPROGNAME_${_prog}:U${_prog}} 70296555Sbdrewerystage_as.prog.${_prog}: ${_prog} 71296555Sbdrewery.endfor 72296555Sbdrewery.endif # ${MK_STAGING} != "no" && !empty(PROGS) 73241823Smarcel.endif 74288158Sbdrewery.endif # PROGS || PROGS_CXX 75241823Smarcel 76288158Sbdrewery# These are handled by the main make process. 77274079Sngie.ifdef _RECURSING_PROGS 78296122SbdreweryMK_STAGING= no 79296122Sbdrewery 80296000Sbdrewery_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS CONFGROUPS FILESGROUPS INCSGROUPS \ 81296000Sbdrewery SCRIPTS 82288158Sbdrewery.for v in ${_PROGS_GLOBAL_VARS} 83288158Sbdrewery$v = 84288158Sbdrewery.endfor 85274079Sngie.endif 86274079Sngie 87242710Ssjg# handle being called [bsd.]progs.mk 88258095Ssjg.include <bsd.prog.mk> 89241823Smarcel 90318332Sbdrewery# Find common sources among the PROGS to depend on them before building 91289286Sbdrewery# anything. This allows parallelization without them each fighting over 92289286Sbdrewery# the same objects. 93289286Sbdrewery_PROGS_COMMON_SRCS= 94289286Sbdrewery_PROGS_ALL_SRCS= 95242710Ssjg.for p in ${PROGS} 96289286Sbdrewery.for s in ${SRCS.${p}} 97289286Sbdrewery.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}} 98289286Sbdrewery_PROGS_COMMON_SRCS+= ${s} 99289286Sbdrewery.else 100289286Sbdrewery_PROGS_ALL_SRCS+= ${s} 101289286Sbdrewery.endif 102289286Sbdrewery.endfor 103289286Sbdrewery.endfor 104289286Sbdrewery.if !empty(_PROGS_COMMON_SRCS) 105291340Sbdrewery_PROGS_COMMON_OBJS= ${_PROGS_COMMON_SRCS:M*.[dhly]} 106291340Sbdrewery.if !empty(_PROGS_COMMON_SRCS:N*.[dhly]) 107291340Sbdrewery_PROGS_COMMON_OBJS+= ${_PROGS_COMMON_SRCS:N*.[dhly]:R:S/$/.o/g} 108291338Sbdrewery.endif 109318332Sbdrewery.endif 110318332Sbdrewery 111318332Sbdrewery# When recursing, ensure common sources are not rebuilt in META_MODE. 112318332Sbdrewery.if defined(_RECURSING_PROGS) && !empty(_PROGS_COMMON_OBJS) && \ 113318332Sbdrewery !empty(.MAKE.MODE:Mmeta) 114318332Sbdrewery${_PROGS_COMMON_OBJS}: .NOMETA 115318332Sbdrewery.endif 116318332Sbdrewery 117318332Sbdrewery.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 118318332Sbdrewery# tell progs.mk we might want to install things 119335643SbdreweryPROGS_TARGETS+= checkdpadd clean depend install 120335643Sbdrewery# Only handle removing depend files from the main process. 121335643Sbdrewery_PROG_MK.cleandir= CLEANDEPENDFILES= CLEANDEPENDDIRS= 122335643Sbdrewery_PROG_MK.cleanobj= CLEANDEPENDFILES= CLEANDEPENDDIRS= 123335643Sbdrewery# Only recurse on these if there is no objdir, meaning a normal 124335643Sbdrewery# 'clean' gets ran via the target defined in bsd.obj.mk. 125335643Sbdrewery# Same check from cleanobj: in bsd.obj.mk 126335643Sbdrewery.if ${CANONICALOBJDIR} == ${.CURDIR} || !exists(${CANONICALOBJDIR}/) 127335643SbdreweryPROGS_TARGETS+= cleandir cleanobj 128335643Sbdrewery.endif 129318332Sbdrewery 130318332Sbdrewery# Ensure common objects are built before recursing. 131318332Sbdrewery.if !empty(_PROGS_COMMON_OBJS) 132289286Sbdrewery${PROGS}: ${_PROGS_COMMON_OBJS} 133289286Sbdrewery.endif 134289286Sbdrewery 135289286Sbdrewery.for p in ${PROGS} 136242710Ssjg.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p) 137242710Ssjg# bsd.prog.mk may need to know this 138242710Ssjgx.$p= PROG_CXX=$p 139241823Smarcel.endif 140241823Smarcel 141288158Sbdrewery# Main PROG target 142242710Ssjg$p ${p}_p: .PHONY .MAKE 143284288Ssjg (cd ${.CURDIR} && \ 144284288Ssjg DEPENDFILE=.depend.$p \ 145294873Sbdrewery NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \ 146289669Sbdrewery PROG=$p ${x.$p}) 147241823Smarcel 148288158Sbdrewery# Pseudo targets for PROG, such as 'install'. 149242710Ssjg.for t in ${PROGS_TARGETS:O:u} 150242710Ssjg$p.$t: .PHONY .MAKE 151284288Ssjg (cd ${.CURDIR} && \ 152284288Ssjg DEPENDFILE=.depend.$p \ 153294873Sbdrewery NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS=t \ 154335643Sbdrewery ${_PROG_MK.${t}} PROG=$p ${x.$p} ${@:E}) 155241823Smarcel.endfor 156241823Smarcel.endfor 157241823Smarcel 158288158Sbdrewery# Depend main pseudo targets on all PROG.pseudo targets too. 159242710Ssjg.for t in ${PROGS_TARGETS:O:u} 160295976Sbdrewery.if make(${t}) 161242710Ssjg$t: ${PROGS:%=%.$t} 162295976Sbdrewery.endif 163241823Smarcel.endfor 164289289Sbdrewery.endif # !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 165