try_compile
Попробуйте скомпилировать некоторый код.
Попытка компиляции целых проектов
try_compile(<resultVar> <bindir> <srcdir>
<projectName> [<targetName>] [CMAKE_FLAGS <flags>...]
[OUTPUT_VARIABLE <var>])
Попробуйте скомпилировать проект. Успех или неудача try_compile, т.е. TRUE или FALSE соответственно, возвращается в <resultVar>.
Новое в версии 3.14: Имя <resultVar> определяется пользователем. Ранее оно имело фиксированное имя RESULT_VAR.
В этом формате <srcdir> должен содержать полный проект CMake с файлом CMakeLists.txt и всеми исходными файлами. <bindir> и <srcdir> не будут удалены после выполнения этой команды. Укажите <targetName> для компиляции определённой цели вместо all или ALL_BUILD цели. Значения других параметров см. ниже.
Попытка компиляции исходных файлов
try_compile(<resultVar> <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>]
)
Попробуйте скомпилировать исполняемый файл или статическую библиотеку из одного или нескольких исходных файлов (который определяется переменной CMAKE_TRY_COMPILE_TARGET_TYPE). Успех или неудача try_compile, т.е. TRUE или FALSE соответственно, возвращается в <resultVar>.
Новое в версии 3.14: Имя <resultVar> определяется пользователем. Ранее оно имело фиксированное имя RESULT_VAR.
В этом формате необходимо указать один или несколько исходных файлов. Если 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_FLAGS <flags>... -
Укажите флаги в формате
-DVAR:TYPE=VALUEдля передачи в командную строкуcmakeдля управления компиляцией теста. Приведённый пример показывает, как используются значения переменныхINCLUDE_DIRECTORIES,LINK_DIRECTORIES, иLINK_LIBRARIES. -
COMPILE_DEFINITIONS <defs>... -
Укажите аргументы
-Ddefinitionдля передачи вadd_definitions()в сгенерированном проекте теста. -
COPY_FILE <fileName> -
Скопировать скомпилированный исполняемый файл или статическую библиотеку в заданный
<fileName>. -
COPY_FILE_ERROR <var> -
Используется после
COPY_FILEдля сохранения в переменную<var>любых сообщений об ошибках, возникших при попытке скопировать файл. -
LINK_LIBRARIES <libs>... -
Укажите библиотеки, которые должны быть подключены в сгенерированном проекте. Список библиотек может ссылаться на системные библиотеки и на Импортированные цели из вызывающего проекта.
Если этот параметр указан, любое значение
-DLINK_LIBRARIES=...для параметраCMAKE_FLAGSбудет проигнорировано. -
LINK_OPTIONS <options>... -
Новое в версии 3.14.
Укажите параметры шага компоновки для передачи в
target_link_options()или для установки свойства целиSTATIC_LIBRARY_OPTIONSв сгенерированном проекте, в зависимости от переменнойCMAKE_TRY_COMPILE_TARGET_TYPE. -
OUTPUT_VARIABLE <var> -
Сохранить вывод из процесса компиляции в заданную переменную.
-
<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сгенерированного проекта.
В этой версии все файлы в <bindir>/CMakeFiles/CMakeTmp будут автоматически очищены. Для отладки, --debug-trycompile может быть передан в cmake для предотвращения этой очистки. Однако несколько последовательных операций try_compile повторно используют эту единственную выходную директорию. Если вы используете --debug-trycompile, вы можете отлаживать только один вызов try_compile за раз. Рекомендуемая процедура состоит в том, чтобы защитить все вызовы try_compile в вашем проекте с помощью логики if(NOT DEFINED <resultVar>), настроить всё с помощью CMake, выполнить настройки один раз, затем удалить запись кэша, связанную с вызовом try_compile, в котором вы заинтересованы, и затем повторно запустить CMake с --debug-trycompile.
Другие параметры поведения
Новое в версии 3.4: Если задано, следующие переменные передаются в сгенерированный try_compile CMakeLists.txt для инициализации свойств целевых компиляций значениями по умолчанию:
CMAKE_CUDA_RUNTIME_LIBRARYCMAKE_ENABLE_EXPORTSCMAKE_LINK_SEARCH_START_STATICCMAKE_LINK_SEARCH_END_STATICCMAKE_MSVC_RUNTIME_LIBRARYCMAKE_POSITION_INDEPENDENT_CODE
Если CMP0056 установлено в NEW, то CMAKE_EXE_LINKER_FLAGS также передаётся.
Изменено в версии 3.14: Если CMP0083 установлено в NEW, для получения корректной работы в момент линковки необходимо вызвать команду check_pie_supported() из модуля CheckPIESupported до использования команды try_compile().
Текущие настройки CMP0065 и CMP0083 распространяются на сгенерированный тестовый проект.
Установите переменную CMAKE_TRY_COMPILE_CONFIGURATION, чтобы выбрать конфигурацию сборки.
Новое в версии 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-инструментария и целевой системы также распространяются на тестовый проект.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/command/try_compile.html