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