Установите LINK_FLAGS для библиотек INTERFACE в cmake - PullRequest
0 голосов
/ 19 ноября 2018

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

Я провел некоторое исследование по моему вопросу, но ответы в основном касаются изменения 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 ]

0 голосов
/ 19 ноября 2018

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

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

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

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

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

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

0 голосов
/ 19 ноября 2018

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

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

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

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