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