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