如何通过编译器可靠判断当前CMake使用的是AVR编译器?
优雅检测AVR编译目标的CMake方法
方法一:通过编译器目标三元组检测(最可靠)
AVR交叉编译器的目标架构固定为avr,通过让编译器输出目标信息判断,不受编译器文件名、路径或平台后缀影响,是最可靠的方案:
# 检测是否为AVR编译器 if(CMAKE_C_COMPILER) execute_process( COMMAND ${CMAKE_C_COMPILER} -dumpmachine OUTPUT_VARIABLE COMPILER_TARGET OUTPUT_STRIP_TRAILING_WHITESPACE ) string(FIND "${COMPILER_TARGET}" "avr" AVR_TARGET_FOUND) if(AVR_TARGET_FOUND GREATER_EQUAL 0) set(IS_AVR ON CACHE BOOL "Targeting AVR architecture") else() set(IS_AVR OFF CACHE BOOL "Not targeting AVR architecture") endif() endif()
方法二:通过编译器名称检测(简单直接)
如果不想执行外部命令,可以直接检查编译器的文件名(自动处理Windows下的.exe后缀),适合常规使用场景:
# 通过编译器名称检测AVR if(CMAKE_C_COMPILER) get_filename_component(COMPILER_NAME "${CMAKE_C_COMPILER}" NAME_WE) if(COMPILER_NAME STREQUAL "avr-gcc") set(IS_AVR ON CACHE BOOL "Targeting AVR architecture") else() set(IS_AVR OFF CACHE BOOL "Not targeting AVR architecture") endif() endif()
统一使用IS_AVR变量
设置好IS_AVR后,即可在CMake脚本中统一用该变量做条件判断,适配不同编译环境:
if(IS_AVR) add_compile_options(--arduino-avr-specific-option) # 添加其他AVR专属配置:链接选项、头文件包含路径等 endif()
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

