Spec-Zone.ru › CMake

CheckSourceRuns

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

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

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

include(CheckSourceRuns)

Команды

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

check_source_runs

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

check_source_runs(<lang> <code> <variable> [SRC_EXT <extension>])

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

Аргументы:

<lang>

Язык программирования исходного кода <code>, который необходимо проверить. Поддерживаются следующие языки: C, CXX, CUDA, Fortran, HIP, OBJC и OBJCXX.

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

<code>

Исходный код для проверки. Он должен содержать корректную исходную программу. Например, в нём должна быть как минимум функция main() (для C/C++) или модуль program (для Fortran).

<variable>

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

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, все сообщения о состоянии, связанные с проверкой, подавляются.

Примеры

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

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

include(CheckSourceRuns)

check_source_runs(C [[
  #include <stdlib.h>
  #include <stdnoreturn.h>
  noreturn void f(){ exit(0); }
  int main(void) { f(); return 1; }
]] HAVE_NORETURN)

Пример: проверка кода на Fortran

Проверка успешного выполнения исходного кода на Fortran:

include(CheckSourceRuns)

check_source_runs(Fortran [[
  program test
  real :: x[*]
  call co_sum(x)
  end program
]] HAVE_COARRAY)

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

В следующем примере показано, как проверить работоспособность стандартной библиотеки C++ и std::vector во время выполнения. Если исходный код успешно компилируется, компонуется и запускается, внутренней переменной кэша HAVE_WORKING_STD_VECTOR будет присвоено логическое значение true. Код передаётся с помощью аргумента в скобках, что упрощает обработку встроенных кавычек:

include(CheckSourceRuns)

check_source_runs(CXX [[
  #include <iostream>
  #include <vector>

  int main()
  {
    std::vector<int> v = {1, 2, 3};
    if (v.size() != 3) return 1;
    std::cout << "Vector works correctly." << std::endl;
    return 0;
  }
]] HAVE_WORKING_STD_VECTOR)

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

В следующем примере этот модуль используется совместно с модулем CMakePushCheckState, чтобы задать необходимые определения компиляции и библиотеки при проверке поддержки функции C sched_getcpu() и её работоспособности во время выполнения. Например, в некоторых системах функция sched_getcpu() может быть доступна во время компиляции, но фактически не реализована ядром. В таких случаях она возвращает -1 и присваивает errno значение ENOSYS. Эта проверка подтверждает, что sched_getcpu() успешно выполняется, и сохраняет логический результат во внутренней переменной кэша HAVE_SCHED_GETCPU.

include(CheckSourceRuns)
include(CMakePushCheckState)

cmake_push_check_state(RESET)
  set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)

  if(CMAKE_SYSTEM_NAME STREQUAL "Haiku")
    set(CMAKE_REQUIRED_LIBRARIES gnu)
  endif()

  check_source_runs(C [[
    #include <sched.h>
    int main(void)
    {
      if (sched_getcpu() == -1) {
        return 1;
      }
      return 0;
    }
  ]] HAVE_SCHED_GETCPU)
cmake_pop_check_state()

См. также

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

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

Spec-Zone.ru

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