1# $NetBSD: bsd.prog.mk,v 1.165 2003/03/30 00:35:07 thorpej Exp $ 2# @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94 3 4.include <bsd.init.mk> 5.include <bsd.shlib.mk> 6 7##### Basic targets 8.PHONY: cleanextra cleanobjs cleanprog proginstall scriptsinstall 9realinstall: proginstall scriptsinstall 10clean: cleanprog 11 12##### Default values 13CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include} 14CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include/g++} 15CFLAGS+= ${COPTS} 16.if ${MACHINE_ARCH} == "sparc64" 17CFLAGS+= -mcmodel=medlow 18.endif 19 20# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o 21.if ${OBJECT_FMT} == "ELF" 22.ifndef LIBCRTBEGIN 23LIBCRTBEGIN= ${DESTDIR}/usr/lib/crti.o ${DESTDIR}/usr/lib/crtbegin.o 24.MADE: ${LIBCRTBEGIN} 25.endif 26.ifndef LIBCRTEND 27.if ${MACHINE_ARCH} == "powerpc" && defined(HAVE_GCC3) 28LIBCRTEND= ${DESTDIR}/usr/lib/crtsavres.o \ 29 ${DESTDIR}/usr/lib/crtend.o ${DESTDIR}/usr/lib/crtn.o 30.else 31LIBCRTEND= ${DESTDIR}/usr/lib/crtend.o ${DESTDIR}/usr/lib/crtn.o 32.endif 33.MADE: ${LIBCRTEND} 34.endif 35_SHLINKER= ${SHLINKDIR}/ld.elf_so 36.else 37LIBCRTBEGIN?= 38LIBCRTEND?= 39_SHLINKER= ${SHLINKDIR}/ld.so 40.endif 41 42.ifndef LIBCRT0 43LIBCRT0= ${DESTDIR}/usr/lib/crt0.o 44.MADE: ${LIBCRT0} 45.endif 46 47##### Installed system library definitions 48# E.g. LIBC?=${DESTDIR}/usr/lib/libc.a 49# etc.. 50# 51__bsd_prog_mk_system_libs?= \ 52 BZ2 C C_PIC CDK COM_ERR COMPAT CRYPT CRYPTO CRYPTO_IDEA CRYPTO_MDC2 \ 53 CRYPTO_RC5 \ 54 CURSES DBM DES EDIT FORM GCC GNUMALLOC GSSAPI HDB INTL IPSEC \ 55 KADM KADM5CLNT KADM5SRV KAFS KDB KRB KRB5 KSTREAM KVM L M MENU \ 56 OBJC OSSAUDIO PCAP PCI PMC POSIX PTHREAD PTHREAD_DBG RESOLV RMT \ 57 ROKEN RPCSVC RT SKEY SS SSL SL TERMCAP TELNET USBHID UTIL WRAP Y Z 58 59.for _n in ${__bsd_prog_mk_system_libs} 60.ifndef LIB${_n} 61LIB${_n}= ${DESTDIR}/usr/lib/lib${_n:tl}.a 62# XXX - note that ${DESTDIR} will be expanded in the following rule 63.MADE: ${LIB${_n}} 64.endif 65.endfor 66.undef __bsd_prog_mk_system_libs 67 68##### Build and install rules 69.if defined(SHAREDSTRINGS) 70CLEANFILES+=strings 71.c.o: 72 ${CC} -E ${CFLAGS} ${.IMPSRC} | xstr -c - 73 @${CC} ${CFLAGS} -c x.c -o ${.TARGET} 74 @rm -f x.c 75 76.cc.o: 77 ${CXX} -E ${CXXFLAGS} ${.IMPSRC} | xstr -c - 78 @mv -f x.c x.cc 79 @${CXX} ${CXXFLAGS} -c x.cc -o ${.TARGET} 80 @rm -f x.cc 81 82.C.o: 83 ${CXX} -E ${CXXFLAGS} ${.IMPSRC} | xstr -c - 84 @mv -f x.c x.C 85 @${CXX} ${CXXFLAGS} -c x.C -o ${.TARGET} 86 @rm -f x.C 87.endif 88 89.if defined(PROG_CXX) 90PROG= ${PROG_CXX} 91.endif 92 93.if defined(PROG) 94.if defined(PROG_CXX) 95SRCS?= ${PROG}.cc 96.else 97SRCS?= ${PROG}.c 98.endif 99 100DPSRCS+= ${SRCS:M*.[ly]:C/\..$/.c/} 101CLEANFILES+= ${DPSRCS} ${YHEADER:D${SRCS:M*.y:.y=.h}} 102 103.if !empty(SRCS:N*.h:N*.sh:N*.fth) 104OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g} 105LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 106.endif 107 108.if defined(OBJS) && !empty(OBJS) 109.NOPATH: ${OBJS} ${PROG} ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 110 111_PROGLDOPTS= 112.if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves 113.if ${OBJECT_FMT} == "ELF" 114_PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER} 115.endif 116.if ${OBJECT_FMT} == "a.out" 117LIBCRT0= ${DESTDIR}/lib/crt0.o 118.endif 119.endif 120.if ${SHLIBDIR} != ${LIBDIR} 121_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \ 122 -Wl,-rpath,${SHLIBDIR}:/usr/lib \ 123 -L${DESTDIR}${SHLIBDIR} 124.elif ${SHLIBINSTALLDIR} != ${LIBDIR} 125_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \ 126 -L${DESTDIR}${SHLIBINSTALLDIR} 127.endif 128 129.if defined(PROG_CXX) 130_CCLINK= ${CXX} 131_SUPCXX= -lstdc++ -lm 132.else 133_CCLINK= ${CC} 134.endif 135 136.gdbinit: 137 rm -f .gdbinit 138.if defined(DESTDIR) && !empty(DESTDIR) 139 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit 140.else 141 touch .gdbinit 142.endif 143.for __gdbinit in ${GDBINIT} 144 echo "source ${__gdbinit}" >> .gdbinit 145.endfor 146 147.if defined(DESTDIR) 148 149${PROG}: .gdbinit ${LIBCRT0} ${DPSRCS} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 150.if !commands(${PROG}) 151 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND} 152.endif 153 154.else 155 156${PROG}: .gdbinit ${LIBCRT0} ${DPSRCS} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 157.if !commands(${PROG}) 158 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD} 159.endif 160 161.endif # defined(DESTDIR) 162.endif # defined(OBJS) && !empty(OBJS) 163 164.if !defined(MAN) 165MAN= ${PROG}.1 166.endif # !defined(MAN) 167.endif # defined(PROG) 168 169realall: ${PROG} ${SCRIPTS} 170 171cleanprog: cleanobjs cleanextra 172 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG} 173 174cleanobjs: 175.if defined(OBJS) && !empty(OBJS) 176 rm -f ${OBJS} ${LOBJS} 177.endif 178 179cleanextra: 180.if defined(CLEANFILES) && !empty(CLEANFILES) 181 rm -f ${CLEANFILES} 182.endif 183 184.if defined(SRCS) && !target(afterdepend) 185afterdepend: .depend 186 @(TMP=/tmp/_depend$$$$; \ 187 sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.ln:/' \ 188 < .depend > $$TMP; \ 189 mv $$TMP .depend) 190.endif 191 192.if defined(PROG) && !target(proginstall) 193PROGNAME?=${PROG} 194 195proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME} 196.PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME} 197 198__proginstall: .USE 199 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 200 ${STRIPFLAG} ${SYSPKGTAG} ${.ALLSRC} ${.TARGET} 201 202.if !defined(UPDATE) 203${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall 204.if !defined(BUILD) && !make(all) && !make(${PROG}) 205${DESTDIR}${BINDIR}/${PROGNAME}! .MADE 206.endif 207.else 208${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall 209.if !defined(BUILD) && !make(all) && !make(${PROG}) 210${DESTDIR}${BINDIR}/${PROGNAME}: .MADE 211.endif 212.endif 213.endif 214 215.if !target(proginstall) 216proginstall:: 217.endif 218 219.if defined(SCRIPTS) && !target(scriptsinstall) 220SCRIPTSDIR?=${BINDIR} 221SCRIPTSOWN?=${BINOWN} 222SCRIPTSGRP?=${BINGRP} 223SCRIPTSMODE?=${BINMODE} 224 225scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 226.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 227 228__scriptinstall: .USE 229 ${INSTALL_FILE} \ 230 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ 231 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ 232 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ 233 ${SYSPKGTAG} ${.ALLSRC} ${.TARGET} 234 235.for S in ${SCRIPTS:O:u} 236.if !defined(UPDATE) 237${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall 238.if !defined(BUILD) && !make(all) && !make(${S}) 239${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE 240.endif 241.else 242${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall 243.if !defined(BUILD) && !make(all) && !make(${S}) 244${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE 245.endif 246.endif 247.endfor 248.endif 249 250.if !target(scriptsinstall) 251scriptsinstall:: 252.endif 253 254lint: ${LOBJS} 255.if defined(LOBJS) && !empty(LOBJS) 256 ${LINT} ${LINTFLAGS} ${LDFLAGS:M-L*} ${LOBJS} ${LDADD} 257.endif 258 259##### Pull in related .mk logic 260.include <bsd.man.mk> 261.include <bsd.nls.mk> 262.include <bsd.files.mk> 263.include <bsd.inc.mk> 264.include <bsd.links.mk> 265.include <bsd.dep.mk> 266.include <bsd.sys.mk> 267 268${TARGETS}: # ensure existence 269