1# $NetBSD: bsd.prog.mk,v 1.219 2006/11/11 06:15: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 10.if defined(PROG_CXX) 11PROG= ${PROG_CXX} 12.endif 13 14.if defined(PROG_PAX) 15PROG_PAX.${PROG}?= ${PROG_PAX} 16.endif 17 18##### Basic targets 19realinstall: proginstall scriptsinstall 20clean: cleanprog 21 22##### PROG specific flags. 23COPTS+= ${COPTS.${PROG}} 24CPPFLAGS+= ${CPPFLAGS.${PROG}} 25CXXFLAGS+= ${CXXFLAGS.${PROG}} 26OBJCOPTS+= ${OBJCOPTS.${PROG}} 27LDADD+= ${LDADD.${PROG}} 28LDFLAGS+= ${LDFLAGS.${PROG}} 29LDSTATIC+= ${LDSTATIC.${PROG}} 30 31##### Default values 32CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include} 33CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++} 34CFLAGS+= ${COPTS} 35OBJCFLAGS+= ${OBJCOPTS} 36MKDEP_SUFFIXES?= .o .ln 37 38# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o 39.if ${OBJECT_FMT} == "ELF" 40.ifndef LIBCRTBEGIN 41LIBCRTBEGIN= ${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN} 42.MADE: ${LIBCRTBEGIN} 43.endif 44.ifndef LIBCRTEND 45LIBCRTEND= ${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o 46.MADE: ${LIBCRTEND} 47.endif 48_SHLINKER= ${SHLINKDIR}/ld.elf_so 49.else 50LIBCRTBEGIN?= 51LIBCRTEND?= 52_SHLINKER= ${SHLINKDIR}/ld.so 53.endif 54 55.ifndef LIBCRT0 56LIBCRT0= ${DESTDIR}/usr/lib/crt0.o 57.MADE: ${LIBCRT0} 58.endif 59 60##### Installed system library definitions 61# 62# E.g. 63# LIBC?=${DESTDIR}/usr/lib/libc.a 64# LIBX11?=${DESTDIR}/usr/X11R6/lib/libX11.a 65# etc.. 66 67.for _lib in \ 68 asn1 bluetooth bsdmalloc bz2 c c_pic cdk com_err compat crypt \ 69 crypto crypto_idea crypto_mdc2 crypto_rc5 \ 70 curses dbm des edit event \ 71 form fl g2c gcc gnumalloc gssapi hdb intl ipsec \ 72 kadm5clnt kadm5srv kafs krb5 kvm l \ 73 m magic menu objc ossaudio pam pcap pci pmc posix pthread pthread_dbg \ 74 puffs radius resolv rmt roken rpcsvc rt sdp skey sl ss ssh ssl termcap \ 75 usbhid util wrap y z 76.ifndef LIB${_lib:tu} 77LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a 78.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 79.endif 80.endfor 81 82# PAM applications, if linked statically, need more libraries 83.if (${MKPIC} == "no") 84.if (${MKCRYPTO} != "no") 85PAM_STATIC_LDADD+= -lssh 86PAM_STATIC_DPADD+= ${LIBSSH} 87.endif 88.if (${MKKERBEROS} != "no") 89PAM_STATIC_LDADD+= -lkafs -lkrb5 -lasn1 -lroken -lcom_err -lcrypto 90PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBASN1} ${LIBROKEN} \ 91 ${LIBCOM_ERR} ${LIBCRYPTO} 92.endif 93.if (${MKSKEY} != "no") 94PAM_STATIC_LDADD+= -lskey 95PAM_STATIC_DPADD+= ${LIBSKEY} 96.endif 97PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil 98PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL} 99.else 100PAM_STATIC_LDADD= 101PAM_STATIC_DPADD= 102.endif 103 104# These need + -> X transformations 105.ifndef LIBSTDCXX 106LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a 107.MADE: ${LIBSTDCXX} 108.endif 109 110.ifndef LIBSUPCXX 111LIBSUPCXX= ${DESTDIR}/usr/lib/libsupc++.a 112.MADE: ${LIBSUPCXX} 113.endif 114 115.for _lib in \ 116 dps expat fntstubs fontcache fontconfig fontenc freetype FS \ 117 GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \ 118 Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \ 119 XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm 120.ifndef LIB${_lib:tu} 121LIB${_lib:tu}= ${DESTDIR}/usr/X11R6/lib/lib${_lib}.a 122.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 123.endif 124.endfor 125 126 127##### Build and install rules 128.if defined(SHAREDSTRINGS) 129CLEANFILES+=strings 130.c.o: 131 ${CC} -E ${CPPFLAGS} ${CFLAGS} ${.IMPSRC} | xstr -c - 132 @${CC} ${CPPFLAGS} ${CFLAGS} -c x.c -o ${.TARGET} 133 @rm -f x.c 134 135.cc.o .cpp.o .cxx.o .C.o: 136 ${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c - 137 @mv -f x.c x.cc 138 @${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET} 139 @rm -f x.cc 140.endif 141 142.if defined(PROG) # { 143.if defined(PROG_CXX) 144SRCS?= ${PROG}.cc 145.else 146SRCS?= ${PROG}.c 147.endif 148 149PROGNAME?= ${PROG} 150 151.if defined(RESCUEDIR) 152CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\" 153.endif 154 155_YPSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 156 157DPSRCS+= ${_YPSRCS} 158CLEANFILES+= ${_YPSRCS} 159 160.if !empty(SRCS:N*.h:N*.sh:N*.fth) 161OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g} 162LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 163.endif 164 165.if defined(OBJS) && !empty(OBJS) # { 166.NOPATH: ${OBJS} ${PROG} ${_YPSRCS} 167 168_PROGLDOPTS= 169.if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves 170.if ${OBJECT_FMT} == "ELF" 171_PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER} 172.endif 173.endif 174.if ${SHLIBDIR} != "/usr/lib" 175_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \ 176 -R${SHLIBDIR} \ 177 -L${DESTDIR}${SHLIBDIR} 178.elif ${SHLIBINSTALLDIR} != "/usr/lib" 179_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \ 180 -L${DESTDIR}${SHLIBINSTALLDIR} 181.endif 182 183.if defined(PROG_CXX) 184_CCLINK= ${CXX} 185.else 186_CCLINK= ${CC} 187.endif 188 189.if ${MKDEBUG} != "no" && ${OBJECT_FMT} == "ELF" && !commands(${PROG}) 190_PROGDEBUG= ${PROGNAME}.debug 191.endif 192 193.gdbinit: 194 rm -f .gdbinit 195.if defined(DESTDIR) && !empty(DESTDIR) 196 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit 197.else 198 touch .gdbinit 199.endif 200.for __gdbinit in ${GDBINIT} 201 echo "source ${__gdbinit}" >> .gdbinit 202.endfor 203 204${OBJS} ${LOBJS}: ${DPSRCS} 205 206${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 207.if !commands(${PROG}) 208 ${_MKTARGET_LINK} 209.if defined(DESTDIR) 210 ${_CCLINK} -Wl,-nostdlib \ 211 ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} \ 212 -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \ 213 ${OBJS} ${LDADD} \ 214 -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib 215.else 216 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD} 217.endif # defined(DESTDIR) 218.if defined(PROG_PAX.${PROG}) 219 ${PAXCTL} ${PROG_PAX.${PROG}} ${.TARGET} 220.endif 221.endif # !commands(${PROG}) 222 223${PROG}.ro: ${OBJS} ${DPADD} 224 ${_MKTARGET_LINK} 225 ${LD} -r -dc -o ${.TARGET} ${OBJS} 226 227.if defined(_PROGDEBUG) 228${_PROGDEBUG}: ${PROG} 229 ${_MKTARGET_CREATE} 230 ${OBJCOPY} --only-keep-debug ${PROG} ${_PROGDEBUG} 231 ${OBJCOPY} -R .gnu_debuglink --add-gnu-debuglink=${_PROGDEBUG} ${PROG} \ 232 || rm -f ${_PROGDEBUG} 233.endif 234 235.endif # defined(OBJS) && !empty(OBJS) # } 236 237.if !defined(MAN) 238MAN= ${PROG}.1 239.endif # !defined(MAN) 240.endif # defined(PROG) # } 241 242realall: ${PROG} ${_PROGDEBUG} ${SCRIPTS} 243 244cleanprog: .PHONY cleanobjs cleanextra 245 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG} ${_PROGDEBUG} 246 247cleanobjs: .PHONY 248.if defined(OBJS) && !empty(OBJS) 249 rm -f ${OBJS} ${LOBJS} 250.endif 251 252cleanextra: .PHONY 253.if defined(CLEANFILES) && !empty(CLEANFILES) 254 rm -f ${CLEANFILES} 255.endif 256 257.if defined(PROG) && !target(proginstall) # { 258 259proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME} ${_PROGDEBUG:D${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}} 260.PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME} ${_PROGDEBUG:D${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}} 261 262__proginstall: .USE 263 ${_MKTARGET_INSTALL} 264 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 265 ${STRIPFLAG} ${.ALLSRC} ${.TARGET} 266 267__progdebuginstall: .USE 268 ${_MKTARGET_INSTALL} 269 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \ 270 ${.ALLSRC} ${.TARGET} 271 272.if ${MKUPDATE} == "no" 273${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall 274.if !defined(BUILD) && !make(all) && !make(${PROG}) 275${DESTDIR}${BINDIR}/${PROGNAME}! .MADE 276.endif 277.if defined(_PROGDEBUG) 278${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}! ${_PROGDEBUG} __progdebuginstall 279.if !defined(BUILD) && !make(all) && !make(${PROG}) 280${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}! .MADE 281.endif 282.endif # define(_PROGDEBUG) 283.else # MKUPDATE != no 284${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall 285.if !defined(BUILD) && !make(all) && !make(${PROG}) 286${DESTDIR}${BINDIR}/${PROGNAME}: .MADE 287.endif 288.if defined(_PROGDEBUG) 289${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}: ${_PROGDEBUG} __progdebuginstall 290.if !defined(BUILD) && !make(all) && !make(${PROG}) 291${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}: .MADE 292.endif 293.endif # defined(_PROGDEBUG) 294.endif # MKUPDATE != no 295 296.endif # defined(PROG) && !target(proginstall) # } 297 298.if !target(proginstall) 299proginstall:: 300.endif 301.PHONY: proginstall 302 303.if defined(SCRIPTS) && !target(scriptsinstall) # { 304SCRIPTSDIR?=${BINDIR} 305SCRIPTSOWN?=${BINOWN} 306SCRIPTSGRP?=${BINGRP} 307SCRIPTSMODE?=${BINMODE} 308 309scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 310.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 311 312__scriptinstall: .USE 313 ${_MKTARGET_INSTALL} 314 ${INSTALL_FILE} \ 315 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ 316 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ 317 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ 318 ${.ALLSRC} ${.TARGET} 319 320.for S in ${SCRIPTS:O:u} 321.if ${MKUPDATE} == "no" 322${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall 323.if !defined(BUILD) && !make(all) && !make(${S}) 324${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE 325.endif 326.else 327${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall 328.if !defined(BUILD) && !make(all) && !make(${S}) 329${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE 330.endif 331.endif 332.endfor 333.endif # } 334 335.if !target(scriptsinstall) 336scriptsinstall:: 337.endif 338.PHONY: scriptsinstall 339 340lint: ${LOBJS} 341.if defined(LOBJS) && !empty(LOBJS) 342 ${LINT} ${LINTFLAGS} ${LDFLAGS:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS} ${LDADD} 343.endif 344 345##### Pull in related .mk logic 346.include <bsd.man.mk> 347.include <bsd.nls.mk> 348.include <bsd.files.mk> 349.include <bsd.inc.mk> 350.include <bsd.links.mk> 351.include <bsd.sys.mk> 352.include <bsd.dep.mk> 353 354${TARGETS}: # ensure existence 355 356.endif # HOSTPROG 357