bazel-contrib / rules_foreign_cc

Build rules for interfacing with "foreign" (non-Bazel) build systems (CMake, configure-make, GNU Make, boost, ninja, Meson)
https://bazel-contrib.github.io/rules_foreign_cc
Apache License 2.0
680 stars 249 forks source link

cmake: handle builds that use static toolchain libs #1256

Closed novas0x2a closed 3 months ago

novas0x2a commented 3 months ago

The problem being solved here is: if a toolchain wants to link the toolchain libs statically, there are some flags that need to be passed. Unfortunately, static linking is notoriously order-sensitive (if an object needs a symbol, it can only be resolved by libraries later than it on the command line). This means there are scenarios where this works: gcc thing.o -o stuff -l:libstdc++.a this fails with missing symbols (like std::cout): gcc -l:libstdc++.a -o stuff thing.o

In other words, we need these flags to be in <LINK_LIBRARIES> and not just <LINK_FLAGS>, so they fall after the <OBJECTS> that might need them and that is what this code does, by injecting these indicative flags into CMAKE_CXX_STANDARD_LIBRARIES_INIT

This is a kind of hacky way to handle this; I suspect once https://github.com/bazelbuild/bazel/pull/23204 lands, it will be possible to do this better.