diff options
Diffstat (limited to 'share/mk/bsd.progs.mk')
-rw-r--r-- | share/mk/bsd.progs.mk | 396 |
1 files changed, 67 insertions, 329 deletions
diff --git a/share/mk/bsd.progs.mk b/share/mk/bsd.progs.mk index 531c2ef..b6236fe 100644 --- a/share/mk/bsd.progs.mk +++ b/share/mk/bsd.progs.mk @@ -1,350 +1,88 @@ -# from: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 # $FreeBSD$ - -.include <bsd.init.mk> - -.SUFFIXES: .out .o .c .cc .cpp .cxx .C .m .y .l .ln .s .S .asm - -.if ${MK_MAN} == "no" -NO_MAN= +# $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 +# + +.MAIN: all + +.if defined(PROGS) + +# 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(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 defined(COPTS) -CFLAGS+=${COPTS} +# for meta mode, there can be only one! +.if ${PROG} == ${UPDATE_DEPENDFILE_PROG:Uno} +UPDATE_DEPENDFILE ?= yes .endif - -.if defined(DEBUG_FLAGS) -. if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" -CTFFLAGS+= -g -. endif -CFLAGS+=${DEBUG_FLAGS} -CXXFLAGS+=${DEBUG_FLAGS} +UPDATE_DEPENDFILE ?= NO + +# ensure that we don't clobber each other's dependencies +DEPENDFILE?= .depend.${PROG} +# prog.mk will do the rest +.else +all: ${PROGS} + +# We cannot capture dependencies for meta mode here +UPDATE_DEPENDFILE = NO +# nor can we safely run in parallel. +.NOTPARALLEL: .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} +# handle being called [bsd.]progs.mk +.include <${.PARSEFILE:S,progs,prog,}> -. if !defined(NLSDIR.${_P}) -NLSDIR.${_P}:= ${NLSDIR} -. endif -. undef NLSDIR +.ifndef PROG +PROGS_TARGETS += clean -. 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 +.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 -CLEANFILES+= ${PROGS} - -.include <bsd.libnames.mk> +$p ${p}_p: .PHONY .MAKE + (cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p}) -_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 +.for t in ${PROGS_TARGETS:O:u} +$p.$t: .PHONY .MAKE + (cd ${.CURDIR} && ${.MAKE} -f ${MAKEFILE} PROG=$p ${x.$p} ${@:E}) .endfor - -.if !target(install) - -. if !target(realinstall) - -. 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 -.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> .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 |