bsd.prog.mk revision 1.358 1 # $NetBSD: bsd.prog.mk,v 1.358 2025/12/16 04:21:03 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 ssh \
183 ssl \
184 stdc++ \
185 supc++ \
186 terminfo \
187 tre \
188 unbound \
189 usbhid \
190 util \
191 wind \
192 wrap \
193 y \
194 z
195
196 .for _lib in ${_LIBLIST}
197 .ifndef LIB${_lib:tu}
198 LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib:S/xx/++/:S/atf_c/atf-c/}.a
199 .MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
200 .endif
201 .endfor
202
203 .if (${MKKERBEROS} != "no")
204 # Kerberos5 applications
205 LIBKRB5_LDADD+= -lkrb5 -lcom_err \
206 -lhx509 -lcrypto -lasn1 \
207 -lwind -lheimbase -lcom_err -lroken \
208 -lcrypt -lutil
209 LIBKRB5_DPADD+= ${LIBKRB5} ${LIBCOM_ERR} \
210 ${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
211 ${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
212 ${LIBCRYPT} ${LIBUTIL}
213 LIBGSSAPI_LDADD+= -lgssapi -lheimntlm ${LIBKRB5_LDADD}
214 LIBGSSAPI_DPADD+= ${LIBGSSAPI} ${LIBHEIMNTLM} ${LIBKRB5_DPADD}
215 .endif
216
217 .if (${MKLDAP} != "no")
218 LIBLDAP_LDADD+= -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto
219 LIBLDAP_DPADD+= ${LIBLDAP} ${LIBLBER} ${LIBGSSAPI_DPADD} ${LIBSSL} \
220 ${LIBCRYPTO}
221 .endif
222
223 # PAM applications, if linked statically, need more libraries
224 .if (${MKPIC} == "no")
225 PAM_STATIC_LDADD+= -lssh
226 PAM_STATIC_DPADD+= ${LIBSSH}
227 .if (${MKKERBEROS} != "no")
228 PAM_STATIC_LDADD+= -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
229 -lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lm
230 PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN1} \
231 ${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3} \
232 ${LIBM}
233 .endif
234 .if (${MKSKEY} != "no")
235 PAM_STATIC_LDADD+= -lskey
236 PAM_STATIC_DPADD+= ${LIBSKEY}
237 .endif
238 PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil
239 PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL}
240 .else
241 PAM_STATIC_LDADD=
242 PAM_STATIC_DPADD=
243 .endif
244
245 # NB: If you are a library here, add it in bsd.README
246 # This list is sorted with -f so that it matches the order in bsd.README
247 _X11LIBLIST= dps EGL fntstubs fontcache fontconfig fontenc freetype FS GL GLU \
248 GLw I810XvMC ICE IntelXvMC lbxutil SM X11 X11_xcb Xres Xau Xau7 Xaw xcb \
249 Xcomposite Xcursor xcvt Xdamage Xdmcp Xext Xfixes Xfont Xfont2 Xft Xi \
250 Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt XTrap Xtst Xv Xxf86dga \
251 Xxf86misc Xxf86vm
252 _XCBLIBLIST= \
253 atom aux composite damage dpms dri2 dri3 event glx icccm image keysyms \
254 present property randr record render_util render reply res screensaver \
255 shape shm sync xf86dri xfixes xinerama xinput xkb xtest xv xvmc
256
257 # Ugly one-offs
258 LIBX11_XCB= ${DESTDIR}${X11USRLIBDIR}/libX11-xcb.a
259 LIBXCB= ${DESTDIR}${X11USRLIBDIR}/libxcb.a
260
261 .for _lib in ${_X11LIBLIST}
262 .ifndef LIB${_lib:tu}
263 LIB${_lib:tu}= ${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
264 .MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
265 .endif
266 .endfor
267
268 # These ones have "_" in the variable name and "-" in the path.
269 .for _lib in ${_XCBLIBLIST}
270 .ifndef LIBXCB_${_lib:tu}
271 LIBXCB_${_lib:tu}= ${DESTDIR}${X11USRLIBDIR}/libxcb-${_lib}.a
272 .MADE: ${LIBXCB_${_lib:tu}} # Note: ${DESTDIR} will be expanded
273 .endif
274 .endfor
275
276 .if defined(RESCUEDIR)
277 CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\"
278 .endif
279
280 _PROGLDOPTS=
281 .if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves
282 _PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER}
283 .endif
284 .if ${SHLIBDIR} != "/usr/lib"
285 _PROGLDOPTS+= -Wl,-rpath,${SHLIBDIR} \
286 -L=${SHLIBDIR}
287 .elif ${SHLIBINSTALLDIR} != "/usr/lib"
288 _PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR} \
289 -L=${SHLIBINSTALLDIR}
290 .endif
291
292 # XXX Provisional -- we should get this out of PROGDPLIBS for each
293 # specific dependency so we can write the directory in one place where
294 # the library is defined, and not copy and paste it everywhere the
295 # library is used.
296 .for _subdir_ in ${PROGDPSUBDIRS:U}
297 _PROGLDOPTS+= -Wl,-rpath,${SHLIBDIR}/${_subdir_} \
298 -L=${SHLIBDIR}/${_subdir_}
299 .endfor
300
301 __proginstall: .USE
302 ${_MKTARGET_INSTALL}
303 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
304 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
305
306 __progrumpinstall: .USE
307 ${_MKTARGET_INSTALL}
308 ${INSTALL_FILE} -o ${RUMPBINOWN} -g ${RUMPBINGRP} -m ${RUMPBINMODE} \
309 ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
310
311 __progdebuginstall: .USE
312 ${_MKTARGET_INSTALL}
313 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
314 ${.ALLSRC} ${.TARGET}
315
316
317
318 #
319 # Backwards compatibility with Makefiles that assume that bsd.prog.mk
320 # can only build a single binary.
321 #
322
323 _APPEND_MANS=yes
324 _APPEND_SRCS=yes
325
326 _CCLINKFLAGS=
327
328 .if defined(PROG_CXX)
329 PROG= ${PROG_CXX}
330 _CCLINK= ${CXX} ${_CCLINKFLAGS}
331 .endif
332
333 .if defined(RUMPPRG)
334 CPPFLAGS+= -D_KERNTYPES
335 PROG= ${RUMPPRG}
336 . ifndef CRUNCHEDPROG
337 . if (${MKRUMP} != "no")
338 PROGS= ${RUMPPRG} rump.${RUMPPRG}
339 . else
340 PROGS= ${RUMPPRG}
341 . endif
342 . if defined(SRCS)
343 . if (${MKRUMP} != "no")
344 SRCS.rump.${PROG}:= ${SRCS} ${PROG}_rumpops.c ${RUMPSRCS}
345 . endif
346 SRCS+= ${PROG}_hostops.c
347 . else
348 SRCS= ${PROG}.c ${PROG}_hostops.c
349 . if (${MKRUMP} != "no")
350 SRCS.rump.${PROG}= ${PROG}.c ${PROG}_rumpops.c ${RUMPSRCS}
351 . endif
352 . endif
353 . if (${MKRUMP} != "no")
354 DPSRCS+= ${PROG}_rumpops.c ${RUMPSRCS}
355 LDADD.rump.${PROG}+= ${LDADD.rump} -lrumpclient
356 DPADD.rump.${PROG}+= ${DPADD.rump} ${LIBRUMPCLIENT}
357 MAN.rump.${PROG}= # defined but feeling empty
358 _RUMPINSTALL.rump.${PROG}=# defined
359 . endif
360 . else # CRUNCHEDPROG
361 PROGS= ${PROG}
362 CPPFLAGS+= -DCRUNCHOPS
363 . endif
364 .endif
365
366 .if defined(PROG)
367 _CCLINK?= ${CC} ${_CCLINKFLAGS}
368 . if defined(MAN)
369 MAN.${PROG}= ${MAN}
370 _APPEND_MANS= no
371 . endif
372 . if !defined(OBJS)
373 OBJS= ${OBJS.${PROG}}
374 . endif
375 . if defined(PROGNAME)
376 PROGNAME.${PROG}= ${PROGNAME}
377 . endif
378 . if defined(SRCS)
379 SRCS.${PROG}= ${SRCS}
380 _APPEND_SRCS= no
381 . endif
382 .endif
383
384 # Turn the single-program PROG and PROG_CXX variables into their multi-word
385 # counterparts, PROGS and PROGS_CXX.
386 .if !defined(RUMPPRG)
387 . if defined(PROG_CXX) && !defined(PROGS_CXX)
388 PROGS_CXX= ${PROG_CXX}
389 . elif defined(PROG) && !defined(PROGS)
390 PROGS= ${PROG}
391 . endif
392 .endif
393
394 ##### Libraries that this may depend upon.
395 .if defined(PROGDPLIBS) # {
396 . for _lib _dir in ${PROGDPLIBS}
397 . if !defined(LIBDO.${_lib})
398 LIBDO.${_lib}!= cd "${_dir}" && ${PRINTOBJDIR}
399 .MAKEOVERRIDES+=LIBDO.${_lib}
400 . endif
401 . if defined(PROGDPLIBSSTATIC)
402 DPADD+= ${LIBDO.${_lib}}/lib${_lib}.a
403 LDADD+= ${LIBDO.${_lib}}/lib${_lib}.a
404 . else
405 LDADD+= -L${LIBDO.${_lib}} -l${_lib}
406 . if exists(${LIBDO.${_lib}}/lib${_lib}_pic.a)
407 DPADD+= ${LIBDO.${_lib}}/lib${_lib}_pic.a
408 . elif exists(${LIBDO.${_lib}}/lib${_lib}.so)
409 DPADD+= ${LIBDO.${_lib}}/lib${_lib}.so
410 . else
411 DPADD+= ${LIBDO.${_lib}}/lib${_lib}.a
412 . endif
413 . endif
414 . endfor
415 .endif # }
416
417 LDADD+=${LDADD_AFTER}
418 DPADD+=${DPADD_AFTER}
419
420 #
421 # Per-program definitions and targets.
422 #
423
424 _CCLINK.CDEFAULT= ${CC} ${_CCLINKFLAGS}
425 # Definitions specific to C programs.
426 .for _P in ${PROGS}
427 SRCS.${_P}?= ${_P}.c
428 _CCLINK.${_P}= ${CC} ${_CCLINKFLAGS}
429 _CFLAGS.${_P}= ${CFLAGS} ${CPUFLAGS}
430 _CPPFLAGS.${_P}= ${CPPFLAGS}
431 _COPTS.${_P}= ${COPTS}
432 .endfor
433
434 _CCLINK.CXXDEFAULT= ${CXX} ${_CCLINKFLAGS}
435 # Definitions specific to C++ programs.
436 .for _P in ${PROGS_CXX}
437 SRCS.${_P}?= ${_P}.cc
438 _CCLINK.${_P}= ${CXX} ${_CCLINKFLAGS}
439 .endfor
440
441 # Language-independent definitions.
442 .for _P in ${PROGS} ${PROGS_CXX} # {
443
444 BINDIR.${_P}?= ${BINDIR}
445 PROGNAME.${_P}?= ${_P}
446
447 .if ${MKDEBUG:Uno} != "no" && !defined(NODEBUG) && !commands(${_P}) && \
448 empty(SRCS.${_P}:M*.sh)
449 _PROGDEBUG.${_P}:= ${PROGNAME.${_P}}.debug
450 .endif
451
452 # paxctl specific arguments
453
454 .if defined(PAXCTL_FLAGS)
455 PAXCTL_FLAGS.${_P}?= ${PAXCTL_FLAGS}
456 .endif
457
458 .if ${MKSANITIZER:Uno} == "yes" && \
459 (${USE_SANITIZER} == "address" || ${USE_SANITIZER} == "thread" || \
460 ${USE_SANITIZER} == "memory")
461 PAXCTL_FLAGS.${_P}= +a
462 .endif
463
464 ##### PROG specific flags.
465
466 _DPADD.${_P}= ${DPADD} ${DPADD.${_P}}
467 _LDADD.${_P}= ${LDADD} ${LDADD.${_P}}
468 _LDFLAGS.${_P}= ${LDFLAGS} ${LDFLAGS.${_P}}
469 .if ${MKSANITIZER} != "yes"
470 # Sanitizers don't support static build.
471 _LDSTATIC.${_P}= ${LDSTATIC} ${LDSTATIC.${_P}}
472 .endif
473
474 ##### Build and install rules
475 .if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
476 SRCS+= ${SRCS.${_P}} # For bsd.dep.mk
477 .endif
478
479 _YPSRCS.${_P}= ${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
480
481 DPSRCS+= ${_YPSRCS.${_P}}
482 CLEANFILES+= ${_YPSRCS.${_P}}
483
484 .if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
485 OBJS.${_P}+= ${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
486 LOBJS.${_P}+= ${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
487 .endif
488
489 .if defined(OBJS.${_P}) && !empty(OBJS.${_P}) # {
490 .NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
491
492 ${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
493
494 ${_P}: .gdbinit ${LIBCRT0} ${LIBCRTI} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} \
495 ${LIBCRTEND} ${_DPADD.${_P}}
496 .if !commands(${_P})
497 ${_MKTARGET_LINK}
498 ${_CCLINK.${_P}} \
499 ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
500 ${OBJS.${_P}} ${_PROGLDOPTS} ${_LDADD.${_P}}
501 .if defined(CTFMERGE)
502 ${CTFMERGE} ${CTFMFLAGS} -o ${.TARGET} ${OBJS.${_P}}
503 .endif
504 .if defined(PAXCTL_FLAGS.${_P})
505 ${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
506 .endif
507 .if ${MKSTRIPIDENT} != "no"
508 ${OBJCOPY} -R .ident ${.TARGET}
509 .endif
510 .endif # !commands(${_P})
511
512 ${_P}.ro: ${OBJS.${_P}} ${_DPADD.${_P}}
513 ${_MKTARGET_LINK}
514 ${CC} ${LDFLAGS:N-pie} -nostdlib -r -Wl,-dc -o ${.TARGET} ${OBJS.${_P}}
515
516 .if defined(_PROGDEBUG.${_P})
517 ${_PROGDEBUG.${_P}}: ${_P}
518 ${_MKTARGET_CREATE}
519 ( ${OBJCOPY} --only-keep-debug --compress-debug-sections \
520 ${_P} ${_PROGDEBUG.${_P}} && \
521 ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
522 --add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
523 ) || (rm -f ${_PROGDEBUG.${_P}}; false)
524 .endif
525
526 .endif # defined(OBJS.${_P}) && !empty(OBJS.${_P}) # }
527
528 .if !defined(MAN.${_P})
529 MAN.${_P}= ${_P}.1
530 .endif # !defined(MAN.${_P})
531 .if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
532 MAN+= ${MAN.${_P}}
533 .endif
534
535 realall: ${_P} ${_PROGDEBUG.${_P}}
536
537 CLEANFILES+= ${_P} ${_PROGDEBUG.${_P}}
538
539 .if defined(OBJS.${_P}) && !empty(OBJS.${_P})
540 CLEANFILES+= ${OBJS.${_P}} ${LOBJS.${_P}}
541 .endif
542
543 _PROG_INSTALL+= proginstall-${_P}
544
545 .if !target(proginstall-${_P}) # {
546 proginstall-${_P}:: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
547 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
548 .PRECIOUS: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
549 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
550
551 .if ${MKUPDATE} == "no"
552 .if defined(_RUMPINSTALL.${_P})
553 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __progrumpinstall
554 .else
555 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
556 .endif
557 .if !defined(BUILD) && !make(all) && !make(${_P})
558 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
559 .endif
560 .if defined(_PROGDEBUG.${_P})
561 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
562 .if !defined(BUILD) && !make(all) && !make(${_P})
563 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
564 .endif
565 .endif # define(_PROGDEBUG.${_P})
566 .else # MKUPDATE != no
567 .if defined(_RUMPINSTALL.${_P})
568 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __progrumpinstall
569 .else
570 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
571 .endif
572 .if !defined(BUILD) && !make(all) && !make(${_P})
573 ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
574 .endif
575 .if defined(_PROGDEBUG.${_P})
576 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
577 .if !defined(BUILD) && !make(all) && !make(${_P})
578 ${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
579 .endif
580 .endif # defined(_PROGDEBUG.${_P})
581 .endif # MKUPDATE != no
582
583 .endif # !target(proginstall-${_P}) # }
584
585 lint: lint-${_P}
586 lint-${_P}: ${LOBJS.${_P}}
587 .if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
588 .if defined(DESTDIR)
589 ${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[ ]*/-L/Wg:M-L*} -L${DESTDIR}/usr/libdata/lint ${LOBJS.${_P}} ${_LDADD.${_P}}
590 .else
591 ${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
592 .endif
593 .endif
594
595 .endfor # _P in ${PROGS} ${PROGS_CXX} # }
596
597 .if defined(OBJS) && !empty(OBJS) && \
598 (empty(PROGS) && empty(PROGS_CXX))
599 CLEANFILES+= ${OBJS} ${LOBJS}
600 .endif
601
602 .if !target(proginstall)
603 proginstall:: ${_PROG_INSTALL}
604 .endif
605 .PHONY: proginstall
606
607
608
609 realall: ${SCRIPTS}
610 .if defined(SCRIPTS) && !target(scriptsinstall) # {
611 SCRIPTSDIR?=${BINDIR}
612 SCRIPTSOWN?=${BINOWN}
613 SCRIPTSGRP?=${BINGRP}
614 SCRIPTSMODE?=${BINMODE}
615
616 scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
617 .PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
618
619 __scriptinstall: .USE
620 ${_MKTARGET_INSTALL}
621 ${INSTALL_FILE} \
622 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
623 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
624 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
625 ${.ALLSRC} ${.TARGET}
626
627 .for S in ${SCRIPTS:O:u}
628 .if ${MKUPDATE} == "no"
629 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
630 .if !defined(BUILD) && !make(all) && !make(${S})
631 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
632 .endif
633 .else
634 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
635 .if !defined(BUILD) && !make(all) && !make(${S})
636 ${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
637 .endif
638 .endif
639 .endfor
640 .endif # }
641
642 .if !target(scriptsinstall)
643 scriptsinstall::
644 .endif
645 .PHONY: scriptsinstall
646
647 ##### Pull in related .mk logic
648 LINKSOWN?= ${BINOWN}
649 LINKSGRP?= ${BINGRP}
650 LINKSMODE?= ${BINMODE}
651 .include <bsd.man.mk>
652 .include <bsd.nls.mk>
653 .include <bsd.files.mk>
654 .include <bsd.inc.mk>
655 .include <bsd.links.mk>
656 .include <bsd.sys.mk>
657 .include <bsd.dep.mk>
658 .include <bsd.clang-analyze.mk>
659 .include <bsd.clean.mk>
660
661 ${TARGETS}: # ensure existence
662
663 .endif # HOSTPROG
664