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