1#         $NetBSD: Makefile.params,v 1.23 2023/06/11 10:43:51 lukem Exp $
2#
3# Makefile fragment for printing build parameters.
4#
5# Public variables:
6#         RELEASEVARS
7#                   List of variables whose value should be printed.
8#
9#         PRINT_PARAMS
10#                   A command to print the desired variables and values
11#                   to stdout, without any additional debugging information.
12#                   Values are printed as single-quoted strings, with
13#                   embedded quotes and newlines escaped in a way that's
14#                   acceptable to sh(1).  Undefined values are printed
15#                   as "(undefined)" (without quotation marks).
16#
17# Internal targets:
18#         _params:
19#                   Prints the names and values of all the variables
20#                   listed in ${RELEASEVARS}.  The desired results may be
21#                   redirected somewhere other than stdout, for example by
22#                   setting _params_redirect='>&3'.          stdout and stderr may
23#                   contain unwanted debugging information, from make and
24#                   the shell.
25#
26# Internal variables:
27#         _params_redirect:
28#                   If set, this should be a shell redirection specification, such
29#                   as '>&3', controlling where the output from "make _params" will
30#                   be sent.
31#
32# Example:
33#         . ${NETBSDSRCDIR}/etc/Makefile.params
34#         show-params: .MAKE .PHONY # print params to stdout
35#                   @${PRINT_PARAMS}
36#
37
38.include <bsd.own.mk>         # for some variables
39
40RELEASEVARS=        DISTRIBVER EXTERNAL_TOOLCHAIN HAVE_GCC HAVE_GDB \
41                    HAVE_LLVM HAVE_PCC INSTALLWORLDDIR \
42                    MACHINE MACHINE_ARCH \
43                    NETBSD_OFFICIAL_RELEASE NOCLEANDIR NODISTRIBDIRS NOINCLUDES \
44                    TOOLCHAIN_MISSING \
45                    USE_HESIOD USE_INET6 USE_JEMALLOC USE_KERBEROS USE_LDAP \
46                    USE_PAM USE_SKEY USE_YP \
47                    USETOOLS
48
49.if ${MKREPRO:Uno} != "yes"
50RELEASEVARS+=       BSDOBJDIR BSDSRCDIR BUILDID BUILDINFO BUILDSEED \
51                    DESTDIR KERNARCHDIR KERNCONFDIR KERNOBJDIR KERNSRCDIR MAKE \
52                    KERNEL_DIR MAKECONF MAKEFLAGS MAKEOBJDIR MAKEOBJDIRPREFIX \
53                    MAKEVERBOSE NETBSDSRCDIR OBJMACHINE OBJMACHINE_ARCH \
54                    RELEASEDIR RELEASEMACHINEDIR TOOLDIR USR_OBJMACHINE X11SRCDIR
55.endif
56
57RELEASEVARS+= ${_MKVARS.yes} ${_MKVARS.no}
58
59#
60# Duplicate the DISTRIBVER setting from src/etc/Makefile.
61#
62.ifndef DISTRIBVER
63DISTRIBVER!=        ${HOST_SH} ${NETBSDSRCDIR}/sys/conf/osrelease.sh
64.endif
65
66#
67# _params does the printing.
68#
69_params_redirect?= # empty
70
71_params: .PHONY
72.for var in ${RELEASEVARS:O}
73.if defined(${var})
74          @printf "%20s = '%-s'\n" ${var} ${${var}:C/'/'\\\\''/gW:Q} \
75              ${_params_redirect}
76.else
77          @printf "%20s = (undefined)\n" ${var} \
78              ${_params_redirect}
79.endif
80.endfor
81
82# PRINT_PARAMS:
83#
84# The output from the "make _params" can include the following types of
85# unwanted lines:
86#
87#     make -j prints "--- _params ---";
88#
89#     if MAKEVERBOSE is set to 3 or more then make prints each "printf"
90#     command in addition to executing it;
91#
92#     if MAKEVERBOSE is set to 4 then the shell prints each command
93#     (prefixed with "+").
94#
95# So the resulting output can look like this:
96#
97#         --- _params ---
98#         + echo 'printf "%20s = '\''%-s'\''\n" BSDOBJDIR /usr/obj'
99#         printf "%20s = '%-s'\n" BSDOBJDIR /usr/obj
100#         + printf '%20s = '\''%-s'\''\n' BSDOBJDIR /usr/obj
101#                    BSDOBJDIR = '/usr/obj'
102#         + echo 'printf "%20s = '\''%-s'\''\n" BSDSRCDIR /usr/src'
103#         printf "%20s = '%-s'\n" BSDSRCDIR /usr/src
104#         + printf '%20s = '\''%-s'\''\n' BSDSRCDIR /usr/src
105#                    BSDSRCDIR = '/usr/src'
106#         [...]
107#
108# where what we want is just this:
109#
110#                    BSDOBJDIR = '/usr/obj'
111#                    BSDSRCDIR = '/usr/src'
112#                    [...]
113#
114# The shell redirections in ${PRINT_PARAMS} ensure that the unwanted
115# noise is discarded (via ">/dev/null"), while the desired information
116# ends up on the subshell's stdout (via ">&3" and "3>&1").  The value
117# of _params_redirect is passed in the environment instead of on the
118# command line, to prevent it from appearing in MAKEFLAGS (which would
119# appear in the output).
120#
121PRINT_PARAMS:=      (_params_redirect='>&3' ${MAKE} -f ${.PARSEDIR:Q}/${.PARSEFILE:Q} _params 3>&1 >/dev/null)
122