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