From 957c34372c1ce8765b1184d3ff7160f7642a2de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sat, 25 Nov 2017 23:59:11 +0200 Subject: [PATCH] Build libunwind and libcxx both as static and dynamic libraries --- build-libcxx.sh | 279 +++++++++++++++++++++++++++++------------------- 1 file changed, 167 insertions(+), 112 deletions(-) diff --git a/build-libcxx.sh b/build-libcxx.sh index ceaeb35..1003445 100755 --- a/build-libcxx.sh +++ b/build-libcxx.sh @@ -2,11 +2,23 @@ set -e -if [ $# -lt 1 ]; then - echo $0 dest +BUILD_STATIC=1 +BUILD_SHARED=1 + +while [ $# -gt 0 ]; do + if [ "$1" = "--disable-shared" ]; then + BUILD_SHARED= + elif [ "$1" = "--disable-static" ]; then + BUILD_STATIC= + else + PREFIX="$1" + fi + shift +done +if [ -z "$PREFIX" ]; then + echo $0 [--disable-shared] [--disable-static] dest exit 1 fi -PREFIX="$1" export PATH=$PREFIX/bin:$PATH : ${CORES:=4} @@ -46,116 +58,159 @@ fi LIBCXX=$(pwd)/libcxx MERGE_ARCHIVES=$(pwd)/merge-archives.sh -cd libunwind -for arch in $ARCHS; do - mkdir -p build-$arch - cd build-$arch - # If llvm-config and the llvm cmake files are available, -w gets added - # to the compiler flags; manually add it here to avoid noisy warnings - # that normally are suppressed. - cmake \ - -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_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_NO_OLD_LIBSTDCXX=TRUE \ - -DCXX_SUPPORTS_CXX11=TRUE \ - -DLIBUNWIND_USE_COMPILER_RT=TRUE \ - -DLIBUNWIND_ENABLE_THREADS=TRUE \ - -DLIBUNWIND_ENABLE_SHARED=FALSE \ - -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \ - -DLIBUNWIND_STANDALONE_BUILD=TRUE \ - -DCMAKE_CXX_FLAGS="-nostdinc++ -I$LIBCXX/include -w" \ - -DCMAKE_C_FLAGS="-w" \ - .. - make -j$CORES - make install - # Merge libpsapi.a into the static library libunwind.a, to - # avoid having to specify -lpsapi when linking to it. - $MERGE_ARCHIVES \ - $PREFIX/$arch-w64-mingw32/lib/libunwind.a \ - $PREFIX/$arch-w64-mingw32/lib/libpsapi.a - cd .. -done -cd .. +build_all() { + type="$1" + if [ "$type" = "shared" ]; then + SHARED=TRUE + STATIC=FALSE + else + SHARED=FALSE + STATIC=TRUE + fi -cd libcxxabi -for arch in $ARCHS; do - mkdir -p build-$arch - cd build-$arch - # If llvm-config and the llvm cmake files are available, -w gets added - # to the compiler flags; manually add it here to avoid noisy warnings - # that normally are suppressed. - cmake \ - -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_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 \ - -DLIBCXXABI_USE_COMPILER_RT=ON \ - -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \ - -DLIBCXXABI_ENABLE_THREADS=ON \ - -DLIBCXXABI_TARGET_TRIPLE=$arch-w64-mingw32 \ - -DLIBCXXABI_ENABLE_SHARED=OFF \ - -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include \ - -DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=OFF \ - -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ - -DCXX_SUPPORTS_CXX11=TRUE \ - -DCMAKE_CXX_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -D_LIBCPP_HAS_THREAD_API_WIN32 -w" \ - .. - make -j$CORES + cd libunwind + for arch in $ARCHS; do + mkdir -p build-$arch-$type + cd build-$arch-$type + # If llvm-config and the llvm cmake files are available, -w gets added + # to the compiler flags; manually add it here to avoid noisy warnings + # that normally are suppressed. + cmake \ + -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_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_NO_OLD_LIBSTDCXX=TRUE \ + -DCXX_SUPPORTS_CXX11=TRUE \ + -DLIBUNWIND_USE_COMPILER_RT=TRUE \ + -DLIBUNWIND_ENABLE_THREADS=TRUE \ + -DLIBUNWIND_ENABLE_SHARED=$SHARED \ + -DLIBUNWIND_ENABLE_STATIC=$STATIC \ + -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \ + -DLIBUNWIND_STANDALONE_BUILD=TRUE \ + -DCMAKE_CXX_FLAGS="-nostdinc++ -I$LIBCXX/include -w" \ + -DCMAKE_C_FLAGS="-w" \ + -DCMAKE_SHARED_LINKER_FLAGS="-lpsapi" \ + .. + make -j$CORES + make install + if [ "$type" = "shared" ]; then + cp lib/libunwind.dll $PREFIX/$arch-w64-mingw32/bin + else + # Merge libpsapi.a into the static library libunwind.a, to + # avoid having to specify -lpsapi when linking to it. + $MERGE_ARCHIVES \ + $PREFIX/$arch-w64-mingw32/lib/libunwind.a \ + $PREFIX/$arch-w64-mingw32/lib/libpsapi.a + fi + cd .. + done cd .. -done -cd .. -cd libcxx -for arch in $ARCHS; do - mkdir -p build-$arch - cd build-$arch - cmake \ - -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_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 \ - -DLIBCXX_USE_COMPILER_RT=ON \ - -DLIBCXX_INSTALL_HEADERS=ON \ - -DLIBCXX_ENABLE_EXCEPTIONS=ON \ - -DLIBCXX_ENABLE_THREADS=ON \ - -DLIBCXX_HAS_WIN32_THREAD_API=ON \ - -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \ - -DLIBCXX_ENABLE_SHARED=OFF \ - -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ - -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ - -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ - -DLIBCXX_ENABLE_FILESYSTEM=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/lib \ - -DCMAKE_CXX_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \ - .. - make -j$CORES - make install - $MERGE_ARCHIVES \ - $PREFIX/$arch-w64-mingw32/lib/libc++.a \ - $PREFIX/$arch-w64-mingw32/lib/libunwind.a + cd libcxxabi + for arch in $ARCHS; do + mkdir -p build-$arch-$type + cd build-$arch-$type + # If llvm-config and the llvm cmake files are available, -w gets added + # to the compiler flags; manually add it here to avoid noisy warnings + # that normally are suppressed. + if [ "$type" = "shared" ]; then + LIBCXXABI_VISIBILITY_FLAGS="-D_LIBCPP_BUILDING_LIBRARY -U_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" + else + LIBCXXABI_VISIBILITY_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" + fi + cmake \ + -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_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 \ + -DLIBCXXABI_USE_COMPILER_RT=ON \ + -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \ + -DLIBCXXABI_ENABLE_THREADS=ON \ + -DLIBCXXABI_TARGET_TRIPLE=$arch-w64-mingw32 \ + -DLIBCXXABI_ENABLE_SHARED=OFF \ + -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include \ + -DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=OFF \ + -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ + -DCXX_SUPPORTS_CXX11=TRUE \ + -DCMAKE_CXX_FLAGS="$LIBCXXABI_VISIBILITY_FLAGS -D_LIBCPP_HAS_THREAD_API_WIN32 -w" \ + .. + make -j$CORES + cd .. + done cd .. -done -cd .. + + cd libcxx + for arch in $ARCHS; do + mkdir -p build-$arch-$type + cd build-$arch-$type + if [ "$type" = "shared" ]; then + LIBCXX_VISIBILITY_FLAGS="-D_LIBCXXABI_BUILDING_LIBRARY" + else + LIBCXX_VISIBILITY_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" + fi + cmake \ + -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_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 \ + -DLIBCXX_USE_COMPILER_RT=ON \ + -DLIBCXX_INSTALL_HEADERS=ON \ + -DLIBCXX_ENABLE_EXCEPTIONS=ON \ + -DLIBCXX_ENABLE_THREADS=ON \ + -DLIBCXX_HAS_WIN32_THREAD_API=ON \ + -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \ + -DLIBCXX_ENABLE_SHARED=$SHARED \ + -DLIBCXX_ENABLE_STATIC=$STATIC \ + -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ + -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ + -DLIBCXX_ENABLE_FILESYSTEM=OFF \ + -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ + -DLIBCXX_ABI_UNSTABLE=TRUE \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include \ + -DLIBCXX_CXX_ABI_LIBRARY_PATH=../../libcxxabi/build-$arch-$type/lib \ + -DCMAKE_CXX_FLAGS="$LIBCXX_VISIBILITY_FLAGS" \ + -DCMAKE_SHARED_LINKER_FLAGS="-lunwind -Wl,--export-all-symbols" \ + -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \ + .. + make -j$CORES + make install + if [ "$type" = "shared" ]; then + $MERGE_ARCHIVES \ + $PREFIX/$arch-w64-mingw32/lib/libc++.dll.a \ + $PREFIX/$arch-w64-mingw32/lib/libunwind.dll.a + cp lib/libc++.dll $PREFIX/$arch-w64-mingw32/bin + else + $MERGE_ARCHIVES \ + $PREFIX/$arch-w64-mingw32/lib/libc++.a \ + $PREFIX/$arch-w64-mingw32/lib/libunwind.a + fi + 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