1# $NetBSD: bsd.prog.mk,v 1.214 2006/06/19 15:44:44 gdamore 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.ifndef LIBSTDCXX 101LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a 102.MADE: ${LIBSTDCXX} 103.endif 104 105.for _lib in \ 106 dps expat fntstubs fontcache fontconfig fontenc freetype FS \ 107 GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \ 108 Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \ 109 XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm 110.ifndef LIB${_lib:tu} 111LIB${_lib:tu}= ${DESTDIR}/usr/X11R6/lib/lib${_lib}.a 112.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 113.endif 114.endfor 115 116 117##### Build and install rules 118.if defined(SHAREDSTRINGS) 119CLEANFILES+=strings 120.c.o: 121 ${CC} -E ${CPPFLAGS} ${CFLAGS} ${.IMPSRC} | xstr -c - 122 @${CC} ${CPPFLAGS} ${CFLAGS} -c x.c -o ${.TARGET} 123 @rm -f x.c 124 125.cc.o .cpp.o .cxx.o .C.o: 126 ${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c - 127 @mv -f x.c x.cc 128 @${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET} 129 @rm -f x.cc 130.endif 131 132.if defined(PROG) 133.if defined(PROG_CXX) 134SRCS?= ${PROG}.cc 135.else 136SRCS?= ${PROG}.c 137.endif 138 139.if defined(RESCUEDIR) 140CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\" 141.endif 142 143_YPSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 144 145DPSRCS+= ${_YPSRCS} 146CLEANFILES+= ${_YPSRCS} 147 148.if !empty(SRCS:N*.h:N*.sh:N*.fth) 149OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g} 150LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 151.endif 152 153.if defined(OBJS) && !empty(OBJS) 154.NOPATH: ${OBJS} ${PROG} ${_YPSRCS} 155 156_PROGLDOPTS= 157.if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves 158.if ${OBJECT_FMT} == "ELF" 159_PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER} 160.endif 161.endif 162.if ${SHLIBDIR} != "/usr/lib" 163_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \ 164 -R${SHLIBDIR} \ 165 -L${DESTDIR}${SHLIBDIR} 166.elif ${SHLIBINSTALLDIR} != "/usr/lib" 167_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \ 168 -L${DESTDIR}${SHLIBINSTALLDIR} 169.endif 170 171.if defined(PROG_CXX) 172_CCLINK= ${CXX} 173.if ${USE_LIBSTDCXX} == "no" 174_SUPCXX= -lsupc++ -lm 175.else 176_SUPCXX= -lstdc++ -lm 177.endif 178.else 179_CCLINK= ${CC} 180.endif 181 182.gdbinit: 183 rm -f .gdbinit 184.if defined(DESTDIR) && !empty(DESTDIR) 185 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit 186.else 187 touch .gdbinit 188.endif 189.for __gdbinit in ${GDBINIT} 190 echo "source ${__gdbinit}" >> .gdbinit 191.endfor 192 193${OBJS} ${LOBJS}: ${DPSRCS} 194 195${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 196.if !commands(${PROG}) 197 ${_MKTARGET_LINK} 198.if defined(DESTDIR) 199 ${_CCLINK} -Wl,-nostdlib \ 200 ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} \ 201 -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \ 202 ${OBJS} ${LDADD} \ 203 -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib 204.else 205 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD} 206.endif # defined(DESTDIR) 207.endif # !commands(${PROG}) 208 209${PROG}.ro: ${OBJS} ${DPADD} 210 ${_MKTARGET_LINK} 211 ${LD} -r -dc -o ${.TARGET} ${OBJS} 212 213.endif # defined(OBJS) && !empty(OBJS) 214 215.if !defined(MAN) 216MAN= ${PROG}.1 217.endif # !defined(MAN) 218.endif # defined(PROG) 219 220realall: ${PROG} ${SCRIPTS} 221 222cleanprog: .PHONY cleanobjs cleanextra 223 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG} 224 225cleanobjs: .PHONY 226.if defined(OBJS) && !empty(OBJS) 227 rm -f ${OBJS} ${LOBJS} 228.endif 229 230cleanextra: .PHONY 231.if defined(CLEANFILES) && !empty(CLEANFILES) 232 rm -f ${CLEANFILES} 233.endif 234 235.if defined(PROG) && !target(proginstall) 236PROGNAME?=${PROG} 237 238proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME} 239.PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME} 240 241__proginstall: .USE 242 ${_MKTARGET_INSTALL} 243 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 244 ${STRIPFLAG} ${.ALLSRC} ${.TARGET} 245 246.if ${MKUPDATE} == "no" 247${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall 248.if !defined(BUILD) && !make(all) && !make(${PROG}) 249${DESTDIR}${BINDIR}/${PROGNAME}! .MADE 250.endif 251.else 252${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall 253.if !defined(BUILD) && !make(all) && !make(${PROG}) 254${DESTDIR}${BINDIR}/${PROGNAME}: .MADE 255.endif 256.endif 257.endif 258 259.if !target(proginstall) 260proginstall:: 261.endif 262.PHONY: proginstall 263 264.if defined(SCRIPTS) && !target(scriptsinstall) 265SCRIPTSDIR?=${BINDIR} 266SCRIPTSOWN?=${BINOWN} 267SCRIPTSGRP?=${BINGRP} 268SCRIPTSMODE?=${BINMODE} 269 270scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 271.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 272 273__scriptinstall: .USE 274 ${_MKTARGET_INSTALL} 275 ${INSTALL_FILE} \ 276 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ 277 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ 278 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ 279 ${.ALLSRC} ${.TARGET} 280 281.for S in ${SCRIPTS:O:u} 282.if ${MKUPDATE} == "no" 283${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall 284.if !defined(BUILD) && !make(all) && !make(${S}) 285${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE 286.endif 287.else 288${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall 289.if !defined(BUILD) && !make(all) && !make(${S}) 290${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE 291.endif 292.endif 293.endfor 294.endif 295 296.if !target(scriptsinstall) 297scriptsinstall:: 298.endif 299.PHONY: scriptsinstall 300 301lint: ${LOBJS} 302.if defined(LOBJS) && !empty(LOBJS) 303 ${LINT} ${LINTFLAGS} ${LDFLAGS:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS} ${LDADD} 304.endif 305 306##### Pull in related .mk logic 307.include <bsd.man.mk> 308.include <bsd.nls.mk> 309.include <bsd.files.mk> 310.include <bsd.inc.mk> 311.include <bsd.links.mk> 312.include <bsd.sys.mk> 313.include <bsd.dep.mk> 314 315${TARGETS}: # ensure existence 316 317.endif # HOSTPROG 318