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 | 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 cat <<EOF 145.\" DO NOT EDIT-- this file is generated by tools/build/options/makeman. 146.\" ${fbsdid} 147.Dd $(echo $(LC_TIME=C date +'%B %e, %Y')) 148.Dt SRC.CONF 5 149.Os 150.Sh NAME 151.Nm src.conf 152.Nd "source build options" 153.Sh DESCRIPTION 154The 155.Nm 156file contains settings that will apply to every build involving the 157.Fx 158source tree; see 159.Xr build 7 . 160.Pp 161The 162.Nm 163file uses the standard makefile syntax. 164However, 165.Nm 166should not specify any dependencies to 167.Xr make 1 . 168Instead, 169.Nm 170is to set 171.Xr make 1 172variables that control the aspects of how the system builds. 173.Pp 174The default location of 175.Nm 176is 177.Pa /etc/src.conf , 178though an alternative location can be specified in the 179.Xr make 1 180variable 181.Va SRCCONF . 182Overriding the location of 183.Nm 184may be necessary if the system-wide settings are not suitable 185for a particular build. 186For instance, setting 187.Va SRCCONF 188to 189.Pa /dev/null 190effectively resets all build controls to their defaults. 191.Pp 192The only purpose of 193.Nm 194is to control the compilation of the 195.Fx 196source code, which is usually located in 197.Pa /usr/src . 198As a rule, the system administrator creates 199.Nm 200when the values of certain control variables need to be changed 201from their defaults. 202.Pp 203In addition, control variables can be specified 204for a particular build via the 205.Fl D 206option of 207.Xr make 1 208or in its environment; see 209.Xr environ 7 . 210.Pp 211The environment of 212.Xr make 1 213for the build can be controlled via the 214.Va SRC_ENV_CONF 215variable, which defaults to 216.Pa /etc/src-env.conf . 217Some examples that may only be set in this file are 218.Va WITH_DIRDEPS_BUILD , 219and 220.Va WITH_META_MODE 221as they are environment-only variables. 222Note that 223.Va MAKEOBJDIRPREFIX 224may be set here only when using 225.Va WITH_DIRDEPS_BUILD . 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} -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 # Work around BIND_UTILS=no being the default when every WITH_ 283 # option is enabled. 284 if [ "$(cat $t/deps2)" = WITHOUT_BIND_UTILS ]; then 285 sort $t/deps $t/deps2 > $t/_deps 286 mv $t/_deps $t/deps 287 :> $t/deps2 288 fi 289 290 havedeps=0 291 if [ -s $t/deps ] ; then 292 havedeps=1 293 echo 'When set, it enforces these options:' 294 echo '.Pp' 295 echo '.Bl -item -compact' 296 while read opt2 ; do 297 echo '.It' 298 echo ".Va ${opt2}" 299 done < $t/deps 300 echo '.El' 301 fi 302 303 if [ -s $t/deps2 ] ; then 304 if [ ${havedeps} -eq 1 ] ; then 305 echo '.Pp' 306 fi 307 echo 'When set, these options are also in effect:' 308 echo '.Pp' 309 echo '.Bl -inset -compact' 310 while read opt2 ; do 311 echo ".It Va ${opt2}" 312 noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/') 313 echo '(unless' 314 echo ".Va ${noopt}" 315 echo 'is set explicitly)' 316 done < $t/deps2 317 echo '.El' 318 fi 319 320 case " ${env_only_options} " in 321 *\ ${opt#*_}\ *) 322 echo ".Pp" 323 echo "This must be set in the environment, make command line, or" 324 echo ".Pa /etc/src-env.conf ," 325 echo "not" 326 echo ".Pa /etc/src.conf ." 327 ;; 328 esac 329 330 twiddle >&2 331 done 332 cat <<EOF 333.El 334.Sh FILES 335.Bl -tag -compact -width Pa 336.It Pa /etc/src.conf 337.It Pa /etc/src-env.conf 338.It Pa /usr/share/mk/bsd.own.mk 339.El 340.Sh SEE ALSO 341.Xr make 1 , 342.Xr make.conf 5 , 343.Xr build 7 , 344.Xr ports 7 345.Sh HISTORY 346The 347.Nm 348file appeared in 349.Fx 7.0 . 350.Sh AUTHORS 351This manual page was autogenerated by 352.An tools/build/options/makeman . 353EOF 354} 355 356twiddle_pos=0 357twiddle() 358{ 359 local c0='|' c1='/' c2='-' c3='\' 360 361 eval printf '%c\\b' '$c'${twiddle_pos} 362 twiddle_pos=$(((twiddle_pos+1)%4)) 363} 364 365main 366