Using dds in a CMake Project

Using dds in a CMake Project

One of dds’s primary goals is to inter-operate with other build systems cleanly. Because of CMakes ubiquity, dds includes built-in support for emitting files that can be imported into CMake.

See also

Before reading this page, be sure to read the Generating a libman Index section of the Building and Using dds in Another Build System page, which will discuss how to use the dds build-deps subcommand.

See also

This page presents an involved and detailed process for importing dependencies, but there’s also an easy mode for a one-line solution. See: How Do I Use dds in a CMake Project?.

Generating a CMake Import File

build-deps accepts an --lmi-path argument, but also accepts a --cmake=<path> argument that serves a similar purpose: It will write a CMake file to <path> that can be include()’d into a CMake project:

$ dds build-deps "neo-sqlite3^0.2.0" --cmake=deps.cmake

This will write a file ./deps.cmake that we can include() from a CMake project, which will then expose the neo-sqlite3 package as a set of imported targets.

Using the CMake Import File

Once we have generated the CMake import file using dds build-deps, we can simply import it in our CMakeLists.txt:


Like with dds, CMake wants us to explicitly declare how our build targets use other libraries. When we include() the generated CMake file, it will generate IMPORTED targets that can be linked against.

In dds (and in libman), a library is identified by a combination of namespace and name, joined together with a slash / character. This qualified name of a library is decided by the original package author, and should be documented. In the case of neo-sqlite3, the only library is neo/sqlite3.

When the generated import file imports a library, it creates a qualified name using a double-colon “::” instead of a slash. As such, our neo/sqlite3 is imported in CMake as neo::sqlite3. We can link against it as we would with any other target:

add_executable(my-application app.cpp)
target_link_libraries(my-application PRIVATE neo::sqlite3)

Easy Mode: PMM Support

PMM is the package package manager, and can be used to control and access package managers from within CMake scripts. This includes controlling dds. With PMM, we can automate all of the previous steps into a single line.

For a complete rundown on using PMM to get dependencies via dds, refer to the How Do I Use dds in a CMake Project? page.

Using PMM removes the requirement that we write a separate dependencies file, and we no longer need to invoke dds build-deps externally, as it is all handled by PMM.