xref: /freebsd/contrib/bmake/mk/prog.mk (revision 6a7405f5a6b639682cacf01e35d561411ff556aa)
1#	$Id: prog.mk,v 1.45 2024/12/12 19:56:36 sjg Exp $
2
3# should be set properly in sys.mk
4_this ?= ${.PARSEFILE:S,bsd.,,}
5
6.if !target(__${_this}__)
7__${_this}__: .NOTMAIN
8
9.include <init.mk>
10
11# FreeBSD at least expects MAN8 etc.
12.if defined(MAN) && !empty(MAN)
13_sect:=${MAN:E}
14MAN${_sect}=${MAN}
15.endif
16
17.SUFFIXES: .out .o .c ${CXX_SUFFIXES} .y .l ${CCM_SUFFIXES} ${PCM}
18
19CFLAGS+=	${COPTS}
20
21.if ${TARGET_OSNAME} == "NetBSD"
22.if ${MACHINE_ARCH} == "sparc64"
23CFLAGS+=	-mcmodel=medlow
24.endif
25
26# ELF platforms depend on crtbegin.o and crtend.o
27.if ${OBJECT_FMT} == "ELF"
28.ifndef LIBCRTBEGIN
29LIBCRTBEGIN=	${DESTDIR}/usr/lib/crtbegin.o
30.MADE: ${LIBCRTBEGIN}
31.endif
32.ifndef LIBCRTEND
33LIBCRTEND=	${DESTDIR}/usr/lib/crtend.o
34.MADE: ${LIBCRTEND}
35.endif
36_SHLINKER=	${SHLINKDIR}/ld.elf_so
37.else
38LIBCRTBEGIN?=
39LIBCRTEND?=
40_SHLINKER=	${SHLINKDIR}/ld.so
41.endif
42
43.ifndef LIBCRT0
44LIBCRT0=	${DESTDIR}/usr/lib/crt0.o
45.MADE: ${LIBCRT0}
46.endif
47.endif	# NetBSD
48
49# here is where you can define what LIB* are
50.-include <libnames.mk>
51.if ${MK_DPADD_MK} == "yes"
52# lots of cool magic, but might not suit everyone.
53.include <dpadd.mk>
54.endif
55
56.if ${MK_GPROF} == "yes"
57CFLAGS+= ${CC_PG} ${PROFFLAGS}
58LDADD+= ${CC_PG}
59.if ${MK_DPADD_MK} == "no"
60LDADD_LIBC_P?= -lc_p
61LDADD_LAST+= ${LDADD_LIBC_P}
62.endif
63.endif
64
65.if defined(SHAREDSTRINGS)
66CLEANFILES+=strings
67.c.o:
68	@${COMPILE.c:N-c} -E ${.IMPSRC} | xstr -c -
69	@${COMPILE.c} x.c -o ${.TARGET}
70	@rm -f x.c
71
72# precompiled C++ Modules
73${CCM_SUFFIXES:%=%${PCM}}:
74	@${COMIPILE.cc:N-c} -E ${.IMPSRC} | xstr -c -
75	@mv -f x.c x.cc
76	@${COMPILE.pcm} x.cc -o ${.TARGET}
77	@rm -f x.cc
78
79${CXX_SUFFIXES:N.c*m:%=%.o}:
80	@${COMIPILE.cc:N-c} -E ${.IMPSRC} | xstr -c -
81	@mv -f x.c x.cc
82	@${COMPILE.cc} x.cc -o ${.TARGET}
83	@rm -f x.cc
84.endif
85
86.if defined(PROG_CXX)
87PROG=		${PROG_CXX}
88_SUPCXX?=	-lstdc++ -lm
89.endif
90
91.if defined(PROG)
92BINDIR ?= ${prefix}/bin
93
94.if empty(SRCS)
95# init.mk handling of QUALIFIED_VAR_LIST means
96# SRCS will be defined - even if empty.
97SRCS = ${PROG}.c
98.endif
99
100SRCS ?=	${PROG}.c
101
102.for s in ${SRCS:${OBJS_SRCS_PRE_FILTER:ts:}:M*/*}
103${.o .po .lo:L:@o@${s:${OBJS_SRCS_FILTER:ts:}}$o@}: $s
104.endfor
105
106OBJS_SRCS = ${SRCS:${OBJS_SRCS_FILTER:ts:}}
107.if !empty(OBJS_SRCS)
108OBJS+=	${OBJS_SRCS:S/$/.o/g}
109LOBJS+=	${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln}
110.endif
111
112.if defined(OBJS) && !empty(OBJS)
113.NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}}
114
115# this is known to work for NetBSD 1.6 and FreeBSD 4.2
116.if ${TARGET_OSNAME:NFreeBSD:NNetBSD} == ""
117_PROGLDOPTS=
118.if ${SHLINKDIR} != "/usr/libexec"	# XXX: change or remove if ld.so moves
119_PROGLDOPTS+=	-Wl,-dynamic-linker=${_SHLINKER}
120.endif
121.if defined(LIBDIR) && ${SHLIBDIR} != ${LIBDIR}
122_PROGLDOPTS+=	-Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \
123		-L${DESTDIR}${SHLIBDIR}
124.endif
125_PROGLDOPTS+=	-Wl,-rpath,${SHLIBDIR}:/usr/lib
126.endif	# NetBSD
127
128.if ${MK_PROG_LDORDER_MK} != "no"
129${PROG}: ldorder
130
131.include <ldorder.mk>
132.endif
133# avoid -dL errors
134LDADD_LDORDER ?=
135LDSTATIC ?=
136
137.if defined(DESTDIR) && exists(${LIBCRT0}) && ${LIBCRT0} != "/dev/null"
138
139${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
140	${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} -L${DESTDIR}/usr/lib ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD_LDORDER} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
141
142.else
143
144${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
145	${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD_LDORDER} ${LDADD}
146
147.endif	# defined(DESTDIR)
148.endif	# defined(OBJS) && !empty(OBJS)
149
150.if	!defined(MAN)
151MAN=	${PROG}.1
152.endif	# !defined(MAN)
153.endif	# defined(PROG)
154
155.if !defined(_SKIP_BUILD)
156realbuild: ${PROG}
157.endif
158
159all: _SUBDIRUSE
160
161.if !target(clean)
162cleanprog:
163	rm -f a.out [Ee]rrs mklog core *.core \
164	    ${PROG} ${OBJS} ${LOBJS} ${CLEANFILES}
165
166clean: _SUBDIRUSE cleanprog
167cleandir: _SUBDIRUSE cleanprog
168.else
169cleandir: _SUBDIRUSE clean
170.endif
171
172.if defined(SRCS) && (!defined(MKDEP) || ${MKDEP} != autodep)
173afterdepend: .depend
174	@(TMP=/tmp/_depend$$$$; \
175	    sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \
176	      < .depend > $$TMP; \
177	    mv $$TMP .depend)
178.endif
179
180.if !target(install)
181.if !target(beforeinstall)
182beforeinstall:
183.endif
184.if !target(afterinstall)
185afterinstall:
186.endif
187
188.if !empty(BINOWN)
189PROG_INSTALL_OWN ?= -o ${BINOWN} -g ${BINGRP}
190.endif
191
192.if !target(realinstall)
193realinstall: proginstall
194.endif
195.if !target(proginstall)
196proginstall:
197.if defined(PROG)
198	[ -d ${DESTDIR}${BINDIR} ] || \
199	${INSTALL} -d ${PROG_INSTALL_OWN} -m 775 ${DESTDIR}${BINDIR}
200	${INSTALL} ${COPY} ${STRIP_FLAG} ${PROG_INSTALL_OWN} -m ${BINMODE} \
201	    ${PROG} ${DESTDIR}${BINDIR}/${PROG_NAME}
202.endif
203.if defined(HIDEGAME)
204	(cd ${DESTDIR}/usr/games; rm -f ${PROG}; ln -s dm ${PROG})
205.endif
206.endif
207
208.include <links.mk>
209
210install: maninstall install_links _SUBDIRUSE
211
212install_links:
213.if !empty(SYMLINKS)
214	@set ${SYMLINKS}; ${_SYMLINKS_SCRIPT}
215.endif
216.if !empty(LINKS)
217	@set ${LINKS}; ${_LINKS_SCRIPT}
218.endif
219
220maninstall: afterinstall
221afterinstall: realinstall
222install_links: realinstall
223proginstall: beforeinstall
224realinstall: beforeinstall
225.endif
226
227.if !target(lint)
228lint: ${LOBJS}
229.if defined(LOBJS) && !empty(LOBJS)
230	@${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD}
231.endif
232.endif
233
234.NOPATH:	${PROG}
235.if defined(OBJS) && !empty(OBJS)
236.NOPATH:	${OBJS}
237.endif
238
239.if defined(FILES) || defined(FILESGROUPS)
240.include <files.mk>
241.endif
242
243.if ${MK_MAN} != "no"
244.include <man.mk>
245.endif
246
247.if ${MK_NLS} != "no"
248.include <nls.mk>
249.endif
250
251.include <obj.mk>
252.include <dep.mk>
253.include <subdir.mk>
254
255.if !empty(PROG) && ${MK_STAGING_PROG} == "yes"
256STAGE_BINDIR ?= ${STAGE_OBJTOP}${BINDIR}
257STAGE_DIR.prog ?= ${STAGE_BINDIR}
258.if ${PROG_NAME:U${PROG}} != ${PROG}
259STAGE_AS_SETS += prog
260STAGE_AS_${PROG} = ${PROG_NAME}
261stage_as.prog: ${PROG}
262.else
263STAGE_SETS += prog
264stage_files.prog: ${PROG}
265.endif
266.endif
267
268.include <final.mk>
269
270.endif
271