Files
llvm-mingw/wrappers/clang-target-wrapper.sh
Martin Storsjö 866d47cced wrappers: Pick up the Clang config file implicitly
Clang only picks up config files implicitly using the normalized
triple form, so use file names with "-windows-gnu" instead of
"-mingw32".

In theory, we could also want to pick up the config file implicitly
by having "<triple>-<mode>" be a symlink directly to the clang
executable. That works for regular mingw32 targets, but for the
mingw32uwp target, there's no distinction in the normalized
triple, so both would end up using the same "-windows-gnu" config
files. So as long as we want to support the mingw32uwp prefixed
tools, we need to use a wrapper.
2024-11-06 11:40:30 +02:00

99 lines
2.9 KiB
Bash
Executable File

#!/bin/sh
#
# Copyright (c) 2018 Martin Storsjo
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
get_dir() {
target="$1"
while [ -L "$target" ]; do
cd "$(dirname "$target")"
target="$(readlink "$(basename "$target")")"
done
cd "$(dirname "$target")"
pwd
}
DIR="$(get_dir "$0")"
BASENAME="$(basename "$0")"
TARGET="${BASENAME%-*}"
EXE="${BASENAME##*-}"
DEFAULT_TARGET=x86_64-w64-mingw32
if [ "$TARGET" = "$BASENAME" ]; then
TARGET=$DEFAULT_TARGET
fi
ARCH="${TARGET%%-*}"
TARGET_OS="${TARGET##*-}"
# Check if trying to compile Ada; if we try to do this, invoking clang
# would end up invoking <triplet>-gcc with the same arguments, which ends
# up in an infinite recursion.
case "$*" in
*-x\ ada*)
echo "Ada is not supported" >&2
exit 1
;;
*)
;;
esac
# Allow setting e.g. CCACHE=1 to wrap all building in ccache.
if [ -n "$CCACHE" ]; then
CCACHE=ccache
fi
# If changing this wrapper, change clang-target-wrapper.c accordingly.
CLANG="$DIR/clang"
FLAGS=""
FLAGS="$FLAGS --start-no-unused-arguments"
case $EXE in
clang++|g++|c++)
FLAGS="$FLAGS --driver-mode=g++"
;;
c99)
FLAGS="$FLAGS -std=c99"
;;
c11)
FLAGS="$FLAGS -std=c11"
;;
esac
LINKER_FLAGS=""
case $TARGET_OS in
mingw32uwp)
# the UWP target is for Windows 10
FLAGS="$FLAGS -D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00"
# the UWP target can only use Windows Store APIs
FLAGS="$FLAGS -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
# the Windows Store API only supports Windows Unicode (some rare ANSI ones are available)
FLAGS="$FLAGS -DUNICODE"
# Force the Universal C Runtime
FLAGS="$FLAGS -D_UCRT"
# Default linker flags; passed after any user specified -l options,
# to let the user specified libraries take precedence over these.
# add the minimum runtime to use for UWP targets
LINKER_FLAGS="$LINKER_FLAGS --start-no-unused-arguments"
LINKER_FLAGS="$LINKER_FLAGS -Wl,-lwindowsapp"
# This still requires that the toolchain (in particular, libc++.a) has
# been built targeting UCRT originally.
LINKER_FLAGS="$LINKER_FLAGS -Wl,-lucrtapp"
LINKER_FLAGS="$LINKER_FLAGS --end-no-unused-arguments"
;;
esac
FLAGS="$FLAGS -target $TARGET"
FLAGS="$FLAGS --end-no-unused-arguments"
$CCACHE "$CLANG" $FLAGS "$@" $LINKER_FLAGS