升级npk.yml以支持Nuclei Studio 2023.10

在Nuclei Studio 2023.10中,一个重要变更,是支持GCC 13, 所以之前发布的NPK Package也需要做对应的变更,以更好的适用于Nuclei Studio 2023.10,其中有以下几个变更点。

需要注意新版的npk.yml 不再支持以前 2022.12版本的IDE

npk.yml中的工具链升级

在npk中,我们定义了buildconfig来自定义工程build时的各种参数,Nuclei Studio通过type标识使用的是那一种toolchain,如gcc、clang等, 通过 type->toolchain_name & cross_prefix 来标识使用的toolchain里面具体的那个发行版本。升级SDK以支持GCC 13,对比以下两个例子不难看出, 只需要修改 toolchain_name: RISC-V GCC/Newlib 和 cross_prefix: riscv64-unknown-elf- ,就可以使SDK支持在创建工程时,可以选择GCC 13工具链。

以下内容是支持gcc 10 的buildconfig配置(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)。

## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei GNU Toolchain
    cross_prefix: riscv-nuclei-elf- # optional
    common_flags: # flags need to be combined together across all packages
    ldflags:
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

下以内容,是支持GCC 13和Clang的buildconfig配置(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)。

## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei GNU Toolchain
    # 升级到 GCC13时,这里进行如下两行的改变
    # 且针对所有npk.yml的文件只要包含buildconfig的都需要进行修改,不仅仅限于ssp/bsp类型,还包括bsp/app/mwp/osp/sdk类型
    toolchain_name: RISC-V GCC/Newlib
    cross_prefix: riscv64-unknown-elf- # optional
    common_flags: # flags need to be combined together across all packages
    ldflags:
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:
  - type: clang
    description: Nuclei LLVM Toolchain
    toolchain_name: RISC-V Clang/Newlib
    cross_prefix: riscv64-unknown-elf- # optional
    common_flags: # flags need to be combined together across all packages
    ldflags:
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

除标准的IMAFDC之外的扩展(ARCHEXT)的升级

以下示例以Nuclei SDK 0.5.0的evalsoc的npk.yml升级举例, 仅考虑GCC的支持,如果需要考虑CLANG的支持,请参见 SDK中evalsoc的npk.yml的详细变更

在GCC 13中,对RISC-V 指令扩展使用有了很大的变更,具体内容可以查看Nuclei Studio用户手册2.1.4章内容和Nuclei SDK中ARCH_EXT说明。

升级npk.yml时,如果SDK中使用到了RISC-V 除了标准的IMAFDC之外指令扩展,例如B/P/K/V, 也需要升级对应的配置。

在NPK中,RISC-V 指令扩展以是-march=xxx的方式传递给Nuclei Studio,Nuclei Studio接收到相关配置,就会存储并应用到编译的过程中。 以Nuclei SDK中的npk.yml为例,通过下面这段配置我们就可以得到-march=的值,不难看出与RISC-V指令扩展相关的是NPK中的变量nuclei_archext

## (为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)
## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei RISC-V GNU Toolchain #must
    cross_prefix: riscv-nuclei-elf- # optional
    common_flags: # flags need to be combined together across all packages
      # 这里 -march 传递的值 就是 nuclei_core.arch 和 nuclei_archext 两个变量拼接而来
      # 例如 nuclei_core.arch设置为rv32imafdc, nuclei_archext设置为 _zba_zbb_zbc_zbs_xxldspn1x,
      # 那么 传递的就是 -march=rv32imafdc_zba_zbb_zbc_zbs_xxldspn1x
      # 如果你的 march是已知和确定的,这里直接就可以给定 -march/-mabi的选项,无需通过 configuration字段来进行传递
      - flags: -march=${nuclei_core.arch}$(join(${nuclei_archext},'')) -mabi=${nuclei_core.abi}
    ldflags:
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

在旧版的SDK中,nuclei_archext定义的是一个multicheckbox,用户可以自己选择,而在新版的SDK中nuclei_archext定义的是一个text输入框, 这样用户可以更灵活的使用RISC-V 指令扩展,如果在某些工程或场景下,想要预设一些RISC-V 指令扩展,建议给一个默认值就可以了,可以参考下代的示例代码。

  • 用于支持Nuclei RISC-V Toolchain 2022.12的写法
  ## 旧版的SDK中,nuclei_archext定义的是一个multicheckbox
  ##(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)
  nuclei_archext:
    default_value: []
    type: multicheckbox
    global: true
    description: Nuclei ARCH Extensions
    choices:
      - name: b
        description: Bitmanip Extension
      - name: p
        description: Packed SIMD Extension
      - name: v
        description: Vector Extension
  • 用于支持Nuclei RISC-V Toolchain 2023.10的写法
    ## 新版的SDK中nuclei_archext定义的是一个text输入框
    ## Package Configurations
    configuration:
    nuclei_archext:
        default_value: "_zba_zbb_zbc_zbs"
        type: text
        global: true
        # hints and tips are introduced in Nuclei Studio 2023.10
        # used to show tool tips and input hints
        tips: "Possible other ISA extensions, seperated by underscores, like '_zba_zbb_zbc_zbs_xxldspn1x'"
        hints: "_zba_zbb_zbc_zbs_xxldspn1x"
        description: Nuclei ARCH Extensions

