xref: /freebsd/tools/build/options/makeman (revision bae28eaa8d26ddd67e9af51979f1a54599e9b3a8)
1#!/bin/sh
2#
3# This file is in the public domain.
4
5set -o errexit
6LC_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		${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	${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 MAKEOBJDIRPREFIX ,
201and
202.Va WITH_META_MODE
203as they are environment-only variables.
204.Pp
205The values of variables are ignored regardless of their setting;
206even if they would be set to
207.Dq Li FALSE
208or
209.Dq Li NO .
210Just the existence of an option will cause
211it to be honoured by
212.Xr make 1 .
213.Pp
214The following list provides a name and short description for variables
215that can be used for source builds.
216.Bl -tag -width indent
217EOF
218	show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default
219	# Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the
220	# actual config that results from enabling every WITH_ option.  This
221	# can be reverted if/when we no longer have options that disable
222	# others.
223	show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf
224	show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL
225	show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL
226	env_only_options="$(${make} -V __ENV_ONLY_OPTIONS)"
227
228	show_options |
229	while read opt targets ; do
230		if [ ! -f ${opt} ] ; then
231			echo "no description found for ${opt}, skipping" >&2
232			continue
233		fi
234
235		echo ".It Va ${opt}"
236		sed -e's/\$\(FreeBSD: .*\) \$/from \1/' ${opt}
237		if [ -n "${targets}" ] ; then
238			echo '.Pp'
239			echo 'It is a default setting on'
240			echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /').
241		fi
242
243		if [ "${opt%%_*}" = 'WITHOUT' ] ; then
244			sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf
245			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt}
246			comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
247		elif [ "${opt%%_*}" = 'WITH' ] ; then
248			sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf
249			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt}
250			comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
251		else
252			echo 'internal error' >&2
253			exit 1
254		fi
255
256		show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt}
257		comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" |
258		comm -13 $t/deps - > $t/deps2
259
260		# Work around BIND_UTILS=no being the default when every WITH_
261		# option is enabled.
262		if [ "$(cat $t/deps2)" = WITHOUT_BIND_UTILS ]; then
263			sort $t/deps $t/deps2 > $t/_deps
264			mv $t/_deps $t/deps
265			:> $t/deps2
266		fi
267
268		havedeps=0
269		if [ -s $t/deps ] ; then
270			havedeps=1
271			echo 'When set, it also enforces the following options:'
272			echo '.Pp'
273			echo '.Bl -item -compact'
274			while read opt2 ; do
275				echo '.It'
276				echo ".Va ${opt2}"
277			done < $t/deps
278			echo '.El'
279		fi
280
281		if [ -s $t/deps2 ] ; then
282			if [ ${havedeps} -eq 1 ] ; then
283				echo '.Pp'
284			fi
285			echo 'When set, the following options are also in effect:'
286			echo '.Pp'
287			echo '.Bl -inset -compact'
288			while read opt2 ; do
289				echo ".It Va ${opt2}"
290				noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/')
291				echo '(unless'
292				echo ".Va ${noopt}"
293				echo 'is set explicitly)'
294			done < $t/deps2
295			echo '.El'
296		fi
297
298		case " ${env_only_options} " in
299			*\ ${opt#*_}\ *)
300				echo ".Pp"
301				echo "This must be set in the environment, make command line, or"
302				echo ".Pa /etc/src-env.conf ,"
303				echo "not"
304				echo ".Pa /etc/src.conf ."
305				;;
306		esac
307
308		twiddle >&2
309	done
310	cat <<EOF
311.El
312.Sh FILES
313.Bl -tag -compact -width Pa
314.It Pa /etc/src.conf
315.It Pa /etc/src-env.conf
316.It Pa /usr/share/mk/bsd.own.mk
317.El
318.Sh SEE ALSO
319.Xr make 1 ,
320.Xr make.conf 5 ,
321.Xr build 7 ,
322.Xr ports 7
323.Sh HISTORY
324The
325.Nm
326file appeared in
327.Fx 7.0 .
328.Sh AUTHORS
329This manual page was autogenerated.
330EOF
331}
332
333twiddle_pos=0
334twiddle()
335{
336	local c0='|' c1='/' c2='-' c3='\'
337
338	eval printf '%c\\b' '$c'${twiddle_pos}
339	twiddle_pos=$(((twiddle_pos+1)%4))
340}
341
342main
343