Зависимости подмодулей CMake - PullRequest
0 голосов
/ 23 марта 2019

У меня есть проект CMake с двумя подмодулями A и B.B зависит от A.В подмодуле B я хотел бы искать A, используя find_package(A CONFIG).Мой минимальный (не) рабочий пример:

CMakeLists.txt
   cmake_minimum_required(VERSION 3.13)
   project(AB)
   add_subdirectory(B)
   add_subdirectory(A)
A/CMakeLists.txt:
   message(STATUS "CMake: A")
   add_library(A SHARED A.hpp A.cpp)
   target_include_directories(A PUBLIC "${CURRENT_SOURCE_DIR}")
   install(TARGETS A EXPORT AA LIBRARY DESTINATION lib/)
   export(TARGETS A NAMESPACE AA:: FILE ${CMAKE_BINARY_DIR}/A/AConfig.cmake)
   export(PACKAGE AA)
A/A.hpp (some non-sense code)
A/A.cpp
B/CMakeLists.txt
   find_package(A CONFIG)
   message(STATUS "---> ${A_FOUND}")
   add_library(B B.hpp B.cpp)
   target_link_libraries(B AA::A)
B/B.hpp (some non-sense code)
B/B.cpp

A/CMakeList.txt правильно выдает AConfig.cmake.Но, насколько я понимаю, это происходит после (!) find_package(A CONFIG) и, следовательно, AConfig.cmake не найдено.Любая идея, как заставить find_package() запускаться после выполнения A?

Конечно, я знаю, что в этом примере find_package не имеет никакого смысла.В моем реальном проекте подмодули являются внешним программным обеспечением, которое я не хочу модифицировать (в моем случае - Parallels STL и TBB).

1 Ответ

1 голос
/ 24 марта 2019

Действительно, в настоящее время cmake не поддерживает это должным образом. Обсуждение будущих планов можно найти здесь . Вот мой уродливый обходной путь:

A/CMakeLists.txt:
   message(STATUS "CMake: A")
   add_library(A SHARED A.hpp A.cpp)
   target_include_directories(A PUBLIC "${CURRENT_SOURCE_DIR}")
   install(TARGETS A EXPORT AA LIBRARY DESTINATION lib/)
   export(TARGETS A NAMESPACE AA:: FILE ${CMAKE_BINARY_DIR}/A/AConfig.cmake)
   export(PACKAGE AA)

   add_library(AA::A ALIAS A)
   file(WRITE ${CMAKE_BINARY_DIR}/A/AConfig.cmake "")
   # include(CMakePackageConfigHelpers)
   # write_basic_package_version_file(
   #   ${CMAKE_BINARY_DIR}/A/AConfigVersion.cmake
   #   VERSION 1.0.0
   #   COMPATIBILITY AnyNewerVersion)

Итак, идея заключается в создании фиктивного файла AConfig.cmake. Это перезаписывается позже, но это гарантирует, что find_package() не прервется до того, как он будет создан. Затем нам нужно присвоить псевдоним цели A имени после импорта AA::A. В случае, если существует требование к версии A, необходимо также создать файл AConfigVersion.cmake. Я создал MWE на github .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...