Skip to content

[libcxx] it should pass -Xlinker when user uses clang instead of clang-cl for build libcxx #96430

@trcrsired

Description

@trcrsired
[cqwrteur@DESKTOP-9B705LH llvm_build]$ /home/cqwrteur/toolchains/llvm/x86_64-unknown-linux-gnu/llvm/bin/clang++ --target=x86_64-windows-msvc -nostartfiles -nostdlib -fuse-ld=lld --sysroot=/home/cqwrteur/toolchains/windows-msvc-sysroot -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -g -Xclang -gcodeview  /MANIFEST:NO  -fuse-ld=lld-link -shared -o lib/c++.dll  -Xlinker /MANIFEST:EMBED -Xlinker /implib:lib/c++.lib -Xlinker /pdb:lib/c++.pdb -Xlinker /version:1.0 libcxx/src/CMakeFiles/cxx_shared.dir/algorithm.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/any.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/bind.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/call_once.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/charconv.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/chrono.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/error_category.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/exception.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/expected.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/filesystem_clock.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/filesystem_error.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/path.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/functional.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/hash.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/legacy_pointer_safety.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/memory.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/memory_resource.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/new_handler.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/new_helpers.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/optional.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/print.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/random_shuffle.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ryu/d2fixed.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ryu/d2s.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ryu/f2s.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/stdexcept.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/string.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/system_error.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/typeinfo.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/valarray.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/variant.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/vector.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/verbose_abort.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/atomic.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/barrier.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/condition_variable_destructor.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/condition_variable.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/future.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/mutex_destructor.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/mutex.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/shared_mutex.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/thread.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/random.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/fstream.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ios.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ios.instantiations.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/iostream.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/locale.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/ostream.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/regex.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/strstream.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/support/win32/locale_win32.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/support/win32/support.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/support/win32/thread_win32.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/directory_entry.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/directory_iterator.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/operations.cpp.obj libcxx/src/CMakeFiles/cxx_shared.dir/filesystem/int128_builtins.cpp.obj  -nostdlib++  --unwindlib=none  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -loldnames
clang++: error: no such file or directory: '/MANIFEST:NO'

Proposed change:

diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt
index 9e6c70335a79..c19041dd9da6 100644
--- a/libcxx/src/CMakeLists.txt
+++ b/libcxx/src/CMakeLists.txt
@@ -275,8 +275,14 @@ if (LIBCXX_ENABLE_SHARED)
     # Since we most likely do not have a mt.exe replacement, disable the
     # manifest bundling.  This allows a normal cmake invocation to pass which
     # will attempt to use the manifest tool to generate the bundled manifest
-    set_target_properties(cxx_shared PROPERTIES
+    if (${CMAKE_CXX_COMPILER_FRONTEND_VARIANT} STREQUAL "MSVC")
+        set_target_properties(cxx_shared PROPERTIES
                           APPEND_STRING PROPERTY LINK_FLAGS " /MANIFEST:NO")
+    else()
+        set_target_properties(cxx_shared PROPERTIES
+                         APPEND_STRING PROPERTY LINK_FLAGS " -Xlinker /MANIFEST:NO")
+    endif()
+
   endif()
 endif()

Metadata

Metadata

Assignees

No one assigned

    Labels

    cmakeBuild system in general and CMake in particularlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions