]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/build/options/makeman
MFC r315764,r315765:
[FreeBSD/FreeBSD.git] / tools / build / options / makeman
1 #!/bin/sh
2 #
3 # This file is in the public domain.
4
5 set -o errexit
6 export LC_ALL=C
7
8 ident='$FreeBSD$'
9
10 t=$(mktemp -d -t makeman)
11 trap 'test -d $t && rm -rf $t' exit
12
13 srcdir=$(realpath ../../..)
14 make="make -C $srcdir -m $srcdir/share/mk"
15
16 #
17 # usage: no_targets all_targets yes_targets
18 #
19 no_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
31 show_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 #
78 show()
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
119 main()
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
136 The
137 .Nm
138 file contains settings that will apply to every build involving the
139 .Fx
140 source tree; see
141 .Xr build 7 .
142 .Pp
143 The
144 .Nm
145 file uses the standard makefile syntax.
146 However,
147 .Nm
148 should not specify any dependencies to
149 .Xr make 1 .
150 Instead,
151 .Nm
152 is to set
153 .Xr make 1
154 variables that control the aspects of how the system builds.
155 .Pp
156 The default location of
157 .Nm
158 is
159 .Pa /etc/src.conf ,
160 though an alternative location can be specified in the
161 .Xr make 1
162 variable
163 .Va SRCCONF .
164 Overriding the location of
165 .Nm
166 may be necessary if the system-wide settings are not suitable
167 for a particular build.
168 For instance, setting
169 .Va SRCCONF
170 to
171 .Pa /dev/null
172 effectively resets all build controls to their defaults.
173 .Pp
174 The only purpose of
175 .Nm
176 is to control the compilation of the
177 .Fx
178 source code, which is usually located in
179 .Pa /usr/src .
180 As a rule, the system administrator creates
181 .Nm
182 when the values of certain control variables need to be changed
183 from their defaults.
184 .Pp
185 In addition, control variables can be specified
186 for a particular build via the
187 .Fl D
188 option of
189 .Xr make 1
190 or in its environment; see
191 .Xr environ 7 .
192 .Pp
193 The environment of
194 .Xr make 1
195 for the build can be controlled via the
196 .Va SRC_ENV_CONF
197 variable, which defaults to
198 .Pa /etc/src-env.conf .
199 Some examples that may only be set in this file are
200 .Va WITH_DIRDEPS_BUILD ,
201 and
202 .Va WITH_META_MODE
203 as they are environment-only variables.
204 Note that
205 .Va MAKEOBJDIRPREFIX
206 may be set here only when using
207 .Va WITH_DIRDEPS_BUILD .
208 .Pp
209 The values of variables are ignored regardless of their setting;
210 even if they would be set to
211 .Dq Li FALSE
212 or
213 .Dq Li NO .
214 Just the existence of an option will cause
215 it to be honoured by
216 .Xr make 1 .
217 .Pp
218 The following list provides a name and short description for variables
219 that can be used for source builds.
220 .Bl -tag -width indent
221 EOF
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
328 The
329 .Nm
330 file appeared in
331 .Fx 7.0 .
332 .Sh AUTHORS
333 This manual page was autogenerated.
334 EOF
335 }
336
337 twiddle_pos=0
338 twiddle()
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
346 main