1# $NetBSD: bsd.prog.mk,v 1.244 2009/12/08 15:18:42 uebayasi Exp $ 2# @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94 3 4.ifndef HOSTPROG 5 6.include <bsd.init.mk> 7.include <minix.gcov.mk> 8 9# 10# Definitions and targets shared among all programs built by a single 11# Makefile. 12# 13 14##### Minix rule to make the "install" target depend on 15##### "all" and "depend" targets 16realinstall: realall 17realall: depend 18depend: ${.CURDIR}/.gitignore 19 20##### Basic targets 21realinstall: proginstall scriptsinstall 22clean: cleanprog 23 24cleanobjs: .PHONY 25 26cleanprog: .PHONY cleanobjs cleanextra 27 rm -f a.out [Ee]rrs mklog core *.core 28 29##### Default values 30.if empty(CPPFLAGS:M-nostdinc) 31CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include} 32.endif 33.if empty(CXXFLAGS:M-nostdinc++) 34CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++} 35.endif 36CFLAGS+= ${COPTS} 37OBJCFLAGS+= ${OBJCOPTS} 38MKDEP_SUFFIXES?= .o .ln 39 40##### Installed system library definitions 41# 42# E.g. 43# LIBC?=${DESTDIR}/usr/lib/libc.a 44# LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a 45# etc.. 46 47# .for _lib in \ 48# archive asn1 bluetooth bsdmalloc bz2 c c_pic cdk com_err compat \ 49# crypt crypto crypto_idea crypto_mdc2 crypto_rc5 \ 50# curses dbm des edit event \ 51# fetch form fl g2c gcc gnumalloc gssapi hdb heimntlm hx509 intl ipsec \ 52# kadm5clnt kadm5srv kafs krb5 kvm l lber ldap ldap_r \ 53# m magic menu objc ossaudio pam pcap pci pmc posix pthread pthread_dbg \ 54# puffs radius resolv rmt roken rpcsvc rt rump rumpuser skey sl ss \ 55# ssh ssl termcap usbhid util wrap y z bind9 dns lwres isccfg isccc isc \ 56# \ 57# rumpfs_cd9660fs rumpfs_efs rumpfs_ext2fs rumpfs_ffs rumpfs_hfs \ 58# rumpfs_lfs rumpfs_msdosfs rumpfs_nfs rumpfs_ntfs rumpfs_syspuffs \ 59# rumpfs_tmpfs rumpfs_udf rumpfs_ufs 60.for _lib in \ 61 c curses blockdriver chardriver netdriver edit end m sys timers util \ 62 bz2 l audiodriver exec ddekit devman usb elf bdev sffs hgfs vboxfs \ 63 minc minlib 64.ifndef LIB${_lib:tu} 65LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a 66.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 67.endif 68.endfor 69 70# These need + -> X transformations 71.ifndef LIBSTDCXX 72LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a 73.MADE: ${LIBSTDCXX} 74.endif 75 76.ifndef LIBSUPCXX 77LIBSUPCXX= ${DESTDIR}/usr/lib/libsupc++.a 78.MADE: ${LIBSUPCXX} 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}${X11USRLIBDIR}/lib${_lib}.a 88.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded 89.endif 90.endfor 91 92.if defined(RESCUEDIR) 93CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\" 94.endif 95 96__proginstall: .USE 97 ${_MKTARGET_INSTALL} 98 ${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ 99 ${STRIPFLAG} ${.ALLSRC} ${.TARGET} 100 101__progdebuginstall: .USE 102 ${_MKTARGET_INSTALL} 103 ${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \ 104 ${.ALLSRC} ${.TARGET} 105 106 107 108# 109# Backwards compatibility with Makefiles that assume that bsd.prog.mk 110# can only build a single binary. 111# 112 113_APPEND_MANS=yes 114_APPEND_SRCS=yes 115 116_CCLINKFLAGS= 117.if defined(DESTDIR) 118_CCLINKFLAGS+= -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ 119.endif 120 121.if defined(PROG_CXX) 122PROG= ${PROG_CXX} 123_CCLINK= ${CXX} ${_CCLINKFLAGS} 124.endif 125 126.if defined(PROG) 127_CCLINK?= ${CC} ${_CCLINKFLAGS} 128. if defined(MAN) 129MAN.${PROG}= ${MAN} 130_APPEND_MANS= no 131. endif 132. if !defined(OBJS) 133OBJS= ${OBJS.${PROG}} 134. endif 135. if defined(PROGNAME) 136PROGNAME.${PROG}= ${PROGNAME} 137. endif 138. if defined(SRCS) 139SRCS.${PROG}= ${SRCS} 140_APPEND_SRCS= no 141. endif 142.endif 143 144# Turn the single-program PROG and PROG_CXX variables into their multi-word 145# counterparts, PROGS and PROGS_CXX. 146.if defined(PROG_CXX) && !defined(PROGS_CXX) 147PROGS_CXX= ${PROG_CXX} 148.elif defined(PROG) && !defined(PROGS) 149PROGS= ${PROG} 150.endif 151 152 153 154# 155# Per-program definitions and targets. 156# 157 158# Definitions specific to C programs. 159.for _P in ${PROGS} 160SRCS.${_P}?= ${_P}.c 161_CCLINK.${_P}= ${CC} ${_CCLINKFLAGS} 162.endfor 163 164# Definitions specific to C++ programs. 165.for _P in ${PROGS_CXX} 166SRCS.${_P}?= ${_P}.cc 167_CCLINK.${_P}= ${CXX} ${_CCLINKFLAGS} 168.endfor 169 170# Language-independent definitions. 171.for _P in ${PROGS} ${PROGS_CXX} # { 172 173BINDIR.${_P}?= ${BINDIR} 174PROGNAME.${_P}?= ${_P} 175 176.if ${MKDEBUG} != "no" && ${OBJECT_FMT} == "ELF" && !commands(${_P}) 177_PROGDEBUG.${_P}:= ${PROGNAME.${_P}}.debug 178.endif 179 180##### PROG specific flags. 181 182_LDADD.${_P}= ${LDADD} ${LDADD.${_P}} 183_LDFLAGS.${_P}= ${LDFLAGS} ${LDFLAGS.${_P}} 184_LDSTATIC.${_P}= ${LDSTATIC} ${LDSTATIC.${_P}} 185 186##### Build and install rules 187.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss]) 188SRCS+= ${SRCS.${_P}} # For bsd.dep.mk 189.endif 190 191_YPSRCS.${_P}= ${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}} 192 193DPSRCS+= ${_YPSRCS.${_P}} 194CLEANFILES+= ${_YPSRCS.${_P}} 195 196.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth) 197OBJS.${_P}+= ${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g} 198LOBJS.${_P}+= ${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln} 199.endif 200 201.if defined(OBJS.${_P}) && !empty(OBJS.${_P}) # { 202.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}} 203 204${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS} 205 206${_P}: ${LIBCRT0} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} 207.if !commands(${_P}) 208 ${_MKTARGET_LINK} 209 ${_CCLINK.${_P}} \ 210 ${DESTDIR:D-Wl,-nostdlib} \ 211 ${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \ 212 ${OBJS.${_P}} ${_LDADD.${_P}} \ 213 ${DESTDIR:D-L${_GCC_LIBGCCDIR}} \ 214 ${_PROGLDOPTS} 215.if defined(PAXCTL_FLAGS.${_P}) 216 ${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET} 217.endif 218.if ${MKSTRIPIDENT} != "no" 219 ${OBJCOPY} -R .ident ${.TARGET} 220.endif 221.endif # !commands(${_P}) 222 223${_P}.ro: ${OBJS.${_P}} ${DPADD} 224 ${_MKTARGET_LINK} 225 ${LD} -r -dc -o ${.TARGET} ${OBJS.${_P}} 226 227.if defined(_PROGDEBUG.${_P}) 228${_PROGDEBUG.${_P}}: ${_P} 229 ${_MKTARGET_CREATE} 230 ${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}} 231 ${OBJCOPY} -R .gnu_debuglink --add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \ 232 || rm -f ${_PROGDEBUG.${_P}} 233.endif 234 235.endif # defined(OBJS.${_P}) && !empty(OBJS.${_P}) # } 236 237.if !defined(MAN.${_P}) 238MAN.${_P}= ${_P}.1 239.endif # !defined(MAN.${_P}) 240.if !empty(_APPEND_MANS:M[Yy][Ee][Ss]) 241MAN+= ${MAN.${_P}} 242.endif 243 244realall: ${_P} ${_PROGDEBUG.${_P}} 245 246cleanprog: cleanprog-${_P} 247cleanprog-${_P}: 248 rm -f ${_P} ${_PROGDEBUG.${_P}} 249 250.if defined(OBJS.${_P}) && !empty(OBJS.${_P}) 251cleanobjs: cleanobjs-${_P} 252cleanobjs-${_P}: 253 rm -f ${OBJS.${_P}} ${LOBJS.${_P}} 254.endif 255 256_PROG_INSTALL+= proginstall-${_P} 257 258.if !target(proginstall-${_P}) # { 259proginstall-${_P}:: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \ 260 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}} 261.PRECIOUS: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \ 262 ${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}} 263 264.if ${MKUPDATE} == "no" 265${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall 266.if !defined(BUILD) && !make(all) && !make(${_P}) 267${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE 268.endif 269.if defined(_PROGDEBUG.${_P}) 270${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall 271.if !defined(BUILD) && !make(all) && !make(${_P}) 272${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE 273.endif 274.endif # define(_PROGDEBUG.${_P}) 275.else # MKUPDATE != no 276${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall 277.if !defined(BUILD) && !make(all) && !make(${_P}) 278${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE 279.endif 280.if defined(_PROGDEBUG.${_P}) 281${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall 282.if !defined(BUILD) && !make(all) && !make(${_P}) 283${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE 284.endif 285.endif # defined(_PROGDEBUG.${_P}) 286.endif # MKUPDATE != no 287 288.endif # !target(proginstall-${_P}) # } 289 290lint: lint-${_P} 291lint-${_P}: ${LOBJS.${_P}} 292.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P}) 293 ${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}} 294.endif 295 296.endfor # _P in ${PROGS} ${PROGS_CXX} # } 297 298.if defined(OBJS) && !empty(OBJS) && \ 299 (empty(PROGS) && empty(PROGS_CXX)) 300cleanobjs: cleanobjs-plain 301cleanobjs-plain: 302 rm -f ${OBJS} ${LOBJS} 303.endif 304 305.if !target(proginstall) 306proginstall:: ${_PROG_INSTALL} 307.endif 308.PHONY: proginstall 309 310 311 312realall: ${SCRIPTS} 313.if defined(SCRIPTS) && !target(scriptsinstall) # { 314SCRIPTSDIR?=${BINDIR} 315SCRIPTSOWN?=${BINOWN} 316SCRIPTSGRP?=${BINGRP} 317SCRIPTSMODE?=${BINMODE} 318 319scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 320.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@} 321 322__scriptinstall: .USE 323 ${_MKTARGET_INSTALL} 324 ${INSTALL_FILE} \ 325 -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ 326 -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ 327 -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ 328 ${.ALLSRC} ${.TARGET} 329 330.for S in ${SCRIPTS:O:u} 331.if ${MKUPDATE} == "no" 332${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall 333.if !defined(BUILD) && !make(all) && !make(${S}) 334${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE 335.endif 336.else 337${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall 338.if !defined(BUILD) && !make(all) && !make(${S}) 339${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE 340.endif 341.endif 342.endfor 343.endif # } 344 345.if !target(scriptsinstall) 346scriptsinstall:: 347.endif 348.PHONY: scriptsinstall 349 350##### Pull in related .mk logic 351LINKSOWN?= ${BINOWN} 352LINKSGRP?= ${BINGRP} 353LINKSMODE?= ${BINMODE} 354.include <bsd.man.mk> 355.include <bsd.files.mk> 356.include <bsd.inc.mk> 357.include <bsd.links.mk> 358.include <bsd.sys.mk> 359.include <bsd.dep.mk> 360.include <minix.gcc.mk> 361 362 363cleanextra: .PHONY 364.if defined(CLEANFILES) && !empty(CLEANFILES) 365 rm -f ${CLEANFILES} 366.endif 367 368${TARGETS}: # ensure existence 369 370${.CURDIR}/.gitignore: Makefile 371 echo $(CLEANFILES) $(PROGS) | tr ' ' '\n' >${.TARGET} 372 373.if defined(MINIXDYNAMIC) 374LDFLAGS += -dynamic 375.else 376LDFLAGS += -static 377.endif 378 379.endif # HOSTPROG 380