Установите LINK_FLAGS для библиотек INTERFACE в cmake

Я работаю над библиотекой C++11 только для заголовков, которая использует современный CMake. Под "современным" я имею в виду не только использование CMake v3.0+ но также пытается использовать как можно больше лучших практик в беседе Даниэля Пфайфера.

Я провел некоторое исследование по моему вопросу, но ответы в основном касаются изменения LINK_FLAGS непосредственно на глобальном уровне, который я не хочу иметь. Прямо сейчас в моем проекте мне требуется минимальная версия 3.9.0 CMake из-за некоторых функций, которые я использую.

Мой вопрос о том, / ли добавить LINK_FLAGS исходя из двух моих зависимостей: BLAS и LAPACK. По сути, у меня есть следующая выдержка из моего CMakeLists.txt файл:

cmake_minimum_required(VERSION 3.9.0)

project(polo VERSION 1.0.0 LANGUAGES C CXX)

find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)

add_library(polo INTERFACE)
add_library(polo::polo ALIAS polo)

target_compile_features(polo INTERFACE cxx_std_11)

target_include_directories(polo
  INTERFACE
    $<BUILD_INTERFACE:${polo_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

target_link_libraries(polo
  INTERFACE
    ${BLAS_LIBRARIES}
    ${LAPACK_LIBRARIES}
)

set_property(
  TARGET
    polo
  PROPERTY LINK_FLAGS
    ${BLAS_LINKER_FLAGS}
    ${LAPACK_LINKER_FLAGS}
)

Насколько я могу понять из документации FindBLAS а также FindLAPACK модули, я должен информировать своих пользователей по крайней мере о {BLAS,LAPACK}_LIBRARIES а также {BLAS,LAPACK}_LINKER_FLAGS, Для первого, я думаю, я справился с проблемой правильно. Тем не менее, для последнего мне нужно использовать либо set_target_properties или же set_property, Между этими двумя, последнее, кажется, дает мне более чистое решение в том смысле, что я могу использовать обе переменные из Find{BLAS,LAPACK} модули вместе. Когда я пытаюсь собрать свою библиотеку, используя вышеуказанное решение, я получаю очевидную ошибку:

CMake Error at src/CMakeLists.txt:32 (set_property):
  INTERFACE_LIBRARY targets may only have whitelisted properties.  The
  property "LINK_FLAGS" is not allowed.

У меня вопрос в два раза:

  1. Должен ли я использовать *_LINKER_FLAGS исходя из модулей вообще, и,
  2. Если да, то как мне их аккуратно интегрировать в мой проект CMake?

Что касается 2. выше, я видел несколько предложений / ответов по использованию target_link_libraries, но я не уверен, что это вариант для.

Спасибо за ваше время!

2 ответа

Решение

Прежде всего, я прошу прощения у сообщества за перекрестную публикацию вопроса.

Матье попытался помочь мне с двумя вариантами:

  1. Предоставление вспомогательной функции, чтобы потребители библиотеки могли вызывать функцию для правильной обработки LINK_FLAGS, а также,
  2. IMPORTED вариант библиотеки, который он сохранил в качестве окончательного ответа (см. комментарии там для мотивации).

К сожалению, ни одно из этих решений не работает. Первый - не чистый способ информировать потребителя о ваших зависимостях. Вторая версия, кажется, работает с INTERFACE библиотеки, но любой потребитель, который зависит от INTERFACE библиотека, которая создает объект, такой как, например, C-API библиотеки только заголовка, которая создает SHARED библиотека, имеет проблемы со сборкой и установкой IMPORTED библиотека.

Решение, похоже, заключается в использовании CMake v3.13 и выше, который на дату публикации находится в кандидате на выпуск (rc3) государство. Видимо, CMake v3.13 будет представлять INTERFACE_LINK_OPTIONS для таких целей.

РЕДАКТИРОВАТЬ. CMake v3.13 был выпущен.

Приятно то, что вы можете предоставить им вспомогательный.cmake (называемый polo-config.cmake).

Один из вариантов в файле.cmake - создать IMPORTED библиотека, в которой вы держите нужные флаги, вероятно, как PUBLIC на этот раз, чтобы они были переданы следующему пользователю.

Конечно, вам нужно правильно добавить библиотеку, настроить пути включения, путь к библиотеке...

Другие вопросы по тегам