[CMake] Writing foo-config.cmake with find_dependency

Mateusz Loskot mateusz at loskot.net
Mon Oct 1 15:45:24 EDT 2018


Hi,

After 10+ years of maintaining a horrible kind o CMake configuration
for a project I maintain, SOCI [1], I'm in the middle of rewriting it [2]
according to the modern CMake principles. At least, I'm trying to.

The library has number of dependencies on third-party libraries,
namely database access client libraries. I've reached the point
where I need to 'list' those dependencies in soci-config.cmake [3]
Namely, I need to make friend with find_dependency.

In SOCI, I maintain number of Find-modules, eg. FindSQLite3.cmake,
FindOracle.cmake, etc. Those are also an ancient CMake scripts,
but I think my problem/question is orthogonal to rewriting those to
target-aware modules or keep those old-style w/ FOO_LIBRARIES, etc.

Now, if I have a custom `FindSQLite3.cmake` module and I do
target_link_libraries(soci_sqlite3 PUBLIC ${SQLITE3_LIBRARIES})
in CMakeLists.txt of the SOCI library, then in soci-config.cmake I do
find_dependency(SQLite3)
Is that correct?

Now, am I supposed to deploy the FindSQLite3.cmake along
soci-config.cmake to match the ${SQLITE3_LIBRARIES}?
What if a user of SOCI (or even CMake distribution) comes with
custom FindSQLite3.cmake which actually defines targets
instead of old-style variables
or defines SQLITE_LIBRARIES (without 3 in  SQLITE)?

How to handle such situations?
What should I read to wrap my head around the find_dependency
for my use case?

[1] https://github.com/SOCI/soci/
[2] https://github.com/mloskot/soci/tree/ml/modern-cmake
[3] https://github.com/mloskot/soci/blob/ml/modern-cmake/cmake/soci-config.cmake

Best regards,
-- 
Mateusz Loskot, http://mateusz.loskot.net


More information about the CMake mailing list