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