b7f38e69a9
On some targets 'make showconfig' currently reports both 'no' and 'yes' for some options. For example: % make TARGET=mips showconfig | grep SSP MK_SSP = no MK_SSP = yes Emit a warning on encountering a duplicated variable, and skip the second entry. Sponsored by: The FreeBSD Foundation
353 lines
7.5 KiB
Bash
Executable File
353 lines
7.5 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# This file is in the public domain.
|
|
|
|
set -o errexit
|
|
export LC_ALL=C
|
|
|
|
ident='$FreeBSD$'
|
|
|
|
t=$(mktemp -d -t makeman)
|
|
trap 'test -d $t && rm -rf $t' exit
|
|
|
|
srcdir=$(realpath ../../..)
|
|
make="make -C $srcdir -m $srcdir/share/mk"
|
|
|
|
#
|
|
# usage: no_targets all_targets yes_targets
|
|
#
|
|
no_targets()
|
|
{
|
|
for t1 in $1 ; do
|
|
for t2 in $2 ; do
|
|
if [ "${t1}" = "${t2}" ] ; then
|
|
continue 2
|
|
fi
|
|
done
|
|
echo ${t1}
|
|
done
|
|
}
|
|
|
|
show_options()
|
|
{
|
|
ALL_TARGETS=$(echo $(${make} targets | tail -n +2))
|
|
rm -f $t/settings
|
|
for target in ${ALL_TARGETS} ; do
|
|
prev_opt=
|
|
env -i ${make} showconfig \
|
|
SRC_ENV_CONF=/dev/null SRCCONF=/dev/null \
|
|
__MAKE_CONF=/dev/null \
|
|
TARGET_ARCH=${target#*/} TARGET=${target%/*} |
|
|
while read var _ val ; do
|
|
opt=${var#MK_}
|
|
if [ $opt = "$prev_opt" ]; then
|
|
echo "$target: ignoring duplicate option $opt" >&2
|
|
continue
|
|
fi
|
|
prev_opt=$opt
|
|
case ${val} in
|
|
yes)
|
|
echo ${opt} ${target}
|
|
;;
|
|
no)
|
|
echo ${opt}
|
|
;;
|
|
*)
|
|
echo "make showconfig broken: ${var} ${_} ${val} (not yes or no)" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done > $t/settings.target
|
|
if [ -r $t/settings ] ; then
|
|
join -t\ $t/settings $t/settings.target > $t/settings.new
|
|
mv $t/settings.new $t/settings
|
|
else
|
|
mv $t/settings.target $t/settings
|
|
fi
|
|
done
|
|
|
|
while read opt targets ; do
|
|
if [ "${targets}" = "${ALL_TARGETS}" ] ; then
|
|
echo "WITHOUT_${opt}"
|
|
elif [ -z "${targets}" ] ; then
|
|
echo "WITH_${opt}"
|
|
else
|
|
echo "WITHOUT_${opt}" $(no_targets "${ALL_TARGETS}" "${targets}")
|
|
echo "WITH_${opt} ${targets}"
|
|
fi
|
|
done < $t/settings
|
|
}
|
|
|
|
#
|
|
# usage: show { settings | with | without } ...
|
|
#
|
|
show()
|
|
{
|
|
|
|
mode=$1 ; shift
|
|
case ${mode} in
|
|
settings)
|
|
yes_prefix=WITH
|
|
no_prefix=WITHOUT
|
|
;;
|
|
with)
|
|
yes_prefix=WITH
|
|
no_prefix=WITH
|
|
;;
|
|
without)
|
|
yes_prefix=WITHOUT
|
|
no_prefix=WITHOUT
|
|
;;
|
|
*)
|
|
echo 'internal error' >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
env -i ${make} .MAKE.MODE=normal "$@" showconfig __MAKE_CONF=/dev/null \
|
|
SRCCONF=/dev/null |
|
|
while read var _ val ; do
|
|
opt=${var#MK_}
|
|
case ${val} in
|
|
yes)
|
|
echo ${yes_prefix}_${opt}
|
|
;;
|
|
no)
|
|
echo ${no_prefix}_${opt}
|
|
;;
|
|
*)
|
|
echo "make showconfig broken: ${var} ${_} ${val} (not yes or no)" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
main()
|
|
{
|
|
|
|
ident=${ident#$}
|
|
ident=${ident% $}
|
|
fbsdid='$'FreeBSD'$'
|
|
cat <<EOF
|
|
.\" DO NOT EDIT-- this file is automatically generated.
|
|
.\" from ${ident}
|
|
.\" ${fbsdid}
|
|
.Dd $(echo $(LC_TIME=C date +'%B %e, %Y'))
|
|
.Dt SRC.CONF 5
|
|
.Os
|
|
.Sh NAME
|
|
.Nm src.conf
|
|
.Nd "source build options"
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Nm
|
|
file contains settings that will apply to every build involving the
|
|
.Fx
|
|
source tree; see
|
|
.Xr build 7 .
|
|
.Pp
|
|
The
|
|
.Nm
|
|
file uses the standard makefile syntax.
|
|
However,
|
|
.Nm
|
|
should not specify any dependencies to
|
|
.Xr make 1 .
|
|
Instead,
|
|
.Nm
|
|
is to set
|
|
.Xr make 1
|
|
variables that control the aspects of how the system builds.
|
|
.Pp
|
|
The default location of
|
|
.Nm
|
|
is
|
|
.Pa /etc/src.conf ,
|
|
though an alternative location can be specified in the
|
|
.Xr make 1
|
|
variable
|
|
.Va SRCCONF .
|
|
Overriding the location of
|
|
.Nm
|
|
may be necessary if the system-wide settings are not suitable
|
|
for a particular build.
|
|
For instance, setting
|
|
.Va SRCCONF
|
|
to
|
|
.Pa /dev/null
|
|
effectively resets all build controls to their defaults.
|
|
.Pp
|
|
The only purpose of
|
|
.Nm
|
|
is to control the compilation of the
|
|
.Fx
|
|
source code, which is usually located in
|
|
.Pa /usr/src .
|
|
As a rule, the system administrator creates
|
|
.Nm
|
|
when the values of certain control variables need to be changed
|
|
from their defaults.
|
|
.Pp
|
|
In addition, control variables can be specified
|
|
for a particular build via the
|
|
.Fl D
|
|
option of
|
|
.Xr make 1
|
|
or in its environment; see
|
|
.Xr environ 7 .
|
|
.Pp
|
|
The environment of
|
|
.Xr make 1
|
|
for the build can be controlled via the
|
|
.Va SRC_ENV_CONF
|
|
variable, which defaults to
|
|
.Pa /etc/src-env.conf .
|
|
Some examples that may only be set in this file are
|
|
.Va WITH_DIRDEPS_BUILD ,
|
|
and
|
|
.Va WITH_META_MODE
|
|
as they are environment-only variables.
|
|
Note that
|
|
.Va MAKEOBJDIRPREFIX
|
|
may be set here only when using
|
|
.Va WITH_DIRDEPS_BUILD .
|
|
.Pp
|
|
The values of variables are ignored regardless of their setting;
|
|
even if they would be set to
|
|
.Dq Li FALSE
|
|
or
|
|
.Dq Li NO .
|
|
Just the existence of an option will cause
|
|
it to be honoured by
|
|
.Xr make 1 .
|
|
.Pp
|
|
The following list provides a name and short description for variables
|
|
that can be used for source builds.
|
|
.Bl -tag -width indent
|
|
EOF
|
|
show settings SRC_ENV_CONF=/dev/null | sort > $t/config_default
|
|
# Work around WITH_LDNS_UTILS forcing BIND_UTILS off by parsing the
|
|
# actual config that results from enabling every WITH_ option. This
|
|
# can be reverted if/when we no longer have options that disable
|
|
# others.
|
|
show with SRC_ENV_CONF=/dev/null | sort | sed 's/$/=/' > $t/src.conf
|
|
show settings SRC_ENV_CONF=$t/src.conf | sort > $t/config_WITH_ALL
|
|
show without SRC_ENV_CONF=/dev/null | sort > $t/config_WITHOUT_ALL
|
|
env_only_options="$(${make} -V __ENV_ONLY_OPTIONS)"
|
|
|
|
show_options |
|
|
while read opt targets ; do
|
|
if [ ! -f ${opt} ] ; then
|
|
echo "no description found for ${opt}, skipping" >&2
|
|
continue
|
|
fi
|
|
|
|
echo ".It Va ${opt}"
|
|
sed -e's/\$\(FreeBSD: .*\) \$/from \1/' ${opt}
|
|
if [ -n "${targets}" ] ; then
|
|
echo '.Pp'
|
|
echo 'It is a default setting on'
|
|
echo $(echo ${targets} | sed -e's/ /, /g' -e's/\(.*\), /\1 and /').
|
|
fi
|
|
|
|
if [ "${opt%%_*}" = 'WITHOUT' ] ; then
|
|
sed -n "/^WITH_${opt#WITHOUT_}$/!s/$/=/p" $t/config_WITH_ALL > $t/src.conf
|
|
show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITH_ALL_${opt}
|
|
comm -13 $t/config_WITH_ALL $t/config_WITH_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
|
|
elif [ "${opt%%_*}" = 'WITH' ] ; then
|
|
sed -n "/^WITHOUT${opt#WITH}$/!s/$/=/p" $t/config_WITHOUT_ALL > $t/src.conf
|
|
show settings SRC_ENV_CONF=$t/src.conf -D${opt} | sort > $t/config_WITHOUT_ALL_${opt}
|
|
comm -13 $t/config_WITHOUT_ALL $t/config_WITHOUT_ALL_${opt} | sed -n "/^${opt}$/!p" > $t/deps
|
|
else
|
|
echo 'internal error' >&2
|
|
exit 1
|
|
fi
|
|
|
|
show settings SRC_ENV_CONF=/dev/null -D${opt} | sort > $t/config_${opt}
|
|
comm -13 $t/config_default $t/config_${opt} | sed -n "/^${opt}$/!p" |
|
|
comm -13 $t/deps - > $t/deps2
|
|
|
|
# Work around BIND_UTILS=no being the default when every WITH_
|
|
# option is enabled.
|
|
if [ "$(cat $t/deps2)" = WITHOUT_BIND_UTILS ]; then
|
|
sort $t/deps $t/deps2 > $t/_deps
|
|
mv $t/_deps $t/deps
|
|
:> $t/deps2
|
|
fi
|
|
|
|
havedeps=0
|
|
if [ -s $t/deps ] ; then
|
|
havedeps=1
|
|
echo 'When set, it also enforces the following options:'
|
|
echo '.Pp'
|
|
echo '.Bl -item -compact'
|
|
while read opt2 ; do
|
|
echo '.It'
|
|
echo ".Va ${opt2}"
|
|
done < $t/deps
|
|
echo '.El'
|
|
fi
|
|
|
|
if [ -s $t/deps2 ] ; then
|
|
if [ ${havedeps} -eq 1 ] ; then
|
|
echo '.Pp'
|
|
fi
|
|
echo 'When set, the following options are also in effect:'
|
|
echo '.Pp'
|
|
echo '.Bl -inset -compact'
|
|
while read opt2 ; do
|
|
echo ".It Va ${opt2}"
|
|
noopt=$(echo ${opt2} | sed -e's/WITH_/WITHOUT_/;t' -e's/WITHOUT_/WITH_/')
|
|
echo '(unless'
|
|
echo ".Va ${noopt}"
|
|
echo 'is set explicitly)'
|
|
done < $t/deps2
|
|
echo '.El'
|
|
fi
|
|
|
|
case " ${env_only_options} " in
|
|
*\ ${opt#*_}\ *)
|
|
echo ".Pp"
|
|
echo "This must be set in the environment, make command line, or"
|
|
echo ".Pa /etc/src-env.conf ,"
|
|
echo "not"
|
|
echo ".Pa /etc/src.conf ."
|
|
;;
|
|
esac
|
|
|
|
twiddle >&2
|
|
done
|
|
cat <<EOF
|
|
.El
|
|
.Sh FILES
|
|
.Bl -tag -compact -width Pa
|
|
.It Pa /etc/src.conf
|
|
.It Pa /etc/src-env.conf
|
|
.It Pa /usr/share/mk/bsd.own.mk
|
|
.El
|
|
.Sh SEE ALSO
|
|
.Xr make 1 ,
|
|
.Xr make.conf 5 ,
|
|
.Xr build 7 ,
|
|
.Xr ports 7
|
|
.Sh HISTORY
|
|
The
|
|
.Nm
|
|
file appeared in
|
|
.Fx 7.0 .
|
|
.Sh AUTHORS
|
|
This manual page was autogenerated.
|
|
EOF
|
|
}
|
|
|
|
twiddle_pos=0
|
|
twiddle()
|
|
{
|
|
local c0='|' c1='/' c2='-' c3='\'
|
|
|
|
eval printf '%c\\b' '$c'${twiddle_pos}
|
|
twiddle_pos=$(((twiddle_pos+1)%4))
|
|
}
|
|
|
|
main
|