最终显示创建项目的时候显示效果如下

libncrt的升级

libncrt较之前也有了些许变化,在NPK中使用libncrt之前,新旧版SDK中都是一样的在conifguration中定义了一个变量stdclib, 它的值是一个下拉框,可以选择不同的值。不同点是在得到stdclib后,在common_flags或者其它地方使用stdclib时略有不同。

关于stdclib的一些说明,可以参见 这里

## 定义stdclib变量
##(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)
## Package Configurations
configuration:
  stdclib:
    default_value: newlib_nano
    type: choice
    global: true
    description: Standard C Library
    choices:
      - name: newlib_full
        description: newlib with full feature
      - name: newlib_fast
        description: newlib nano with printf/scanf float
      - name: newlib_small
        description: newlib nano with printf float
      - name: newlib_nano
        description: newlib nano without printf/scanf float
      - name: libncrt_fast
        description: nuclei c runtime library, optimized for speed
      - name: libncrt_balanced
        description: nuclei c runtime library, balanced, full feature
      - name: libncrt_small
        description: nuclei c runtime library, optimized for size, full feature
      - name: libncrt_nano
        description: nuclei c runtime library, optimized for size, no float support
      - name: libncrt_pico
        description: nuclei c runtime library, optimized for size, no long/long long support
      - name: nostd
        description: no std c library will be used, and don't search the standard system directories for header files
      - name: nospec
        description: no std c library will be used, not pass any --specs options

在新版的SDK中,如果使用--specs=libncrt_xxx.specs 或者链接库里面包含 -lncrt_xxx (表示采用libncrt c库), 则需变更为 -lncrt_xxx -lfileops_uart -lheapops_basic,这也是旧SDK变更为支持GCC 13的新SDK的原则。

下面配置为在旧版SDK中的npk变量stdclib,当变量stdclib以libncrt开头时,会直接定义一个--specs=${stdclib}.specs, 按照上面我们说的原则,这里应该变成设置-l$(subst(${stdclib},lib,)) -lfileops_uart -lheapops_basic,所以在新版SDK中的写法就变成了下面的配置方式。

## 在旧版SDK中使用stdclib变量
##(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)
## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei GNU Toolchain
    cross_prefix: riscv-nuclei-elf- # optional
    common_flags: # flags need to be combined together across all packages
      - flags: --specs=${stdclib}.specs
        condition: $( startswith(${stdclib}, "libncrt") )
    ldflags:
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

转变为

## 在新版SDK中使用stdclib变量
##(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)
## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei GNU Toolchain
    toolchain_name: RISC-V GCC/Newlib
    cross_prefix: riscv64-unknown-elf- # optional
    common_flags: # flags need to be combined together across all packages
      - flags: --specs=${stdclib}.specs
        condition: $( startswith(${stdclib}, "libncrt") )
    ldflags:
      - flags: -l$(subst(${stdclib},lib,)) -lheapops_basic -lfileops_uart
        condition: $( startswith(${stdclib}, "libncrt") )
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

在Nuclei Studio 2023.10中集成的GCC 13,在使用过程中会有warning,链接选项增加一个-Wl,--no-warn-rwx-segments可以隐藏warning。

具体可以参考以下配置(为了方便举例,隐藏了部分参数,具体参数根据实际情况定义)

## Build Configuration
buildconfig:
  - type: gcc
    description: Nuclei GNU Toolchain
    toolchain_name: RISC-V GCC/Newlib
    cross_prefix: riscv64-unknown-elf- # optional
    common_flags: # flags need to be combined together across all packages
    ldflags:
       # 用于消除gcc13链接阶段的warning
       - flags: -Wl,--no-warn-rwx-segments
    cflags:
    asmflags:
    cxxflags:
    common_defines:
    prebuild_steps: # could be override by app/bsp type
      command:
      description:
    postbuild_steps: # could be override by app/bsp type
      command:
      description:

关于Nuclei SDK 0.5.0 npk.yml 详细变更

关于支持Nuclei Studio + Nuclei RISC-V Toolchain 2023.10的npk.yml变更,可以参考nuclei-sdk 0.5.0的变更。

  • gd32vf103的变化 git diff 0.4.1..0.5.0 SoC/gd32vf103/***npk.yml

  • evalsoc的变化: git diff 0.4.1..0.5.0 SoC/evalsoc/***npk.yml

  • NMSIS的变化: git diff 0.4.1..0.5.0 NMSIS/***npk.yml

  • application的变化: git diff 0.4.1..0.5.0 application/***npk.yml

  • RTOS的变化: git diff 0.4.1..0.5.0 OS/***npk.yml

执行查看代码变更命令方法如下

git clone https://github.com/Nuclei-Software/nuclei-sdk/
cd nuclei-sdk
git fetch --all 
git diff 0.4.1..0.5.0 SoC/gd32vf103/***npk.yml
git diff 0.4.1..0.5.0 SoC/evalsoc/***npk.yml
git diff 0.4.1..0.5.0 NMSIS/***npk.yml
git diff 0.4.1..0.5.0 application/***npk.yml
git diff 0.4.1..0.5.0 OS/***npk.yml