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.10.3 по умолчанию не предупреждает, если эта политика не установлена, и просто использует старое поведение. См. документацию переменной 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.10/policy/CMP0060.html