CMP0060
Связывать библиотеки полным путем, даже в неявных директориях.
Политика 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.18.4 по умолчанию не предупреждает, когда эта политика не задана, а просто использует поведение 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.18/policy/CMP0060.html