Spec-Zone.ru › CMake 3.31

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>.

В этом формате необходимо указать один или несколько исходных файлов. Кроме того, один из 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})

CMake автоматически генерирует для каждой операции try_compile уникальную директорию в ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch с неопределённым именем. Эти директории автоматически очищаются, если --debug-trycompile передаётся в cmake. Такие директории из предыдущих запусков также безусловно очищаются в начале любого выполнения 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 для своей работы, и все такие файлы будут автоматически очищаться. Для отладки можно передать --debug-trycompile в cmake, чтобы избежать этой очистки. Однако, несколько последовательных операций 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.

Результат будет сохранён в обычной переменной, а не в записи кэша.

Переменная результата обычно кэшируется, чтобы можно было использовать простой шаблон для избежания повторения теста при последующих выполнениях 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_LINK_SEARCH_START_STATIC
  • CMAKE_LINK_SEARCH_END_STATIC
  • CMAKE_MSVC_RUNTIME_LIBRARY
  • CMAKE_POSITION_INDEPENDENT_CODE
  • CMAKE_WATCOM_RUNTIME_LIBRARY

Если CMP0056 установлено в значение NEW, тогда также передаётся CMAKE_EXE_LINKER_FLAGS.

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

Текущие настройки CMP0065 и CMP0083 распространяются в сгенерированный тестовый проект.

Установите переменную CMAKE_TRY_COMPILE_CONFIGURATION для выбора конфигурации сборки:

  • Для генераторов с несколькими конфигурациями, это выбирает конфигурацию для сборки.
  • Для генераторов с одной конфигурацией, это устанавливает CMAKE_BUILD_TYPE в тестовом проекте.

Добавлена в версии 3.6: Установите переменную CMAKE_TRY_COMPILE_TARGET_TYPE для указания типа целевого объекта, используемого для подписи исходного файла.

Добавлена в версии 3.6: Установите переменную CMAKE_TRY_COMPILE_PLATFORM_VARIABLES для указания переменных, которые должны быть распространены в тестовый проект. Эта переменная предназначена для использования только в файлах toolchain и учитывается только командой 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 toolset и целевой системы также распространяются в тестовый проект.

Добавлена в версии 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 распространяется в конфигурацию сборки тестового проекта при использовании подписи всего проекта всего проекта.

См. также

  • try_run()

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

Spec-Zone.ru

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