鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

CMake脚本配置说明

顶层CMake配置

顶层CMake配置如下所示。

cmake_minimum_required(VERSION 3.14.1) 
project(ucc_project LANGUAGES C ASM) 
 
#  支持配置SDK包目录所在路径 
set(SDK_DIR {flexda_sdk安装路径}/flexda_sdk CACHE STRING "the path of FlexDA_SDK" FORCE) 
#  支持配置用户代码路径,即当前顶层CMake配置文件所在路径 
set(GUEST_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "the path of customer code" FORCE) 
#  支持配置板卡类型(eth_2x100ge) 
set(BOARD_TYPE "eth_2x100ge" CACHE STRING "BOARD_TYPE" FORCE) 
 
#  支持配置用户固件版本(四位数字版本号:X.Y.Z.N,每一位数字范围为0~255) 
set(VERSION "17.6.3.3" CACHE STRING "VERSION" FORCE) 
 
#  用户固件完整性签名开关(on为开,off为关) 
set(KEY_SWITCH "off" CACHE STRING "KEY_SWITCH" FORCE) 

#  支持配置用户私钥文件路径
set(PRIVATE_KEY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../build/cs_keys_and_pubkey_hash/private_key.pem CACHE STRING "the path of private key" FORCE)

#  支持配置用户公钥文件路径
set(PUBLIC_KEY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../build/cs_keys_and_pubkey_hash/public_key_ne.bin CACHE STRING "the path of public key" FORCE)
 
#  代码检查工具(verifier)开关(on为开,off为关) 
set(CODE_CHECK "on" CACHE STRING "CODE_CHECK" FORCE) 
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 
 
# 设置编译选项和工具 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTACK_CONTROL=n -DINLINE_LEVEL=1 -DDBG_PRINT=y -DCMAKE_EXPORT_COMPILE_COMMAND=1") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_MODE_ASIC -DDBG_PRINT_TO_HOST -D__INLINE_DEBUG__") 
# 支持配置日志打印级别:DDBG_PRINT_LEVEL=error/info/debug/warning 
set(DBG_PRINT_LEVEL error) 
if(DBG_PRINT_LEVEL STREQUAL "debug") 
    set(PRINT_FLAGS "${PRINT_FLAGS} -DDBG_PRINT_LV_ERROR -DDBG_PRINT_LV_WARN -DDBG_PRINT_LV_INFO -DDBG_PRINT_LV_DEBUG") 
elseif(DBG_PRINT_LEVEL STREQUAL "info") 
    set(PRINT_FLAGS "${PRINT_FLAGS} -DDBG_PRINT_LV_ERROR -DDBG_PRINT_LV_WARN -DDBG_PRINT_LV_INFO") 
elseif(DBG_PRINT_LEVEL STREQUAL "warning") 
    set(PRINT_FLAGS "${PRINT_FLAGS} -DDBG_PRINT_LV_ERROR -DDBG_PRINT_LV_WARN") 
elseif(DBG_PRINT_LEVEL STREQUAL "error") 
    set(PRINT_FLAGS "${PRINT_FLAGS} -DDBG_PRINT_LV_ERROR") 
endif() 
 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PRINT_FLAGS}") 
set(FLASH_BIN "flash_bin") 
set(NPU_DEP "" CACHE INTERNAL "Global variable") 
set(NPU_DEP_SRC "" CACHE INTERNAL "Global variable") 
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 
set(FlexDACC_TOOLCHAIN ${SDK_DIR}/tools/compiler/flexdacc) 
 
 #  执行flexdacc的环境检查功能,检查环境中的依赖是否符合要求 
execute_process( 
    COMMAND ${FlexDACC_TOOLCHAIN} --check 
    RESULT_VARIABLE FlexDACC_CHECK_RESULT 
) 
if(NOT "${FlexDACC_CHECK_RESULT}" STREQUAL "0") 
    message(FATAL_ERROR  
    "$Error: Environment check failed. \n" 
    "{FlexDACC_TOOLCHAIN} check failed with exit code: ${FlexDACC_CHECK_RESULT}") 
endif() 
 
