xref: /freebsd/tools/build/options/makeman (revision 1f4bcc459a76b7aa664f3fd557684cd0ba6da352)
1#!/bin/sh
2#
3# This file is in the public domain.
4
5set -o errexit
6export LC_ALL=C
7
8ident='$FreeBSD$'
9
10t=$(mktemp -d -t makeman)
11trap 'test -d $t && rm -rf $t' exit
12
13srcdir=$(realpath ../../..)
14make="make -C $srcdir -m $srcdir/share/mk"
15
16#
17# usage: no_targets all_targets yes_targets
18#
19no_targets()
20{
21	for t1 in $1 ; do
22		for t2 in $2 ; do
23			if [ "${t1}" = "${t2}" ] ; then
24				continue 2
25			fi
26		done
27		echo ${t1}
28	done
29}
30
31show_options()
32{
33	ALL_TARGETS=$(echo $(${make} targets | tail -n +2))
34	rm -f $t/settings
35	for target in ${ALL_TARGETS} ; do
36		env -i ${make} showconfig \
37		    SRC_ENV_CONF=/dev/null SRCCONF=/dev/null \
38		    __MAKE_CONF=/dev/null \
39		    TARGET_ARCH=${target#*/} TARGET=${target%/*} |
40		while read var _ val ; do
41			opt=${var#MK_}
42			case ${val} in
43			yes)
44				echo ${opt} ${target}
45				;;
46			no)
47				echo ${opt}
48				;;
49			*)
50				echo "make showconfig broken: ${var} ${_} ${val} (not yes or no)" >&2
51				exit 1
52				;;
53			esac
54		done > $t/settings.target
55		if [ -r $t/settings ] ; then
56			join -t\  $t/settings $t/settings.target > $t/settings.new
57			mv $t/settings.new $t/settings
58		else
59			mv $t/settings.target $t/settings
60		fi
61	done
62
63	while read opt targets ; do
64		if [ "${targets}" = "${ALL_TARGETS}" ] ; then
65			echo "WITHOUT_${opt}"
66		elif [ -z "${targets}" ] ; then
67			echo "WITH_${opt}"
68		else
69			echo "WITHOUT_${opt}" $(no_targets "${ALL_TARGETS}" "${targets}")
70			echo "WITH_${opt} ${targets}"
71		fi
72	done < $t/settings
73}
74
75#
76# usage: show { settings | with | without } ...
77#
78show()
79{
80
81	mode=$1 ; shift
82	case ${mode} in
83	settings)
84		yes_prefix=WITH
85		no_prefix=WITHOUT
86		;;
87	with)
88		yes_prefix=WITH
89		no_prefix=WITH
90		;;
91	without)
92		yes_prefix=WITHOUT
93		no_prefix=WITHOUT
94		;;
95	*)
96		echo 'internal error' >&2
97		exit 1
98		;;
99	esac
100	env -i ${make} .MAKE.MODE=normal "$@" showconfig __MAKE_CONF=/dev/null \
101	    SRCCONF=/dev/null |
102	while read var _ val ; do
103		opt=${var#MK_}
104		case ${val} in
105		yes)
106			echo ${yes_prefix}_${opt}
107			;;
108		no)
109			echo ${no_prefix}_${opt}
110			;;
111		*)
112			echo "make showconfig broken: ${var} ${_} ${val} (not yes or no)" >&2
113			exit 1
114			;;
115		esac
116	done
117}
118
119main()
120{
121
122	ident=${ident#$}
123	ident=${ident% $}
124	fbsdid='$'FreeBSD'$'
125	cat <<EOF
126.\" DO NOT EDIT-- this file is automatically generated.
127.\" from ${ident}
128.\" ${fbsdid}
129.Dd $(echo $(LC_TIME=C date +'%B %e, %Y'))
130.Dt SRC.CONF 5
131.Os
132.Sh NAME
133.Nm src.conf
134.Nd "source build options"
135.Sh DESCRIPTION
136The
137.Nm
138file contains settings that will apply to every build involving the
139.Fx
140source tree; see
141.Xr build 7 .
142.Pp
143The
144.Nm
145file uses the standard makefile syntax.
146However,
147.Nm
148should not specify any dependencies to
149.Xr make 1 .
150Instead,
151.Nm
152is to set
153.Xr make 1
154variables that control the aspects of how the system builds.
155.Pp
156The default location of
157.Nm
158is
159.Pa /etc/src.conf ,
160though an alternative location can be specified in the
161.Xr make 1
162variable
163.Va SRCCONF .
164Overriding the location of
165.Nm
166may be necessary if the system-wide settings are not suitable
167for a particular build.
168For instance, setting
169.Va SRCCONF
170to
171.Pa /dev/null
172effectively resets all build controls to their defaults.
173.Pp
174The only purpose of
175.Nm
176is to control the compilation of the
177.Fx
178source code, which is usually located in
179.Pa /usr/src .
180As a rule, the system administrator creates
181.Nm
182when the values of certain control variables need to be changed
183from their defaults.
184.Pp
185In addition, control variables can be specified
186for a particular build via the
187.Fl D
188option of
189.Xr make 1
190or in its environment; see
191.Xr environ 7 .
192.Pp
193The environment of
194.Xr make 1
195for the build can be controlled via the
196.Va SRC_ENV_CONF
197variable, which defaults to
198.Pa /etc/src-env.conf .
199Some examples that may only be set in this file are
200.Va WITH_DIRDEPS_BUILD ,
201and
202.Va WITH_META_MODE
203as they are environment-only variables.
204Note that
205.Va MAKEOBJDIRPREFIX
206may be set here only when using
207.Va WITH_DIRDEPS_BUILD .
208.Pp
209The values of variables are ignored regardless of their setting;
210even if they would be set to
211.Dq Li FALSE
212or
213.Dq Li NO .
214Just the existence of an option will cause
215it to be honoured by
216.Xr make 1 .
217.Pp
218The following list provides a name and short description for variables
219that can be used for source builds.
220.Bl -tag -width indent
221EOF
222	show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default
223	# Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the
224	# actual config that results from enabling every WITH_ option.  This
225	# can be reverted if/when we no longer have options that disable
226	# others.
227	show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf
228	show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL
229	show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL
230	env_only_options="$(${make} -V __ENV_ONLY_OPTIONS)"
231
232	show_options |
233	while read opt targets ; do
234		if [ ! -f ${opt} ] ; then
235			echo "no description found for ${opt}, skipping" >&2
236			continue
237		fi
238
239		echo ".It Va ${opt}"
240		sed -e's/\$\(FreeBSD: .*\) \$/from \1/' ${opt}
241		if [ -n "${targets}" ] ; then
242			echo '.Pp'
243			echo 'It is a default setting on'
244			echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /').
245		fi
246
247		if [ "${opt%%_*}" = 'WITHOUT' ] ; then
248			sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf
249			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt}
250			comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
251		elif [ "${opt%%_*}" = 'WITH' ] ; then
252			sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf
253			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt}
254			comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
255		else
256			echo 'internal error' >&2
257			exit 1
258		fi
259
260		show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt}
261		comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" |
262		comm -13 $t/deps - > $t/deps2
263
264		# Work around BIND_UTILS=no being the default when every WITH_
265		# option is enabled.
266		if [ "$(cat $t/deps2)" = WITHOUT_BIND_UTILS ]; then
267			sort $t/deps $t/deps2 > $t/_deps
268			mv $t/_deps $t/deps
269			:> $t/deps2
270		fi
271
272		havedeps=0
273		if [ -s $t/deps ] ; then
274			havedeps=1
275			echo 'When set, it also enforces the following options:'
276			echo '.Pp'
277			echo '.Bl -item -compact'
278			while read opt2 ; do
279				echo '.It'
280				echo ".Va ${opt2}"
281			done < $t/deps
282			echo '.El'
283		fi
284
285		if [ -s $t/deps2 ] ; then
286			if [ ${havedeps} -eq 1 ] ; then
287				echo '.Pp'
288			fi
289			echo 'When set, the following options are also in effect:'
290			echo '.Pp'
291			echo '.Bl -inset -compact'
292			while read opt2 ; do
293				echo ".It Va ${opt2}"
294				noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/')
295				echo '(unless'
296				echo ".Va ${noopt}"
297				echo 'is set explicitly)'
298			done < $t/deps2
299			echo '.El'
300		fi
301
302		case " ${env_only_options} " in
303			*\ ${opt#*_}\ *)
304				echo ".Pp"
305				echo "This must be set in the environment, make command line, or"
306				echo ".Pa /etc/src-env.conf ,"
307				echo "not"
308				echo ".Pa /etc/src.conf ."
309				;;
310		esac
311
312		twiddle >&2
313	done
314	cat <<EOF
315.El
316.Sh FILES
317.Bl -tag -compact -width Pa
318.It Pa /etc/src.conf
319.It Pa /etc/src-env.conf
320.It Pa /usr/share/mk/bsd.own.mk
321.El
322.Sh SEE ALSO
323.Xr make 1 ,
324.Xr make.conf 5 ,
325.Xr build 7 ,
326.Xr ports 7
327.Sh HISTORY
328The
329.Nm
330file appeared in
331.Fx 7.0 .
332.Sh AUTHORS
333This manual page was autogenerated.
334EOF
335}
336
337twiddle_pos=0
338twiddle()
339{
340	local c0='|' c1='/' c2='-' c3='\'
341
342	eval printf '%c\\b' '$c'${twiddle_pos}
343	twiddle_pos=$(((twiddle_pos+1)%4))
344}
345
346main
347