Spec-Zone.ru › CMake 3.26

CMP0060

Новое в версии 3.3.

Связывание библиотек по полному пути даже в неявных каталогах.

Политика CMP0003 была введена с целью всегда связывать файлы библиотек по полному пути, когда полный путь задаётся команде target_link_libraries(). Однако на некоторых платформах (например, HP-UX) фронт-энд компилятора добавляет альтернативные пути поиска библиотек для текущей архитектуры (например, /usr/lib/<arch> имеет альтернативы для библиотек в /usr/lib для текущей архитектуры). На таких платформах команда find_library() может найти библиотеку, такую как /usr/lib/libfoo.so, которая не относится к текущей архитектуре.

До политики CMP0003 проекты по-прежнему собирались в таких случаях, потому что неверный путь к библиотеке преобразовывался в -lfoo в строке линковки, а линковщик находил соответствующую библиотеку в архитектурно-специфическом пути поиска, неявно предоставляемом фронт-эндом компилятора. В то время мы решили сохранить совместимость с такими проектами, всегда преобразуя файлы библиотек, найденные в неявных каталогах линковки, в -lfoo флаги, чтобы попросить линковщик искать их. Этот подход позволил существующим проектам продолжить сборку, одновременно ссылаясь на библиотеки вне неявных каталогов линковки по полному пути (например, те, которые находятся в дереве сборки).

CMake позволяет проектам переопределить это поведение, используя целевую библиотеку импорта с её свойством IMPORTED_LOCATION, установленным на желаемый полный путь к файлу библиотеки. На самом деле, многие модули поиска учатся предоставлять импортированные целевые объекты вместо просто традиционной Foo_LIBRARIES переменной, перечисляющей файлы библиотек. Однако это делает зависящей от того, связана ли библиотека через импортированный целевой объект или нет, строку линковки, сгенерированную для библиотеки, найденной модулем поиска, что нелогично. Кроме того, это поведение стало источником путаницы, поскольку сгенерированная строка линковки для файла библиотеки зависит от его местоположения. Это также проблематично для проектов, пытающихся создать статическую ссылку, поскольку флаги, такие как -Wl,-Bstatic -lfoo -Wl,-Bdynamic могут использоваться для помощи линковщику в выборе libfoo.a вместо libfoo.so, но затем пропускают динамическую линковку последующих библиотек. (См. свойство целевого объекта LINK_SEARCH_END_STATIC для решения, обычно используемого для этой проблемы.)

Когда впервые был введён специальный случай для библиотек в неявных каталогах линковки, список неявных каталогов линковки был просто жёстко закодирован (например, /lib, /usr/lib, и ещё несколько). С тех пор CMake научился обнаруживать неявные каталоги линковки, используемые фронт-эндом компилятора. При необходимости команда find_library() может быть обучена использовать эту информацию для поиска библиотек нужной архитектуры.

По этим причинам CMake 3.3 и выше предпочитают отказаться от специального случая и связывать библиотеки по полному пути, даже если они находятся в неявных каталогах линковки. Политика CMP0060 обеспечивает совместимость для существующих проектов.

Поведением OLD для этой политики является просьба к линковщику поискать библиотеки, полные пути к которым известны, находятся в неявных каталогах линковки. Поведением NEW для этой политики является связывание библиотек по полному пути, даже если они находятся в неявных каталогах линковки.

Эта политика была введена в версии CMake 3.3. В отличие от большинства политик, CMake версии 3.26.0-rc3 по умолчанию не предупреждает, если эта политика не установлена, и просто использует поведение OLD. См. документацию переменной CMAKE_POLICY_WARNING_CMP0060 для управления предупреждением.

Примечание

Поведение OLD политики deprecated by definition и может быть удалено в будущих версиях CMake.

© 2000–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/policy/CMP0060.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API