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