186534Sjake# SPDX-License-Identifier: BSD-2-Clause
286534Sjake#
386534Sjake# $Id: progs.mk,v 1.18 2024/04/09 17:18:24 sjg Exp $
486534Sjake#
586534Sjake#	@(#) Copyright (c) 2006, Simon J. Gerraty
686534Sjake#
786534Sjake#	This file is provided in the hope that it will
888610Sjake#	be of use.  There is absolutely NO WARRANTY.
988610Sjake#	Permission to copy, redistribute or otherwise
1088610Sjake#	use this file is hereby granted provided that
1188610Sjake#	the above copyright notice and this notice are
1288610Sjake#	left intact.
1388610Sjake#
1488610Sjake#	Please send copies of changes and bug-fixes to:
1588610Sjake#	sjg@crufty.net
1692054Stmm#
1792054Stmm
1892054Stmm.MAIN: all
19
20.if defined(PROGS)
21
22# In meta mode, we can capture dependenices for _one_ of the progs.
23# if makefile doesn't nominate one, we use the first.
24.ifndef UPDATE_DEPENDFILE_PROG
25UPDATE_DEPENDFILE_PROG = ${PROGS:[1]}
26.export UPDATE_DEPENDFILE_PROG
27.endif
28
29.ifndef PROG
30# They may have asked us to build just one
31.for t in ${PROGS}
32.if make($t)
33PROG ?= $t
34.endif
35.endfor
36.endif
37
38.if defined(PROG)
39# just one of many
40PROG_VARS += \
41	BINDIR \
42	CXXFLAGS \
43	DPADD \
44	DPLIBS \
45	LDADD \
46	MAN \
47
48.ifndef SYS_OS_MK
49# assume we are not using init.mk, otherwise
50# we need to avoid overlap with its
51# QUALIFIED_VAR_LIST which includes these and its
52# VAR_QUALIFIER_LIST includes .TARGET which
53# would match PROG
54PROG_VARS += \
55	CFLAGS \
56	COPTS \
57	CPPFLAGS \
58	LDFLAGS \
59	SRCS \
60
61.endif
62
63.for v in ${PROG_VARS:O:u}
64.if defined(${v}.${PROG}) || defined(${v}_${PROG})
65$v += ${${v}_${PROG}:U${${v}.${PROG}}}
66.endif
67.endfor
68
69# for meta mode, there can be only one!
70.if ${PROG} == ${UPDATE_DEPENDFILE_PROG:Uno}
71UPDATE_DEPENDFILE ?= yes
72.endif
73UPDATE_DEPENDFILE ?= NO
74
75# ensure that we don't clobber each other's dependencies
76DEPENDFILE?= .depend.${PROG}
77# prog.mk will do the rest
78.else
79all: ${PROGS}
80
81# We cannot capture dependencies for meta mode here
82UPDATE_DEPENDFILE = NO
83# nor can we safely run in parallel.
84.NOTPARALLEL:
85.endif
86.endif
87
88# handle being called [bsd.]progs.mk
89.include <${.PARSEFILE:S,progs,prog,}>
90
91.ifndef PROG
92# tell progs.mk we might want to install things
93PROGS_TARGETS+= cleandepend cleandir cleanobj depend install
94
95.for p in ${PROGS}
96.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
97# bsd.prog.mk may need to know this
98x.$p= PROG_CXX=$p
99.endif
100
101$p ${p}_p: .PHONY .MAKE
102	(cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p} -DWITHOUT_META_STATS)
103
104.for t in ${PROGS_TARGETS:O:u}
105$p.$t: .PHONY .MAKE
106	(cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p} ${@:E} -DWITHOUT_META_STATS)
107.endfor
108.endfor
109
110.for t in ${PROGS_TARGETS:O:u}
111$t: ${PROGS:%=%.$t}
112.endfor
113
114.if !defined(WITHOUT_META_STATS) && ${.MAKE.LEVEL} > 0
115.END: _reldir_finish
116.ERROR: _reldir_failed
117.endif
118
119.endif
120