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