redoconf: better handling of required vs optional detectors.

CC.rc was the only "mandatory" detection, which was weird and
inconsistent.  Instead, make it optional like the others, and have it
set a HAVE_CC variable appropriately (and have CXX.rc work the same
way).  Then, add a default.required.rc.od that checks the HAVE_* for
any variable and aborts if it is not available.

This allows us to fix confusing behaviour in allconfig.do, which would
try every compiler on the system, but redo would print a (non-fatal)
error message (and prevent redo-stamp optimization) when CC.rc failed
for any non-working compilers.  Now CC.rc just politely reports that it
didn't find a compiler.  Then we change all.rc.od to make CC.rc
mandatory.

Reported-by: Nathaniel Filardo <nwfilardo@gmail.com>
This commit is contained in:
Avery Pennarun 2019-02-23 16:45:08 -05:00
commit bdb8d8a27d
10 changed files with 56 additions and 24 deletions

View file

@ -4,3 +4,4 @@ hello
/arches /arches
/out /out
/out.* /out.*
/sources

View file

@ -1,6 +1,6 @@
. ./redoconf.rc . ./redoconf.rc
rc_include \ rc_include \
rc/CC.rc \ rc/CC.required.rc \
rc/CXX.rc \ rc/CXX.rc \
rc/libqt4.rc \ rc/libqt4.rc \
rc/libgtk2.rc \ rc/libgtk2.rc \

View file

@ -8,9 +8,13 @@ config() {
( (
cd "$dir" && cd "$dir" &&
../configure --host="$arch" "$@" && ../configure --host="$arch" "$@" &&
redo-ifchange rc/CC.rc && ( set --;
. ./redoconf.rc &&
rc_include rc/CC.rc &&
[ -n "$HAVE_CC" ]
) &&
echo "$dir" echo "$dir"
) || : ) || (echo "Skipping arch '$arch' $*" >&2)
} }
for d in $(cat arches); do for d in $(cat arches); do
@ -22,6 +26,6 @@ for d in $(cat arches); do
config "out.$d" "$arch" & config "out.$d" "$arch" &
config "out.$d.static" "$arch" "--enable-static" & config "out.$d.static" "$arch" "--enable-static" &
config "out.$d.opt" "$arch" "--enable-optimization" & config "out.$d.opt" "$arch" "--enable-optimization" &
done done >$3
wait wait

View file

@ -1,14 +1,16 @@
IFS=: (
echo native >$3 echo native
if [ -z "$NO_SLOW_TESTS" ]; then echo fake-always-fails
for dir in $PATH; do if [ -z "$NO_SLOW_TESTS" ]; then
for d in "$dir"/*-cc "$dir"/*-gcc; do IFS=:
base=${d##*/} for dir in $PATH; do
arch=${base%-*} for d in "$dir"/*-cc "$dir"/*-gcc; do
if [ -x "$d" ]; then echo "$arch"; fi base=${d##*/}
arch=${base%-*}
if [ -x "$d" ]; then echo "$arch"; fi
done
done done
done >>$3 fi
fi ) >$3
redo-always redo-always
redo-stamp <$3 redo-stamp <$3

View file

@ -1,8 +1,8 @@
# This script is run from the output dir, # This script is run from the output dir.
# which contains a src/ symlink to the source dir. # The source dir is at $S.
. ./redoconf.rc . ./redoconf.rc
rc_include all.rc rc_include all.rc
redo-ifchange "$S/sources"
( (
cd "$S" cd "$S"
@ -26,5 +26,4 @@ rc_include all.rc
printf '%s\n' "$LIBGTK2" "$LIBQT4" printf '%s\n' "$LIBGTK2" "$LIBQT4"
) >$3 ) >$3
redo-always
redo-stamp <$3 redo-stamp <$3

View file

@ -0,0 +1,12 @@
# This file changes when the list of source files changes.
# If you depend on it, you can make a target that gets
# rebuilt only when it might need to reconsider the
# list of available source files.
find . -name '*.[ch]' -o \
-name '*.cc' -o \
-name '*.od' -o \
-name '*.list' |
grep -v '^\./out\.' |
sort >$3
redo-always
redo-stamp <$3

View file

@ -13,10 +13,10 @@ redo-ifchange "$REDOCONF/rc.sh" "$REDOCONF/utils.sh"
_rc_exit_check() { _rc_exit_check() {
if [ -z "$RC_INCLUDE_RAN" ]; then if [ -z "$RC_INCLUDE_RAN" ]; then
echo "Fatal: used redoconf/rc.sh but didn't call rc_include." >&2 echo "Fatal: used redoconf/rc.sh but didn't call rc_include." >&2
exit 99 exit 91
elif [ -n "$RC_QUEUE" ]; then elif [ -n "$RC_QUEUE" ]; then
echo "Fatal: must call rc_save or rc_undo before ending." >&2 echo "Fatal: must call rc_save or rc_undo before ending." >&2
exit 99 exit 92
fi fi
} }
trap _rc_exit_check EXIT trap _rc_exit_check EXIT

View file

@ -57,7 +57,7 @@ for d in "$@"; do
x="${x#-}" x="${x#-}"
[ -n "$x" ] && x="$x-" [ -n "$x" ] && x="$x-"
rc_replaceln ARCH "$x" rc_replaceln ARCH "$x"
rc_replaceln HAVE_CC 1
rc_save rc_save
exit 0 exit 0
fi fi
@ -65,4 +65,5 @@ done
echo "Can't find a working C compiler." >&2 echo "Can't find a working C compiler." >&2
rc_undo rc_undo
exit 1 rc_replaceln CC ""
rc_save

View file

@ -23,6 +23,7 @@ for d in "$@"; do
# it to include -lstdc++, etc. # it to include -lstdc++, etc.
# A future .rc could override this again. # A future .rc could override this again.
rc_replaceln LINK "$d" rc_replaceln LINK "$d"
rc_replaceln HAVE_CXX 1
rc_save rc_save
exit 0 exit 0
fi fi
@ -32,4 +33,3 @@ echo "Warning: Can't find a working C++ compiler." >&2
rc_undo rc_undo
rc_replaceln CXX "" rc_replaceln CXX ""
rc_save rc_save
exit 0

View file

@ -0,0 +1,13 @@
. ./redoconf.rc
base=${1%.required.rc}
name=${base#*/}
NAME=$(echo "$name" | tr 'a-z.' 'A-Z_')
rc_include "$base.rc"
eval v="\$$NAME"
if [ -z "$v" ]; then
echo "$NAME is required in order to build." >&2
exit 1
fi