minix/share/mk/bsd.prog.mk
Gianluca Guida 6567e50a6f mk scripts: add flag for compiling with nbsd libc.
This patch changes the system mk scripts to enable compilation
of programs using the BSD make system to compile with the new
libc.

In details, it does the following:

- it always defines the __MINIX make variable. This can be used,
 in porting applications, to specialize Makefiles for Minix.

 - If the environment variable NBSD is set to something different
  than 'no' and if the compiler is not ack, set NBSD_LIBC to 'yes'.
  This will set the destination lib directory to '/usr/netbsd/lib' 
  and set up CPPFLAGS and LDFLAGS to use new libc's includes and
  library directory.
2011-03-03 16:41:19 +00:00

398 lines
11 KiB
Makefile

# $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>
.include <bsd.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: .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)
.if (${NBSD_LIBC} == "yes")
CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/netbsd/include}
.else
CPPFLAGS+= ${DESTDIR:D-nostdinc ${CPPFLAG_ISYSTEM} ${DESTDIR}/usr/include}
.endif
.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 \
c curses driver netdriver edit end m sys timers util bz2 l hgfs \
audiodriver exec ddekit devman usb
.ifndef LIB${_lib:tu}
LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a
.if ${COMPILER_TYPE} == "ack"
LIB${_lib:tu}= ${DESTDIR}/usr/lib/i386/lib${_lib}.a
.elif ${COMPILER_TYPE} == "gnu"
.if defined(NBSD_LIBC) && (${NBSD_LIBC} != "no")
LIB${_lib:tu}= ${DESTDIR}/usr/netbsd/lib/lib${_lib}.a
.else
LIB${_lib:tu}= ${DESTDIR}/usr/lib/lib${_lib}.a
.endif
.endif
.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} \
${INSTALLFLAGS} ${STRIPFLAG} ${.ALLSRC} ${.TARGET}
__progdebuginstall: .USE
${_MKTARGET_INSTALL}
${INSTALL_FILE} -o ${DEBUGOWN} -g ${DEBUGGRP} -m ${DEBUGMODE} \
${INSTALLFLAGS} ${.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>
.if ${COMPILER_TYPE} == "ack"
.include <bsd.ack.mk>
.elif ${COMPILER_TYPE} == "gnu"
.include <bsd.gcc.mk>
.endif
cleanextra: .PHONY
.if defined(CLEANFILES) && !empty(CLEANFILES)
rm -f ${CLEANFILES}
.endif
${TARGETS}: # ensure existence
###### Minix rule to set up mem allocations for boot image services
.if defined(INSTALLFLAGS)
all: .PHONY memalloc
memalloc: realall
${INSTALL} ${INSTALLFLAGS} ${PROG}
.endif
.gitignore: Makefile
echo $(CLEANFILES) $(PROGS) | tr ' ' '\n' >.gitignore
.endif # HOSTPROG