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