build-libcxx: Build both static and shared libc++ in one single cmake build

Since bedf657d0f4c54ffe9ef4303382657a74296b544 in llvm-project
(May 18th), a static libc++ built at the same time as a shared one
no longer contain dllexport directives, making that library actually
usable.

Since dfa88927ae1411ccc3b248b7e624f2acf623d947 (Jun 6th), the
libc++ headers no longer have dllimport attributes, making the headers
installed from a build containing a shared library usable both
for the shared and static library, without the user having to set
any specific defines.

These two changes allow removing the manual build workarounds of
building the libraries in separate CMake invocations in a specific
order.
This commit is contained in:
Martin Storsjö committed 2022-07-31 01:08:30 +03:00
1 parent 5cc13adcc3
commit 6b9e0b1dbd
1 file changed
+46 -64
+46 -64
View File
@@ -16,18 +16,18 @@
set -e
BUILD_STATIC=1
BUILD_SHARED=1
BUILD_STATIC=ON
BUILD_SHARED=ON
while [ $# -gt 0 ]; do
if [ "$1" = "--disable-shared" ]; then
BUILD_SHARED=
BUILD_SHARED=OFF
elif [ "$1" = "--enable-shared" ]; then
BUILD_SHARED=1
BUILD_SHARED=ON
elif [ "$1" = "--disable-static" ]; then
BUILD_STATIC=
BUILD_STATIC=OFF
elif [ "$1" = "--enable-static" ]; then
BUILD_STATIC=1
BUILD_STATIC=ON
else
PREFIX="$1"
fi
@@ -74,62 +74,44 @@ else
BUILDCMD=make
fi
build_all() {
type="$1"
CMAKEFLAGS=""
if [ "$type" = "shared" ]; then
SHARED=TRUE
STATIC=FALSE
CMAKEFLAGS="$CMAKEFLAGS -DLIBCXXABI_USE_LLVM_UNWINDER=ON"
else
SHARED=FALSE
STATIC=TRUE
fi
for arch in $ARCHS; do
[ -z "$CLEAN" ] || rm -rf build-$arch
mkdir -p build-$arch
cd build-$arch
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" \
-DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBUNWIND_ENABLE_SHARED=$BUILD_SHARED \
-DLIBUNWIND_ENABLE_STATIC=$BUILD_STATIC \
-DLIBCXX_USE_COMPILER_RT=ON \
-DLIBCXX_ENABLE_SHARED=$BUILD_SHARED \
-DLIBCXX_ENABLE_STATIC=$BUILD_STATIC \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXXABI_USE_COMPILER_RT=ON \
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
..
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" \
-DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBUNWIND_ENABLE_SHARED=$SHARED \
-DLIBUNWIND_ENABLE_STATIC=$STATIC \
-DLIBCXX_USE_COMPILER_RT=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_LIBDIR_SUFFIX="" \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXXABI_USE_COMPILER_RT=ON \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
$CMAKEFLAGS \
..
$BUILDCMD ${CORES+-j$CORES}
$BUILDCMD install
cd ..
done
}
# 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
$BUILDCMD ${CORES+-j$CORES}
$BUILDCMD install
cd ..
done