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