minix/share/mk/bsd.prog.mk

379 lines
10 KiB
Makefile
Raw Normal View History

# $NetBSD: bsd.prog.mk,v 1.244 2009/12/08 15:18:42 uebayasi Exp $
# @(#)bsd.prog.mk 8.2 (Berkeley) 4/2/94
.ifndef HOSTPROG
.include <bsd.init.mk>
2011-07-22 17:59:15 +02:00
.include <minix.gcov.mk>
#
# Definitions and targets shared among all programs built by a single
# Makefile.
#
##### Minix rule to make the "install" target depend on
##### "all" and "depend" targets
realinstall: realall
realall: depend
depend: ${.CURDIR}/.gitignore
##### Basic targets
realinstall: proginstall scriptsinstall
clean: cleanprog
cleanobjs: .PHONY
cleanprog: .PHONY cleanobjs cleanextra
rm -f a.out [Ee]rrs mklog core *.core
##### Default values
.if empty(CPPFLAGS:M-nostdinc)
CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
.endif
.if empty(CXXFLAGS:M-nostdinc++)
CXXFLAGS+= ${DESTDIR:D-nostdinc++ ${CPPFLAG_ISYSTEMXX} ${DESTDIR}/usr/include/g++}
.endif
CFLAGS+= ${COPTS}
OBJCFLAGS+= ${OBJCOPTS}
MKDEP_SUFFIXES?= .o .ln
##### Installed system library definitions
#
# E.g.
# LIBC?=${DESTDIR}/usr/lib/libc.a
# LIBX11?=${DESTDIR}/usr/X11R7/lib/libX11.a
# etc..
# .for _lib in \
# archive asn1 bluetooth bsdmalloc bz2 c c_pic cdk com_err compat \
# crypt crypto crypto_idea crypto_mdc2 crypto_rc5 \
# curses dbm des edit event \
# fetch form fl g2c gcc gnumalloc gssapi hdb heimntlm hx509 intl ipsec \
# kadm5clnt kadm5srv kafs krb5 kvm l lber ldap ldap_r \
# m magic menu objc ossaudio pam pcap pci pmc posix pthread pthread_dbg \
# puffs radius resolv rmt roken rpcsvc rt rump rumpuser skey sl ss \
# ssh ssl termcap usbhid util wrap y z bind9 dns lwres isccfg isccc isc \
# \
# rumpfs_cd9660fs rumpfs_efs rumpfs_ext2fs rumpfs_ffs rumpfs_hfs \
# rumpfs_lfs rumpfs_msdosfs rumpfs_nfs rumpfs_ntfs rumpfs_syspuffs \
# rumpfs_tmpfs rumpfs_udf rumpfs_ufs
.for _lib in \
Split block/character protocols and libdriver This patch separates the character and block driver communication protocols. The old character protocol remains the same, but a new block protocol is introduced. The libdriver library is replaced by two new libraries: libchardriver and libblockdriver. Their exposed API, and drivers that use them, have been updated accordingly. Together, libbdev and libblockdriver now completely abstract away the message format used by the block protocol. As the memory driver is both a character and a block device driver, it now implements its own message loop. The most important semantic change made to the block protocol is that it is no longer possible to return both partial results and an error for a single transfer. This simplifies the interaction between the caller and the driver, as the I/O vector no longer needs to be copied back. Also, drivers are now no longer supposed to decide based on the layout of the I/O vector when a transfer should be cut short. Put simply, transfers are now supposed to either succeed completely, or result in an error. After this patch, the state of the various pieces is as follows: - block protocol: stable - libbdev API: stable for synchronous communication - libblockdriver API: needs slight revision (the drvlib/partition API in particular; the threading API will also change shortly) - character protocol: needs cleanup - libchardriver API: needs cleanup accordingly - driver restarts: largely unsupported until endpoint changes are reintroduced As a side effect, this patch eliminates several bugs, hacks, and gcc -Wall and -W warnings all over the place. It probably introduces a few new ones, too. Update warning: this patch changes the protocol between MFS and disk drivers, so in order to use old/new images, the MFS from the ramdisk must be used to mount all file systems.
2011-11-22 13:27:53 +01:00
c curses blockdriver chardriver netdriver edit end m sys timers util \
bz2 l audiodriver exec ddekit devman usb elf bdev sffs hgfs vboxfs
.ifndef LIB${_lib:tu}
LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a
.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
.endif
.endfor
# These need + -> X transformations
.ifndef LIBSTDCXX
LIBSTDCXX= ${DESTDIR}/usr/lib/libstdc++.a
.MADE: ${LIBSTDCXX}
.endif
.ifndef LIBSUPCXX
LIBSUPCXX= ${DESTDIR}/usr/lib/libsupc++.a
.MADE: ${LIBSUPCXX}
.endif
.for _lib in \
dps expat fntstubs fontcache fontconfig fontenc freetype FS \
GL GLU ICE lbxutil SM X11 Xau Xaw Xdmcp Xext Xfont Xft \
Xi Xinerama xkbfile Xmu Xmuu Xpm Xrandr Xrender Xss Xt \
XTrap Xtst Xv Xxf86dga Xxf86misc Xxf86vm
.ifndef LIB${_lib:tu}
LIB${_lib:tu}= ${DESTDIR}${X11USRLIBDIR}/lib${_lib}.a
.MADE: ${LIB${_lib:tu}} # Note: ${DESTDIR} will be expanded
.endif
.endfor
.if defined(RESCUEDIR)
CPPFLAGS+= -DRESCUEDIR=\"${RESCUEDIR}\"
.endif
__proginstall: .USE
${_MKTARGET_INSTALL}
${INSTALL_FILE} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
${STRIPFLAG} ${.ALLSRC} ${.TARGET}
__progdebuginstall: .USE
${_MKTARGET_INSTALL}
${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
${.ALLSRC} ${.TARGET}
#
# Backwards compatibility with Makefiles that assume that bsd.prog.mk
# can only build a single binary.
#
_APPEND_MANS=yes
_APPEND_SRCS=yes
_CCLINKFLAGS=
.if defined(DESTDIR)
_CCLINKFLAGS+= -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/
.endif
.if defined(PROG_CXX)
PROG= ${PROG_CXX}
_CCLINK= ${CXX} ${_CCLINKFLAGS}
.endif
.if defined(PROG)
_CCLINK?= ${CC} ${_CCLINKFLAGS}
. if defined(MAN)
MAN.${PROG}= ${MAN}
_APPEND_MANS= no
. endif
. if !defined(OBJS)
OBJS= ${OBJS.${PROG}}
. endif
. if defined(PROGNAME)
PROGNAME.${PROG}= ${PROGNAME}
. endif
. if defined(SRCS)
SRCS.${PROG}= ${SRCS}
_APPEND_SRCS= no
. endif
.endif
# Turn the single-program PROG and PROG_CXX variables into their multi-word
# counterparts, PROGS and PROGS_CXX.
.if defined(PROG_CXX) && !defined(PROGS_CXX)
PROGS_CXX= ${PROG_CXX}
.elif defined(PROG) && !defined(PROGS)
PROGS= ${PROG}
.endif
#
# Per-program definitions and targets.
#
# Definitions specific to C programs.
.for _P in ${PROGS}
SRCS.${_P}?= ${_P}.c
_CCLINK.${_P}= ${CC} ${_CCLINKFLAGS}
.endfor
# Definitions specific to C++ programs.
.for _P in ${PROGS_CXX}
SRCS.${_P}?= ${_P}.cc
_CCLINK.${_P}= ${CXX} ${_CCLINKFLAGS}
.endfor
# Language-independent definitions.
.for _P in ${PROGS} ${PROGS_CXX} # {
BINDIR.${_P}?= ${BINDIR}
PROGNAME.${_P}?= ${_P}
.if ${MKDEBUG} != "no" && ${OBJECT_FMT} == "ELF" && !commands(${_P})
_PROGDEBUG.${_P}:= ${PROGNAME.${_P}}.debug
.endif
##### PROG specific flags.
_LDADD.${_P}= ${LDADD} ${LDADD.${_P}}
_LDFLAGS.${_P}= ${LDFLAGS} ${LDFLAGS.${_P}}
_LDSTATIC.${_P}= ${LDSTATIC} ${LDSTATIC.${_P}}
##### Build and install rules
.if !empty(_APPEND_SRCS:M[Yy][Ee][Ss])
SRCS+= ${SRCS.${_P}} # For bsd.dep.mk
.endif
_YPSRCS.${_P}= ${SRCS.${_P}:M*.[ly]:C/\..$/.c/} ${YHEADER:D${SRCS.${_P}:M*.y:.y=.h}}
DPSRCS+= ${_YPSRCS.${_P}}
CLEANFILES+= ${_YPSRCS.${_P}}
.if !empty(SRCS.${_P}:N*.h:N*.sh:N*.fth)
OBJS.${_P}+= ${SRCS.${_P}:N*.h:N*.sh:N*.fth:R:S/$/.o/g}
LOBJS.${_P}+= ${LSRCS:.c=.ln} ${SRCS.${_P}:M*.c:.c=.ln}
.endif
.if defined(OBJS.${_P}) && !empty(OBJS.${_P}) # {
.NOPATH: ${OBJS.${_P}} ${_P} ${_YPSRCS.${_P}}
${OBJS.${_P}} ${LOBJS.${_P}}: ${DPSRCS}
${_P}: ${LIBCRT0} ${OBJS.${_P}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD}
.if !commands(${_P})
${_MKTARGET_LINK}
${_CCLINK.${_P}} \
${DESTDIR:D-Wl,-nostdlib} \
${_LDFLAGS.${_P}} ${_LDSTATIC.${_P}} -o ${.TARGET} \
${OBJS.${_P}} ${_LDADD.${_P}} \
${DESTDIR:D-L${_GCC_LIBGCCDIR}} \
${_PROGLDOPTS}
.if defined(PAXCTL_FLAGS.${_P})
${PAXCTL} ${PAXCTL_FLAGS.${_P}} ${.TARGET}
.endif
.if ${MKSTRIPIDENT} != "no"
${OBJCOPY} -R .ident ${.TARGET}
.endif
.endif # !commands(${_P})
${_P}.ro: ${OBJS.${_P}} ${DPADD}
${_MKTARGET_LINK}
${LD} -r -dc -o ${.TARGET} ${OBJS.${_P}}
.if defined(_PROGDEBUG.${_P})
${_PROGDEBUG.${_P}}: ${_P}
${_MKTARGET_CREATE}
${OBJCOPY} --only-keep-debug ${_P} ${_PROGDEBUG.${_P}}
${OBJCOPY} -R .gnu_debuglink --add-gnu-debuglink=${_PROGDEBUG.${_P}} ${_P} \
|| rm -f ${_PROGDEBUG.${_P}}
.endif
.endif # defined(OBJS.${_P}) && !empty(OBJS.${_P}) # }
.if !defined(MAN.${_P})
MAN.${_P}= ${_P}.1
.endif # !defined(MAN.${_P})
.if !empty(_APPEND_MANS:M[Yy][Ee][Ss])
MAN+= ${MAN.${_P}}
.endif
realall: ${_P} ${_PROGDEBUG.${_P}}
cleanprog: cleanprog-${_P}
cleanprog-${_P}:
rm -f ${_P} ${_PROGDEBUG.${_P}}
.if defined(OBJS.${_P}) && !empty(OBJS.${_P})
cleanobjs: cleanobjs-${_P}
cleanobjs-${_P}:
rm -f ${OBJS.${_P}} ${LOBJS.${_P}}
.endif
_PROG_INSTALL+= proginstall-${_P}
.if !target(proginstall-${_P}) # {
proginstall-${_P}:: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
.PRECIOUS: ${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}} \
${_PROGDEBUG.${_P}:D${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}}
.if ${MKUPDATE} == "no"
${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! ${_P} __proginstall
.if !defined(BUILD) && !make(all) && !make(${_P})
${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}! .MADE
.endif
.if defined(_PROGDEBUG.${_P})
${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! ${_PROGDEBUG.${_P}} __progdebuginstall
.if !defined(BUILD) && !make(all) && !make(${_P})
${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}! .MADE
.endif
.endif # define(_PROGDEBUG.${_P})
.else # MKUPDATE != no
${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: ${_P} __proginstall
.if !defined(BUILD) && !make(all) && !make(${_P})
${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}: .MADE
.endif
.if defined(_PROGDEBUG.${_P})
${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: ${_PROGDEBUG.${_P}} __progdebuginstall
.if !defined(BUILD) && !make(all) && !make(${_P})
${DESTDIR}${DEBUGDIR}${BINDIR.${_P}}/${_PROGDEBUG.${_P}}: .MADE
.endif
.endif # defined(_PROGDEBUG.${_P})
.endif # MKUPDATE != no
.endif # !target(proginstall-${_P}) # }
lint: lint-${_P}
lint-${_P}: ${LOBJS.${_P}}
.if defined(LOBJS.${_P}) && !empty(LOBJS.${_P})
${LINT} ${LINTFLAGS} ${_LDFLAGS.${_P}:C/-L[ ]*/-L/Wg:M-L*} ${LOBJS.${_P}} ${_LDADD.${_P}}
.endif
.endfor # _P in ${PROGS} ${PROGS_CXX} # }
.if defined(OBJS) && !empty(OBJS) && \
(empty(PROGS) && empty(PROGS_CXX))
cleanobjs: cleanobjs-plain
cleanobjs-plain:
rm -f ${OBJS} ${LOBJS}
.endif
.if !target(proginstall)
proginstall:: ${_PROG_INSTALL}
.endif
.PHONY: proginstall
realall: ${SCRIPTS}
.if defined(SCRIPTS) && !target(scriptsinstall) # {
SCRIPTSDIR?=${BINDIR}
SCRIPTSOWN?=${BINOWN}
SCRIPTSGRP?=${BINGRP}
SCRIPTSMODE?=${BINMODE}
scriptsinstall:: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
.PRECIOUS: ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}@}
__scriptinstall: .USE
${_MKTARGET_INSTALL}
${INSTALL_FILE} \
-o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \
-g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \
-m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \
${.ALLSRC} ${.TARGET}
.for S in ${SCRIPTS:O:u}
.if ${MKUPDATE} == "no"
${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! ${S} __scriptinstall
.if !defined(BUILD) && !make(all) && !make(${S})
${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}! .MADE
.endif
.else
${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: ${S} __scriptinstall
.if !defined(BUILD) && !make(all) && !make(${S})
${DESTDIR}${SCRIPTSDIR_${S}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S}:U${SCRIPTSNAME:U${S:T:R}}}: .MADE
.endif
.endif
.endfor
.endif # }
.if !target(scriptsinstall)
scriptsinstall::
.endif
.PHONY: scriptsinstall
##### Pull in related .mk logic
LINKSOWN?= ${BINOWN}
LINKSGRP?= ${BINGRP}
LINKSMODE?= ${BINMODE}
.include <bsd.man.mk>
.include <bsd.files.mk>
.include <bsd.inc.mk>
.include <bsd.links.mk>
.include <bsd.sys.mk>
.include <bsd.dep.mk>
2011-07-22 17:28:27 +02:00
.include <minix.gcc.mk>
cleanextra: .PHONY
.if defined(CLEANFILES) && !empty(CLEANFILES)
rm -f ${CLEANFILES}
.endif
${TARGETS}: # ensure existence
${.CURDIR}/.gitignore: Makefile
echo $(CLEANFILES) $(PROGS) | tr ' ' '\n' >${.TARGET}
.if defined(MINIXDYNAMIC)
LDFLAGS += -dynamic
.else
LDFLAGS += -static
.endif
.endif # HOSTPROG