bsd.prog.mk revision 1.325 1 # $NetBSD: bsd.prog.mk,v 1.325 2020/03/03 02:25:03 christos Exp $
2 # @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94
3
4 .ifndef HOSTPROG
5
6 .include <bsd.init.mk>
7 .include <bsd.shlib.mk>
8 .include <bsd.gcc.mk>
9 .include <bsd.sanitizer.mk>
10
11 ##### Sanitizer specific flags.
12
13 CFLAGS+= ${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
14 CXXFLAGS+= ${SANITIZERFLAGS} ${LIBCSANITIZERFLAGS}
15 LDFLAGS+= ${SANITIZERFLAGS}
16
17 #
18 # Definitions and targets shared among all programs built by a single
19 # Makefile.
20 #
21
22 ##### Basic targets
23 realinstall: proginstall scriptsinstall
24
25 .gdbinit:
26 rm -f .gdbinit
27 .if defined(DESTDIR) && !empty(DESTDIR)
28 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit
29 .else
30 touch .gdbinit
31 .endif
32 .for __gdbinit in ${GDBINIT}
33 echo "source ${__gdbinit}" >> .gdbinit
34 .endfor
35
36 CLEANFILES+= a.out [Ee]rrs mklog core *.core .gdbinit
37
38 .if defined(SHAREDSTRINGS)
39 CLEANFILES+=strings
40 .c.o:
41 ${CC} -E ${CPPFLAGS} ${CFLAGS} ${.IMPSRC} | xstr -c -
42 @${CC} ${CPPFLAGS} ${CFLAGS} -c x.c -o ${.TARGET}
43 .if defined(CTFCONVERT)
44 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
45 .endif
46 @rm -f x.c
47
48 .cc.o .cpp.o .cxx.o .C.o:
49 ${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c -
50 @${MV} x.c x.cc
51 @${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET}
52 .if defined(CTFCONVERT)
53 ${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
54 .endif
55 @rm -f x.cc
56 .endif
57
58 .if defined(MKPIE) && (${MKPIE} != "no") && !defined(NOPIE)
59 CFLAGS+= ${PIE_CFLAGS}
60 AFLAGS+= ${PIE_AFLAGS}
61 LDFLAGS+= ${"${LDSTATIC.${.TARGET}}" == "-static" :? : ${PIE_LDFLAGS}}
62 .endif
63
64 CFLAGS+= ${COPTS}
65 .if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG)
66 CFLAGS+= -g
67 .endif
68 OBJCFLAGS+= ${OBJCOPTS}
69 MKDEP_SUFFIXES?= .o .ln .d
70
71 # CTF preserve debug symbols
72 .if (${MKCTF:Uno} != "no") && (${CFLAGS:M-g} != "")
73 CTFFLAGS+= -g
74 CTFMFLAGS+= -g
75 .if defined(HAVE_GCC)
76 #CFLAGS+=-gdwarf-2
77 .endif
78 .endif
79
80 # ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o
81 .ifndef LIBCRTBEGIN
82 LIBCRTBEGIN= ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o ${_GCC_CRTBEGIN}
83 .MADE: ${LIBCRTBEGIN}
84 .endif
85 .ifndef LIBCRTEND
86 LIBCRTEND= ${_GCC_CRTEND} ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crtn.o
87 .MADE: ${LIBCRTEND}
88 .endif
89 _SHLINKER= ${SHLINKDIR}/ld.elf_so
90
91 .ifndef LIBCRT0
92 LIBCRT0= ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crt0.o
93 .MADE: ${LIBCRT0}
94 .endif
95
96 .ifndef LIBCRTI
97 LIBCRTI= ${DESTDIR}/usr/lib/${MLIBDIR:D${MLIBDIR}/}crti.o
98 .MADE: ${LIBCRTI}
99 .endif
100
101 ##### Installed system library definitions
102 #
103 # E.g.
104 # LIBC?=${DESTDIR}/usr/lib/libc.a
105 # LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
106 # etc..
107 # NB: If you are a library here, add it in bsd.README
108
109 _LIBLIST=\
110 archive \
111 asn1 \
112 atf_c \
113 atf_cxx \
114 bind9 \
115 bluetooth \
116 bsdmalloc \
117 bz2 \
118 c \
119 c_pic \
120 cbor \
121 com_err \
122 compat \
123 crypt \
124 crypto \
125 curses \
126 cxx \
127 des \
128 dns \
129 edit \
130 event \
131 event_openssl \
132 event_pthreads \
133 execinfo \
134 expat \
135 fetch \
136 fl \
137 fido2 \
138 form \
139 gcc \
140 gnumalloc \
141 gssapi \
142 hdb \
143 heimbase \
144 heimntlm \
145 hx509 \
146 intl \
147 ipsec \
148 isc \
149 isccc \
150 isccfg \
151 kadm5clnt \
152 kadm5srv \
153 kafs \
154 krb5 \
155 kvm \
156 l \
157 lber \
158 ldap \
159 ldap_r \
160 lua \
161 m \
162 magic \
163 menu \
164 netpgpverify \
165 ns \
166 objc \
167 ossaudio \
168 panel \
169 pam \
170 pcap \
171 pci \
172 posix \
173 pthread \
174 puffs \
175 quota \
176 radius \
177 refuse \
178 resolv \
179 rmt \
180 roken \
181 rpcsvc \
182 rt \
183 rump \
184 rumpfs_cd9660 \
185 rumpfs_efs \
186 rumpfs_ext2fs \
187 rumpfs_ffs \
188 rumpfs_hfs \
189 rumpfs_lfs \
190 rumpfs_msdos \
191 rumpfs_nfs \
192 rumpfs_ntfs \
193 rumpfs_syspuffs \
194 rumpfs_tmpfs \
195 rumpfs_udf \
196 rumpuser \
197 saslc \
198 skey \
199 sl \
200 sqlite3 \
201 ssh \
202 ssl \
203 stdc++ \
204 supc++ \
205 terminfo \
206 tre \
207 unbound \
208 usbhid \
209 util \
210 wind \
211 wrap \
212 y \
213 z
214
215 .for _lib in ${_LIBLIST}
216 .ifndef LIB${_lib:tu}
217 LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
218 .MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
219 .endif
220 .endfor
221
222 .if (${MKKERBEROS} != "no")
223 LIBKRB5_LDADD+= -lkrb5
224 LIBKRB5_DPADD+= ${LIBKRB5}
225 # Kerberos5 applications, if linked statically, need more libraries
226 LIBKRB5_STATIC_LDADD+= \
227 -lhx509 -lcrypto -lasn1 -lcom_err -lroken \
228 -lwind -lheimbase -lsqlite3 -lcrypt -lutil
229 LIBKRB5_STATIC_DPADD+= \
230 ${LIBHX509} ${LIBCRYPTO} ${LIBASN1} ${LIBCOM_ERR} ${LIBROKEN} \
231 ${LIBWIND} ${LIBHEIMBASE} ${LIBSQLITE3} ${LIBCRYPT} ${LIBUTIL}
232 . if (${MKPIC} == "no")
233 LIBKRB5_LDADD+= ${LIBKRB5_STATIC_LDADD}
234 LIBKRB5_DPADD+= ${LIBKRB5_STATIC_DPADD}
235 . endif
236 .endif
237
238 # PAM applications, if linked statically, need more libraries
239 .if (${MKPIC} == "no")
240 PAM_STATIC_LDADD+= -lssh
241 PAM_STATIC_DPADD+= ${LIBSSH}
242 .if (${MKKERBEROS} != "no")
243 PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
244 -lroken -lcom_err -lheimbase -lcrypto -lsqlite3
245 PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
246 ${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3}
247 .endif
248 .if (${MKSKEY} != "no")
249 PAM_STATIC_LDADD+= -lskey
250 PAM_STATIC_DPADD+= ${LIBSKEY}
251 .endif
252 PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
253 PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
254 .else
255 PAM_STATIC_LDADD=
256 PAM_STATIC_DPADD=
257 .endif
258
259 # NB: If you are a library here, add it in bsd.README
260 # This list is sorted with -f so that it matches the order in bsd.README
261 _X11LIBLIST= dps fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
262 ICE lbxutil SM X11 X11_xcb Xau Xaw xcb Xdmcp Xext Xfont Xfont2 Xft Xi \
263 Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
264 Xxf86misc Xxf86vm
265
266 .for _lib in ${_X11LIBLIST}
267 .ifndef LIB${_lib:tu}
268 LIB${_lib:tu}= ${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
269 .MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
270 .endif
271 .endfor
272
273 # Ugly one-offs
274 LIBX11_XCB= ${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
275 LIBXCB= ${DESTDIR}${X11USRLIBDIR}/libxcb.a
276
277 .if defined(RESCUEDIR)
278 CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\"
279 .endif
280
281 _PROGLDOPTS=
282 .if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves
283 _PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER}
284 .endif
285 .if ${SHLIBDIR} != "/usr/lib"
286 _PROGLDOPTS+= -Wl,-rpath,${SHLIBDIR} \
287 -L=${SHLIBDIR}
288 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
289 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
290 -L=${SHLIBINSTALLDIR}
291 .endif
292
293 __proginstall: .USE
294 ${_MKTARGET_INSTALL}
295 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
296 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
297
298 __progrumpinstall: .USE
299 ${_MKTARGET_INSTALL}
300 ${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
301 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
302
303 __progdebuginstall: .USE
304 ${_MKTARGET_INSTALL}
305 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
306 ${.ALLSRC} ${.TARGET}
307
308
309
310 #
311 # Backwards compatibility with Makefiles that assume that bsd.prog.mk
312 # can only build a single binary.
313 #
314
315 _APPEND_MANS=yes
316 _APPEND_SRCS=yes
317
318 _CCLINKFLAGS=
319
320 .if defined(PROG_CXX)
321 PROG= ${PROG_CXX}
322 _CCLINK= ${CXX} ${_CCLINKFLAGS}
323 .endif
324
325 .if defined(RUMPPRG)
326 CPPFLAGS+= -D_KERNTYPES
327 PROG= ${RUMPPRG}
328 . ifndef CRUNCHEDPROG
329 . if (${MKRUMP} != "no")
330 PROGS= ${RUMPPRG} rump.${RUMPPRG}
331 . else
332 PROGS= ${RUMPPRG}
333 . endif
334 . if defined(SRCS)
335 . if (${MKRUMP} != "no")
336 SRCS.rump.${PROG}:= ${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
337 . endif
338 SRCS+= ${PROG}_hostops.c
339 . else
340 SRCS= ${PROG}.c ${PROG}_hostops.c
341 . if (${MKRUMP} != "no")
342 SRCS.rump.${PROG}= ${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
343 . endif
344 . endif
345 . if (${MKRUMP} != "no")
346 DPSRCS+= ${PROG}_rumpops.c ${RUMPSRCS}
347 LDADD.rump.${PROG}+= ${LDADD.rump} -lrumpclient
348 DPADD.rump.${PROG}+= ${DPADD.rump} ${LIBRUMPCLIENT}
349 MAN.rump.${PROG}= # defined but feeling empty
350 _RUMPINSTALL.rump.${PROG}=# defined
351 . endif
352 . else # CRUNCHEDPROG
353 PROGS= ${PROG}
354 CPPFLAGS+= -DCRUNCHOPS
355 . endif
356 .endif
357
358 .if defined(PROG)
359 _CCLINK?= ${CC} ${_CCLINKFLAGS}
360 . if defined(MAN)
361 MAN.${PROG}= ${MAN}
362 _APPEND_MANS= no
363 . endif
364 . if !defined(OBJS)
365 OBJS= ${OBJS.${PROG}}
366 . endif
367 . if defined(PROGNAME)
368 PROGNAME.${PROG}= ${PROGNAME}
369 . endif
370 . if defined(SRCS)
371 SRCS.${PROG}= ${SRCS}
372 _APPEND_SRCS= no
373 . endif
374 .endif
375
376 # Turn the single-program PROG and PROG_CXX variables into their multi-word
377 # counterparts, PROGS and PROGS_CXX.
378 .if !defined(RUMPPRG)
379 . if defined(PROG_CXX) && !defined(PROGS_CXX)
380 PROGS_CXX= ${PROG_CXX}
381 . elif defined(PROG) && !defined(PROGS)
382 PROGS= ${PROG}
383 . endif
384 .endif
385
386 ##### Libraries that this may depend upon.
387 .if defined(PROGDPLIBS) # {
388 .for _lib _dir in ${PROGDPLIBS}
389 .if !defined(BINDO.${_lib})
390 PROGDO.${_lib}!= cd "${_dir}" && ${PRINTOBJDIR}
391 .MAKEOVERRIDES+=PROGDO.${_lib}
392 .endif
393 LDADD+= -L${PROGDO.${_lib}} -l${_lib}
394 .if exists(${PROGDO.${_lib}}/lib${_lib}_pic.a)
395 DPADD+= ${PROGDO.${_lib}}/lib${_lib}_pic.a
396 .elif exists(${PROGDO.${_lib}}/lib${_lib}.so)
397 DPADD+= ${PROGDO.${_lib}}/lib${_lib}.so
398 .else
399 DPADD+= ${PROGDO.${_lib}}/lib${_lib}.a
400 .endif
401 .endfor
402 .endif # }
403 #
404 # Per-program definitions and targets.
405 #
406
407 _CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
408 # Definitions specific to C programs.
409 .for _P in ${PROGS}
410 SRCS.${_P}?= ${_P}.c
411 _CCLINK.${_P}= ${CC} ${_CCLINKFLAGS}
412 _CFLAGS.${_P}= ${CFLAGS} ${CPUFLAGS}
413 _CPPFLAGS.${_P}= ${CPPFLAGS}
414 _COPTS.${_P}= ${COPTS}
415 .endfor
416
417 _CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
418 # Definitions specific to C++ programs.
419 .for _P in ${PROGS_CXX}
420 SRCS.${_P}?= ${_P}.cc
421 _CCLINK.${_P}= ${CXX} ${_CCLINKFLAGS}
422 .endfor
423
424 # Language-independent definitions.
425 .for _P in ${PROGS} ${PROGS_CXX} # {
426
427 BINDIR.${_P}?= ${BINDIR}
428 PROGNAME.${_P}?= ${_P}
429
430 .if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
431 empty(SRCS.${_P}:M*.sh)
432 _PROGDEBUG.${_P}:= ${PROGNAME.${_P}}.debug
433 .endif
434
435 # paxctl specific arguments
436
437 .if defined(PAXCTL_FLAGS)
438 PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
439 .endif
440
441 .if ${MKSANITIZER:Uno} == "yes" && \
442 (${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
443 ${USE_SANITIZER} == "memory")
444 PAXCTL_FLAGS.${_P}= +a
445 .endif
446
447 ##### PROG specific flags.
448
449 _DPADD.${_P}= ${DPADD} ${DPADD.${_P}}
450 _LDADD.${_P}= ${LDADD} ${LDADD.${_P}}
451 _LDFLAGS.${_P}= ${LDFLAGS} ${LDFLAGS.${_P}}
452 .if ${MKSANITIZER} != "yes"
453 # Sanitizers don't support static build.
454 _LDSTATIC.${_P}= ${LDSTATIC} ${LDSTATIC.${_P}}
455 .endif
456
457 ##### Build and install rules
458 .if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
459 SRCS+= ${SRCS.${_P}} # For bsd.dep.mk
460 .endif
461
462 _YPSRCS.${_P}= ${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
463
464 DPSRCS+= ${_YPSRCS.${_P}}
465 CLEANFILES+= ${_YPSRCS.${_P}}
466
467 .if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
468 OBJS.${_P}+= ${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
469 LOBJS.${_P}+= ${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
470 .endif
471
472 .if defined(OBJS.${_P}) && !empty(OBJS.${_P}) # {
473 .NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
474
475 .if (defined(USE_COMBINE) && ${USE_COMBINE} != "no" && !commands(${_P}) \
476 && (${_CCLINK.${_P}} == ${_CCLINK.CDEFAULT} \
477 || ${_CCLINK.${_P}} == ${_CCLINK.CXXDEFAULT}) \
478 && !defined(NOCOMBINE.${_P}) && !defined(NOCOMBINE))
479 .for f in ${SRCS.${_P}:N*.h:N*.sh:N*.fth:C/\.[yl]$/.c/g}
480 #_XFLAGS.$f := ${CPPFLAGS.$f:D1} ${CPUFLAGS.$f:D2} \
481 # ${COPTS.$f:D3} ${OBJCOPTS.$f:D4} ${CXXFLAGS.$f:D5}
482 .if (${CPPFLAGS.$f:D1} == "1" || ${CPUFLAGS.$f:D2} == "2" \
483 || ${COPTS.$f:D3} == "3" || ${OBJCOPTS.$f:D4} == "4" \
484 || ${CXXFLAGS.$f:D5} == "5") \
485 || ("${f:M*.[cyl]}" == "" || commands(${f:R:S/$/.o/}))
486 XOBJS.${_P}+= ${f:R:S/$/.o/}
487 .else
488 XSRCS.${_P}+= ${f}
489 NODPSRCS+= ${f}
490 .endif
491 .endfor
492
493 ${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${XOBJS.${_P}} ${SRCS.${_P}} \
494 ${DPSRCS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${_DPADD.${_P}}
495 ${_MKTARGET_LINK}
496 .if defined(DESTDIR)
497 ${_CCLINK.${_P}} -Wl,-nostdlib \
498 ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
499 -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \
500 -MD --combine ${_CPPFLAGS.${_P}} ${_CFLAGS.${_P}} ${_COPTS.${_P}} \
501 ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
502 ${_LDADD.${_P}} -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib
503 .else
504 ${_CCLINK.${_P}} ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} ${_PROGLDOPTS} \
505 -MD --combine ${_CPPFLAGS.${_P}} ${_COPTS.${_P}}
506 ${XSRCS.${_P}:@.SRC.@${.ALLSRC:M*.c:M*${.SRC.}}@:O:u} ${XOBJS.${_P}} \
507 ${_LDADD.${_P}}
508 .endif # defined(DESTDIR)
509 .if defined(CTFMERGE)
510 ${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
511 .endif
512 .if defined(PAXCTL_FLAGS.${_P})
513 ${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
514 .endif
515 .if ${MKSTRIPIDENT} != "no"
516 ${OBJCOPY} -R .ident ${.TARGET}
517 .endif
518
519 CLEANFILES+= ${_P}.d
520 .if exists(${_P}.d)
521 .include "${_P}.d" # include -MD depend for program.
522 .endif
523 .else # USE_COMBINE
524
525 ${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
526
527 ${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
528 ${LIBCRTEND} ${_DPADD.${_P}}
529 .if !commands(${_P})
530 ${_MKTARGET_LINK}
531 ${_CCLINK.${_P}} \
532 ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
533 ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
534 .if defined(CTFMERGE)
535 ${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
536 .endif
537 .if defined(PAXCTL_FLAGS.${_P})
538 ${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
539 .endif
540 .if ${MKSTRIPIDENT} != "no"
541 ${OBJCOPY} -R .ident ${.TARGET}
542 .endif
543 .endif # !commands(${_P})
544 .endif # USE_COMBINE
545
546 ${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
547 ${_MKTARGET_LINK}
548 ${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
549
550 .if defined(_PROGDEBUG.${_P})
551 ${_PROGDEBUG.${_P}}: ${_P}
552 ${_MKTARGET_CREATE}
553 ( ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} \
554 && ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
555 --add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
556 ) || (rm -f ${_PROGDEBUG.${_P}}; false)
557 .endif
558
559 .endif # defined(OBJS.${_P}) && !empty(OBJS.${_P}) # }
560
561 .if !defined(MAN.${_P})
562 MAN.${_P}= ${_P}.1
563 .endif # !defined(MAN.${_P})
564 .if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
565 MAN+= ${MAN.${_P}}
566 .endif
567
568 realall: ${_P} ${_PROGDEBUG.${_P}}
569
570 CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
571
572 .if defined(OBJS.${_P}) && !empty(OBJS.${_P})
573 CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
574 .endif
575
576 _PROG_INSTALL+= proginstall-${_P}
577
578 .if !target(proginstall-${_P}) # {
579 proginstall-${_P}:: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
580 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
581 .PRECIOUS: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
582 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
583
584 .if ${MKUPDATE} == "no"
585 .if defined(_RUMPINSTALL.${_P})
586 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
587 .else
588 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
589 .endif
590 .if !defined(BUILD) && !make(all) && !make(${_P})
591 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
592 .endif
593 .if defined(_PROGDEBUG.${_P})
594 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
595 .if !defined(BUILD) && !make(all) && !make(${_P})
596 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
597 .endif
598 .endif # define(_PROGDEBUG.${_P})
599 .else # MKUPDATE != no
600 .if defined(_RUMPINSTALL.${_P})
601 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
602 .else
603 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
604 .endif
605 .if !defined(BUILD) && !make(all) && !make(${_P})
606 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
607 .endif
608 .if defined(_PROGDEBUG.${_P})
609 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
610 .if !defined(BUILD) && !make(all) && !make(${_P})
611 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
612 .endif
613 .endif # defined(_PROGDEBUG.${_P})
614 .endif # MKUPDATE != no
615
616 .endif # !target(proginstall-${_P}) # }
617
618 lint: lint-${_P}
619 lint-${_P}: ${LOBJS.${_P}}
620 .if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
621 ${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
622 .endif
623
624 .endfor # _P in ${PROGS} ${PROGS_CXX} # }
625
626 .if defined(OBJS) && !empty(OBJS) && \
627 (empty(PROGS) && empty(PROGS_CXX))
628 CLEANFILES+= ${OBJS} ${LOBJS}
629 .endif
630
631 .if !target(proginstall)
632 proginstall:: ${_PROG_INSTALL}
633 .endif
634 .PHONY: proginstall
635
636
637
638 realall: ${SCRIPTS}
639 .if defined(SCRIPTS) && !target(scriptsinstall) # {
640 SCRIPTSDIR?=${BINDIR}
641 SCRIPTSOWN?=${BINOWN}
642 SCRIPTSGRP?=${BINGRP}
643 SCRIPTSMODE?=${BINMODE}
644
645 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
646 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
647
648 __scriptinstall: .USE
649 ${_MKTARGET_INSTALL}
650 ${INSTALL_FILE} \
651 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
652 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
653 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
654 ${.ALLSRC} ${.TARGET}
655
656 .for S in ${SCRIPTS:O:u}
657 .if ${MKUPDATE} == "no"
658 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
659 .if !defined(BUILD) && !make(all) && !make(${S})
660 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
661 .endif
662 .else
663 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
664 .if !defined(BUILD) && !make(all) && !make(${S})
665 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
666 .endif
667 .endif
668 .endfor
669 .endif # }
670
671 .if !target(scriptsinstall)
672 scriptsinstall::
673 .endif
674 .PHONY: scriptsinstall
675
676 ##### Pull in related .mk logic
677 LINKSOWN?= ${BINOWN}
678 LINKSGRP?= ${BINGRP}
679 LINKSMODE?= ${BINMODE}
680 .include <bsd.man.mk>
681 .include <bsd.nls.mk>
682 .include <bsd.files.mk>
683 .include <bsd.inc.mk>
684 .include <bsd.links.mk>
685 .include <bsd.sys.mk>
686 .include <bsd.dep.mk>
687 .include <bsd.clang-analyze.mk>
688 .include <bsd.clean.mk>
689
690 ${TARGETS}: # ensure existence
691
692 .endif # HOSTPROG
693