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