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 MK_AUTO_OBJ=no | 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 , 221and 222.Va MAKEOBJDIRPREFIX 223as they are environment-only variables. 224.Pp 225The values of variables are ignored regardless of their setting; 226even if they would be set to 227.Dq Li FALSE 228or 229.Dq Li NO . 230The presence of an option causes 231it to be honored by 232.Xr make 1 . 233.Pp 234This list provides a name and short description for variables 235that can be used for source builds. 236.Bl -tag -width indent 237EOF 238 show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default 239 # Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the 240 # actual config that results from enabling every WITH_ option. This 241 # can be reverted if/when we no longer have options that disable 242 # others. 243 show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf 244 show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL 245 show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL 246 env_only_options="$(${make} MK_AUTO_OBJ=no -V __ENV_ONLY_OPTIONS)" 247 248 show_options | 249 while read opt targets ; do 250 if [ ! -f ${opt} ] ; then 251 echo "no description found for ${opt}, skipping" >&2 252 continue 253 fi 254 255 echo ".It Va ${opt}" 256 sed -e'/\$FreeBSD.*\$/d' ${opt} 257 if [ -n "${targets}" ] ; then 258 echo '.Pp' 259 echo 'This is a default setting on' 260 echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /'). 261 fi 262 263 if [ "${opt%%_*}" = 'WITHOUT' ] ; then 264 sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf 265 show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt} 266 comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps 267 elif [ "${opt%%_*}" = 'WITH' ] ; then 268 sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf 269 show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt} 270 comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps 271 else 272 echo 'internal error' >&2 273 exit 1 274 fi 275 276 show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt} 277 comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" | 278 comm -13 $t/deps - > $t/deps2 279 280 havedeps=0 281 if [ -s $t/deps ] ; then 282 havedeps=1 283 echo 'When set, it enforces these options:' 284 echo '.Pp' 285 echo '.Bl -item -compact' 286 while read opt2 ; do 287 echo '.It' 288 echo ".Va ${opt2}" 289 done < $t/deps 290 echo '.El' 291 fi 292 293 if [ -s $t/deps2 ] ; then 294 if [ ${havedeps} -eq 1 ] ; then 295 echo '.Pp' 296 fi 297 echo 'When set, these options are also in effect:' 298 echo '.Pp' 299 echo '.Bl -inset -compact' 300 while read opt2 ; do 301 echo ".It Va ${opt2}" 302 noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/') 303 echo '(unless' 304 echo ".Va ${noopt}" 305 echo 'is set explicitly)' 306 done < $t/deps2 307 echo '.El' 308 fi 309 310 case " ${env_only_options} " in 311 *\ ${opt#*_}\ *) 312 echo ".Pp" 313 echo "This must be set in the environment, make command line, or" 314 echo ".Pa /etc/src-env.conf ," 315 echo "not" 316 echo ".Pa /etc/src.conf ." 317 ;; 318 esac 319 320 twiddle >&2 321 done 322 cat <<EOF 323.El 324.Sh FILES 325.Bl -tag -compact -width Pa 326.It Pa /etc/src.conf 327.It Pa /etc/src-env.conf 328.It Pa /usr/share/mk/bsd.own.mk 329.El 330.Sh SEE ALSO 331.Xr make 1 , 332.Xr make.conf 5 , 333.Xr build 7 , 334.Xr ports 7 335.Sh HISTORY 336The 337.Nm 338file appeared in 339.Fx 7.0 . 340.Sh AUTHORS 341This manual page was autogenerated by 342.An tools/build/options/makeman . 343EOF 344} 345 346twiddle_pos=0 347twiddle() 348{ 349 local c0='|' c1='/' c2='-' c3='\' 350 351 eval printf '%c\\b' '$c'${twiddle_pos} 352 twiddle_pos=$(((twiddle_pos+1)%4)) 353} 354 355main 356