makeman revision 318614
1168404Spjd#!/bin/sh
2168404Spjd#
3168404Spjd# This file is in the public domain.
4168404Spjd
5168404Spjdset -o errexit
6168404SpjdLC_ALL=C
7168404Spjd
8168404Spjdident='$FreeBSD: stable/10/tools/build/options/makeman 318614 2017-05-22 06:08:20Z ngie $'
9168404Spjd
10168404Spjdt=$(mktemp -d -t makeman)
11168404Spjdtrap 'test -d $t && rm -rf $t' exit
12168404Spjd
13168404Spjdsrcdir=$(realpath ../../..)
14168404Spjdmake="make -C $srcdir -m $srcdir/share/mk"
15168404Spjd
16168404Spjd#
17168404Spjd# usage: no_targets all_targets yes_targets
18168404Spjd#
19168404Spjdno_targets()
20168404Spjd{
21168404Spjd	for t1 in $1 ; do
22168404Spjd		for t2 in $2 ; do
23168404Spjd			if [ "${t1}" = "${t2}" ] ; then
24168404Spjd				continue 2
25168404Spjd			fi
26168404Spjd		done
27168404Spjd		echo ${t1}
28168404Spjd	done
29168404Spjd}
30168404Spjd
31168404Spjdshow_options()
32168404Spjd{
33168508Spjd	ALL_TARGETS=$(echo $(${make} targets | tail -n +2))
34168404Spjd	rm -f $t/settings
35168404Spjd	for target in ${ALL_TARGETS} ; do
36168404Spjd		env -i ${make} showconfig \
37168404Spjd		    SRCCONF=/dev/null __MAKE_CONF=/dev/null \
38168404Spjd		    TARGET_ARCH=${target#*/} TARGET=${target%/*} |
39168508Spjd		while read var _ val ; do
40168404Spjd			opt=${var#MK_}
41168404Spjd			case ${val} in
42168404Spjd			yes)
43168404Spjd				echo ${opt} ${target}
44168404Spjd				;;
45168404Spjd			no)
46168404Spjd				echo ${opt}
47168404Spjd				;;
48168404Spjd			*)
49168404Spjd				echo 'make showconfig broken' >&2
50168404Spjd				exit 1
51168404Spjd				;;
52168404Spjd			esac
53168404Spjd		done > $t/settings.target
54168404Spjd		if [ -r $t/settings ] ; then
55168404Spjd			join -t\  $t/settings $t/settings.target > $t/settings.new
56168404Spjd			mv $t/settings.new $t/settings
57168404Spjd		else
58168404Spjd			mv $t/settings.target $t/settings
59168404Spjd		fi
60168404Spjd	done
61168404Spjd
62168404Spjd	while read opt targets ; do
63168404Spjd		if [ "${targets}" = "${ALL_TARGETS}" ] ; then
64168404Spjd			echo "WITHOUT_${opt}"
65168404Spjd		elif [ -z "${targets}" ] ; then
66168508Spjd			echo "WITH_${opt}"
67168508Spjd		else
68168404Spjd			echo "WITHOUT_${opt}" $(no_targets "${ALL_TARGETS}" "${targets}")
69168404Spjd			echo "WITH_${opt} ${targets}"
70185319Spjd		fi
71168404Spjd	done < $t/settings
72241896Skib}
73168404Spjd
74185319Spjd#
75185319Spjd# usage: show { settings | with | without } ...
76185319Spjd#
77185319Spjdshow()
78185319Spjd{
79185319Spjd
80185319Spjd	mode=$1 ; shift
81185319Spjd	case ${mode} in
82185319Spjd	settings)
83185319Spjd		yes_prefix=WITH
84185319Spjd		no_prefix=WITHOUT
85168404Spjd		;;
86194617Skib	with)
87241896Skib		yes_prefix=WITH
88194617Skib		no_prefix=WITH
89168404Spjd		;;
90168508Spjd	without)
91196966Skib		yes_prefix=WITHOUT
92168404Spjd		no_prefix=WITHOUT
93175294Sattilio		;;
94168508Spjd	*)
95168404Spjd		echo 'internal error' >&2
96168404Spjd		exit 1
97168508Spjd		;;
98168508Spjd	esac
99168404Spjd	env -i ${make} "$@" showconfig __MAKE_CONF=/dev/null |
100168508Spjd	while read var _ val ; do
101168508Spjd		opt=${var#MK_}
102168508Spjd		case ${val} in
103168508Spjd		yes)
104168508Spjd			echo ${yes_prefix}_${opt}
105168508Spjd			;;
106168508Spjd		no)
107168508Spjd			echo ${no_prefix}_${opt}
108168508Spjd			;;
109168508Spjd		*)
110168508Spjd			echo 'make showconfig broken' >&2
111168508Spjd			exit 1
112168508Spjd			;;
113168508Spjd		esac
114168508Spjd	done
115168508Spjd}
116168508Spjd
117168508Spjdmain()
118168508Spjd{
119168508Spjd
120168508Spjd	ident=${ident#$}
121168508Spjd	ident=${ident% $}
122168508Spjd	fbsdid='$'FreeBSD'$'
123168508Spjd	cat <<EOF
124168508Spjd.\" DO NOT EDIT-- this file is automatically generated.
125168508Spjd.\" from ${ident}
126168508Spjd.\" ${fbsdid}
127168508Spjd.Dd $(echo $(LC_TIME=C date +'%B %e, %Y'))
128168508Spjd.Dt SRC.CONF 5
129168508Spjd.Os
130168404Spjd.Sh NAME
131241896Skib.Nm src.conf
132168404Spjd.Nd "source build options"
133175202Sattilio.Sh DESCRIPTION
134182371SattilioThe
135175294Sattilio.Nm
136168404Spjdfile contains settings that will apply to every build involving the
137168404Spjd.Fx
138168404Spjdsource tree; see
139168404Spjd.Xr build 7 .
140168404Spjd.Pp
141168508SpjdThe
142168508Spjd.Nm
143168508Spjdfile uses the standard makefile syntax.
144168508SpjdHowever,
145168508Spjd.Nm
146168508Spjdshould not specify any dependencies to
147168508Spjd.Xr make 1 .
148168508SpjdInstead,
149168508Spjd.Nm
150168508Spjdis to set
151168508Spjd.Xr make 1
152168508Spjdvariables that control the aspects of how the system builds.
153168404Spjd.Pp
154168508SpjdThe default location of
155168404Spjd.Nm
156168508Spjdis
157168508Spjd.Pa /etc/src.conf ,
158168508Spjdthough an alternative location can be specified in the
159168508Spjd.Xr make 1
160168508Spjdvariable
161168508Spjd.Va SRCCONF .
162168508SpjdOverriding the location of
163168508Spjd.Nm
164168508Spjdmay be necessary if the system-wide settings are not suitable
165168508Spjdfor a particular build.
166168508SpjdFor instance, setting
167168404Spjd.Va SRCCONF
168168404Spjdto
169168404Spjd.Pa /dev/null
170241896Skibeffectively resets all build controls to their defaults.
171168404Spjd.Pp
172168404SpjdThe only purpose of
173168404Spjd.Nm
174168404Spjdis to control the compilation of the
175168404Spjd.Fx
176168404Spjdsource code, which is usually located in
177168404Spjd.Pa /usr/src .
178168404SpjdAs a rule, the system administrator creates
179168404Spjd.Nm
180168404Spjdwhen the values of certain control variables need to be changed
181168404Spjdfrom their defaults.
182168404Spjd.Pp
183168404SpjdIn addition, control variables can be specified
184168404Spjdfor a particular build via the
185168404Spjd.Fl D
186175202Sattiliooption of
187168404Spjd.Xr make 1
188175294Sattilioor in its environment; see
189168404Spjd.Xr environ 7 .
190168404Spjd.Pp
191168404SpjdThe values of variables are ignored regardless of their setting;
192168508Spjdeven if they would be set to
193168508Spjd.Dq Li FALSE
194168508Spjdor
195168508Spjd.Dq Li NO .
196168508SpjdJust the existence of an option will cause
197218665Smarcelit to be honoured by
198168508Spjd.Xr make 1 .
199168508Spjd.Pp
200168508SpjdThe following list provides a name and short description for variables
201168508Spjdthat can be used for source builds.
202168508Spjd.Bl -tag -width indent
203168508SpjdEOF
204168508Spjd	show settings SRCCONF=/dev/null | sort > $t/config_default
205168508Spjd	# Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the
206168508Spjd	# actual config that results from enabling every WITH_ option.  This
207168508Spjd	# can be reverted if/when we no longer have options that disable
208168508Spjd	# others.
209168508Spjd	show with SRCCONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf
210168508Spjd	show settings SRCCONF=$t/src.conf | sort > $t/config_WITH_ALL
211168508Spjd	show without SRCCONF=/dev/null | sort > $t/config_WITHOUT_ALL
212168508Spjd
213168508Spjd	show_options |
214168404Spjd	while read opt targets ; do
215168404Spjd		if [ ! -f ${opt} ] ; then
216168404Spjd			echo "no description found for ${opt}, skipping" >&2
217168404Spjd			continue
218241896Skib		fi
219241896Skib
220168508Spjd		echo ".It Va ${opt}"
221168404Spjd		sed -e's/\$\(FreeBSD: .*\) \$/from \1/' ${opt}
222		if [ -n "${targets}" ] ; then
223			echo '.Pp'
224			echo 'It is a default setting on'
225			echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /').
226		fi
227
228		if [ "${opt%%_*}" = 'WITHOUT' ] ; then
229			sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf
230			show settings SRCCONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt}
231			comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
232		elif [ "${opt%%_*}" = 'WITH' ] ; then
233			sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf
234			show settings SRCCONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt}
235			comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
236		else
237			echo 'internal error' >&2
238			exit 1
239		fi
240
241		show settings SRCCONF=/dev/null -D${opt} | sort > $t/config_${opt}
242		comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" |
243		comm -13 $t/deps - > $t/deps2
244
245		# Work around BIND_UTILS=no being the default when every WITH_
246		# option is enabled.
247		if [ "$(cat $t/deps2)" = WITHOUT_BIND_UTILS ]; then
248			sort $t/deps $t/deps2 > $t/_deps
249			mv $t/_deps $t/deps
250			:> $t/deps2
251		fi
252
253		havedeps=0
254		if [ -s $t/deps ] ; then
255			havedeps=1
256			echo 'When set, it also enforces the following options:'
257			echo '.Pp'
258			echo '.Bl -item -compact'
259			while read opt2 ; do
260				echo '.It'
261				echo ".Va ${opt2}"
262			done < $t/deps
263			echo '.El'
264		fi
265
266		if [ -s $t/deps2 ] ; then
267			if [ ${havedeps} -eq 1 ] ; then
268				echo '.Pp'
269			fi
270			echo 'When set, the following options are also in effect:'
271			echo '.Pp'
272			echo '.Bl -inset -compact'
273			while read opt2 ; do
274				echo ".It Va ${opt2}"
275				noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/')
276				echo '(unless'
277				echo ".Va ${noopt}"
278				echo 'is set explicitly)'
279			done < $t/deps2
280			echo '.El'
281		fi
282		twiddle >&2
283	done
284	cat <<EOF
285.El
286.Sh FILES
287.Bl -tag -compact -width Pa
288.It Pa /etc/src.conf
289.It Pa /usr/share/mk/bsd.own.mk
290.El
291.Sh SEE ALSO
292.Xr make 1 ,
293.Xr make.conf 5 ,
294.Xr build 7 ,
295.Xr ports 7
296.Sh HISTORY
297The
298.Nm
299file appeared in
300.Fx 7.0 .
301.Sh AUTHORS
302This manual page was autogenerated by
303.An tools/build/options/makeman .
304EOF
305}
306
307twiddle_pos=0
308twiddle()
309{
310	local c0='|' c1='/' c2='-' c3='\'
311
312	eval printf '%c\\b' '$c'${twiddle_pos}
313	twiddle_pos=$(((twiddle_pos+1)%4))
314}
315
316main
317