1241823Smarcel# $FreeBSD: releng/10.3/share/mk/bsd.progs.mk 291791 2015-12-04 18:09:51Z 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 19260005Sjmmv.if defined(PROGS) || defined(PROGS_CXX) 20260005Sjmmv# we really only use PROGS below... 21260005SjmmvPROGS += ${PROGS_CXX} 22241823Smarcel 23242710Ssjg# In meta mode, we can capture dependenices for _one_ of the progs. 24242710Ssjg# if makefile doesn't nominate one, we use the first. 25260005Sjmmv.if defined(.PARSEDIR) 26242710Ssjg.ifndef UPDATE_DEPENDFILE_PROG 27242710SsjgUPDATE_DEPENDFILE_PROG = ${PROGS:[1]} 28242710Ssjg.export UPDATE_DEPENDFILE_PROG 29241823Smarcel.endif 30260005Sjmmv.else 31260005SjmmvUPDATE_DEPENDFILE_PROG?= no 32260005Sjmmv.endif 33241823Smarcel 34242710Ssjg.ifndef PROG 35242710Ssjg# They may have asked us to build just one 36242710Ssjg.for t in ${PROGS} 37242710Ssjg.if make($t) 38291790Sbdrewery.if ${PROGS_CXX:U:M${t}} 39291790SbdreweryPROG_CXX ?= $t 40291790Sbdrewery.endif 41242710SsjgPROG ?= $t 42241823Smarcel.endif 43242710Ssjg.endfor 44242710Ssjg.endif 45241823Smarcel 46242710Ssjg.if defined(PROG) 47242710Ssjg# just one of many 48291189SngiePROG_OVERRIDE_VARS += BINDIR BINGRP BINOWN BINMODE DPSRCS MAN NO_WERROR \ 49291189Sngie PROGNAME SRCS WARNS 50289052SbdreweryPROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD LINKS \ 51289052Sbdrewery LDFLAGS MLINKS ${PROG_OVERRIDE_VARS} 52242710Ssjg.for v in ${PROG_VARS:O:u} 53273501Sngie.if empty(${PROG_OVERRIDE_VARS:M$v}) 54273501Sngie.if defined(${v}.${PROG}) 55273501Sngie$v += ${${v}.${PROG}} 56273501Sngie.elif defined(${v}_${PROG}) 57273501Sngie$v += ${${v}_${PROG}} 58273501Sngie.endif 59260005Sjmmv.else 60260005Sjmmv$v ?= 61249770Ssjg.endif 62242710Ssjg.endfor 63241823Smarcel 64242710Ssjg# for meta mode, there can be only one! 65260005Sjmmv.if ${PROG} == ${UPDATE_DEPENDFILE_PROG} 66242710SsjgUPDATE_DEPENDFILE ?= yes 67241823Smarcel.endif 68242710SsjgUPDATE_DEPENDFILE ?= NO 69241823Smarcel 70242710Ssjg# ensure that we don't clobber each other's dependencies 71242710SsjgDEPENDFILE?= .depend.${PROG} 72242710Ssjg# prog.mk will do the rest 73291790Sbdrewery.else # !defined(PROG) 74289051Sbdreweryall: ${PROGS} 75241823Smarcel 76242710Ssjg# We cannot capture dependencies for meta mode here 77242710SsjgUPDATE_DEPENDFILE = NO 78242710Ssjg# nor can we safely run in parallel. 79242710Ssjg.NOTPARALLEL: 80241823Smarcel.endif 81289051Sbdrewery.endif # PROGS || PROGS_CXX 82241823Smarcel 83289051Sbdrewery# These are handled by the main make process. 84276478Sngie.ifdef _RECURSING_PROGS 85289051Sbdrewery_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS FILESGROUPS SCRIPTS 86289051Sbdrewery.for v in ${_PROGS_GLOBAL_VARS} 87289051Sbdrewery$v = 88289051Sbdrewery.endfor 89276478Sngie.endif 90276478Sngie 91242710Ssjg# handle being called [bsd.]progs.mk 92260005Sjmmv.include <bsd.prog.mk> 93241823Smarcel 94291790Sbdrewery.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 95249770Ssjg# tell progs.mk we might want to install things 96289053SbdreweryPROGS_TARGETS+= checkdpadd clean cleandepend cleandir depend install 97241823Smarcel 98291789Sbdrewery# Find common sources among the PROGS and depend on them before building 99291789Sbdrewery# anything. This allows parallelization without them each fighting over 100291789Sbdrewery# the same objects. 101291789Sbdrewery_PROGS_COMMON_SRCS= 102291789Sbdrewery_PROGS_ALL_SRCS= 103242710Ssjg.for p in ${PROGS} 104291789Sbdrewery.for s in ${SRCS.${p}} 105291789Sbdrewery.if ${_PROGS_ALL_SRCS:M${s}} && !${_PROGS_COMMON_SRCS:M${s}} 106291789Sbdrewery_PROGS_COMMON_SRCS+= ${s} 107291789Sbdrewery.else 108291789Sbdrewery_PROGS_ALL_SRCS+= ${s} 109291789Sbdrewery.endif 110291789Sbdrewery.endfor 111291789Sbdrewery.endfor 112291789Sbdrewery.if !empty(_PROGS_COMMON_SRCS) 113291789Sbdrewery_PROGS_COMMON_OBJS= ${_PROGS_COMMON_SRCS:M*.[dhly]} 114291789Sbdrewery.if !empty(_PROGS_COMMON_SRCS:N*.[dhly]) 115291789Sbdrewery_PROGS_COMMON_OBJS+= ${_PROGS_COMMON_SRCS:N*.[dhly]:R:S/$/.o/g} 116291789Sbdrewery.endif 117291789Sbdrewery${PROGS}: ${_PROGS_COMMON_OBJS} 118291789Sbdrewery.endif 119291789Sbdrewery 120291789Sbdrewery.for p in ${PROGS} 121242710Ssjg.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p) 122242710Ssjg# bsd.prog.mk may need to know this 123242710Ssjgx.$p= PROG_CXX=$p 124241823Smarcel.endif 125241823Smarcel 126289051Sbdrewery# Main PROG target 127242710Ssjg$p ${p}_p: .PHONY .MAKE 128291791Sbdrewery (cd ${.CURDIR} && \ 129291791Sbdrewery NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ 130291791Sbdrewery PROG=$p \ 131276048Sngie DEPENDFILE=.depend.$p .MAKE.DEPENDFILE=.depend.$p \ 132276048Sngie ${x.$p}) 133241823Smarcel 134289051Sbdrewery# Pseudo targets for PROG, such as 'install'. 135242710Ssjg.for t in ${PROGS_TARGETS:O:u} 136242710Ssjg$p.$t: .PHONY .MAKE 137291791Sbdrewery (cd ${.CURDIR} && \ 138291791Sbdrewery NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ 139291791Sbdrewery PROG=$p \ 140276048Sngie DEPENDFILE=.depend.$p .MAKE.DEPENDFILE=.depend.$p \ 141276048Sngie ${x.$p} ${@:E}) 142241823Smarcel.endfor 143241823Smarcel.endfor 144241823Smarcel 145289051Sbdrewery# Depend main pseudo targets on all PROG.pseudo targets too. 146242710Ssjg.for t in ${PROGS_TARGETS:O:u} 147242710Ssjg$t: ${PROGS:%=%.$t} 148241823Smarcel.endfor 149291790Sbdrewery.endif # !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG) 150