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.29/policy/CMP0060.html