CMake find_package не обрабатывает мультиконфигурации

Мы используем Jenkins 2.60.2 и CMake 3.9.1 для автоматизации нашей системы сборки. Все это хорошо работает для нескольких версий инструментов сборки, архитектур и целей отладки / выпуска (если ВСЕ конфигурации были собраны и установлены, так что оба отлаживать А ТАКЖЕ Релиз).

отлаживать-единственная конфигурация, которая использует find_package() обычно игнорирует CMAKE_BUILD_TYPE на открытие. Внутри скрипты ищут файлы и библиотеки и сохраняют местоположения в переменных. В конце скрипта переменные проверяются на _НЕ НАЙДЕНО Строки, которые являются результатом файла или библиотеки, которые не найдены во всех ссылочных путях / подсказках. Так по сути find_package() потерпит неудачу, если Release lib не может быть найден, и пометит весь пакет как не установленный должным образом, даже если сборка строго заинтересована в отлаживать цель.

Типично XXXConfig.cmake файлы используют вызов find_package_handle_standard_args(.. PATH_TO_LIB), который сканирует _НЕ НАЙДЕНО строки в переменных пути к библиотекам. Эти переменные обычно устанавливаются в _НЕ НАЙДЕНО по более ранним звонкам find_library(Имя_библиотеки PATH_TO_LIB ..). Для получения дополнительной информации я обращаюсь к документации CMake.

Пользователь действительно может пометить библиотеки отладки с помощью «debug» и выпускать библиотеки с «optimized», но это, похоже, не помогает во время обнаружения lib и используется только во время компоновки.

Кто-нибудь знает, как правильно с этим справиться?

С уважением

3

Решение

Это один из прискорбных недостатков классического использования find_package,

Обратите внимание, что find_package также позволяет другой режим работы, основаны на пакетах конфигурационных файлов, которые хорошо подходят для решения этой конкретной проблемы, но потребуют некоторых изменений в вашей системе сборки. Вам понадобятся скрипты конфигурации для всех ваших библиотек (CMake может сгенерировать их для вас, если сами библиотеки также собраны CMake; если нет, это может быть немного хлопотно), и зависимые цели будут ссылаться на эти библиотеки через импортированные цели вместо переменных (что обычно облегчает задачу зависимым целям). Я настоятельно рекомендую вам принять это как долгосрочное решение.

Если по какой-либо причине вы не можете сделать это, вам придется изменить свои скрипты поиска. Обычный метод — искать двоичные файлы отладки и выпуска отдельно, а затем объединять библиотеки поиска из этих вызовов в одну переменную (вместе с debug а также optimized спецификаторы), а затем есть тот переменная в качестве аргумента find_package_handle_standard_args, Таким образом, до тех пор, пока будет найден один из двух, ваш скрипт поиска будет счастлив, хотя в итоге вы не сможете собрать все возможные конфигурации. Кроме того, вы также можете пропустить звонок find_package_handle_standard_args в целом и вручную реализовать собственную логику для определения, была ли найдена библиотека. Как вы можете видеть из man-страница для этой функции, в основном он представляет собой шаблонный материал и при необходимости может быть легко заменен более гибкой, написанной от руки реализацией.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]