LLVM's default host detection doesn't always work (cmake doesn't detect and provide the target architecture, but it provides the bitness, thus LLVM's GetHostTriple.cmake guesses on the same architecture as running the build), thus pass it manually. This didn't use to matter, as the tests for whether --target=<target> works used to fail, as the toolchain isn't complete at that point. But since 7af584ed87cc6eddb6adbc451c90fb8867469e06 in llvm-project (November 5th 2021), the libunwind cmake tests for --target do succeed (without noticing that linking actually will fail), and thus can end up using the incorrectly guessed compiler target. Thus, this fixes building the runtimes with current git main versions of llvm-project.
208 lines
6.7 KiB
Bash
Executable File
208 lines
6.7 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.
|
|
|
|
set -e
|
|
|
|
BUILD_STATIC=1
|
|
BUILD_SHARED=1
|
|
|
|
while [ $# -gt 0 ]; do
|
|
if [ "$1" = "--disable-shared" ]; then
|
|
BUILD_SHARED=
|
|
elif [ "$1" = "--enable-shared" ]; then
|
|
BUILD_SHARED=1
|
|
elif [ "$1" = "--disable-static" ]; then
|
|
BUILD_STATIC=
|
|
elif [ "$1" = "--enable-static" ]; then
|
|
BUILD_STATIC=1
|
|
else
|
|
PREFIX="$1"
|
|
fi
|
|
shift
|
|
done
|
|
if [ -z "$PREFIX" ]; then
|
|
echo $0 [--disable-shared] [--disable-static] dest
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$PREFIX"
|
|
PREFIX="$(cd "$PREFIX" && pwd)"
|
|
|
|
export PATH="$PREFIX/bin:$PATH"
|
|
|
|
: ${ARCHS:=${TOOLCHAIN_ARCHS-i686 x86_64 armv7 aarch64}}
|
|
|
|
if [ ! -d llvm-project/libunwind ] || [ -n "$SYNC" ]; then
|
|
CHECKOUT_ONLY=1 ./build-llvm.sh
|
|
fi
|
|
|
|
cd llvm-project
|
|
|
|
LLVM_PATH="$(pwd)/llvm"
|
|
|
|
if [ -n "$(which ninja)" ]; then
|
|
CMAKE_GENERATOR="Ninja"
|
|
NINJA=1
|
|
BUILDCMD=ninja
|
|
else
|
|
: ${CORES:=$(nproc 2>/dev/null)}
|
|
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
|
|
: ${CORES:=4}
|
|
|
|
case $(uname) in
|
|
MINGW*)
|
|
CMAKE_GENERATOR="MSYS Makefiles"
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
BUILDCMD=make
|
|
fi
|
|
|
|
build_all() {
|
|
type="$1"
|
|
if [ "$type" = "shared" ]; then
|
|
SHARED=TRUE
|
|
STATIC=FALSE
|
|
else
|
|
SHARED=FALSE
|
|
STATIC=TRUE
|
|
fi
|
|
|
|
cd libunwind
|
|
for arch in $ARCHS; do
|
|
[ -z "$CLEAN" ] || rm -rf build-$arch-$type
|
|
mkdir -p build-$arch-$type
|
|
cd build-$arch-$type
|
|
cmake \
|
|
${CMAKE_GENERATOR+-G} "$CMAKE_GENERATOR" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX="$PREFIX/$arch-w64-mingw32" \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CXX_COMPILER_TARGET=$arch-w64-windows-gnu \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DLLVM_PATH="$LLVM_PATH" \
|
|
-DCMAKE_AR="$PREFIX/bin/llvm-ar" \
|
|
-DCMAKE_RANLIB="$PREFIX/bin/llvm-ranlib" \
|
|
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
|
|
-DLIBUNWIND_ENABLE_SHARED=$SHARED \
|
|
-DLIBUNWIND_ENABLE_STATIC=$STATIC \
|
|
..
|
|
$BUILDCMD ${CORES+-j$CORES}
|
|
$BUILDCMD install
|
|
cd ..
|
|
done
|
|
cd ..
|
|
|
|
# Configure, but don't build, libcxx, so that libcxxabi has
|
|
# proper headers to refer to
|
|
cd libcxx
|
|
for arch in $ARCHS; do
|
|
[ -z "$CLEAN" ] || rm -rf build-$arch-$type
|
|
mkdir -p build-$arch-$type
|
|
cd build-$arch-$type
|
|
cmake \
|
|
${CMAKE_GENERATOR+-G} "$CMAKE_GENERATOR" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX="$PREFIX/$arch-w64-mingw32" \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CXX_COMPILER_TARGET=$arch-w64-windows-gnu \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_AR="$PREFIX/bin/llvm-ar" \
|
|
-DCMAKE_RANLIB="$PREFIX/bin/llvm-ranlib" \
|
|
-DLLVM_PATH="$LLVM_PATH" \
|
|
-DLIBCXX_USE_COMPILER_RT=ON \
|
|
-DLIBCXX_HAS_WIN32_THREAD_API=ON \
|
|
-DLIBCXX_ENABLE_SHARED=$SHARED \
|
|
-DLIBCXX_ENABLE_STATIC=$STATIC \
|
|
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
|
|
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
|
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include \
|
|
-DLIBCXX_CXX_ABI_LIBRARY_PATH=../../libcxxabi/build-$arch-$type/lib \
|
|
-DLIBCXX_LIBDIR_SUFFIX="" \
|
|
-DLIBCXX_INCLUDE_TESTS=FALSE \
|
|
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
|
|
..
|
|
$BUILDCMD ${CORES+-j$CORES} generate-cxx-headers
|
|
cd ..
|
|
done
|
|
cd ..
|
|
|
|
cd libcxxabi
|
|
for arch in $ARCHS; do
|
|
[ -z "$CLEAN" ] || rm -rf build-$arch-$type
|
|
mkdir -p build-$arch-$type
|
|
cd build-$arch-$type
|
|
cmake \
|
|
${CMAKE_GENERATOR+-G} "$CMAKE_GENERATOR" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX="$PREFIX/$arch-w64-mingw32" \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CXX_COMPILER_TARGET=$arch-w64-windows-gnu \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DLLVM_PATH="$LLVM_PATH" \
|
|
-DCMAKE_AR="$PREFIX/bin/llvm-ar" \
|
|
-DCMAKE_RANLIB="$PREFIX/bin/llvm-ranlib" \
|
|
-DLIBCXXABI_USE_COMPILER_RT=ON \
|
|
-DLIBCXXABI_ENABLE_SHARED=OFF \
|
|
-DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/build-$arch-$type/include/c++/v1 \
|
|
-DLIBCXXABI_LIBDIR_SUFFIX="" \
|
|
-DLIBCXX_ENABLE_SHARED=$SHARED \
|
|
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
|
|
..
|
|
$BUILDCMD ${CORES+-j$CORES}
|
|
cd ..
|
|
done
|
|
cd ..
|
|
|
|
cd libcxx
|
|
for arch in $ARCHS; do
|
|
cd build-$arch-$type
|
|
$BUILDCMD ${CORES+-j$CORES}
|
|
$BUILDCMD install
|
|
cd ..
|
|
done
|
|
cd ..
|
|
}
|
|
|
|
# Build shared first and static afterwards; the headers for static linking also
|
|
# work when linking against the DLL, but not vice versa.
|
|
[ -z "$BUILD_SHARED" ] || build_all shared
|
|
[ -z "$BUILD_STATIC" ] || build_all static
|
|
|
|
# Remove dummy placeholder libunwind.a. If we've built a static version, it
|
|
# already was overwritten with a proper one, but if only building a shared
|
|
# version, remove the dummy one to avoid surprises.
|
|
for arch in $ARCHS; do
|
|
# Only remove the file if it contains no members.
|
|
if [ -f $PREFIX/$arch-w64-mingw32/lib/libunwind.a ] && [ "$(llvm-ar t $PREFIX/$arch-w64-mingw32/lib/libunwind.a)" = "" ]; then
|
|
rm $PREFIX/$arch-w64-mingw32/lib/libunwind.a
|
|
fi
|
|
done
|