Add src/etc/Makefile.params, containing the definition of the

RELEASEVARS variable, and commands related to printing the values of
the variables whose names are in RELEASEVARS.

Add an awk script to remove noise printed by "make -j" or high levels
of MAKEVERBOSE, so we get only the variables names and values.  The
values are escaped so that variables containing embedded newlines,
quotation marks, and backslashes, are passed through safely.

Adapt src/etc/Makefile and src/Makefile to use the new ${PRINT_PARAMS}
command defined in src/etc/Makefile.params.

Now ${DESTDIR}/etc/release and the params file in the top-level
.OBJDIR should never contain unwanted noise, even after a build with
MAKEVERBOSE=4.
This commit is contained in:
apb 2012-12-03 13:53:28 +00:00
parent be789ebcbe
commit 3e31590ff0
3 changed files with 161 additions and 45 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.301 2012/11/15 23:51:53 joerg Exp $
# $NetBSD: Makefile,v 1.302 2012/12/03 13:53:29 apb Exp $
#
# This is the top-level makefile for building NetBSD. For an outline of
@ -259,11 +259,11 @@ includes-gnu: .PHONY includes-lib
#
# This is referenced by _NETBSD_VERSION_DEPENDS in <bsd.own.mk>.
#
.include "${NETBSDSRCDIR}/etc/Makefile.params"
CLEANDIRFILES+= params
params: .EXEC
${_MKMSG_CREATE} params
@(${MAKEDIRTARGET:S/^@//} etc params) >${.TARGET}.new
@${PRINT_PARAMS} >${.TARGET}.new
@if cmp -s ${.TARGET}.new ${.TARGET} > /dev/null 2>&1; then \
: "params is unchanged" ; \
rm ${.TARGET}.new ; \
@ -272,6 +272,12 @@ params: .EXEC
mv ${.TARGET}.new ${.TARGET} ; \
fi
#
# Display current make(1) parameters
#
show-params: .PHONY .MAKE
@${PRINT_PARAMS}
#
# Build the system and install into DESTDIR.
#
@ -521,9 +527,3 @@ dependall-distrib depend-distrib all-distrib: .PHONY
.include <bsd.obj.mk>
.include <bsd.kernobj.mk>
.include <bsd.subdir.mk>
#
# Display current make(1) parameters
#
show-params: .PHONY .MAKE
${MAKEDIRTARGET} etc params

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.400 2012/11/04 11:09:14 apb Exp $
# $NetBSD: Makefile,v 1.401 2012/12/03 13:53:28 apb Exp $
# from: @(#)Makefile 8.7 (Berkeley) 5/25/95
# Environment variables without default values:
@ -186,40 +186,7 @@ MAKEDEV: ${.CURDIR}/MAKEDEV.awk ${.CURDIR}/MAKEDEV.tmpl \
${TOOL_AWK} -f ${.CURDIR}/MAKEDEV.awk ${.CURDIR}/MAKEDEV.tmpl \
> ${.TARGET}
RELEASEVARS= BSDOBJDIR BSDSRCDIR BUILDID \
DESTDIR DISTRIBVER EXTERNAL_TOOLCHAIN HAVE_GCC HAVE_GDB \
INSTALLWORLDDIR \
KERNARCHDIR KERNCONFDIR KERNOBJDIR KERNSRCDIR \
MACHINE MACHINE_ARCH MAKE MAKECONF MAKEFLAGS \
MAKEOBJDIR MAKEOBJDIRPREFIX MAKEVERBOSE \
MKBFD MKBINUTILS MKCATPAGES \
MKCRYPTO MKCRYPTO_RC5 MKCVS \
MKDEBUG MKDEBUGLIB MKDOC MKDTRACE MKDYNAMICROOT \
MKGCC MKGCCCMDS MKGDB \
MKHESIOD MKHTML MKIEEEFP MKINET6 MKINFO MKIPFILTER \
MKKERBEROS MKLDAP MKLINKLIB MKLINT \
MKMAN MKMANZ MKMDNS MKNLS MKNPF MKOBJ MKOBJDIRS \
MKPAM MKPF MKPIC MKPICINSTALL MKPICLIB MKPOSTFIX MKPROFILE \
MKSHARE MKSKEY MKSOFTFLOAT MKSTATICLIB \
MKUNPRIVED MKUPDATE MKX11 MKYP \
NBUILDJOBS NETBSDSRCDIR \
NOCLEANDIR NODISTRIBDIRS NOINCLUDES \
OBJMACHINE \
RELEASEDIR RELEASEMACHINEDIR TOOLCHAIN_MISSING TOOLDIR \
USE_HESIOD USE_INET6 USE_JEMALLOC USE_KERBEROS USE_LDAP \
USE_PAM USE_SKEY USE_YP \
USETOOLS USR_OBJMACHINE \
X11SRCDIR X11FLAVOUR
params: .PHONY
.for var in ${RELEASEVARS}
.if defined(${var})
@printf "%20s = '%-s'\n" ${var} ${${var}:Q}
.else
@printf "%20s = (undefined)\n" ${var}
.endif
.endfor
.include "${NETBSDSRCDIR}/etc/Makefile.params"
CLEANFILES+= etc-release
etc-release: .EXEC .MAKE
${_MKTARGET_CREATE}
@ -231,7 +198,7 @@ etc-release: .EXEC .MAKE
printf "%20s %s\n" "Build date" "$$(date -u)"; \
printf "%20s %s\n" "Built by" "$${USER-root}@$$(hostname)"; \
echo ; \
(cd ${.CURDIR}; ${MAKE} ${MFLAGS} -j1 params); \
${PRINT_PARAMS} ; \
) >${.OBJDIR}/${.TARGET}
install-etc-release: .PHONY etc-release

149
etc/Makefile.params Normal file
View File

@ -0,0 +1,149 @@
# $NetBSD: Makefile.params,v 1.1 2012/12/03 13:53:28 apb Exp $
#
# Makefile fragment for printing build parameters.
#
# Public variables:
# RELEASEVARS
# List of variables whose value should be printed.
#
# PRINT_PARAMS
# A command to print the desired variables and values.
# Values are printed as single-quoted strings, with
# embedded quotes and newlines escaped in a way that's
# acceptable to sh(1). Undefined values are printed
# as "(undefined)" (without quotation marks).
#
# Internal targets:
# _params:
# Prints the names and values of all the variables
# listed in ${RELEASEVARS}. The output may be intermixed
# with debugging information, which can be removed by the
# ${_PARAMS_POSTPROCESS} command.
#
# Internal variables:
# _PARAMS_POSTPROCESS
# A command to postprocess the output from "make _params",
# to remove debugging information and other noise.
#
# Example:
# . ${NETBSDSRCDIR}/etc/Makefile.params
# show-params: .MAKE .PHONY # print params to stdout
# @${PRINT_PARAMS}
#
.include <bsd.sys.mk> # for TOOL_AWK, ...
RELEASEVARS= BSDOBJDIR BSDSRCDIR BUILDID \
DESTDIR DISTRIBVER EXTERNAL_TOOLCHAIN HAVE_GCC HAVE_GDB \
INSTALLWORLDDIR \
KERNARCHDIR KERNCONFDIR KERNOBJDIR KERNSRCDIR \
MACHINE MACHINE_ARCH MAKE MAKECONF MAKEFLAGS \
MAKEOBJDIR MAKEOBJDIRPREFIX MAKEVERBOSE \
MKBFD MKBINUTILS MKCATPAGES \
MKCRYPTO MKCRYPTO_RC5 MKCVS \
MKDEBUG MKDEBUGLIB MKDOC MKDTRACE MKDYNAMICROOT \
MKGCC MKGCCCMDS MKGDB \
MKHESIOD MKHTML MKIEEEFP MKINET6 MKINFO MKIPFILTER \
MKKERBEROS MKLDAP MKLINKLIB MKLINT \
MKMAN MKMANZ MKMDNS MKNLS MKNPF MKOBJ MKOBJDIRS \
MKPAM MKPF MKPIC MKPICINSTALL MKPICLIB MKPOSTFIX MKPROFILE \
MKSHARE MKSKEY MKSOFTFLOAT MKSTATICLIB \
MKUNPRIVED MKUPDATE MKX11 MKYP \
NBUILDJOBS NETBSDSRCDIR \
NOCLEANDIR NODISTRIBDIRS NOINCLUDES \
OBJMACHINE \
RELEASEDIR RELEASEMACHINEDIR TOOLCHAIN_MISSING TOOLDIR \
USE_HESIOD USE_INET6 USE_JEMALLOC USE_KERBEROS USE_LDAP \
USE_PAM USE_SKEY USE_YP \
USETOOLS USR_OBJMACHINE \
X11SRCDIR X11FLAVOUR
PRINT_PARAMS= (cd ${.CURDIR}; ${MAKE} _params) | ${_PARAMS_POSTPROCESS}
_params: .PHONY
.for var in ${RELEASEVARS}
.if defined(${var})
@printf "%20s = '%-s'\n" ${var} ${${var}:C/'/'\\\\''/gW:Q}
.else
@printf "%20s = (undefined)\n" ${var}
.endif
.endfor
# _PARAMS_POSTPROCESS:
#
# The output from the "make _params" can include the following types of
# unwanted lines:
#
# make -j prints "--- params ---";
#
# if MAKEVERBOSE is set to 3 or more then make prints each "printf"
# command in addition to executing it;
#
# if MAKEVERBOSE is set to 4 then the shell prints each command
# (prefixed with "+").
#
# So the resulting output can look like this:
#
# --- params ---
# + echo 'printf "%20s = '\''%-s'\''\n" BSDOBJDIR /usr/obj'
# printf "%20s = '%-s'\n" BSDOBJDIR /usr/obj
# + printf '%20s = '\''%-s'\''\n' BSDOBJDIR /usr/obj
# BSDOBJDIR = '/usr/obj'
# + echo 'printf "%20s = '\''%-s'\''\n" BSDSRCDIR /usr/src'
# printf "%20s = '%-s'\n" BSDSRCDIR /usr/src
# + printf '%20s = '\''%-s'\''\n' BSDSRCDIR /usr/src
# BSDSRCDIR = '/usr/src'
# [...]
#
# where what we want is just this:
#
# BSDOBJDIR = '/usr/obj'
# BSDSRCDIR = '/usr/src'
# [...]
#
# The awk program in ${PARAMS_POSTPROCESS} removes the unwanted noise,
# taking care with variables whose values contain embedded newlines
# (assuming that embedded newlines appear only inside single quotes).
#
_PARAMS_POSTPROCESS= ${TOOL_AWK} '\
BEGIN { single_quote = "'\''"; \
NORMAL = 0; \
SKIP_HEADING = 1; \
SKIP_MULTILINE = 2; \
PRINT_MULTILINE = 3; \
state = SKIP_HEADING; \
} \
function quotes_balanced_p(line) { \
return (line ~ /^([^\\"'\'']|\\.|'\''[^'\'']*'\''|"(\\.|[^\\"])*")*$$/); \
} \
state == SKIP_MULTILINE { \
if (quotes_balanced_p(single_quote $$0)) { \
state = NORMAL; \
} \
next; \
} \
state == PRINT_MULTILINE { \
if (quotes_balanced_p(single_quote $$0)) { \
state = NORMAL; \
} \
print; next; \
} \
state == SKIP_HEADING && $$0 ~ /^--- .* ---$$/ { next; } \
state == SKIP_HEADING && $$0 ~ / ===> / { next; } \
/^(\+ )?(echo ["'\''])?printf.* = / { \
if (quotes_balanced_p($$0)) { \
state = NORMAL; \
} else { \
state = SKIP_MULTILINE; \
} \
next; \
} \
// { \
if (quotes_balanced_p($$0)) { \
state = NORMAL; \
} else { \
state = PRINT_MULTILINE; \
} \
print; next; \
} \
'