YCT生成的CMake工程如何添加用户自己的源文件
-
CMake
介绍
CMake 在嵌入式编程中的地位已经越来越重要。它是一个强大的跨平台自动化构建系统,能够管理大型项目中的软件构建过程。以下是几个方面,说明了CMake在嵌入式领域的重要性和使用情况:
- 跨平台兼容性:CMake可以生成各种平台上的编译环境,包括Windows、MacOS和各种Unix-like系统。这使得它特别适合于开发可以在多种硬件上运行的嵌入式软件。
- 灵活性和可扩展性:CMake支持复杂的项目结构,可以轻松地管理多个库和应用程序的依赖关系。这对于嵌入式系统开发尤其重要,因为这些系统往往包含多个模块和组件。
- 工具链集成:CMake可以与各种编译器和工具链无缝集成,如GCC、Clang等,以及专用的嵌入式开发工具链,如ARM Keil、IAR等。这使得开发者可以更容易地在其选择的环境中编译和测试代码。YCT 支持生成CMAKE-GCC/CMAKE-IAR/CMAKE-KEIL/CMAKE-GHS
- 代码可重用性:使用CMake可以更容易地在不同项目之间重用代码。通过寻找包和库,CMake允许开发者将常用的功能或库集成到新的嵌入式项目中,而无需重新配置整个构建环境。
YCT生成的CMAKE文件架构
YCT生成的cmake文件遵守最新的Modern Cmake的理解:
- 目标导向:Modern CMake 鼓励使用基于目标(target)的指令来管理构建配置,而不是基于全局的设置。每个目标可以定义自己的编译选项、预处理器定义、链接库等,这使得项目更加模块化和易于管理。
- 用法要求:在传统 CMake 中,库的依赖关系通常通过全局变量和目录链接来管理。而在 Modern CMake 中,推荐使用 target_link_libraries、target_compile_definitions 和 target_include_directories 等命令为目标设置用法要求。这样,当其他目标链接到库时,它们会自动继承正确的编译器标志、宏定义和包含路径。
YCT生成的工程默认是如下的配置:
project 包含:GENERATED_CONFIG_TARGET,GENERATED_SDK_TARGET- GENERATED_CONFIG_TARGET target 包含board下的源文件和头文件
- GENERATED_SDK_TARGET target 包含生成代码(SDK/MCAL)的源文件
- GENERATED_CONFIG_TARGET 和 GENERATED_SDK_TARGET 互相依赖
- Project默认会包含APP目录下的所有的.c,.S文件,同时APP目录会作为include目录
add_executable(${project_elf} app/main.c) #add app as include path target_include_directories(${project_elf} PRIVATE app) #add all source files in app folder file(GLOB dir_sources "app/*.c" "app/*.cpp" "app/*.S") if(dir_sources) foreach(src ${dir_sources}) target_sources(${project_elf} PRIVATE ${src}) endforeach() endif()
添加额外的源文件
直接修改顶层的CMakeLists.txt文件
用户可以直接在 USER CODE BEGIN 开始,USER CODE END 介绍的中间部分增加自己的配置代码,在这之间生成的代码不会被覆盖掉
# USER CODE BEGIN include # target_include_directories(...) # USER CODE END include # USER CODE BEGIN add_executable # target_sources(${project_elf} PRIVATE ..) # USER CODE END add_executable
下面以增加bsp目录为例:
# USER CODE BEGIN include # 增加bsp/inc头文件搜索路径 target_include_directories(${project_elf} PRIVATE "bsp/inc") # USER CODE END include # USER CODE BEGIN add_executable # 增加源文件bsp/bsp.c 作为源代码 target_sources(${project_elf} PRIVATE "bsp/bsp.c") # USER CODE END add_executable
添加一个独立的target文件
当源文件比较多的时候,或者想更好的控制代码的编译选项的时候,建议增加一个独立的target方式来实现,还是以bsp代码作为例子。
写一个BSP.cmake 文件放到bsp目录
cmake_minimum_required(VERSION 3.16) set(sources bsp.c ) #增加头文件 set(includes inc) #增加私有头文件 set(priIncludes ) add_library(BSP STATIC ${sources}) target_include_directories(BSP PUBLIC ${includes}) target_include_directories(BSP PRIVATE ${priIncludes}) #添加基础的编译选项,如CPU类型等 configcore(BSP ${CMAKE_SOURCE_DIR}) #增加宏定义,PRVIATA代表只有这个target里的源代码可以识别到这个宏,(不用加-D) target_compile_definitions(BSP PRIVATE BSP ) #对BSP target的代码单独设置优化选项,不影响其他模块 target_compile_options(BSP PRIVATE -O1 ) #如果BSP代码访问到了SDK的头文件,那么需要添加依赖的target target_link_libraries(BSP GENERATED_CONFIG_TARGET GENERATED_SDK_TARGET )
修改顶层的CMakeLists.txt文件
# USER CODE BEGIN include #包含我们添加的BSP.cmake文件 include(${CMAKE_SOURCE_DIR}/bsp/BSP.cmake) #把BSP target 加入到project里 target_link_libraries(${project_elf} BSP) # USER CODE END include
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...