diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -310,8 +310,12 @@ option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE" ${LIBCXX_CONFIGURE_IDE_DEFAULT}) +set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT OFF) +if (WIN32) + set(LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT ON) +endif() option(LIBCXX_HERMETIC_STATIC_LIBRARY - "Do not export any symbols from the static library." OFF) + "Do not export any symbols from the static library." ${LIBCXX_HERMETIC_STATIC_LIBRARY_DEFAULT}) #=============================================================================== # Check option configurations diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -300,7 +300,9 @@ append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden) endif() target_compile_options(cxx_static PRIVATE ${CXX_STATIC_LIBRARY_FLAGS}) - target_compile_definitions(cxx_static PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) + # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in __config_site + # too. Define it in the same way here, to avoid redefinition conflicts. + target_compile_definitions(cxx_static PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) endif() list(APPEND LIBCXX_BUILD_TARGETS "cxx_static") diff --git a/libcxx/test/libcxx/vendor/clang-cl/static-lib-exports.sh.cpp b/libcxx/test/libcxx/vendor/clang-cl/static-lib-exports.sh.cpp --- a/libcxx/test/libcxx/vendor/clang-cl/static-lib-exports.sh.cpp +++ b/libcxx/test/libcxx/vendor/clang-cl/static-lib-exports.sh.cpp @@ -12,8 +12,3 @@ // directives in clang-cl builds. // RUN: llvm-readobj --coff-directives "%{lib}/libc++.lib" | not grep -i "export:" > /dev/null - -// It's a known issue, that when building a shared library at the same time -// as the static library, the generated static library does contain dllexport -// directives. -// XFAIL: windows-dll diff --git a/libcxx/test/libcxx/vendor/mingw/static-lib-exports.sh.cpp b/libcxx/test/libcxx/vendor/mingw/static-lib-exports.sh.cpp --- a/libcxx/test/libcxx/vendor/mingw/static-lib-exports.sh.cpp +++ b/libcxx/test/libcxx/vendor/mingw/static-lib-exports.sh.cpp @@ -12,8 +12,3 @@ // directives in MinGW builds. // RUN: llvm-readobj --coff-directives "%{lib}/libc++.a" | not grep -i "export:" > /dev/null - -// It's a known issue, that when building a shared library at the same time -// as the static library, the generated static library does contain dllexport -// directives. -// XFAIL: windows-dll diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -136,8 +136,12 @@ set(LIBCXXABI_LIBCXX_INCLUDES "" CACHE PATH "Specify path to libc++ includes.") +set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT OFF) +if (WIN32) + set(LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT ON) +endif() option(LIBCXXABI_HERMETIC_STATIC_LIBRARY - "Do not export any symbols from the static library." OFF) + "Do not export any symbols from the static library." ${LIBCXXABI_HERMETIC_STATIC_LIBRARY_DEFAULT}) set(LIBCXXABI_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/lit.site.cfg.in" CACHE STRING "The path to the Lit testing configuration to use when running the tests. @@ -247,25 +251,6 @@ # it is being built as part of libcxx. add_definitions(-D_LIBCPP_BUILDING_LIBRARY) -# Disable DLL annotations on Windows for static builds. -if (WIN32 AND LIBCXXABI_ENABLE_STATIC AND NOT LIBCXXABI_ENABLE_SHARED) - # If LIBCXX_ENABLE_SHARED isn't set (by the user on the cmake command - # line or via a cache file), use its expected default value (enabled). - if ((LIBCXX_ENABLE_SHARED OR NOT DEFINED LIBCXX_ENABLE_SHARED) AND LIBCXX_ENABLE_STATIC_ABI_LIBRARY) - # Building libcxxabi statically, but intending for it to be statically - # linked into a shared libcxx; keep dllexport enabled within libcxxabi, - # as the symbols will need to be exported from libcxx. - else() - # Regular static build; disable dllexports. - add_definitions(-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) - if (NOT LIBCXXABI_HERMETIC_STATIC_LIBRARY) - # TODO: Enable this warning message as soon as we're sure this is the solution. - # message(WARNING "Implicitly disabling dllexport on Win32 is not supported anymore. Please build with " - # "LIBCXXABI_HERMETIC_STATIC_LIBRARY=ON instead. This will become an error in LLVM 16.") - endif() - endif() -endif() - add_compile_flags_if_supported(-Werror=return-type) # Get warning flags diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt --- a/libcxxabi/src/CMakeLists.txt +++ b/libcxxabi/src/CMakeLists.txt @@ -248,10 +248,13 @@ if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) target_add_compile_flags_if_supported(cxxabi_static_objects PRIVATE -fvisibility-global-new-delete-hidden) endif() + # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in libcxx's + # __config_site too. Define it in the same way here, to avoid redefinition + # conflicts. target_compile_definitions(cxxabi_static_objects PRIVATE _LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS - _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) + _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) endif() if (LIBCXXABI_ENABLE_STATIC) diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -93,8 +93,13 @@ message(FATAL_ERROR "libunwind CET support is not available for MSVC!") endif() +if (WIN32) + set(LIBUNWIND_DEFAULT_HIDE_SYMBOLS TRUE) +else() + set(LIBUNWIND_DEFAULT_HIDE_SYMBOLS FALSE) +endif() option(LIBUNWIND_HIDE_SYMBOLS - "Do not export any symbols from the static library." OFF) + "Do not export any symbols from the static library." ${LIBUNWIND_DEFAULT_HIDE_SYMBOLS}) #=============================================================================== # Configure System @@ -304,11 +309,6 @@ add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() -# Disable DLL annotations on Windows for static builds. -if (WIN32 AND LIBUNWIND_ENABLE_STATIC AND NOT LIBUNWIND_ENABLE_SHARED) - add_definitions(-D_LIBUNWIND_HIDE_SYMBOLS) -endif() - if (C_SUPPORTS_COMMENT_LIB_PRAGMA) if (LIBUNWIND_HAS_DL_LIB) add_definitions(-D_LIBUNWIND_LINK_DL_LIB)