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