CMake脚本配置说明
顶层CMake
顶层CMake配置如下所示。
cmake_minimum_required(VERSION 3.14.1)
project(fullnat_ovs 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_dpu)
set(BOARD_TYPE "eth_2x100ge_dpu" 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)
# 求解器(Res_Planning)开关(on为开,off为关)
set(RES_PLAN_ENABLE "on" CACHE STRING "RES_PLAN_ENABLE" FORCE)
# 设置资源文件路径
# set(RES_XML ${SDK_DIR}/tools/res_planning/configs/dpu3.1/eth_2x100G_dpu/resource_eth_2x100G_dpu_bms_blk.xml CACHE STRING "RES_XML" FORCE)
# 设置编译选项和工具
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_EXPORT_COMPILE_COMMANDS ON)
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 FlexDAACC_CHECK_RESULT
)
if(NOT "${FlexDACC_CHECK_RESULT}" STREQUAL "0")
message(FATAL_ERROR
"$Error: Environment check failed. \n"
"{FlexDAACC_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}) # Use flexdacc as the C compiler
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 -ffunction-sections -fno-builtin -ffreestanding -fno-jump-tables -fno-ipa-sra -std=gnu89")
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}/libnal.a"
"${LIB_DIR}/libhal.a"
"${LIB_DIR}/libvroce.a"
"${LIB_DIR}/libdsl.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)
add_definitions(-DHYDRA_LOG)
# 设置头文件路径
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(${INCLUDE_PATH}/dsl)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
include_directories(${CMAKE_BINARY_DIR})
# 设置固件编译任务
add_subdirectory(${GUEST_SRCDIR}/src_dsl)
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})
以下配置支持用户根据实际情况修改,其余配置保留。
配置内容 |
是否必须 |
配置项 |
|---|---|---|
设置SDK_DIR为安装后flexda_sdk目录所在路径。 用户代码工程(如ovs_project)可放置在任意目录,但需修改该配置,填写flexda_sdk所在目录 |
必须 |
set(SDK_DIR {编程框架自定义安装路径}/flexda_sdk CACHE STRING "the path of FlexDA_SDK" FORCE)
例如,当用户代码工程存放于{编程框架自定义安装路径}/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)
|
设置资源文件路径RES_XML |
非必须 |
set(RES_XML {资源文件路径} CACHE STRING "RES_XML" FORCE)
可选,当不填写该项时,使用flexda_sdk中的默认配置文件 |
设置打印的日志级别,支持设置的日志级别:info、debug、warning、error。 |
必须 |
set(DBG_PRINT_LEVEL={日志级别})
|
设置板卡类型,支持配置板卡类型: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) |
配置用户私钥文件路径。 |
非必须 |
|
配置用户公钥文件路径。 |
非必须 |
|
设置求解器开关,若打开,则会调用求解器。默认配置为on。 |
必须 |
set(RES_PLAN_ENABLE "on" CACHE STRING "RES_PLAN_ENABLE" FORCE) 须知:
OVS特性中,该项为必选项,且必须为“on”,否则可能导致编译报错。 |
设置用户代码工程头文件路径。 |
必须 |
include_directories({用户代码的头文件目录})
|
设置用户源码子目录路径。 |
必须 |
add_subdirectory({用户源码的子目录路径})
|
数据面的子目录CMake配置
子目录CMake配置如下所示。
add_library(fullnat "")
set(CUR_TARGET fullnat)
# 设置cmake和make处理.hdr文件的方式
set_source_files_properties({用户源文件}.hdr PROPERTIES LANGUAGE C COMPILE_OPTIONS "-xc")
#======================= 源文件 ============================#
target_sources(${CUR_TARGET}
PRIVATE
{用户源文件}.hdr
)
set(NPU_DEP_SRC ${NPU_DEP_SRC} ${PROJECT_BINARY_DIR}/lib/libfullnat.a CACHE INTERNAL "Global variable")
set(NPU_DEP ${NPU_DEP} fullnat CACHE INTERNAL "Global variable")
配置项说明如表2所示。
配置内容 |
是否必须 |
配置项 |
|---|---|---|
配置子模块库文件名和工程名 |
必须 |
add_library({库文件名} "")
set(CUR_TARGET {构建工程名称})
|
配置子模块源文件,target_sources下只能添加一个.hdr文件 |
必须 |
target_sources(${CUR_TARGET}
PRIVATE
{用户源文件}.hdr
)
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")
须知:
对于DSL代码文件后缀必须为“.hdr”,且文件名中仅能包含大小写字母、数字及下划线('a-z' 'A-Z' '0-9' '_')。 |
控制面子目录CMake配置
子目录CMake配置如下所示。
add_library(custom_openvswitch_plugin SHARED context.c)
target_include_directories(custom_openvswitch_plugin PUBLIC ./)
target_include_directories(custom_openvswitch_plugin PUBLIC ../../../include/control_plane)
set_target_properties(custom_openvswitch_plugin PROPERTIES
OUTPUT_NAME "custom_openvswitch_plugin"
PREFIX ""
)
配置项说明如表3所示。