Spec-Zone.ru › CMake

CheckSourceCompiles

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

Этот модуль предоставляет команду, которая проверяет, можно ли собрать исходный код для указанного языка.

Загрузите этот модуль в проект CMake с помощью:

include(CheckSourceCompiles)

Команды

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

check_source_compiles

Однократно проверяет, можно ли собрать указанный исходный код для указанного языка:

check_source_compiles(
  <lang>
  <code>
  <variable>
  [FAIL_REGEX <regexes>...]
  [SRC_EXT <extension>]
)

Эта команда однократно проверяет, можно ли скомпилировать исходный код, переданный в <code> (и скомпоновать его в исполняемый файл), для языка программирования <lang>. Результат проверки сохраняется во внутренней переменной кэша, указанной в <variable>.

Аргументы:

<lang>

Язык исходного кода для проверки. Поддерживаются следующие языки: C, CXX, CUDA, Fortran, HIP, ISPC, OBJC, OBJCXX и Swift.

Добавлена в версии 3.21: поддержка языка HIP.

Добавлена в версии 3.26: поддержка языка Swift.

<code>

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

<variable>

Имя переменной внутреннего кэша для сохранения результата проверки: логическое значение true означает успех, а false — неудачу.

FAIL_REGEX <regexes>...

Если задан один или несколько шаблонов регулярных выражений, неудача определяется проверкой того, совпадает ли какая-либо часть вывода компилятора с одним из указанных регулярных выражений.

SRC_EXT <extension>

По умолчанию для внутреннего тестового файла, используемого при проверке, задаётся расширение, соответствующее запрошенному языку (например, .c для C, .cxx для C++, .F90 для Fortran и т. д.). Этот параметр позволяет вместо этого задать .<extension>.

Переменные, влияющие на проверку

Перед вызовом этой команды можно задать следующие переменные, чтобы изменить способ выполнения проверки:

CMAKE_REQUIRED_FLAGS

Строка с разделёнными пробелами дополнительными флагами, передаваемыми компилятору. Список с разделителями-точками с запятой использовать нельзя. Содержимое переменной CMAKE_<LANG>_FLAGS и связанной с ней переменной CMAKE_<LANG>_FLAGS_<CONFIG> для конкретной конфигурации автоматически добавляется перед содержимым этой переменной в команду компилятора.

CMAKE_REQUIRED_DEFINITIONS

Список с разделителями-точками с запятой определений компилятора, каждое в форме -DFOO или -DFOO=bar. Определение для имени, указанного в аргументе команды проверки, задающем переменную результата, также добавляется автоматически.

CMAKE_REQUIRED_INCLUDES

Список с разделителями-точками с запятой путей поиска заголовочных файлов, передаваемых компилятору. Будут использоваться только эти пути поиска заголовочных файлов; содержимое свойства каталога INCLUDE_DIRECTORIES будет проигнорировано.

CMAKE_REQUIRED_LINK_OPTIONS

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

Список с разделителями-точками с запятой параметров, добавляемых в команду компоновки (подробности см. в try_compile()).

CMAKE_REQUIRED_LIBRARIES

Список с разделителями-точками с запятой библиотек, добавляемых в команду компоновки. Это могут быть имена системных библиотек или импортируемые цели (подробности см. в try_compile()).

CMAKE_REQUIRED_LINK_DIRECTORIES

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

Список с разделителями-точками с запятой путей поиска библиотек, передаваемых компоновщику (подробности см. в try_compile()).

CMAKE_REQUIRED_QUIET

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

Если значение этой переменной трактуется как логическое true, все сообщения о состоянии, связанные с проверкой, будут подавлены.

CMAKE_TRY_COMPILE_TARGET_TYPE

Для выполнения проверки внутри вызывается команда try_compile(), а эта переменная задаёт тип создаваемой ею цели. Если переменной присвоено значение EXECUTABLE (по умолчанию), тестовый исходный код компилируется и компонуется как исполняемая программа. Если задано значение STATIC_LIBRARY, тестовый исходный код компилируется, но не компонуется.

Примеры

Пример: базовое использование

В следующем примере показано, как с помощью этого модуля проверить, поддерживает ли компилятор C++ определённую возможность языка. В этом случае проверяется поддержка компилятором лямбда-выражений C++11. Результат сохраняется во внутренней переменной кэша HAVE_CXX11_LAMBDAS:

include(CheckSourceCompiles)

check_source_compiles(CXX [[
  int main()
  {
    auto lambda = []() { return 42; };
    return lambda();
  }
]] HAVE_CXX11_LAMBDAS)

Пример: проверка кода с аргументом в квадратных скобках

В следующем примере показано, как проверить, поддерживает ли компилятор C атрибут noreturn. Код передаётся с помощью аргумента в квадратных скобках, что упрощает обработку встроенных кавычек:

include(CheckSourceCompiles)

check_source_compiles(C [[
  #if !__has_c_attribute(noreturn)
  #  error "No noreturn attribute"
  #endif
  int main(void) { return 0; }
]] HAVE_NORETURN)

Пример: выполнение проверки без компоновки

В следующем примере этот модуль используется для проверки только компиляции исходного кода на Fortran — поддерживает ли компилятор атрибут процедуры pure:

include(CheckSourceCompiles)

block()
  set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

  check_source_compiles(
    Fortran
    "pure subroutine foo()
    end subroutine"
    HAVE_PURE
  )
endblock()

Пример: изолированная проверка

В следующем примере этот модуль используется совместно с модулем CMakePushCheckState, чтобы изменить список необходимых библиотек при проверке наличия значения PQERRORS_SQLSTATE в перечислении PostgreSQL PGVerbosity (доступно начиная с PostgreSQL версии 12):

include(CheckSourceCompiles)
include(CMakePushCheckState)

find_package(PostgreSQL)

if(TARGET PostgreSQL::PostgreSQL)
  cmake_push_check_state(RESET)
    set(CMAKE_REQUIRED_LIBRARIES PostgreSQL::PostgreSQL)

    check_source_compiles(C [[
      #include <libpq-fe.h>
      int main(void)
      {
        PGVerbosity e = PQERRORS_SQLSTATE;
        (void)e;
        return 0;
      }
    ]] HAVE_PQERRORS_SQLSTATE)
  cmake_pop_check_state()
endif()

См. также

  • Модуль CheckSourceRuns позволяет проверить, можно ли собрать и запустить исходный код.

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

Spec-Zone.ru

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