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