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>
69 lines
2.1 KiB
Text
69 lines
2.1 KiB
Text
. ./redoconf.rc
|
|
rc_include
|
|
|
|
rc_helpmsg ARCH "Architecture prefix for output (eg. i686-w64-mingw32-)"
|
|
rc_helpmsg CC "C compiler name (cc)"
|
|
rc_helpmsg CPPFLAGS "Extra C preprocessor flags (eg. -I... -D...)"
|
|
rc_helpmsg CFLAGS "Extra C compiler flags (eg. -O2 -g)"
|
|
rc_helpmsg OPTFLAGS "C/C++ compiler flag overrides (eg. -g0)"
|
|
rc_helpmsg LINK "Linker name (cc)"
|
|
rc_helpmsg LDFLAGS "Extra linker options (eg. -s -static)"
|
|
rc_helpmsg LIBS "Extra libraries to always link against (eg. -lsocket)"
|
|
rc_helpmsg STATIC "Link libraries and binaries statically"
|
|
|
|
if [ -n "$CC" ]; then
|
|
set -- "$CC"
|
|
else
|
|
if [ -n "$ARCH" ] && [ "$ARCH" = "${ARCH%-}" ]; then
|
|
# Make sure arch name includes trailing dash if nonempty
|
|
ARCH="$ARCH-"
|
|
fi
|
|
set -- \
|
|
"${ARCH}cc" "${ARCH}gcc" \
|
|
"${ARCH}clang" "/usr/bin/${ARCH}clang"-[0-9]* \
|
|
"${ARCH}c++" "${ARCH}g++" \
|
|
"${ARCH}clang++" "/usr/bin/${ARCH}clang++"-[0-9]*
|
|
fi
|
|
|
|
rc_appendln CPPFLAGS "-I."
|
|
[ -n "$STATIC" ] && rc_appendln LDFLAGS "-static"
|
|
|
|
for d in "$@"; do
|
|
echo "Trying C compiler: '$d'" >&2
|
|
if CC="$d" CXX="" LINK="$d" rc_compile cc link 'extern int i;'; then
|
|
rc_replaceln CC "$d"
|
|
rc_replaceln LINK "$d"
|
|
|
|
# mingw32 (not mingw64) generates binaries that need
|
|
# a dynamic libgcc at runtime for certain operations
|
|
# (like 64-bit integer division), which is non-obvious.
|
|
# Include it statically if possible, but only on Windows,
|
|
# which we'll detect by whether windows.h exists.
|
|
#
|
|
# If adding the option fails, maybe it's some
|
|
# compiler other than gcc, so that's fine.
|
|
x="-static-libgcc$NL-static-libstdc++"
|
|
appendln LDFLAGS "$x"
|
|
prog='#include <windows.h>'
|
|
if CC="$d" LINK="$d" rc_compile cc link "$prog"; then
|
|
rc_appendln LDFLAGS "$x"
|
|
fi
|
|
|
|
# Set ARCH= to the right compiler prefix, either empty
|
|
# (use native compiler) or something like "i686-w64-mingw32-"
|
|
# (terminating dash), based on the compiler name.
|
|
x="-${CC##*/}"
|
|
x="${x%-*}"
|
|
x="${x#-}"
|
|
[ -n "$x" ] && x="$x-"
|
|
rc_replaceln ARCH "$x"
|
|
rc_replaceln HAVE_CC 1
|
|
rc_save
|
|
exit 0
|
|
fi
|
|
done
|
|
|
|
echo "Can't find a working C compiler." >&2
|
|
rc_undo
|
|
rc_replaceln CC ""
|
|
rc_save
|