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