set(CMAKE_LINKER ${FlexDACC_TOOLCHAIN}) 
set(CMAKE_CXX_COMPILER ${FlexDACC_TOOLCHAIN}) 
set(CMAKE_C_COMPILER ${FlexDACC_TOOLCHAIN}) 
set(CMAKE_C_COMPILER_ARG1 "--compile") 
set(LD_ENDIAN "-EB") 
set(LDFLAGS "${LD_ENDIAN}") 
set(LD_SCRIPT ${SDK_DIR}/build/sim_all.ld) 
 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -c -O2 -flto -flto-partition=none -fgnu89-inline -fno-gcse -fno-ipa-ra -fno-optimize-sibling-calls --param=max-inline-insns-single=400") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -Wall -Wfatal-errors -ffunction-sections -fno-builtin -ffreestanding -fno-jump-tables -fno-ipa-sra -std=gnu89 -Werror") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mgeneral-regs-only") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x27\" -ffixed-\"x27\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x26\" -ffixed-\"x26\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x21\" -ffixed-\"x21\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x20\" -ffixed-\"x20\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x19\" -ffixed-\"x19\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x28\" -ffixed-\"x28\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x23\" -ffixed-\"x23\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x24\" -ffixed-\"x24\" -fno-strict-aliasing") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcall-used-\"x22\" -ffixed-\"x22\" -fno-strict-aliasing") 
 
# 设置库文件 
set(LIB_DIR ${SDK_DIR}/lib) 
set(LIB_FILES 
        "${LIB_DIR}/libbase.a" 
        "${LIB_DIR}/libroce.a" 
        "${LIB_DIR}/libtoe.a" 
        "${LIB_DIR}/libovs.a" 
        "${LIB_DIR}/libpubservice.a" 
        "${LIB_DIR}/libnic.a" 
        "${LIB_DIR}/libvirtio.a" 
        "${LIB_DIR}/libvroce.a" 
        "${LIB_DIR}/libucc_api.a" 
) 
 
set(NPU_DEP_SRC ${NPU_DEP_SRC} ${LIB_FILES} CACHE INTERNAL "Global variable") 
add_compile_options(-mbig-endian) 
add_definitions(-DSML_TBL_DEFINE_COMPUTE_DPU) 
 
# 设置头文件路径 
set(INCLUDE_PATH ${SDK_DIR}/include) 
include_directories(${INCLUDE_PATH}) 
include_directories(${INCLUDE_PATH}/common) 
include_directories(${INCLUDE_PATH}/dfx) 
include_directories(${INCLUDE_PATH}/nal) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
include_directories(${CMAKE_BINARY_DIR}) 
 
# 设置编译任务 
add_subdirectory(${GUEST_SRCDIR}/src) 
add_custom_target(${FLASH_BIN} ALL 
        COMMAND ${CMAKE_LINKER} --link -flto -flto-partition=none -fgnu89-inline -mbig-endian -mgeneral-regs-only -fcall-used-\"x27\" -ffixed-\"x27\" -fno-strict-aliasing -fcall-used-\"x26\" -ffixed-\"x26\" -fno-strict-aliasing -fcall-used-\"x23\" -ffixed-\"x23\" -fno-strict-aliasing -fcall-used-\"x21\" -ffixed-\"x21\" -fno-strict-aliasing -fcall-used-\"x20\" -ffixed-\"x20\" -fno-strict-aliasing -fcall-used-\"x19\" -ffixed-\"x19\" -fno-strict-aliasing -fcall-used-\"x28\" -ffixed-\"x28\" -fno-strict-aliasing -fcall-used-\"x24\" -ffixed-\"x24\" -fno-strict-aliasing -fcall-used-\"x22\" -ffixed-\"x22\" -fno-strict-aliasing -march=armv8-a -Wall -nostdlib -Wfatal-errors -ffunction-sections -fno-builtin -ffreestanding -fno-jump-tables -fno-ipa-sra -std=gnu89 -t -Wl,-Map,sim.map -O2 -T ${LD_SCRIPT} -Wl,-EB -Wl,--whole-archive -Wl,--start-group ${NPU_DEP_SRC} -Wl,--end-group -o ${CMAKE_BINARY_DIR}/sim.elf 
        COMMAND_EXPAND_LISTS 
) 
add_dependencies(${FLASH_BIN} ${NPU_DEP})

以下配置支持用户根据实际情况修改,其余配置保留,如表1 配置项说明所示。

如果修改或删除保留项,会导致编译失败或烧录后挂卡。

表1 配置项说明

配置内容

是否必须

配置项

设置SDK_DIR为安装后flexda_sdk目录所在路径。

用户代码工程(如ucc_project)可放置在任意目录,但需修改该配置,填写flexda_sdk所在目录。

必须

set(SDK_DIR {编程框架自定义安装路径}/flexda_sdk  CACHE STRING "the path of FlexDA_SDK" FORCE)

例如,当用户代码工程(ucc_project)存放于{编程框架自定义安装路径}/flexda_sdk/example目录时,修改该配置为:

