bsd.progs.mk revision 290870
1241823Smarcel# $FreeBSD: head/share/mk/bsd.progs.mk 290870 2015-11-15 18:51:48Z 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# In meta mode, we can capture dependenices for _one_ of the progs.
24242710Ssjg# if makefile doesn't nominate one, we use the first.
25242710Ssjg.ifndef UPDATE_DEPENDFILE_PROG
26242710SsjgUPDATE_DEPENDFILE_PROG = ${PROGS:[1]}
27242710Ssjg.export UPDATE_DEPENDFILE_PROG
28241823Smarcel.endif
29241823Smarcel
30242710Ssjg.ifndef PROG
31242710Ssjg# They may have asked us to build just one
32242710Ssjg.for t in ${PROGS}
33242710Ssjg.if make($t)
34290181Sngie.if ${PROGS_CXX:U:M${t}}
35289289SbdreweryPROG_CXX ?= $t
36289289Sbdrewery.endif
37242710SsjgPROG ?= $t
38241823Smarcel.endif
39242710Ssjg.endfor
40242710Ssjg.endif
41241823Smarcel
42242710Ssjg.if defined(PROG)
43242710Ssjg# just one of many
44290870SngiePROG_OVERRIDE_VARS +=	BINDIR BINGRP BINOWN BINMODE DPSRCS MAN NO_WERROR \
45290870Sngie			PROGNAME SRCS WARNS
46288160SbdreweryPROG_VARS +=	CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD LIBADD LINKS \
47288160Sbdrewery		LDFLAGS MLINKS ${PROG_OVERRIDE_VARS}
48242710Ssjg.for v in ${PROG_VARS:O:u}
49272055Sngie.if empty(${PROG_OVERRIDE_VARS:M$v})
50272055Sngie.if defined(${v}.${PROG})
51272055Sngie$v += ${${v}.${PROG}}
52272055Sngie.elif defined(${v}_${PROG})
53272055Sngie$v += ${${v}_${PROG}}
54272055Sngie.endif
55258095Ssjg.else
56258095Ssjg$v ?=
57249770Ssjg.endif
58242710Ssjg.endfor
59241823Smarcel
60242710Ssjg# for meta mode, there can be only one!
61258095Ssjg.if ${PROG} == ${UPDATE_DEPENDFILE_PROG}
62242710SsjgUPDATE_DEPENDFILE ?= yes
63241823Smarcel.endif
64242710SsjgUPDATE_DEPENDFILE ?= NO
65241823Smarcel
66242710Ssjg# prog.mk will do the rest
67289289Sbdrewery.else # !defined(PROG)
68288158Sbdreweryall: ${PROGS}
69241823Smarcel
70242710Ssjg# We cannot capture dependencies for meta mode here
71242710SsjgUPDATE_DEPENDFILE = NO
72241823Smarcel.endif
73288158Sbdrewery.endif	# PROGS || PROGS_CXX
74241823Smarcel
75288158Sbdrewery# These are handled by the main make process.
76274079Sngie.ifdef _RECURSING_PROGS
77289085Sbapt_PROGS_GLOBAL_VARS= CLEANFILES CLEANDIRS FILESGROUPS SCRIPTS CONFGROUPS
78288158Sbdrewery.for v in ${_PROGS_GLOBAL_VARS}
79288158Sbdrewery$v =
80288158Sbdrewery.endfor
81274079Sngie.endif
82274079Sngie
83242710Ssjg# handle being called [bsd.]progs.mk
84258095Ssjg.include <bsd.prog.mk>
85241823Smarcel
86289289Sbdrewery.if !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
87249770Ssjg# tell progs.mk we might want to install things
88288201SbdreweryPROGS_TARGETS+= checkdpadd clean cleandepend cleandir depend install
89241823Smarcel
90289286Sbdrewery# Find common sources among the PROGS and 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)
105289286Sbdrewery_PROGS_COMMON_OBJS=	${_PROGS_COMMON_SRCS:N*.h:R:S/$/.o/g}
106289286Sbdrewery${PROGS}: ${_PROGS_COMMON_OBJS}
107289286Sbdrewery.endif
108289286Sbdrewery
109289286Sbdrewery.for p in ${PROGS}
110242710Ssjg.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
111242710Ssjg# bsd.prog.mk may need to know this
112242710Ssjgx.$p= PROG_CXX=$p
113241823Smarcel.endif
114241823Smarcel
115288158Sbdrewery# Main PROG target
116242710Ssjg$p ${p}_p: .PHONY .MAKE
117284288Ssjg	(cd ${.CURDIR} && \
118284288Ssjg	    DEPENDFILE=.depend.$p \
119289669Sbdrewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \
120289669Sbdrewery	    PROG=$p ${x.$p})
121241823Smarcel
122288158Sbdrewery# Pseudo targets for PROG, such as 'install'.
123242710Ssjg.for t in ${PROGS_TARGETS:O:u}
124242710Ssjg$p.$t: .PHONY .MAKE
125284288Ssjg	(cd ${.CURDIR} && \
126284288Ssjg	    DEPENDFILE=.depend.$p \
127289669Sbdrewery	    NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \
128289669Sbdrewery	    PROG=$p ${x.$p} ${@:E})
129241823Smarcel.endfor
130241823Smarcel.endfor
131241823Smarcel
132288158Sbdrewery# Depend main pseudo targets on all PROG.pseudo targets too.
133242710Ssjg.for t in ${PROGS_TARGETS:O:u}
134242710Ssjg$t: ${PROGS:%=%.$t}
135241823Smarcel.endfor
136289289Sbdrewery.endif	# !empty(PROGS) && !defined(_RECURSING_PROGS) && !defined(PROG)
137