Spec-Zone.ru › CMake

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_LIBRARY
  • CMAKE_ENABLE_EXPORTS
  • CMAKE_EXECUTABLE_ENABLE_EXPORTS
  • CMAKE_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_STATIC
  • CMAKE_LINK_SEARCH_END_STATIC
  • CMAKE_MSVC_RUNTIME_LIBRARY
  • CMAKE_POSITION_INDEPENDENT_CODE
  • CMAKE_WATCOM_RUNTIME_LIBRARY

Изменено в версии 3.14: Если для CMP0083 задано значение NEW, то для обеспечения корректного поведения на этапе компоновки перед использованием команды try_compile необходимо вызвать команду check_pie_supported() из модуля CheckPIESupported.

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

  • CMP0065 (в версиях CMake ниже 4.0)
  • CMP0083
  • CMP0091
  • CMP0104
  • CMP0123
  • CMP0126
  • CMP0128
  • CMP0136
  • CMP0141
  • CMP0155
  • CMP0157
  • CMP0181
  • CMP0184
  • CMP0210

Задайте переменную 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_STANDARD
  • CMAKE_C_STANDARD_REQUIRED
  • CMAKE_C_EXTENSIONS
  • CMAKE_CXX_STANDARD
  • CMAKE_CXX_STANDARD_REQUIRED
  • CMAKE_CXX_EXTENSIONS
  • CMAKE_OBJC_STANDARD
  • CMAKE_OBJC_STANDARD_REQUIRED
  • CMAKE_OBJC_EXTENSIONS
  • CMAKE_OBJCXX_STANDARD
  • CMAKE_OBJCXX_STANDARD_REQUIRED
  • CMAKE_OBJCXX_EXTENSIONS
  • CMAKE_CUDA_STANDARD
  • CMAKE_CUDA_STANDARD_REQUIRED
  • CMAKE_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> передаются в конфигурацию сборки тестового проекта.

См. также

  • try_run()

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

Spec-Zone.ru

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