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 settings that will apply to every build involving the 158.Fx 159source tree; see 160.Xr build 7 . 161.Pp 162The 163.Nm 164file uses the standard makefile syntax. 165However, 166.Nm 167should not specify any dependencies to 168.Xr make 1 . 169Instead, 170.Nm 171is to set 172.Xr make 1 173variables that control the aspects of how the system builds. 174.Pp 175The default location of 176.Nm 177is 178.Pa /etc/src.conf , 179though an alternative location can be specified in the 180.Xr make 1 181variable 182.Va SRCCONF . 183Overriding the location of 184.Nm 185may be necessary if the system-wide settings are not suitable 186for a particular build. 187For instance, setting 188.Va SRCCONF 189to 190.Pa /dev/null 191effectively resets all build controls to their defaults. 192.Pp 193The only purpose of 194.Nm 195is to control the compilation of the 196.Fx 197source code, which is usually located in 198.Pa /usr/src . 199As a rule, the system administrator creates 200.Nm 201when the values of certain control variables need to be changed 202from their defaults. 203.Pp 204In addition, control variables can be specified 205for a particular build via the 206.Fl D 207option of 208.Xr make 1 209or in its environment; see 210.Xr environ 7 . 211.Pp 212The environment of 213.Xr make 1 214for the build can be controlled via the 215.Va SRC_ENV_CONF 216variable, which defaults to 217.Pa /etc/src-env.conf . 218Some examples that may only be set in this file are 219.Va WITH_DIRDEPS_BUILD , 220and 221.Va WITH_META_MODE , 222and 223.Va MAKEOBJDIRPREFIX 224as they are environment-only variables. 225.Pp 226The values of variables are ignored regardless of their setting; 227even if they would be set to 228.Dq Li FALSE 229or 230.Dq Li NO . 231The presence of an option causes 232it to be honored by 233.Xr make 1 . 234.Pp 235This list provides a name and short description for variables 236that can be used for source builds. 237.Bl -tag -width indent 238EOF 239 show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default 240 # Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the 241 # actual config that results from enabling every WITH_ option. This 242 # can be reverted if/when we no longer have options that disable 243 # others. 244 show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf 245 show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL 246 show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL 247 env_only_options="$(${make} MK_AUTO_OBJ=no -V __ENV_ONLY_OPTIONS)" 248 249 show_options | 250 while read opt targets ; do 251 if [ ! -f ${opt} ] ; then 252 echo "no description found for ${opt}, skipping" >&2 253 continue 254 fi 255 256 echo ".It Va ${opt}" 257 sed -e'/\$FreeBSD.*\$/d' ${opt} 258 if [ -n "${targets}" ] ; then 259 echo '.Pp' 260 echo 'This is a default setting on' 261 echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /'). 262 fi 263 264 if [ "${opt%%_*}" = 'WITHOUT' ] ; then 265 sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf 266 show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt} 267 comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps 268 elif [ "${opt%%_*}" = 'WITH' ] ; then 269 sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf 270 show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt} 271 comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps 272 else 273 echo 'internal error' >&2 274 exit 1 275 fi 276 277 show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt} 278 comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" | 279 comm -13 $t/deps - > $t/deps2 280 281 havedeps=0 282 if [ -s $t/deps ] ; then 283 havedeps=1 284 echo 'When set, it enforces these options:' 285 echo '.Pp' 286 echo '.Bl -item -compact' 287 while read opt2 ; do 288 echo '.It' 289 echo ".Va ${opt2}" 290 done < $t/deps 291 echo '.El' 292 fi 293 294 if [ -s $t/deps2 ] ; then 295 if [ ${havedeps} -eq 1 ] ; then 296 echo '.Pp' 297 fi 298 echo 'When set, these options are also in effect:' 299 echo '.Pp' 300 echo '.Bl -inset -compact' 301 while read opt2 ; do 302 echo ".It Va ${opt2}" 303 noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/') 304 echo '(unless' 305 echo ".Va ${noopt}" 306 echo 'is set explicitly)' 307 done < $t/deps2 308 echo '.El' 309 fi 310 311 case " ${env_only_options} " in 312 *\ ${opt#*_}\ *) 313 echo ".Pp" 314 echo "This must be set in the environment, make command line, or" 315 echo ".Pa /etc/src-env.conf ," 316 echo "not" 317 echo ".Pa /etc/src.conf ." 318 ;; 319 esac 320 321 twiddle >&2 322 done 323 cat <<EOF 324.El 325.Sh FILES 326.Bl -tag -compact -width Pa 327.It Pa /etc/src.conf 328.It Pa /etc/src-env.conf 329.It Pa /usr/share/mk/bsd.own.mk 330.El 331.Sh SEE ALSO 332.Xr make 1 , 333.Xr make.conf 5 , 334.Xr build 7 , 335.Xr ports 7 336.Sh HISTORY 337The 338.Nm 339file appeared in 340.Fx 7.0 . 341.Sh AUTHORS 342This manual page was autogenerated by 343.An tools/build/options/makeman . 344EOF 345} 346 347twiddle_pos=0 348twiddle() 349{ 350 local c0='|' c1='/' c2='-' c3='\' 351 352 eval printf '%c\\b' '$c'${twiddle_pos} 353 twiddle_pos=$(((twiddle_pos+1)%4)) 354} 355 356main 357