跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Blogs
  3. YCT生成的CMake工程如何添加用户自己的源文件

YCT生成的CMake工程如何添加用户自己的源文件

已定时 已固定 已锁定 已移动 Blogs
vscodecmake
1 帖子 1 发布者 257 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • FrankieF 离线
    FrankieF 离线
    Frankie YunTu
    写于 最后由 Frankie 编辑
    #1

    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
    
    1 条回复 最后回复
    1

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YCT离线License申请流程

    帮助没办法联网的电脑使用YCT

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • demo
    12
    can
    8
    lin stack
    6
    yt-link
    5
    vscode
    3
    adc模块
    2
    i2c
    2
    uuid
    2
    Online Users
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门