My project already has abseil-cpp, which works just fine in my external directory and the following in CMakeLists.txt
add_subdirectory(abseil-cpp EXCLUDE_FROM_ALL)
If I then also add grpc, I get build errors like this:
CMake Error at external/grpc/third_party/abseil-cpp/CMake/AbseilHelpers.cmake:148 (add_library):
add_library cannot create target "absl_atomic_hook" because another target
with the same name already exists. The existing target is an interface
library created in source directory
"/path/to/project/external/abseil-cpp/absl/base". See
documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
external/grpc/third_party/abseil-cpp/absl/base/CMakeLists.txt:19 (absl_cc_library)
Clearly duplicate targets.
Looking at the abseil cmake files in grpc/cmake, I tried setting ABSL_ROOT_DIR so that grpc can use my abseil-cpp submodule instead of its own.
set(ABSL_ROOT_DIR "${PROJECT_SOURCE_DIR}/external/abseil-cpp")
But that yields the following similar error:
CMake Error at external/abseil-cpp/CMake/AbseilHelpers.cmake:148 (add_library):
add_library cannot create target "absl_atomic_hook" because another target
with the same name already exists. The existing target is an interface
library created in source directory
"/path/to/project/external/abseil-cpp/absl/base". See
documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
external/abseil-cpp/absl/base/CMakeLists.txt:19 (absl_cc_library)
Because grpc always adds abseil-cpp in grpc/cmake/abseil-cpp.cmake, there's no clean way to avoid this double-add.
So far the only way I have found is to set gRPC_ABSL_PROVIDER to something other than "module" or "package", since that will cause it just not include absl at all, but with the top project including it separately it's still found.
Would be nice if abseil-cpp.cmake could detect if abseil was already available before trying to add it locally.