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