try_compile
Попробовать собрать код.
Компиляция целых проектов
try_compile(<compileResultVar> PROJECT <projectName>
SOURCE_DIR <srcdir>
[BINARY_DIR <bindir>]
[TARGET <targetName>]
[LOG_DESCRIPTION <text>]
[NO_CACHE]
[NO_LOG]
[CMAKE_FLAGS <flags>...]
[OUTPUT_VARIABLE <var>])
Добавлено в версии 3.25.
Попробовать собрать проект. При успешной сборке возвращается TRUE, а при ошибке сборки — FALSE в <compileResultVar>.
В этой форме <srcdir> должен содержать полноценный проект CMake с файлом CMakeLists.txt и всеми исходными файлами. <bindir> и <srcdir> не удаляются после выполнения этой команды. Укажите <targetName>, чтобы собрать определённую цель вместо цели all или ALL_BUILD. Значение остальных параметров описано ниже.
Изменено в версии 3.24: Переменные CMake, описывающие настройки платформы, а также переменные, перечисленные в переменной CMAKE_TRY_COMPILE_PLATFORM_VARIABLES, передаются в конфигурацию сборки проекта. См. политику CMP0137. Ранее это выполнялось только в сигнатуре исходного файла.
Добавлено в версии 3.26: Эта команда записывает событие try_compile в журнале конфигурации, если параметр NO_LOG не указан.
Добавлено в версии 3.30: Если глобальное свойство PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE имеет значение true, CMAKE_PROJECT_TOP_LEVEL_INCLUDES передаётся в конфигурацию сборки проекта.
Эта команда поддерживает альтернативную сигнатуру для CMake версий ниже 3.25. Для ясности рекомендуется использовать приведённую выше сигнатуру.
try_compile(<compileResultVar> <bindir> <srcdir>
<projectName> [<targetName>]
[CMAKE_FLAGS <flags>...]
[OUTPUT_VARIABLE <var>])
Компиляция исходных файлов
try_compile(<compileResultVar>
[SOURCES_TYPE <type>]
{SOURCES <srcfile>... |
SOURCE_FROM_CONTENT <name> <content> |
SOURCE_FROM_VAR <name> <var> |
SOURCE_FROM_FILE <name> <path> }...
[LOG_DESCRIPTION <text>]
[NO_CACHE]
[NO_LOG]
[CMAKE_FLAGS <flags>...]
[COMPILE_DEFINITIONS <defs>...]
[LINK_OPTIONS <options>...]
[LINK_LIBRARIES <libs>...]
[LINKER_LANGUAGE <lang>]
[OUTPUT_VARIABLE <var>]
[COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
[<LANG>_STANDARD <std>]
[<LANG>_STANDARD_REQUIRED <bool>]
[<LANG>_EXTENSIONS <bool>]
)
Добавлено в версии 3.25.
Попробовать собрать исполняемый файл или статическую библиотеку из одного или нескольких исходных файлов. Тип двоичного файла определяется переменной CMAKE_TRY_COMPILE_TARGET_TYPE. При успешной сборке возвращается логическое значение true, а при ошибке сборки — логическое значение false в <compileResultVar> (с сохранением в кэше, если не указан параметр NO_CACHE).
В этой форме необходимо указать один или несколько исходных файлов. Кроме того, перед другими ключевыми словами должно быть указано SOURCES и/или SOURCE_FROM_*.
Если CMAKE_TRY_COMPILE_TARGET_TYPE не задана или имеет значение EXECUTABLE, исходные файлы должны содержать определение для main, а CMake создаст файл CMakeLists.txt для сборки исходных файлов в виде исполняемого файла. Если CMAKE_TRY_COMPILE_TARGET_TYPE имеет значение STATIC_LIBRARY, вместо этого будет собрана статическая библиотека, и определение для main не требуется. Для исполняемого файла сгенерированный файл CMakeLists.txt будет содержать примерно следующее:
add_definitions(<expanded COMPILE_DEFINITIONS from caller>)
include_directories(${INCLUDE_DIRECTORIES})
link_directories(${LINK_DIRECTORIES})
add_executable(cmTryCompileExec <srcfile>...)
target_link_options(cmTryCompileExec PRIVATE <LINK_OPTIONS from caller>)
target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})
Для каждой операции try_compile CMake автоматически создаёт в ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch уникальный каталог с неопределённым именем. Эти каталоги автоматически очищаются, если программе cmake не передан параметр --debug-trycompile. Каталоги, оставшиеся от предыдущих запусков, также безусловно очищаются в начале каждого запуска cmake.
Эта команда поддерживает альтернативную сигнатуру для CMake версий ниже 3.25. Для ясности рекомендуется использовать приведённую выше сигнатуру.
try_compile(<compileResultVar> <bindir> {<srcfile>|SOURCES <srcfile>...}
[CMAKE_FLAGS <flags>...]
[COMPILE_DEFINITIONS <defs>...]
[LINK_OPTIONS <options>...]
[LINK_LIBRARIES <libs>...]
[OUTPUT_VARIABLE <var>]
[COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
[<LANG>_STANDARD <std>]
[<LANG>_STANDARD_REQUIRED <bool>]
[<LANG>_EXTENSIONS <bool>]
)
В этой версии try_compile будет использовать для своей работы <bindir>/CMakeFiles/CMakeTmp, и все такие файлы будут автоматически очищаться. Для отладки программе cmake можно передать параметр --debug-trycompile, чтобы отключить эту очистку. Однако несколько последовательных операций try_compile с одинаковым <bindir> будут использовать один и тот же выходной каталог, поэтому одновременно можно отлаживать только один такой вызов try_compile. Для упрощения отладки нескольких операций try_compile рекомендуется использовать новую сигнатуру.
Параметры
Для указанных выше сигнатур доступны следующие параметры:
-
CMAKE_FLAGS <flags>... -
Укажите флаги в формате
-DVAR:TYPE=VALUE, которые будут переданы командной строкеcmake(1), используемой для выполнения тестовой сборки. В приведённом выше примере показано, как используются значения переменныхCOMPILE_DEFINITIONS,INCLUDE_DIRECTORIES,LINK_DIRECTORIES,LINK_LIBRARIESиLINK_OPTIONS. Параметры компилятора можно передать, например, так:CMAKE_FLAGS -DCOMPILE_DEFINITIONS=-Werror. -
COMPILE_DEFINITIONS <defs>... -
Укажите аргументы
-Ddefinitionдля передачи командеadd_definitions()в сгенерированном тестовом проекте. -
COPY_FILE <fileName> -
Скопируйте собранный исполняемый файл или статическую библиотеку в указанный
<fileName>. -
COPY_FILE_ERROR <var> -
Используйте после
COPY_FILE, чтобы сохранить в переменную<var>сообщение об ошибке, возникшей при попытке копирования файла. -
LINK_LIBRARIES <libs>... -
Укажите библиотеки для компоновки в сгенерированном проекте. Список библиотек может содержать системные библиотеки и импортированные цели из вызывающего проекта.
Если указан этот параметр, любое значение
-DLINK_LIBRARIES=..., заданное параметруCMAKE_FLAGS, будет проигнорировано.Добавлено в версии 3.29: Также поддерживаются цели-псевдонимы для импортированных библиотек.
-
LINK_OPTIONS <options>... -
Добавлено в версии 3.14.
Укажите параметры этапа компоновки для передачи команде
target_link_options()или для задания свойства целиSTATIC_LIBRARY_OPTIONSв сгенерированном проекте — в зависимости от значения переменнойCMAKE_TRY_COMPILE_TARGET_TYPE. -
LINKER_LANGUAGE <lang> -
Добавлено в версии 3.29.
Укажите свойство цели
LINKER_LANGUAGEдля сгенерированного проекта. При использовании нескольких исходных файлов на разных языках задайте язык исходного файла, содержащего точку входа программы, напримерmain. -
LOG_DESCRIPTION <text> -
Добавлено в версии 3.26.
Укажите непустое текстовое описание цели проверки. Оно записывается в запись
cmake-configure-log(7). -
NO_CACHE -
Добавлено в версии 3.25.
<compileResultVar>будет сохранено в обычной переменной, а не в записи кэша.Обычно
<compileResultVar>сохраняется в кэше, чтобы можно было использовать простой шаблон, предотвращающий повторное выполнение проверки при последующих запусках CMake:if(NOT DEFINED RESULTVAR) # ...(check-specific setup code)... try_compile(RESULTVAR ...) # ...(check-specific logging and cleanup code)... endif()
Если переменная-флаг и переменная результата различаются (например, если проверка является частью более широкого исследования),
NO_CACHEможет быть полезен для предотвращения попадания промежуточной переменной результата в кэш. -
NO_LOG -
Добавлено в версии 3.26.
Не записывать для этого вызова запись
cmake-configure-log(7). -
OUTPUT_VARIABLE <var> -
Сохранить вывод процесса сборки в указанную переменную.
-
SOURCE_FROM_CONTENT <name> <content> -
Добавлено в версии 3.25.
Записать
<content>в файл с именем<name>в каталоге операции. Это позволяет не создавать отдельный исходный файл, если его содержимое задаётся динамически. Указанное<name>не должно содержать компоненты пути.Параметр
SOURCE_FROM_CONTENTможно указывать несколько раз. -
SOURCE_FROM_FILE <name> <path> -
Добавлено в версии 3.25.
Скопировать
<path>в файл с именем<name>в каталоге операции. Это позволяет объединить файлы в каталоге операции и может быть полезно, если существующему исходному файлу (например, отдельному файлу в репозитории исходного кода проекта) необходимо ссылаться на другие файлы, созданные с помощьюSOURCE_FROM_*. (В противном случае обычно удобнее использоватьSOURCES.) Указанное<name>не должно содержать компоненты пути. -
SOURCE_FROM_VAR <name> <var> -
Добавлено в версии 3.25.
Записать содержимое
<var>в файл с именем<name>в каталоге операции. Этот параметр аналогиченSOURCE_FROM_CONTENT, но содержимое берётся из указанной переменной CMake, а не передаётся напрямую. Это может быть полезно при передаче аргументов через функцию-обёртку дляtry_compile. Указанное<name>не должно содержать компоненты пути.Параметр
SOURCE_FROM_VARможно указывать несколько раз. -
SOURCES_TYPE <type> -
Добавлено в версии 3.28.
Исходные файлы можно классифицировать с помощью аргумента
SOURCES_TYPE. После его указания все последующие исходные файлы будут считаться файлами этого типа, пока не будет задан другойSOURCES_TYPE. Доступны следующие типы:-
NORMAL -
Исходные файлы не добавляются ни в один
FILE_SETсгенерированного проекта. -
CXX_MODULE -
Добавлено в версии 3.28.
Исходные файлы добавляются в
FILE_SETтипаCXX_MODULESв сгенерированном проекте.
Тип исходных файлов по умолчанию —
NORMAL. -
-
<LANG>_STANDARD <std> -
Добавлено в версии 3.8.
Укажите свойство цели
C_STANDARD,CXX_STANDARD,OBJC_STANDARD,OBJCXX_STANDARDилиCUDA_STANDARDдля сгенерированного проекта. -
<LANG>_STANDARD_REQUIRED <bool> -
Добавлено в версии 3.8.
Укажите свойство цели
C_STANDARD_REQUIRED,CXX_STANDARD_REQUIRED,OBJC_STANDARD_REQUIRED,OBJCXX_STANDARD_REQUIREDилиCUDA_STANDARD_REQUIREDдля сгенерированного проекта. -
<LANG>_EXTENSIONS <bool> -
Добавлено в версии 3.8.
Укажите свойство цели
C_EXTENSIONS,CXX_EXTENSIONS,OBJC_EXTENSIONS,OBJCXX_EXTENSIONSилиCUDA_EXTENSIONSдля сгенерированного проекта.
Другие настройки поведения
Добавлено в версии 3.4: Если заданы, следующие переменные передаются в сгенерированный CMakeLists.txt для try_compile, чтобы инициализировать свойства целей сборки значениями по умолчанию:
CMAKE_CUDA_RUNTIME_LIBRARYCMAKE_ENABLE_EXPORTSCMAKE_EXECUTABLE_ENABLE_EXPORTSCMAKE_SHARED_LIBRARY_ENABLE_EXPORTS-
CMAKE_EXE_LINKER_FLAGS, за исключением версий CMake ниже 4.0, если политикаCMP0056не установлена вNEW -
CMAKE_<LANG>_LINK_FLAGS, за исключением версий CMake ниже 4.3, если политикаCMP0210не установлена вNEW CMAKE_LINK_SEARCH_START_STATICCMAKE_LINK_SEARCH_END_STATICCMAKE_MSVC_RUNTIME_LIBRARYCMAKE_POSITION_INDEPENDENT_CODECMAKE_WATCOM_RUNTIME_LIBRARY
Изменено в версии 3.14: Если для CMP0083 задано значение NEW, то для обеспечения корректного поведения на этапе компоновки перед использованием команды try_compile необходимо вызвать команду check_pie_supported() из модуля CheckPIESupported.
В сгенерированном тестовом проекте автоматически устанавливаются некоторые политики, чтобы при необходимости сохранить состояние вызывающего проекта:
-
CMP0065(в версиях CMake ниже 4.0) CMP0083CMP0091CMP0104CMP0123CMP0126CMP0128CMP0136CMP0141CMP0155CMP0157CMP0181CMP0184CMP0210
Задайте переменную CMAKE_TRY_COMPILE_CONFIGURATION, чтобы выбрать конфигурацию сборки:
- Для генераторов с несколькими конфигурациями это определяет, какую конфигурацию собирать.
- Для генераторов с одной конфигурацией это задаёт значение
CMAKE_BUILD_TYPEв тестовом проекте.
Добавлено в версии 3.6: Задайте переменную CMAKE_TRY_COMPILE_TARGET_TYPE, чтобы указать тип цели для сигнатуры исходного файла.
Добавлено в версии 3.6: Задайте переменную CMAKE_TRY_COMPILE_PLATFORM_VARIABLES, чтобы указать переменные, которые необходимо передать в тестовый проект. Эта переменная предназначена только для использования в файлах цепочки инструментов; она учитывается командой try_compile() только в форме с исходными файлами, но не при передаче целого проекта.
Изменено в версии 3.8: Если для CMP0067 задано значение NEW или используется любой из параметров <LANG>_STANDARD, <LANG>_STANDARD_REQUIRED или <LANG>_EXTENSIONS, учитываются переменные стандарта языка:
CMAKE_C_STANDARDCMAKE_C_STANDARD_REQUIREDCMAKE_C_EXTENSIONSCMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIREDCMAKE_CXX_EXTENSIONSCMAKE_OBJC_STANDARDCMAKE_OBJC_STANDARD_REQUIREDCMAKE_OBJC_EXTENSIONSCMAKE_OBJCXX_STANDARDCMAKE_OBJCXX_STANDARD_REQUIREDCMAKE_OBJCXX_EXTENSIONSCMAKE_CUDA_STANDARDCMAKE_CUDA_STANDARD_REQUIREDCMAKE_CUDA_EXTENSIONS
Их значения используются для задания соответствующих свойств целей в сгенерированном проекте (если они не переопределены явным параметром).
Изменено в версии 3.14: Для генератора Green Hills MULTI в тестовый проект также передаются переменные кэша для настройки набора инструментов GHS и целевой системы.
Добавлено в версии 3.24: Переменной CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES можно задать значение, отключающее передачу переменных платформы в тестовый проект.
Добавлено в версии 3.25: Если для CMP0141 задано значение NEW, переменную CMAKE_MSVC_DEBUG_INFORMATION_FORMAT можно использовать для указания формата отладочной информации MSVC.
Добавлено в версии 3.30: Если глобальное свойство PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE установлено в значение true, CMAKE_PROJECT_TOP_LEVEL_INCLUDES передаётся в конфигурацию сборки тестового проекта при использовании сигнатуры целого проекта.
Добавлено в версии 4.0: Если CMP0184 установлена в значение NEW, можно использовать CMAKE_MSVC_RUNTIME_CHECKS, чтобы указать включённые проверки среды выполнения MSVC.
Добавлено в версии 4.3: Если CMP0210 установлена в значение NEW, CMAKE_<LANG>_LINK_FLAGS и CMAKE_<LANG>_LINK_FLAGS_<CONFIG> передаются в конфигурацию сборки тестового проекта.
См. также
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/try_compile.html