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