diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index be09210b28..8a345c50dd 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -316,12 +316,25 @@ if (WITH_ROCKSDB) set(SWIG_DEFINES ${SWIG_DEFINES} -DIFOPSH_WITH_ROCKSDB) # See https://github.com/facebook/rocksdb/issues/981. if(TARGET RocksDB::rocksdb) - target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE RocksDB::rocksdb) + set(IFCOPENSHELL_ROCKSDB_IMPORTED_TARGET RocksDB::rocksdb) elseif(TARGET RocksDB::rocksdb-shared) - target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE RocksDB::rocksdb-shared) + set(IFCOPENSHELL_ROCKSDB_IMPORTED_TARGET RocksDB::rocksdb-shared) else() message(FATAL_ERROR "RocksDB found but neither RocksDB::rocksdb nor RocksDB::rocksdb-shared target exists") endif() + # Our win/build-deps.cmd builds RocksDB separately per Debug/Release config into the + # same install prefix, so the imported target only ever has DEBUG and RELEASE listed in + # IMPORTED_CONFIGURATIONS. On a multi-config generator (Visual Studio), CMake maps any + # unmatched build config to the *first* entry of that list, which happens to be DEBUG + # (RocksDBTargets-debug.cmake sorts before RocksDBTargets-release.cmake). Without an + # explicit mapping, RelWithDebInfo and MinSizeRel builds would end up linking the + # /MDd-flavored rocksdb_d.lib into an /MD (NDEBUG) binary, causing a CRT/runtime-library + # mismatch that depends on nothing but that alphabetical ordering. + set_target_properties(${IFCOPENSHELL_ROCKSDB_IMPORTED_TARGET} PROPERTIES + MAP_IMPORTED_CONFIG_RELWITHDEBINFO RELEASE + MAP_IMPORTED_CONFIG_MINSIZEREL RELEASE + ) + target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE ${IFCOPENSHELL_ROCKSDB_IMPORTED_TARGET}) if (WITH_ZSTD) # @todo do we actually need the zstd include dir or rather just pass