CMake是一款强大的开源跨平台软件构建系统,支持多种目标构建系统,广泛应用于嵌入式软件开发。
本文主要介绍如何使用IAR工具链进行CMake构建。
准备工作
- 下载,安装和激活IAR工具链
- 下载,安装CMake
使用IAR工具链进行CMake构建
使用IAR工具链进行CMake构建主要需要配置两个文件
- CMakeLists.txt 文件
- CMake工具链文件:包含对应工具链的信息,通常为.cmake文件
下面是IAR EWARM v9.70.4对应的CMake工具链文件 (对应ninja.exe位于安装目录common/bin下面):
set(CMAKE_ASM_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iasmarm.exe")
set(CMAKE_C_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iccarm.exe")
set(CMAKE_CXX_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iccarm.exe")
if(CMAKE_GENERATOR MATCHES "^Ninja.*$")
find_program(CMAKE_MAKE_PROGRAM
NAMES ninja.exe
PATHS $ENV{PATH}
"C:/iar/ewarm-9.70.4/common/bin"
REQUIRED)
endif()
下面主要介绍IAR工具链的CMakeLists.txt文件 (注意:CMakeLists.txt 文件本身功能非常强大,这里只介绍跟IAR工具链相关的部分)。
设置使能IAR编译器语言扩展(对应编译器选项-e):
set(CMAKE_C_EXTENSIONS ON)
set(CMAKE_CXX_EXTENSIONS ON)
设置IAR编译器和汇编器选项
target_compile_options(BareMetal PRIVATE
$<$<COMPILE_LANGUAGE:C>:
--cpu=Cortex-M4
--fpu=VFPv4_sp
--dlib_config=normal
--require_prototypes
-Ol
>
$<$<COMPILE_LANGUAGE:ASM>:
--cpu Cortex-M4
--fpu VFPv4_sp
-s+
-M[]
-w+
>)
设置IAR链接器选项 (注意:如果有重复的参数,需要使用SHELL:)
target_link_options(BareMetal PRIVATE
--map .
--config ../stm32f405xG.icf
--semihosting
--entry Reset_Handler
--place_holder __checksum,4,.checksum,4
#CMake requires the SHELL: prefix for repeated parameters
SHELL:--define_symbol=__checksum_begin=0x8000000
SHELL:--define_symbol=__checksum_end=0x800FFFB
--redirect __iar_sh_stdout=__iar_sh_stdout_swo
--vfe
--text_out locale
--cpu=Cortex-M4
--fpu=VFPv4_sp)
使用ielftool生成checksum:
add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--verbose
--fill="0xFF\;0x8000000-0x800FFFB"
--checksum="__checksum:4,crc32:Li,0xFFFFFFFF\;0x8000000-0x800FFFB"
$<TARGET_FILE:BareMetal>
$<TARGET_FILE:BareMetal>)
使用ielftool生成hex文件:
add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--ihex
--verbose
$<TARGET_FILE:BareMetal>
$<TARGET_FILE_DIR:BareMetal>/BareMetal.hex)
使用ielftool生成bin文件:
add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--bin
--verbose
$<TARGET_FILE:BareMetal>
$<TARGET_FILE_DIR:BareMetal>/BareMetal.bin)
在命令行中输入cmake -G "Ninja Multi-Config" -B build --toolchain ewarm.cmake命令生成对应的Ninja构建

在命令行中输入cmake --build build --config Debug命令进行Debug构建:

在EWARM中新建工程调试对应CMake构建的elf文件,选择工程类型为Externally built executable:

按照readme_external_binary.txt里面的步骤配置对应的调试工程:
- 添加对应的elf文件
- 配置对应的芯片(Options > General Options > Target > Device)
- 配置对应的调试器选项(Options > Debugger > Setup > Driver)
然后就可以进行下载调试了:

另外IAR EWARM v9.60.2开始支持导入CMakeLists.txt 文件,基于CMake进行构建。
在EWARM中新建CMake工程,选择工程类型为Import CMakeLists.txt:

选择对应的CMakeLists.txt文件之后,CMake/CMSIS-Toobox窗口会输出生成的CMake构建信息:

右击工程,选择Make进行构建,对应Build窗口会输出对应CMake构建信息:

配置调试选项:
-
配置对应的芯片(Options > General Options > Target > Device)
-
配置对应的调试器选项(Options > Debugger > Setup > Driver)
然后就可以进行下载调试了:

注意事项
IAR IDE中构建linker会按照模块名字的字母顺序进行链接,而CMake中构建linker会按照target_sources()中指定的模块顺序进行链接,如果想让IAR IDE工程和CMake工程的输出一致,需要配置CMake的target_sources()按照模块名字的字母顺序进行排列,这样IAR IDE工程和CMake工程链接的时候都会按照模块名字的字母顺序进行链接,从而保证输出一致。
总结
本文主要以IAR EWARM v9.70.4为例介绍如何使用IAR工具链进行CMake构建,对应方法同样适用于IAR Build Tools,更多信息可以参考https://github.com/iarsystems/cmake-tutorial 或者联系IAR中国。
参考文献:
