Spec-Zone.ru › CMake

CheckPIESupported

Добавлено в версии 3.14.

Этот модуль предоставляет команду для проверки поддержки компоновщиком кода, независимого от позиции (PIE), или кода, не независимого от позиции (NO_PIE), для исполняемых файлов.

Подключите этот модуль в проекте CMake с помощью:

include(CheckPIESupported)

При установке свойства целевого объекта POSITION_INDEPENDENT_CODE параметры компиляции и компоновки, связанные с PIC, добавляются при сборке объектов библиотек, а параметры компиляции, связанные с PIE, — при сборке объектов исполняемых целевых объектов независимо от этого модуля. Используйте этот модуль, чтобы обеспечить также учет свойства целевого объекта POSITION_INDEPENDENT_CODE для исполняемых файлов во время компоновки.

Команды

Этот модуль предоставляет следующую команду:

check_pie_supported

Проверяет поддержку PIE/NO_PIE и подготавливает все исполняемые файлы к включению параметров PIE на этапе компоновки:

check_pie_supported([OUTPUT_VARIABLE <output>] [LANGUAGES <langs>...])

Доступны следующие параметры:

OUTPUT_VARIABLE <output>

Задает переменную <output> со сведениями о любых ошибках. Если проверка пропущена из-за использования кэшированных результатов предыдущего вызова, вывод будет пустым, даже если при предыдущем вызове возникали ошибки.

LANGUAGES <langs>...

Проверяет компоновщики, используемые для каждого из указанных языков. Если этот параметр не указан, команда проверяет все включенные языки.

Поддерживаются C, CXX, Fortran.

Добавлено в версии 3.23: поддерживаются OBJC, OBJCXX, CUDA и HIP.

Примечание

Для использования check_pie_supported() политика CMP0083 должна иметь значение NEW; в противном случае возникнет фатальная ошибка.

Переменные

Для каждого проверяемого языка команда check_pie_supported() определяет две логические переменные кэша:

CMAKE_<lang>_LINK_PIE_SUPPORTED

Устанавливается в значение true, если компоновщик поддерживает PIE, и в false в противном случае.

CMAKE_<lang>_LINK_NO_PIE_SUPPORTED

Устанавливается в значение true, если компоновщик поддерживает NO_PIE, и в false в противном случае.

Примеры

Чтобы включить PIE также на этапе компоновки исполняемого целевого объекта, подключите этот модуль и вызовите check_pie_supported() до установки свойства целевого объекта POSITION_INDEPENDENT_CODE. Это позволит определить, поддерживает ли компоновщик для каждого проверяемого языка параметры компоновки, связанные с PIE. Например:

add_executable(foo ...)

include(CheckPIESupported)
check_pie_supported()
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)

Поскольку не все компоновщики требуют или поддерживают параметры компоновки, связанные с PIE (например, MSVC), может быть полезно получить сообщения об ошибках для записи в журнал:

add_executable(foo ...)

message(CHECK_START "Checking for C linker PIE support")

include(CheckPIESupported)
check_pie_supported(OUTPUT_VARIABLE output LANGUAGES C)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)

if(CMAKE_C_LINK_PIE_SUPPORTED)
  message(CHECK_PASS "yes")
else()
  message(CHECK_FAIL "no")
  message(VERBOSE "PIE is not supported at link time:\n${output}"
                  "PIE link options will not be passed to linker.")
endif()

Установка свойства целевого объекта POSITION_INDEPENDENT_CODE для исполняемого файла без этого модуля задает параметры компиляции, связанные с PIE, но не параметры компоновки, связанные с PIE, чего в некоторых случаях может быть недостаточно:

add_executable(foo ...)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)

© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckPIESupported.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API