set(SDK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../.. CACHE STRING "the path of FlexDA_SDK" FORCE)

设置GUEST_SRCDIR为用户代码顶层CMakeLists.txt文件所在路径。

必须

set(GUEST_SRCDIR {顶层CMakeLists.txt所在目录}  CACHE STRING "the path of customer code" FORCE)

设置打印的日志级别,支持设置的日志级别有info、debug、warning、error。

必须

set(DBG_PRINT_LEVEL={日志级别})

设置板卡类型,支持配置板卡类型:eth_2x100ge、eth_2x100ge_dpu。

必须

set(BOARD_TYPE {板卡类型} CACHE STRING "BOARD_TYPE" FORCE)  

设置用户固件版本号,四位数字版本号:X.Y.Z.N,每一位数字范围为[0,255]。默认配置为0.0.0.0。

具体可参考版本管理章节。

非必须

set(VERSION "17.6.3.3" CACHE STRING "VERSION" FORCE)

设置用户固件完整性签名开关,若打开则给用户固件签名。默认配置为off。

设置为"on"时,可参考用户固件完整性保护开启固件完整性保护功能。

非必须

set(KEY_SWITCH "off" CACHE STRING "KEY_SWITCH" FORCE)

配置用户私钥文件路径。

非必须

  • 当KEY_SWITCH设置为“off”时,无需配置此选项。
  • 当KEY_SWITCH设置为“on”时,set(PRIVATE_KEY_PATH {用户私钥文件路径} CACHE STRING "the path of private key" FORCE),不设置时,为默认路径“{项目路径}/build/cs_keys_and_pubkey_hash/private_key.pem”

配置用户公钥文件路径。

非必须

  • 当KEY_SWITCH设置为“off”时,无需配置此选项。
  • 当KEY_SWITCH设置为“on”时,set(PUBLIC_KEY_PATH {用户公钥文件路径} CACHE STRING "the path of public key" FORCE),当不设置时,为默认路径“{项目路径}/build/cs_keys_and_pubkey_hash/public_key_ne.bin”

设置代码检查开关,若打开则进行代码检查,关闭时则不进行代码检查。

非必须

set(CODE_CHECK "on" CACHE STRING "CODE_CHECK" FORCE)

设置用户代码工程头文件路径。

必须

include_directories({用户代码的头文件目录})

设置用户源码子目录路径。

必须

add_subdirectory({用户源码的子目录路径})    

子目录CMake配置

子目录CMake配置示例如下所示。

#   设置子模块编译的库文件名 
add_library(ucc "")   
#   配置子模块构建工程名称                                                 
set(CUR_TARGET ucc) 
#====================== 头文件 =============================# 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/subModule) 
#======================= 源文件 ============================# 
file(GLOB SUBMODULE_FILES "subModule/*.c") 
file(GLOB CMAKE_CURRENT_SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.c") 
target_sources(${CUR_TARGET} 
        PRIVATE 
        #  添加源文件 
        ucc_main.c     
        #  添加自定义子模块                             
        ${SUBMODULE_FILES}                                                
) 
set(NPU_DEP_SRC ${NPU_DEP_SRC} ${PROJECT_BINARY_DIR}/lib/libucc.a CACHE INTERNAL "Global variable")     
set(NPU_DEP ${NPU_DEP} ucc CACHE INTERNAL "Global variable")

配置项说明如表2所示。

表2 配置项说明

配置内容

是否必须

配置项

配置子模块库文件名和工程名。

必须

add_library({库文件名} "")                                                 
 set(CUR_TARGET {构建工程名称})   

配置子模块头文件。

必须

include_directories({子模块头文件目录})

配置子模块源文件。

必须

file(GLOB {子模块名称} "{子模块源文件目录}/*.c") 
 target_sources(${CUR_TARGET} 
         PRIVATE 
         ${CMAKE_CURRENT_SOURCE_FILES}  
         ...                                
         ${子模块名称}                                                
 ) 
 set(NPU_DEP_SRC ${NPU_DEP_SRC} ${PROJECT_BINARY_DIR}/lib/lib{库文件名}.a CACHE INTERNAL "Global variable")     
 set(NPU_DEP ${NPU_DEP} {构建工程名称}  CACHE INTERNAL "Global variable")

各模块CMake

各模块CMake配置示例如下所示。

#======================= 源文件 ============================# 
 target_sources(${CUR_TARGET} 
     PRIVATE 
         ucc_hitch_ack.c                  #   添加自定义子模块源文件
         ucc_hitch_timeout.c 
         ucc_hitch_nack.c 
)