[PATCH] D145716: [CMake] Unify llvm_check_linker_flag and llvm_check_compiler_linker_flag
Petr Hosek via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 25 20:21:21 PDT 2023
phosek added a comment.
In D145716#4188311 <https://reviews.llvm.org/D145716#4188311>, @mstorsjo wrote:
> I took a look at what's going wrong here; I diffed the cmake output from a cmake run before and after this change:
>
> @@ -17,12 +17,12 @@
> -- Performing Test LLVM_RUNTIMES_LINKING_WORKS
> -- Performing Test LLVM_RUNTIMES_LINKING_WORKS - Success
> -- Performing Test CXX_SUPPORTS_NOSTDLIBXX_FLAG
> --- Performing Test CXX_SUPPORTS_NOSTDLIBXX_FLAG - Failed
> +-- Performing Test CXX_SUPPORTS_NOSTDLIBXX_FLAG - Success
> -- Performing Test CXX_SUPPORTS_NOSTDINCXX_FLAG
> -- Performing Test CXX_SUPPORTS_NOSTDINCXX_FLAG - Failed
> -- Using Release VC++ CRT: MD
> -- Performing Test SUPPORTS_BREPRO
> --- Performing Test SUPPORTS_BREPRO - Success
> +-- Performing Test SUPPORTS_BREPRO - Failed
> -- Looking for os_signpost_interval_begin
> -- Looking for os_signpost_interval_begin - not found
> -- Found Python3: /usr/bin/python3.10 (found version "3.10.6") found components: Interpreter
> @@ -33,8 +33,6 @@
> -- Using libc++ testing configuration: /home/martin/code/llvm-project/libcxx/test/configs/llvm-libc++-shared-clangcl.cfg.in
> -- Performing Test CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG
> -- Performing Test CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG - Failed
> --- Performing Test C_SUPPORTS_NODEFAULTLIBS_FLAG
> --- Performing Test C_SUPPORTS_NODEFAULTLIBS_FLAG - Failed
> -- Performing Test C_SUPPORTS_COMMENT_LIB_PRAGMA
> -- Performing Test C_SUPPORTS_COMMENT_LIB_PRAGMA - Failed
> -- Performing Test CXX_SUPPORTS_FALIGNED_ALLOCATION_FLAG
> @@ -44,71 +42,65 @@
> -- Performing Test CXX_SUPPORTS_FVISIBILITY_EQ_HIDDEN_FLAG
> -- Performing Test CXX_SUPPORTS_FVISIBILITY_EQ_HIDDEN_FLAG - Failed
> -- Performing Test CXX_SUPPORTS_W4_FLAG
> --- Performing Test CXX_SUPPORTS_W4_FLAG - Success
> +-- Performing Test CXX_SUPPORTS_W4_FLAG - Failed
> -- Performing Test CXX_SUPPORTS_WEXTRA_FLAG
>
> I.e. this change makes `CXX_SUPPORTS_NOSTDLIBXX_FLAG` suddenly succeed where it was failing before. This causes all further checks to fail.
>
> The reason for this is ... complex. When running a compile+link test with a non-MSVC compiler, you first compile the source file with `$CC` (where `CMAKE_C_FLAGS` and `CMAKE_REQUIRED_FLAGS` are included), then you link it with `$CC`, where `CMAKE_REQUIRED_FLAGS` and `CMAKE_EXE_LINKER_FLAGS` are included.
>
> When doing a compile+link test with a MSVC style compiler, you compile it with `$CC` with the same flags as above. But then cmake does the linking by invoking link.exe/lld-link directly, where it only includes `CMAKE_EXE_LINKER_FLAGS`.
>
> In the case of `-nostdlibc++`, clang-cl warns about the warning being unknown, but at least lld-link seems to accept the flag silently. Before, when we were adding the flag to `CMAKE_REQUIRED_FLAGS`, the test compile+link itself succeeded, but it was still deemed a failure due to it producing `clang-16: warning: unknown argument ignored in clang-cl: '-nostdlib++' [-Wunknown-argument]`. Now after this refactoring, the flag is only added to `CMAKE_EXE_LINKER_FLAGS`, where it doesn't produce any warning. But if this test succeeded, in `runtimes/CMakeLists.txt` we go on to add the flag to `CMAKE_REQUIRED_FLAGS`, where it later breaks every future test.
>
> I don't have the whole picture in my mind right now, but I get the feeling that if we're planning to add `-nostdlib++` to `CMAKE_REQUIRED_FLAGS`, we also should be using a test that actually tests setting the flag in `CMAKE_REQUIRED_FLAGS`.
Thank you for looking into this, that analysis was really helpful. I think the correct solution is to use `CMAKE_REQUIRED_LINK_OPTIONS` instead of `CMAKE_REQUIRED_FLAGS`, but that can only be done after we bump the minimum CMake version past 3.14 (in fact we should review every use `llvm_check_compiler_linker_flag` and switch to use `CMAKE_REQUIRED_LINK_OPTIONS` in other places). I think we should also teach `clang-cl` to silently accept `-nostdlib++` the same way `clang` does.
For now as a temporary workaround I just excluded `MSVC` for the `-nostdlib++` flag and added a `TODO` comment.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D145716/new/
https://reviews.llvm.org/D145716
More information about the llvm-commits
mailing list