Latest progs.mk from crufty.net for ATF

Approved by:	marcel (mentor)
This commit is contained in:
Simon J. Gerraty 2012-11-07 21:44:04 +00:00
parent 2a4985847a
commit 81e6864102
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=242710

View File

@ -1,350 +1,88 @@
# from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91
# $FreeBSD$
# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $
#
# @(#) Copyright (c) 2006, Simon J. Gerraty
#
# This file is provided in the hope that it will
# be of use. There is absolutely NO WARRANTY.
# Permission to copy, redistribute or otherwise
# use this file is hereby granted provided that
# the above copyright notice and this notice are
# left intact.
#
# Please send copies of changes and bug-fixes to:
# sjg@crufty.net
#
.include <bsd.init.mk>
.MAIN: all
.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm
.if defined(PROGS)
.if ${MK_MAN} == "no"
NO_MAN=
# In meta mode, we can capture dependenices for _one_ of the progs.
# if makefile doesn't nominate one, we use the first.
.ifndef UPDATE_DEPENDFILE_PROG
UPDATE_DEPENDFILE_PROG = ${PROGS:[1]}
.export UPDATE_DEPENDFILE_PROG
.endif
# Legacy knobs
.if defined(PROG) || defined(PROG_CXX)
. if defined(PROG)
PROGS= ${PROG}
. endif
. if defined(PROG_CXX)
PROGS= ${PROG_CXX}
PROGS_CXX= ${PROG_CXX}
. endif
# Loop once to keep pattern and avoid namespace pollution
. for _P in ${PROGS}
. if defined(INTERNALPROG)
INTERNALPROG.${_P}=
. endif
. if !defined(NO_MAN)
. if defined(MAN)
MAN.${_P}= ${MAN}
. else
. for sect in 1 1aout 2 3 4 5 6 7 8 9
. if defined(MAN${sect})
MAN.${_P}= ${MAN${sect}}
. endif
. endfor
. endif
. endif # defined(NO_MAN)
. if defined(NLSNAME) && !empty(NLSNAME)
NLSNAME.${P}:= ${NLSNAME}
. endif
. if defined(OBJS)
OBJS.${_P}:= ${OBJS}
. endif
. if defined(PRECIOUSPROG)
PRECIOUSPROG.${_P}=
. endif
. if defined(PROGNAME)
PROGNAME.${_P}= ${PROGNAME}
. endif
. if defined(SRCS)
SRCS.${_P}:= ${SRCS}
. endif
. endfor
.else # !defined(PROG) && !defined(PROG_CXX)
. if defined(PROGS_CXX) && !empty(PROGS_CXX)
PROGS+= ${PROGS_CXX}
. endif
.endif # defined(PROG) || defined(PROG_CXX)
.if defined(PROGS_CXX) && !empty(PROGS_CXX)
. for _P in ${PROGS_CXX}
PROG_CXX.${_P}=
. endfor
.ifndef PROG
# They may have asked us to build just one
.for t in ${PROGS}
.if make($t)
PROG ?= $t
.endif
.endfor
.endif
# Avoid recursive variables
.undef NLSNAME
.if defined(COPTS)
CFLAGS+=${COPTS}
.endif
.if defined(DEBUG_FLAGS)
. if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
CTFFLAGS+= -g
. endif
CFLAGS+=${DEBUG_FLAGS}
CXXFLAGS+=${DEBUG_FLAGS}
.endif
STRIP?= -s
.if ${MK_ASSERT_DEBUG} == "no"
CFLAGS+= -DNDEBUG
NO_WERROR=
.endif
.for _P in ${PROGS}
BINDIR.${_P}?= ${BINDIR}
BINGRP.${_P}?= ${BINGRP}
BINMODE.${_P}?= ${BINMODE}
BINOWN.${_P}?= ${BINOWN}
CFLAGS.${_P}+= ${CFLAGS}
CXXFLAGS.${_P}+= ${CXXFLAGS}
DPADD.${_P}+= ${DPADD}
LDADD.${_P}+= ${LDADD}
LDFLAGS.${_P}+= ${LDFLAGS}
INSTALLFLAGS.${_P}?= ${INSTALLFLAGS}
. if defined(PRECIOUSPROG.${_P})
. if !defined(NO_FSCHG) && !defined(NO_FSCHG.${_P})
INSTALLFLAGS.${_P}+= -fschg
. endif
INSTALLFLAGS.${_P}+= -S
. endif
NO_SHARED.${_P}?= ${NO_SHARED}
. if !defined(NLSDIR.${_P})
NLSDIR.${_P}:= ${NLSDIR}
. endif
. undef NLSDIR
. if !empty(NO_SHARED.${_P}) && ${NO_SHARED.${_P}:tl} != "no"
LDFLAGS.${_P}+= -static
. endif
. if defined(SRCS.${_P})
_SRCS:= ${SRCS.${_P}}
OBJS.${_P}+= ${_SRCS:N*.h:R:S/$/.o/g}
. if target(beforelinking)
${_P}: ${OBJS.${_P}} beforelinking
. else
${_P}: ${OBJS.${_P}}
. endif
. if defined(PROG_CXX.${_P})
${CXX} ${CXXFLAGS.${_P}} ${LDFLAGS.${_P}} -o ${.TARGET} ${OBJS.${_P}} \
${LDADD.${_P}}
. else
${CC} ${CFLAGS.${_P}} ${LDFLAGS.${_P}} -o ${.TARGET} ${OBJS.${_P}} \
${LDADD.${_P}}
. endif
. if ${MK_CTF} != "no"
${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS.${_P}}
. endif
. else # !defined(SRCS.${_P})
. if !target(${_P})
. if defined(PROG_CXX.${_P})
SRCS.${_P}?= ${_P}.cc
. else
SRCS.${_P}?= ${_P}.c
. endif
# Always make an intermediate object file because:
# - it saves time rebuilding when only the library has changed
# - the name of the object gets put into the executable symbol table instead of
# the name of a variable temporary object.
# - it's useful to keep objects around for crunching.
OBJS.${_P}:= ${_P}.o
. if target(beforelinking)
${_P}: ${OBJS.${_P}} beforelinking
. else
${_P}: ${OBJS.${_P}}
. endif # target(beforelinking)
. if defined(PROG_CXX.${_P})
${CXX} ${CXXFLAGS.${_P}} ${LDFLAGS.${_P}} -o ${.TARGET} ${OBJS.${_P}} \
${LDADD.${_P}}
. else
${CC} ${CFLAGS.${_P}} ${LDFLAGS.${_P}} -o ${.TARGET} ${OBJS.${_P}} \
${LDADD.${_P}}
. endif
. if ${MK_CTF} != "no"
${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS.${_P}}
. endif
. endif # !target(${_P})
. endif # defined(SRCS.${_P})
CLEANFILES+= ${OBJS.${_P}}
.endfor # for _P in ${PROGS}
all: objwarn ${PROGS} ${SCRIPTS}
.if !defined(NO_MAN)
. for _P in ${PROGS}
MAN.${_P}?= ${_P}.1
MAN:= ${MAN.${_P}}
. include <bsd.man.mk>
. endfor
. if target(_manpages) # bsd.man.mk was included
all: _manpages
. endif
.endif
CLEANFILES+= ${PROGS}
.include <bsd.libnames.mk>
_EXTRADEPEND:
.for _P in ${PROGS}
. if !empty(LDFLAGS.${P}:M-nostdlib)
. if !empty(DPADD.${_P})
echo ${_P}: ${DPADD.${_P}} >> ${DEPENDFILE}
. endif
. else
echo ${_P}: ${LIBC} ${DPADD.${_P}} >> ${DEPENDFILE}
. if defined(PROG_CXX.${_P})
. if !empty(CXXFLAGS.${P}:M-stdlib=libc++)
echo ${_P}: ${LIBCPLUSPLUS} >> ${DEPENDFILE}
. else
echo ${_P}: ${LIBSTDCPLUSPLUS} >> ${DEPENDFILE}
. endif
. endif
. endif
.if defined(PROG)
# just one of many
PROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD MAN SRCS
.for v in ${PROG_VARS:O:u}
$v += ${${v}_${PROG}:U${${v}.${PROG}}}
.endfor
.if !target(install)
# for meta mode, there can be only one!
.if ${PROG} == ${UPDATE_DEPENDFILE_PROG:Uno}
UPDATE_DEPENDFILE ?= yes
.endif
UPDATE_DEPENDFILE ?= NO
. if !target(realinstall)
# ensure that we don't clobber each other's dependencies
DEPENDFILE?= .depend.${PROG}
# prog.mk will do the rest
.else
all: ${PROGS}
. for _P in ${PROGS}
. if !defined(INTERNALPROG.${_P})
.ORDER: beforeinstall _proginstall.${_P}
_proginstall.${_P}:
. if defined(PROGNAME.${_P})
${INSTALL} ${STRIP} -o ${BINOWN.${_P}} -g ${BINGRP.${_P}} \
-m ${BINMODE.${_P}} ${INSTALLFLAGS.${_P}} ${_P} \
${DESTDIR}${BINDIR.${_P}}/${PROGNAME.${_P}}
. else
${INSTALL} ${STRIP} -o ${BINOWN.${_P}} -g ${BINGRP.${_P}} \
-m ${BINMODE.${_P}} ${INSTALLFLAGS.${_P}} ${_P} \
${DESTDIR}${BINDIR.${_P}}
. endif
realinstall: _proginstall.${_P}
. endif # !defined(INTERNALPROG.${_P})
. endfor # for _P in ${PROGS}
. endif # !target(realinstall)
. if defined(SCRIPTS) && !empty(SCRIPTS)
SCRIPTSDIR?= ${BINDIR}
SCRIPTSOWN?= ${BINOWN}
SCRIPTSGRP?= ${BINGRP}
SCRIPTSMODE?= ${BINMODE}
. for S in ${SCRIPTS}
realinstall: scriptsinstall
.ORDER: beforeinstall scriptsinstall
. if defined(SCRIPTSNAME)
SCRIPTSNAME_${S}?= ${SCRIPTSNAME}
. else
SCRIPTSNAME_${S}?= ${S:T:R}
. endif
SCRIPTSDIR_${S}?= ${SCRIPTSDIR}
SCRIPTSOWN_${S}?= ${SCRIPTSOWN}
SCRIPTSGRP_${S}?= ${SCRIPTSGRP}
SCRIPTSMODE_${S}?= ${SCRIPTSMODE}
scriptsinstall: ${DESTDIR}${SCRIPTSDIR_${S}}/${SCRIPTSNAME_${S}}
${DESTDIR}${SCRIPTSDIR_${S}}/${SCRIPTSNAME_${S}}: ${S}
${INSTALL} -o ${SCRIPTSOWN_${S}} \
-g ${SCRIPTSGRP_${S}} \
-m ${SCRIPTSMODE_${S}} \
${.ALLSRC} \
${.TARGET}
. endfor # for S in ${SCRIPTS}
. endif # defined(SCRIPTS) && !empty(SCRIPTS)
.endif # !target(install)
.if !defined(NO_MAN)
. if target(_manpages) # bsd.man.mk was included
realinstall: _maninstall
. endif
# We cannot capture dependencies for meta mode here
UPDATE_DEPENDFILE = NO
# nor can we safely run in parallel.
.NOTPARALLEL:
.endif
.endif
# Wrap bsd.nls.mk because I can't force that Makefile snippet to work only with
# ${PROGS}.
.for _P in ${PROGS}
NLSNAME.${_P}?= ${_P}
NLS:= ${NLS.${_P}}
NLSDIR:= ${NLSDIR.${_P}}
NLSNAME:= ${NLSNAME.${_P}}
.include <bsd.nls.mk>
# handle being called [bsd.]progs.mk
.include <${.PARSEFILE:S,progs,prog,}>
.ifndef PROG
PROGS_TARGETS += clean
.for p in ${PROGS}
.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
# bsd.prog.mk may need to know this
x.$p= PROG_CXX=$p
.endif
$p ${p}_p: .PHONY .MAKE
(cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p})
.for t in ${PROGS_TARGETS:O:u}
$p.$t: .PHONY .MAKE
(cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p} ${@:E})
.endfor
.endfor
.include <bsd.files.mk>
.include <bsd.incs.mk>
.include <bsd.links.mk>
.if !target(lint)
. for _P in ${PROGS}
. if !target(lint.${_P})
. if defined(PROG_CXX.${_P})
lint.${_P}:
. else
_CFLAGS:= ${CFLAGS.${_P}}
_SRCS:= ${SRCS.${_P}}
lint.${_P}: ${_SRCS:M*.c}
${LINT} ${LINTFLAGS} ${_CFLAGS:M-[DIU]*} ${.ALLSRC}
. endif
. endif
lint: lint.${_P}
. endfor
.endif # !target(lint)
.for _P in ${PROGS}
CFLAGS:= ${CFLAGS.${_P}}
CXXFLAGS:= ${CXXFLAGS.${_P}}
# XXX: Pollutes DPADD.${_P} and LDADD.${_P} above
#DPADD:= ${DPADD.${_P}}
#LDADD:= ${LDADD.${_P}}
SRCS:= ${SRCS.${_P}}
. include <bsd.dep.mk>
# bsd.dep.mk mangles SRCS
SRCS.${_P}:= ${SRCS}
. undef DPADD LDADD
.for t in ${PROGS_TARGETS:O:u}
$t: ${PROGS:%=%.$t}
.endfor
# XXX: emulate the old bsd.prog.mk by allowing Makefiles that didn't set
# ${PROG*} to function with this Makefile snippet.
.if empty(PROGS)
. include <bsd.dep.mk>
.endif
.if !exists(${.OBJDIR}/${DEPENDFILE})
. for _P in ${PROGS}
_SRCS:= ${SRCS.${_P}}
${OBJS.${_P}}: ${_SRCS:M*.h}
. endfor
.endif
.include <bsd.obj.mk>
.include <bsd.sys.mk>
.if defined(PORTNAME)
.include <bsd.pkg.mk>
.endif