Making a CMake library accessible by other CMake packages automatically

Taking the code found in a blog post by @daniperezUse CMake-enabled libraries in your CMake project (III) – I’ve come up with the following minimal solution:

myCoolLibrary/CMakeLists.txt

cmake_minimum_required(VERSION 3.3)

project(myCoolLibrary)

function(my_export_target _target _include_dir)
    file(
        WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Config.cmake"
        "
            include(\"\$\{CMAKE_CURRENT_LIST_DIR\}/${_target}Targets.cmake\")
            set_property(
                TARGET ${_target}
                APPEND PROPERTY
                    INTERFACE_INCLUDE_DIRECTORIES \"${_include_dir}\"
            )
        "
    )

    export(TARGETS ${_target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Targets.cmake")

    # NOTE: The following call can pollute your PC's CMake package registry
    #       See comments/alternatives below
    export(PACKAGE ${_target})
endfunction(my_export_target)

...

add_library(${PROJECT_NAME} SHARED ${mysources_SRC})
my_export_target(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}")

myCoolExe/CMakeLists.txt

cmake_minimum_required(VERSION 3.3)

project(myCoolExe)

find_package(myCoolLibrary REQUIRED)

...

add_executable(${PROJECT_NAME} ${my_sources_SRC})
target_link_libraries(${PROJECT_NAME} myCoolLibrary)

To make it reusable I have packed everything into my_export_target(). And I’m friend of self-propagating properties like INTERFACE_INCLUDE_DIRECTORIES.

As commented by @ruslo, using export(PACKAGE ...) can pollute your package registry. So alternatively you can:

  1. Write the target configuration files directly to some dedicated place specific for a certain toolchain

    See e.g. How to install your custom CMake-Find module and 0003659: FIND_PACKAGE command improvements.

  2. Set CMAKE_MODULE_PATH via the second project’s CMake command line (injecting the search path(s) from the outside). If you are building the two projects anyway with a build script, then this is the most direct way to propagate the module search path(s).

Additional References

Leave a Comment