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