Makefile.params revision 1.3
11.3Snjoly#	$NetBSD: Makefile.params,v 1.3 2013/10/18 11:42:59 njoly Exp $
21.1Sapb#
31.1Sapb# Makefile fragment for printing build parameters.
41.1Sapb#
51.1Sapb# Public variables:
61.1Sapb#	RELEASEVARS
71.1Sapb#		List of variables whose value should be printed.
81.1Sapb#
91.1Sapb#	PRINT_PARAMS
101.1Sapb#		A command to print the desired variables and values.
111.1Sapb#		Values are printed as single-quoted strings, with
121.1Sapb#		embedded quotes and newlines escaped in a way that's
131.1Sapb#		acceptable to sh(1).  Undefined values are printed
141.1Sapb#		as "(undefined)" (without quotation marks).
151.1Sapb#
161.1Sapb# Internal targets:
171.1Sapb# 	_params:
181.1Sapb# 		Prints the names and values of all the variables
191.1Sapb# 		listed in ${RELEASEVARS}.  The output may be intermixed
201.1Sapb# 		with debugging information, which can be removed by the
211.1Sapb# 		${_PARAMS_POSTPROCESS} command.
221.1Sapb#
231.1Sapb# Internal variables:
241.1Sapb#	_PARAMS_POSTPROCESS
251.1Sapb#		A command to postprocess the output from "make _params",
261.1Sapb#		to remove debugging information and other noise.
271.1Sapb#
281.1Sapb# Example:
291.1Sapb#	. ${NETBSDSRCDIR}/etc/Makefile.params
301.1Sapb#	show-params: .MAKE .PHONY # print params to stdout
311.1Sapb#		@${PRINT_PARAMS}
321.1Sapb#
331.1Sapb
341.1Sapb.include <bsd.sys.mk>		# for TOOL_AWK, ...
351.1Sapb
361.1SapbRELEASEVARS=	BSDOBJDIR BSDSRCDIR BUILDID \
371.1Sapb		DESTDIR DISTRIBVER EXTERNAL_TOOLCHAIN HAVE_GCC HAVE_GDB \
381.3Snjoly		HAVE_LLVM HAVE_PCC INSTALLWORLDDIR \
391.1Sapb		KERNARCHDIR KERNCONFDIR KERNOBJDIR KERNSRCDIR \
401.1Sapb		MACHINE MACHINE_ARCH MAKE MAKECONF MAKEFLAGS \
411.1Sapb		MAKEOBJDIR MAKEOBJDIRPREFIX MAKEVERBOSE \
421.2Sjmmv		MKATF MKBFD MKBINUTILS MKCATPAGES \
431.1Sapb		MKCRYPTO MKCRYPTO_RC5 MKCVS \
441.1Sapb		MKDEBUG MKDEBUGLIB MKDOC MKDTRACE MKDYNAMICROOT \
451.1Sapb		MKGCC MKGCCCMDS MKGDB \
461.1Sapb		MKHESIOD MKHTML MKIEEEFP MKINET6 MKINFO MKIPFILTER \
471.3Snjoly		MKKERBEROS MKKYUA MKLDAP MKLINKLIB MKLINT MKLLVM \
481.1Sapb		MKMAN MKMANZ MKMDNS MKNLS MKNPF MKOBJ MKOBJDIRS \
491.3Snjoly		MKPAM MKPCC MKPF MKPIC MKPICINSTALL MKPICLIB MKPOSTFIX \
501.3Snjoly		MKPROFILE \
511.1Sapb		MKSHARE MKSKEY MKSOFTFLOAT MKSTATICLIB \
521.1Sapb		MKUNPRIVED MKUPDATE MKX11 MKYP \
531.1Sapb		NBUILDJOBS NETBSDSRCDIR \
541.1Sapb		NOCLEANDIR NODISTRIBDIRS NOINCLUDES \
551.1Sapb		OBJMACHINE \
561.1Sapb		RELEASEDIR RELEASEMACHINEDIR TOOLCHAIN_MISSING TOOLDIR \
571.1Sapb		USE_HESIOD USE_INET6 USE_JEMALLOC USE_KERBEROS USE_LDAP \
581.1Sapb		USE_PAM USE_SKEY USE_YP \
591.1Sapb		USETOOLS USR_OBJMACHINE \
601.1Sapb		X11SRCDIR X11FLAVOUR
611.1Sapb
621.1SapbPRINT_PARAMS= (cd ${.CURDIR}; ${MAKE} _params) | ${_PARAMS_POSTPROCESS}
631.1Sapb
641.1Sapb_params: .PHONY
651.1Sapb.for var in ${RELEASEVARS}
661.1Sapb.if defined(${var})
671.1Sapb	@printf "%20s = '%-s'\n" ${var} ${${var}:C/'/'\\\\''/gW:Q}
681.1Sapb.else
691.1Sapb	@printf "%20s = (undefined)\n" ${var}
701.1Sapb.endif
711.1Sapb.endfor
721.1Sapb
731.1Sapb# _PARAMS_POSTPROCESS:
741.1Sapb#
751.1Sapb# The output from the "make _params" can include the following types of
761.1Sapb# unwanted lines:
771.1Sapb#
781.1Sapb#     make -j prints "--- params ---";
791.1Sapb#
801.1Sapb#     if MAKEVERBOSE is set to 3 or more then make prints each "printf"
811.1Sapb#     command in addition to executing it;
821.1Sapb#
831.1Sapb#     if MAKEVERBOSE is set to 4 then the shell prints each command
841.1Sapb#     (prefixed with "+").
851.1Sapb#
861.1Sapb# So the resulting output can look like this:
871.1Sapb#
881.1Sapb#	--- params ---
891.1Sapb#	+ echo 'printf "%20s = '\''%-s'\''\n" BSDOBJDIR /usr/obj'
901.1Sapb#	printf "%20s = '%-s'\n" BSDOBJDIR /usr/obj
911.1Sapb#	+ printf '%20s = '\''%-s'\''\n' BSDOBJDIR /usr/obj
921.1Sapb#	           BSDOBJDIR = '/usr/obj'
931.1Sapb#	+ echo 'printf "%20s = '\''%-s'\''\n" BSDSRCDIR /usr/src'
941.1Sapb#	printf "%20s = '%-s'\n" BSDSRCDIR /usr/src
951.1Sapb#	+ printf '%20s = '\''%-s'\''\n' BSDSRCDIR /usr/src
961.1Sapb#	           BSDSRCDIR = '/usr/src'
971.1Sapb#	[...]
981.1Sapb#
991.1Sapb# where what we want is just this:
1001.1Sapb#
1011.1Sapb#	           BSDOBJDIR = '/usr/obj'
1021.1Sapb#	           BSDSRCDIR = '/usr/src'
1031.1Sapb#	           [...]
1041.1Sapb#
1051.1Sapb# The awk program in ${PARAMS_POSTPROCESS} removes the unwanted noise,
1061.1Sapb# taking care with variables whose values contain embedded newlines
1071.1Sapb# (assuming that embedded newlines appear only inside single quotes).
1081.1Sapb#
1091.1Sapb_PARAMS_POSTPROCESS= ${TOOL_AWK} '\
1101.1Sapb	BEGIN { single_quote = "'\''"; \
1111.1Sapb		NORMAL = 0; \
1121.1Sapb		SKIP_HEADING = 1; \
1131.1Sapb		SKIP_MULTILINE = 2; \
1141.1Sapb		PRINT_MULTILINE = 3; \
1151.1Sapb		state = SKIP_HEADING; \
1161.1Sapb	} \
1171.1Sapb	function quotes_balanced_p(line) { \
1181.1Sapb		return (line ~ /^([^\\"'\'']|\\.|'\''[^'\'']*'\''|"(\\.|[^\\"])*")*$$/); \
1191.1Sapb	} \
1201.1Sapb	state == SKIP_MULTILINE { \
1211.1Sapb		if (quotes_balanced_p(single_quote $$0)) { \
1221.1Sapb			state = NORMAL; \
1231.1Sapb		} \
1241.1Sapb		next; \
1251.1Sapb	} \
1261.1Sapb	state == PRINT_MULTILINE { \
1271.1Sapb		if (quotes_balanced_p(single_quote $$0)) { \
1281.1Sapb			state = NORMAL; \
1291.1Sapb		} \
1301.1Sapb		print; next; \
1311.1Sapb	} \
1321.1Sapb	state == SKIP_HEADING && $$0 ~ /^--- .* ---$$/ { next; } \
1331.1Sapb	state == SKIP_HEADING && $$0 ~ / ===> / { next; } \
1341.1Sapb	/^(\+ )?(echo ["'\''])?printf.* = / { \
1351.1Sapb		if (quotes_balanced_p($$0)) { \
1361.1Sapb			state = NORMAL; \
1371.1Sapb		} else { \
1381.1Sapb			state = SKIP_MULTILINE; \
1391.1Sapb		} \
1401.1Sapb		next; \
1411.1Sapb	} \
1421.1Sapb	// { \
1431.1Sapb		if (quotes_balanced_p($$0)) { \
1441.1Sapb			state = NORMAL; \
1451.1Sapb		} else { \
1461.1Sapb			state = PRINT_MULTILINE; \
1471.1Sapb		} \
1481.1Sapb		print; next; \
1491.1Sapb	} \
1501.1Sapb	'
151