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