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