This avoids ambiguity on distributions (such as openSUSE) where the HOST environment variable already is set, to the hostname.
100 lines
2.9 KiB
Bash
Executable File
100 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
unset HOST
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--host=*)
|
|
HOST="${1#*=}"
|
|
;;
|
|
*)
|
|
PREFIX="$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
if [ -z "$PREFIX" ]; then
|
|
echo $0 dest
|
|
exit 1
|
|
fi
|
|
mkdir -p "$PREFIX"
|
|
PREFIX="$(cd "$PREFIX" && pwd)"
|
|
|
|
: ${ARCHS:=${TOOLCHAIN_ARCHS-i686 x86_64 armv7 aarch64}}
|
|
: ${TARGET_OSES:=${TOOLCHAIN_TARGET_OSES-mingw32 mingw32uwp}}
|
|
|
|
if [ -n "$HOST" ] && [ -z "$CC" ]; then
|
|
CC=$HOST-gcc
|
|
fi
|
|
: ${CC:=cc}
|
|
|
|
case $(uname) in
|
|
MINGW*)
|
|
EXEEXT=.exe
|
|
;;
|
|
esac
|
|
|
|
if [ -n "$EXEEXT" ]; then
|
|
CLANG_MAJOR=$(basename $(echo $PREFIX/lib/clang/* | awk '{print $NF}') | cut -f 1 -d .)
|
|
WRAPPER_FLAGS="$WRAPPER_FLAGS -municode -DCLANG=\"clang-$CLANG_MAJOR\""
|
|
fi
|
|
|
|
mkdir -p $PREFIX/bin
|
|
cp wrappers/*-wrapper.sh $PREFIX/bin
|
|
if [ -n "$HOST" ]; then
|
|
# TODO: If building natively on msys, pick up the default HOST value from there.
|
|
WRAPPER_FLAGS="$WRAPPER_FLAGS -DDEFAULT_TARGET=\"$HOST\""
|
|
for i in wrappers/*-wrapper.sh; do
|
|
cat $i | sed 's/^DEFAULT_TARGET=.*/DEFAULT_TARGET='$HOST/ > $PREFIX/bin/$(basename $i)
|
|
done
|
|
fi
|
|
$CC wrappers/clang-target-wrapper.c -o $PREFIX/bin/clang-target-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS
|
|
$CC wrappers/windres-wrapper.c -o $PREFIX/bin/windres-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS
|
|
$CC wrappers/llvm-wrapper.c -o $PREFIX/bin/llvm-wrapper$EXEEXT -O2 -Wl,-s $WRAPPER_FLAGS
|
|
if [ -n "$EXEEXT" ]; then
|
|
# For Windows, we should prefer the executable wrapper, which also works
|
|
# when invoked from outside of MSYS.
|
|
CTW_SUFFIX=$EXEEXT
|
|
CTW_LINK_SUFFIX=$EXEEXT
|
|
else
|
|
CTW_SUFFIX=.sh
|
|
fi
|
|
cd $PREFIX/bin
|
|
for arch in $ARCHS; do
|
|
for target_os in $TARGET_OSES; do
|
|
for exec in clang clang++ gcc g++ cc c99 c11 c++; do
|
|
ln -sf clang-target-wrapper$CTW_SUFFIX $arch-w64-$target_os-$exec$CTW_LINK_SUFFIX
|
|
done
|
|
for exec in addr2line ar ranlib nm objcopy strings strip; do
|
|
if [ -n "$HOST" ]; then
|
|
link_target=llvm-wrapper
|
|
else
|
|
link_target=llvm-$exec
|
|
fi
|
|
ln -sf $link_target$EXEEXT $arch-w64-$target_os-$exec$EXEEXT || true
|
|
done
|
|
for exec in windres; do
|
|
ln -sf $exec-wrapper$EXEEXT $arch-w64-$target_os-$exec$EXEEXT
|
|
done
|
|
for exec in ld objdump dlltool; do
|
|
ln -sf $exec-wrapper.sh $arch-w64-$target_os-$exec
|
|
done
|
|
done
|
|
done
|
|
if [ -n "$EXEEXT" ]; then
|
|
if [ ! -L clang$EXEEXT ] && [ -f clang$EXEEXT ] && [ ! -f clang-$CLANG_MAJOR$EXEEXT ]; then
|
|
mv clang$EXEEXT clang-$CLANG_MAJOR$EXEEXT
|
|
fi
|
|
if [ -z "$HOST" ]; then
|
|
HOST=$(./clang-$CLANG_MAJOR -dumpmachine | sed 's/-.*//')-w64-mingw32
|
|
fi
|
|
for exec in clang clang++ gcc g++ cc c99 c11 c++ addr2line ar ranlib nm objcopy strings strip windres; do
|
|
ln -sf $HOST-$exec$EXEEXT $exec$EXEEXT
|
|
done
|
|
for exec in ld objdump dlltool; do
|
|
ln -sf $HOST-$exec $exec
|
|
done
|
|
fi
|