xref: /freebsd/tools/build/options/makeman (revision ec0ea6efa1ad229d75c394c1a9b9cac33af2b1d3)
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 variables that control what components will be generated during
158the build process of the
159.Fx
160source tree; see
161.Xr build 7 .
162.Pp
163The
164.Nm
165file uses the standard makefile syntax.
166However,
167.Nm
168should not specify any dependencies to
169.Xr make 1 .
170Instead,
171.Nm
172is to set
173.Xr make 1
174variables that control the aspects of how the system builds.
175.Pp
176The default location of
177.Nm
178is
179.Pa /etc/src.conf ,
180though an alternative location can be specified in the
181.Xr make 1
182variable
183.Va SRCCONF .
184Overriding the location of
185.Nm
186may be necessary if the system-wide settings are not suitable
187for a particular build.
188For instance, setting
189.Va SRCCONF
190to
191.Pa /dev/null
192effectively resets all build controls to their defaults.
193.Pp
194The only purpose of
195.Nm
196is to control the compilation of the
197.Fx
198source code, which is usually located in
199.Pa /usr/src .
200As a rule, the system administrator creates
201.Nm
202when the values of certain control variables need to be changed
203from their defaults.
204.Pp
205In addition, control variables can be specified
206for a particular build via the
207.Fl D
208option of
209.Xr make 1
210or in its environment; see
211.Xr environ 7 .
212.Pp
213The environment of
214.Xr make 1
215for the build can be controlled via the
216.Va SRC_ENV_CONF
217variable, which defaults to
218.Pa /etc/src-env.conf .
219Some examples that may only be set in this file are
220.Va WITH_DIRDEPS_BUILD ,
221and
222.Va WITH_META_MODE ,
223and
224.Va MAKEOBJDIRPREFIX
225as they are environment-only variables.
226.Pp
227The values of variables are ignored regardless of their setting;
228even if they would be set to
229.Dq Li FALSE
230or
231.Dq Li NO .
232The presence of an option causes
233it to be honored by
234.Xr make 1 .
235.Pp
236This list provides a name and short description for variables
237that can be used for source builds.
238.Bl -tag -width indent
239EOF
240	show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default
241	# Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the
242	# actual config that results from enabling every WITH_ option.  This
243	# can be reverted if/when we no longer have options that disable
244	# others.
245	show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf
246	show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL
247	show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL
248	env_only_options="$(${make} MK_AUTO_OBJ=no -V __ENV_ONLY_OPTIONS)"
249
250	show_options |
251	while read opt targets ; do
252		if [ ! -f ${opt} ] ; then
253			echo "no description found for ${opt}, skipping" >&2
254			continue
255		fi
256
257		echo ".It Va ${opt}"
258		sed -e'/\$FreeBSD.*\$/d' ${opt}
259		if [ -n "${targets}" ] ; then
260			echo '.Pp'
261			echo 'This is a default setting on'
262			echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /').
263		fi
264
265		if [ "${opt%%_*}" = 'WITHOUT' ] ; then
266			sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf
267			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt}
268			comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
269		elif [ "${opt%%_*}" = 'WITH' ] ; then
270			sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf
271			show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt}
272			comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
273		else
274			echo 'internal error' >&2
275			exit 1
276		fi
277
278		show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt}
279		comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" |
280		comm -13 $t/deps - > $t/deps2
281
282		havedeps=0
283		if [ -s $t/deps ] ; then
284			havedeps=1
285			echo 'When set, it enforces these options:'
286			echo '.Pp'
287			echo '.Bl -item -compact'
288			while read opt2 ; do
289				echo '.It'
290				echo ".Va ${opt2}"
291			done < $t/deps
292			echo '.El'
293		fi
294
295		if [ -s $t/deps2 ] ; then
296			if [ ${havedeps} -eq 1 ] ; then
297				echo '.Pp'
298			fi
299			echo 'When set, these options are also in effect:'
300			echo '.Pp'
301			echo '.Bl -inset -compact'
302			while read opt2 ; do
303				echo ".It Va ${opt2}"
304				noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/')
305				echo '(unless'
306				echo ".Va ${noopt}"
307				echo 'is set explicitly)'
308			done < $t/deps2
309			echo '.El'
310		fi
311
312		case " ${env_only_options} " in
313			*\ ${opt#*_}\ *)
314				echo ".Pp"
315				echo "This must be set in the environment, make command line, or"
316				echo ".Pa /etc/src-env.conf ,"
317				echo "not"
318				echo ".Pa /etc/src.conf ."
319				;;
320		esac
321
322		twiddle >&2
323	done
324	cat <<EOF
325.El
326.Sh FILES
327.Bl -tag -compact -width Pa
328.It Pa /etc/src.conf
329.It Pa /etc/src-env.conf
330.It Pa /usr/share/mk/bsd.own.mk
331.El
332.Sh SEE ALSO
333.Xr make 1 ,
334.Xr make.conf 5 ,
335.Xr build 7 ,
336.Xr ports 7
337.Sh HISTORY
338The
339.Nm
340file appeared in
341.Fx 7.0 .
342.Sh AUTHORS
343This manual page was autogenerated by
344.An tools/build/options/makeman .
345EOF
346}
347
348twiddle_pos=0
349twiddle()
350{
351	local c0='|' c1='/' c2='-' c3='\'
352
353	eval printf '%c\\b' '$c'${twiddle_pos}
354	twiddle_pos=$(((twiddle_pos+1)%4))
355}
356
357main
358