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