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