Skip to content

Library options are not exported to calling projects #275

Open
@pmatalon

Description

I have a header-only library project, and I am using project_options to package it, so that it can be used as a dependency for other projects.
The library has numerous options, defined with the cmake functions option or set. What I want is to export those options, so that calling projects can configure them.
Here is the skeleton of its CMakeLists.txt, with the options WITH_OPENMP and CHECK_NAN:

project(my_lib LANGUAGES CXX)

(...) 

project_options(
  ENABLE_CACHE
  # ...other arguments
)

add_library(my_lib INTERFACE)
target_link_libraries(my_lib INTERFACE project_options project_warnings)

set(INCLUDE_DIR "include")
target_include_directories(my_lib INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_DIR}>"
                          "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")

# dependencies
set(DEPENDENCIES_CONFIGURED pugixml fmt)
foreach(DEPENDENCY ${DEPENDENCIES_CONFIGURED})
  find_package(${DEPENDENCY} CONFIG REQUIRED)
endforeach()
target_link_system_libraries(my_lib INTERFACE pugixml::pugixml fmt::fmt)

# optional dependency
option(WITH_OPENMP "Enable OpenMP" OFF)
if(${WITH_OPENMP})
  find_package(OpenMP)
  target_link_libraries(my_lib INTERFACE OpenMP::OpenMP_CXX)
  target_compile_definitions(my_lib INTERFACE MYLIB_WITH_OPENMP)
endif()

# another option
option(CHECK_NAN "Check if NaN occur in computations" OFF)
if(CHECK_NAN)
  target_compile_definitions(my_lib INTERFACE MYLIB_CHECK_NAN)
endif()

(...)

# packaging of the project
package_project(
  TARGETS my_lib project_options project_warnings libdeps
  INTERFACE_DEPENDENCIES_CONFIGURED ${DEPENDENCIES_CONFIGURED}
  INTERFACE_INCLUDES ${INCLUDE_DIR}
)

Now, another project has my_lib as a dependency. Here is its CMakeLists.txt:

project(caller_project CXX)
find_package(my_lib CONFIG REQUIRED)
add_executable(caller_project main.cpp)
target_link_libraries(caller_project PRIVATE my_lib::my_lib my_lib::project_options my_lib::project_warnings my_lib::libdeps)

# How do I set the options WITH_OPENMP and CHECK_NAN of `my_lib`?

The compilation of caller_project works fine with this CMakeLists.txt. My problem is that I can't set my_lib's options.
I think the options are simply not exported, since I don't see them when I use the ccmake command. (On the other hand, if my_lib's dependencies have options themselves, I can see them in ccmake.)
I tried using dynamic_project_options with and without ENABLE_CACHE, but no luck...
Thank you for your support.

Upvote & Fund

@aminya is using Polar.sh so you can upvote and help fund this issue. The funding is received once the issue is completed & confirmed by you.

Thank you in advance for helping prioritize & fund our backlog!


Fund with Polar

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions