[libcxx-commits] [PATCH] D112112: [libunwind] Link with -unwindlib=none
Petr Hosek via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Oct 20 10:23:18 PDT 2021
phosek added a comment.
In D112112#3074743 <https://reviews.llvm.org/D112112#3074743>, @mstorsjo wrote:
> In D112112#3074741 <https://reviews.llvm.org/D112112#3074741>, @mstorsjo wrote:
>
>> If inspecting `CMakeFiles/CMakeError.log` to see what happened when testing the `-unwindlib=none` flag, I find this:
>>
>> Performing C SOURCE FILE Test LIBUNWIND_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG failed with the following output:
>> Change Dir: /build/llvm-project/libunwind/build-i686-shared/CMakeFiles/CMakeTmp
>>
>> Run Build Command(s):/usr/bin/ninja cmTC_94016 && [1/2] Building C object CMakeFiles/cmTC_94016.dir/src.c.obj
>> [2/2] Linking C executable cmTC_94016.exe
>> FAILED: cmTC_94016.exe
>> : && /opt/llvm-mingw/bin/i686-w64-mingw32-clang CMakeFiles/cmTC_94016.dir/src.c.obj -o cmTC_94016.exe -Wl,--out-implib,libcmTC_94016.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && :
>> lld: error: unable to find library -lunwind
>> lld: error: unable to find library -lunwind
>> clang-13: error: linker command failed with exit code 1 (use -v to see invocation)
>> ninja: build stopped: subcommand failed.
>>
>> During this particular test, CMake does apply the tested flag, `-unwindlib=none`, when compiling the test object (`CMakeFiles/cmTC_94016.dir/src.c.obj`) although that's not visible in the log. But it's not applying that flag when it does linking of the test executable. See e.g. https://gitlab.kitware.com/cmake/cmake/-/issues/15934 for discussion on that issue.
>>
>> I'm curious to know how it succeeds in your case, if it's linking in `-lunwind` explicitly when linking the final libunwind library, but not while trying the `check_c_compiler_flag()`. Is it a case where `-lunwind` is added implicitly only when linking as C++ but not C? (As far as I've read the clang driver, if it adds it implicitly for either of them, it should add it for both.)
>
> FWIW, it seems like there's more useful info in `CMakeFiles/CMakeError.log` about what compile command it did use, when testing `check_c_compiler_flag(-unwindlib=none)`, if using the makefile generator instead of the ninja one - as ninja hides the commands that are run except for the commands that actually resulted in an error.
@mstorsjo CMake introduced `CMAKE_REQUIRED_LINK_OPTIONS` to address specifically this issue (see https://cmake.org/cmake/help/latest/module/CheckCSourceCompiles.html), but unfortunately it was only introduced in 3.14 and LLVM is still on 3.13.
In my testing, in CMake versions <3.14 `CMAKE_REQUIRED_FLAGS` apply to link command as well but in >=3.14 you need to use `CMAKE_REQUIRED_LINK_OPTIONS` so I think we'll need to have conditional logic based on the CMake version.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112112/new/
https://reviews.llvm.org/D112112
More information about the libcxx-commits
mailing list