1# $NetBSD: bsd.prog.mk,v 1.215 2006/07/23 11:41:27 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}} 22OBJCOPTS+= ${OBJCOPTS.${PROG}} 23LDADD+= ${LDADD.${PROG}} 24LDFLAGS+= ${LDFLAGS.${PROG}} 25LDSTATIC+= ${LDSTATIC.${PROG}} 26 27##### Default values 28CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include} 29CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++} 30CFLAGS+= ${COPTS} 31OBJCFLAGS+= ${OBJCOPTS} 32MKDEP_SUFFIXES?= .o .ln 33 34# ELF platforms depend on crti.o, crtbegin.o, crtend.o, and crtn.o 35.if ${OBJECT_FMT} == "ELF" 36.ifndef LIBCRTBEGIN 37LIBCRTBEGIN= ${DESTDIR}/usr/lib/crti.o ${_GCC_CRTBEGIN} 38.MADE: ${LIBCRTBEGIN} 39.endif 40.ifndef LIBCRTEND 41LIBCRTEND= ${_GCC_CRTEND} ${DESTDIR}/usr/lib/crtn.o 42.MADE: ${LIBCRTEND} 43.endif 44_SHLINKER= ${SHLINKDIR}/ld.elf_so 45.else 46LIBCRTBEGIN?= 47LIBCRTEND?= 48_SHLINKER= ${SHLINKDIR}/ld.so 49.endif 50 51.ifndef LIBCRT0 52LIBCRT0= ${DESTDIR}/usr/lib/crt0.o 53.MADE: ${LIBCRT0} 54.endif 55 56##### Installed system library definitions 57# 58# E.g. 59# LIBC?=${DESTDIR}/usr/lib/libc.a 60# LIBX11?=${DESTDIR}/usr/X11R6/lib/libX11.a 61# etc.. 62 63.for _lib in \ 64 asn1 bluetooth bsdmalloc bz2 c c_pic cdk com_err compat crypt \ 65 crypto crypto_idea crypto_mdc2 crypto_rc5 \ 66 curses dbm des edit event \ 67 form fl g2c gcc gnumalloc gssapi hdb intl ipsec \ 68 kadm5clnt kadm5srv kafs krb5 kvm l \ 69 m magic menu objc ossaudio pam pcap pci pmc posix pthread pthread_dbg \ 70 radius resolv rmt roken rpcsvc rt sdp skey sl ss ssh ssl termcap \ 71 usbhid util wrap y z 72.ifndef LIB${_lib:tu} 73LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a 74.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 75.endif 76.endfor 77 78# PAM applications, if linked statically, need more libraries 79.if (${MKPIC} == "no") 80.if (${MKCRYPTO} != "no") 81PAM_STATIC_LDADD+= -lssh 82PAM_STATIC_DPADD+= ${LIBSSH} 83.endif 84.if (${MKKERBEROS} != "no") 85PAM_STATIC_LDADD+= -lkafs -lkrb5 -lasn1 -lroken -lcom_err -lcrypto 86PAM_STATIC_DPADD+= ${LIBKAFS} ${LIBKRB5} ${LIBASN1} ${LIBROKEN} \ 87 ${LIBCOM_ERR} ${LIBCRYPTO} 88.endif 89.if (${MKSKEY} != "no") 90PAM_STATIC_LDADD+= -lskey 91PAM_STATIC_DPADD+= ${LIBSKEY} 92.endif 93PAM_STATIC_LDADD+= -lradius -lcrypt -lrpcsvc -lutil 94PAM_STATIC_DPADD+= ${LIBRADIUS} ${LIBCRYPT} ${LIBRPCSVC} ${LIBUTIL} 95.else 96PAM_STATIC_LDADD= 97PAM_STATIC_DPADD= 98.endif 99 100.ifndef LIBSTDCXX 101LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a 102.MADE: ${LIBSTDCXX} 103.endif 104 105.for _lib in \ 106 dps expat fntstubs fontcache fontconfig fontenc freetype FS \ 107 GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \ 108 Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \ 109 XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm 110.ifndef LIB${_lib:tu} 111LIB${_lib:tu}= ${DESTDIR}/usr/X11R6/lib/lib${_lib}.a 112.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 113.endif 114.endfor 115 116 117##### Build and install rules 118.if defined(SHAREDSTRINGS) 119CLEANFILES+=strings 120.c.o: 121 ${CC} -E ${CPPFLAGS} ${CFLAGS} ${.IMPSRC} | xstr -c - 122 @${CC} ${CPPFLAGS} ${CFLAGS} -c x.c -o ${.TARGET} 123 @rm -f x.c 124 125.cc.o .cpp.o .cxx.o .C.o: 126 ${CXX} -E ${CPPFLAGS} ${CXXFLAGS} ${.IMPSRC} | xstr -c - 127 @mv -f x.c x.cc 128 @${CXX} ${CPPFLAGS} ${CXXFLAGS} -c x.cc -o ${.TARGET} 129 @rm -f x.cc 130.endif 131 132.if defined(PROG) # { 133.if defined(PROG_CXX) 134SRCS?= ${PROG}.cc 135.else 136SRCS?= ${PROG}.c 137.endif 138 139PROGNAME?= ${PROG} 140 141.if defined(RESCUEDIR) 142CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\" 143.endif 144 145_YPSRCS= ${SRCS:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS:M*.y:.y=.h}} 146 147DPSRCS+= ${_YPSRCS} 148CLEANFILES+= ${_YPSRCS} 149 150.if !empty(SRCS:N*.h:N*.sh:N*.fth) 151OBJS+= ${SRCS:N*.h:N*.sh:N*.fth:R:S/$/.o/g} 152LOBJS+= ${LSRCS:.c=.ln} ${SRCS:M*.c:.c=.ln} 153.endif 154 155.if defined(OBJS) && !empty(OBJS) # { 156.NOPATH: ${OBJS} ${PROG} ${_YPSRCS} 157 158_PROGLDOPTS= 159.if ${SHLINKDIR} != "/usr/libexec" # XXX: change or remove if ld.so moves 160.if ${OBJECT_FMT} == "ELF" 161_PROGLDOPTS+= -Wl,-dynamic-linker=${_SHLINKER} 162.endif 163.endif 164.if ${SHLIBDIR} != "/usr/lib" 165_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBDIR}:${DESTDIR}/usr/lib \ 166 -R${SHLIBDIR} \ 167 -L${DESTDIR}${SHLIBDIR} 168.elif ${SHLIBINSTALLDIR} != "/usr/lib" 169_PROGLDOPTS+= -Wl,-rpath-link,${DESTDIR}${SHLIBINSTALLDIR}:${DESTDIR}/usr/lib \ 170 -L${DESTDIR}${SHLIBINSTALLDIR} 171.endif 172 173.if defined(PROG_CXX) 174_CCLINK= ${CXX} 175.if ${USE_LIBSTDCXX} == "no" 176_SUPCXX= -lsupc++ -lm 177.else 178_SUPCXX= -lstdc++ -lm 179.endif 180.else 181_CCLINK= ${CC} 182.endif 183 184.if ${MKDEBUG} != "no" && ${OBJECT_FMT} == "ELF" && !commands(${PROG}) 185_PROGDEBUG= ${PROGNAME}.debug 186.endif 187 188.gdbinit: 189 rm -f .gdbinit 190.if defined(DESTDIR) && !empty(DESTDIR) 191 echo "set solib-absolute-prefix ${DESTDIR}" > .gdbinit 192.else 193 touch .gdbinit 194.endif 195.for __gdbinit in ${GDBINIT} 196 echo "source ${__gdbinit}" >> .gdbinit 197.endfor 198 199${OBJS} ${LOBJS}: ${DPSRCS} 200 201${PROG}: .gdbinit ${LIBCRT0} ${OBJS} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 202.if !commands(${PROG}) 203 ${_MKTARGET_LINK} 204.if defined(DESTDIR) 205 ${_CCLINK} -Wl,-nostdlib \ 206 ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} \ 207 -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ \ 208 ${OBJS} ${LDADD} \ 209 -L${_GCC_LIBGCCDIR} -L${DESTDIR}/usr/lib 210.else 211 ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD} 212.endif # defined(DESTDIR) 213.endif # !commands(${PROG}) 214 215${PROG}.ro: ${OBJS} ${DPADD} 216 ${_MKTARGET_LINK} 217 ${LD} -r -dc -o ${.TARGET} ${OBJS} 218 219.if defined(_PROGDEBUG) 220${_PROGDEBUG}: ${PROG} 221 ${_MKTARGET_CREATE} 222 ${OBJCOPY} --only-keep-debug ${PROG} ${_PROGDEBUG} 223 ${OBJCOPY} -R .gnu_debuglink --add-gnu-debuglink=${_PROGDEBUG} ${PROG} \ 224 || rm -f ${_PROGDEBUG} 225.endif 226 227.endif # defined(OBJS) && !empty(OBJS) # } 228 229.if !defined(MAN) 230MAN= ${PROG}.1 231.endif # !defined(MAN) 232.endif # defined(PROG) # } 233 234realall: ${PROG} ${_PROGDEBUG} ${SCRIPTS} 235 236cleanprog: .PHONY cleanobjs cleanextra 237 rm -f a.out [Ee]rrs mklog core *.core .gdbinit ${PROG} ${_PROGDEBUG} 238 239cleanobjs: .PHONY 240.if defined(OBJS) && !empty(OBJS) 241 rm -f ${OBJS} ${LOBJS} 242.endif 243 244cleanextra: .PHONY 245.if defined(CLEANFILES) && !empty(CLEANFILES) 246 rm -f ${CLEANFILES} 247.endif 248 249.if defined(PROG) && !target(proginstall) # { 250 251proginstall:: ${DESTDIR}${BINDIR}/${PROGNAME} ${_PROGDEBUG:D${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}} 252.PRECIOUS: ${DESTDIR}${BINDIR}/${PROGNAME} ${_PROGDEBUG:D${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}} 253 254__proginstall: .USE 255 ${_MKTARGET_INSTALL} 256 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 257 ${STRIPFLAG} ${.ALLSRC} ${.TARGET} 258 259__progdebuginstall: .USE 260 ${_MKTARGET_INSTALL} 261 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \ 262 ${.ALLSRC} ${.TARGET} 263 264.if ${MKUPDATE} == "no" 265${DESTDIR}${BINDIR}/${PROGNAME}! ${PROG} __proginstall 266.if !defined(BUILD) && !make(all) && !make(${PROG}) 267${DESTDIR}${BINDIR}/${PROGNAME}! .MADE 268.endif 269.if defined(_PROGDEBUG) 270${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}! ${_PROGDEBUG} __progdebuginstall 271.if !defined(BUILD) && !make(all) && !make(${PROG}) 272${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}! .MADE 273.endif 274.endif # define(_PROGDEBUG) 275.else # MKUPDATE != no 276${DESTDIR}${BINDIR}/${PROGNAME}: ${PROG} __proginstall 277.if !defined(BUILD) && !make(all) && !make(${PROG}) 278${DESTDIR}${BINDIR}/${PROGNAME}: .MADE 279.endif 280.if defined(_PROGDEBUG) 281${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}: ${_PROGDEBUG} __progdebuginstall 282.if !defined(BUILD) && !make(all) && !make(${PROG}) 283${DESTDIR}${DEBUGDIR}${BINDIR}/${_PROGDEBUG}: .MADE 284.endif 285.endif # defined(_PROGDEBUG) 286.endif # MKUPDATE != no 287 288.endif # defined(PROG) && !target(proginstall) # } 289 290.if !target(proginstall) 291proginstall:: 292.endif 293.PHONY: proginstall 294 295.if defined(SCRIPTS) && !target(scriptsinstall) # { 296SCRIPTSDIR?=${BINDIR} 297SCRIPTSOWN?=${BINOWN} 298SCRIPTSGRP?=${BINGRP} 299SCRIPTSMODE?=${BINMODE} 300 301scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 302.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 303 304__scriptinstall: .USE 305 ${_MKTARGET_INSTALL} 306 ${INSTALL_FILE} \ 307 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ 308 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ 309 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ 310 ${.ALLSRC} ${.TARGET} 311 312.for S in ${SCRIPTS:O:u} 313.if ${MKUPDATE} == "no" 314${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall 315.if !defined(BUILD) && !make(all) && !make(${S}) 316${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE 317.endif 318.else 319${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall 320.if !defined(BUILD) && !make(all) && !make(${S}) 321${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE 322.endif 323.endif 324.endfor 325.endif # } 326 327.if !target(scriptsinstall) 328scriptsinstall:: 329.endif 330.PHONY: scriptsinstall 331 332lint: ${LOBJS} 333.if defined(LOBJS) && !empty(LOBJS) 334 ${LINT} ${LINTFLAGS} ${LDFLAGS:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS} ${LDADD} 335.endif 336 337##### Pull in related .mk logic 338.include <bsd.man.mk> 339.include <bsd.nls.mk> 340.include <bsd.files.mk> 341.include <bsd.inc.mk> 342.include <bsd.links.mk> 343.include <bsd.sys.mk> 344.include <bsd.dep.mk> 345 346${TARGETS}: # ensure existence 347 348.endif # HOSTPROG 349