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_LIBRARYCMAKE_ENABLE_EXPORTSCMAKE_LINK_SEARCH_START_STATICCMAKE_LINK_SEARCH_END_STATICCMAKE_MSVC_RUNTIME_LIBRARYCMAKE_POSITION_INDEPENDENT_CODECMAKE_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_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 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 распространяется в конфигурацию сборки тестового проекта при использовании подписи всего проекта всего проекта.
См. также
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.31/command/try_compile.html