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 配置项说明所示。
如果修改或删除保留项,会导致编译失败或烧录后挂卡。
配置内容 |
是否必须 |
配置项 |
|---|---|---|
设置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) |
配置用户私钥文件路径。 |
非必须 |
|
配置用户公钥文件路径。 |
非必须 |
|
设置代码检查开关,若打开则进行代码检查,关闭时则不进行代码检查。 |
非必须 |
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所示。
配置内容 |
是否必须 |
配置项 |
|---|---|---|
配置子模块库文件名和工程名。 |
必须 |
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
)
父主题: UCC场景代码工程