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