Skip to content

Commit ad0371f

Browse files
Fix importing TileDB in CMake versions prior to 3.18. (#4671)
#4528 introduced a single `TileDB::tiledb`exported CMake target for TileDB with either static or dynamic linkage. For compatibility with previous versions, the targets `TileDB::tiledb_shared` or `TileDB::tiledb_static` were also defined depending on the linkage, as `ALIAS`es to `TileDB::tiledb`. As it turns out however, we cannot use `ALIAS` targets, because they are always declared in the global scope prior to CMake 3.18 and if `find_package(TileDB)` is not called in the top-level `CMakeLists.txt` file, it will fail with `add_library cannot create ALIAS target "TileDB::tiledb_shared" because target "TileDB::tiledb" is imported but not globally visible.`. Nor can we switch to using `IMPORTED INTERFACE` targets and linking them to `TileDB::tiledb`, because it would bring a minor breaking change[^1]. Because `TileDB::tiledb_shared` would become an `INTERFACE` library, it does not have an `IMPORTED_LOCATION` anymore, which would cause [calls to `install_target_libs(TileDB::tiledb_shared)`](https://github.com/TileDB-Inc/TileDB-VCF/blob/5bcc79b07935ac540c56bf6ed9ee0f5d60bf247e/libtiledbvcf/cmake/Modules/FindTileDB_EP.cmake#L121) to fail. Thankfully there is another solution. We set the [`EXPORT_NAME`](https://cmake.org/cmake/help/latest/prop_tgt/EXPORT_NAME.html) of the `tiledb` target to either `tiledb_shared` or `tiledb_static` depending on the linkage, and define `TileDB::tiledb` as an `IMPORTED INTERFACE` target[^2] to the linkage-specific target. This maintains full compatibility. [^1]: Something similar is the "breaking build system change" I talked about in #4408 (comment). After removing the `install_target_libs` calls from this repository, the change in Curl did not afffect us and we could update much more easily. [^2]: In this opposite case the unified target _must_ be an `IMPORTED INTERFACE`. We cannot get the `IMPORTED_LOCATION` of `TileDB::tiledb`, but since the target is new this is not a breaking change. --- TYPE: BUILD DESC: Fix importing TileDB in CMake versions prior to 3.18.
1 parent 49e8752 commit ad0371f

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

cmake/inputs/Config.cmake.in

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ endif()
4444
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
4545
check_required_components("@PROJECT_NAME@")
4646

47-
if(@BUILD_SHARED_LIBS@ AND NOT TARGET TileDB::tiledb_shared) # BUILD_SHARED_LIBS AND NOT TARGET TileDB::tiledb_shared
48-
add_library(TileDB::tiledb_shared ALIAS TileDB::tiledb)
49-
elseif(NOT TARGET TileDB::tiledb_static)
50-
add_library(TileDB::tiledb_static ALIAS TileDB::tiledb)
47+
if(NOT TARGET TileDB::tiledb)
48+
if(TARGET TileDB::tiledb_shared)
49+
add_library(TileDB::tiledb INTERFACE IMPORTED)
50+
set_target_properties(TileDB::tiledb PROPERTIES INTERFACE_LINK_LIBRARIES TileDB::tiledb_shared)
51+
elseif(TARGET TileDB::tiledb_static)
52+
add_library(TileDB::tiledb INTERFACE IMPORTED)
53+
set_target_properties(TileDB::tiledb PROPERTIES INTERFACE_LINK_LIBRARIES TileDB::tiledb_static)
54+
endif()
5155
endif()
5256

5357
# Define a convenience all-caps variable

tiledb/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,15 @@ endif()
835835
# the value of the BUILD_SHARED_LIBS variable.
836836
add_library(tiledb $<TARGET_OBJECTS:TILEDB_CORE_OBJECTS>)
837837

838+
# Export the target as either tiledb_shared or tiledb_static for compatibility.
839+
# The exported config will create the unified tiledb target that links to either
840+
# of them.
841+
if(BUILD_SHARED_LIBS)
842+
set_target_properties(tiledb PROPERTIES EXPORT_NAME tiledb_shared)
843+
else()
844+
set_target_properties(tiledb PROPERTIES EXPORT_NAME tiledb_static)
845+
endif()
846+
838847
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/sm/c_api/tiledb_version.h" ver)
839848

840849
string(REGEX MATCH "TILEDB_VERSION_MAJOR ([0-9]*)" _ ${ver})

0 commit comments

Comments
 (0)