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 библиотечный целевой объект со свойством 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_policy() или cmake_minimum_required(). Если она не установлена, CMake по умолчанию не выводит предупреждение и использует поведение OLD.
См. документацию по переменной CMAKE_POLICY_WARNING_CMP0060 для управления предупреждением.
Примечание
Поведение OLD политики deprecated by definition и может быть удалено в будущих версиях CMake.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/policy/CMP0060.html