On windows, we rename clang.exe to clang-$MAJOR.exe, and later install clang.exe as a wrapper for the default architecture. But if only building certain architectures, and the host architecture isn't one of them, we shouldn't install any unprefixed clang.exe at all.
111 lines
3.2 KiB
Bash
Executable File
111 lines
3.2 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 "$HOST" ]; then
|
|
EXEEXT=.exe
|
|
fi
|
|
|
|
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
|
|
HOST_ARCH="${HOST%%-*}"
|
|
# Install unprefixed wrappers if $HOST is one of the architectures
|
|
# we are installing wrappers for.
|
|
case $ARCHS in
|
|
*$HOST_ARCH*)
|
|
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
|
|
;;
|
|
esac
|
|
fi
|