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