DPDK - 使用 cmake 构建l2fwd多平台编译系统
配置cmake基础参数
cmake_minimum_required(VERSION 3.10)
set(CMAKE_SYSTEM_NAME Linux)
message(STATUS "CC: \"$ENV{CC}\"")
message(STATUS "CXX: \"$ENV{CXX}\"")
message(STATUS "CMAKE_C_COMPILER: \"${CMAKE_C_COMPILER}\"")
message(STATUS "CMAKE_CXX_COMPILER: \"${CMAKE_CXX_COMPILER}\"")
# 设置C/CXX默认编译器 clang/clang++
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
#set(ENV{VERBOSE} 1)
# 设置默认 BUILD_TYPE
if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()
message(STATUS "Build type: \"${CMAKE_BUILD_TYPE}\"")
配置 DPDK 编译参数
project(l2fwd C)
# 设置 DPDK SDK/TARGET 目录
set(DPDK_SDK /DPDK/v1911)
set(DPDK_TARGET v1911_znver1-clang-11.0.0-fc29)
include_directories (
${CMAKE_SOURCE_DIR}
)
link_directories (
${CMAKE_SOURCE_DIR}/lib
)
string(CONCAT CMAKE_C_FLAGS_DEBUG
"-O0 "
"-g3 "
"-fstack-protector "
"-DFORTIFY_SOURCE=2 "
"-fno-common "
)
string(CONCAT CMAKE_C_LDFLAGS_DEBUG
"-g3 "
)
# 设置默认编译参数
string(CONCAT CMAKE_C_FLAGS_RELWITHDEBINFO
"-Ofast "
"-g3 "
"-m64 -pthread "
"-D_GNU_SOURCE "
"-DNDEBUG "
"-w -Wextra -Wall "
"-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wdeprecated -Wno-missing-field-initializers -Wno-address-of-packed-member"
)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_machine_target 构建target编译参数
macro(add_machine_target dpdk_target dpdk_machine)
set(build_target ${dpdk_target}_l2fwd)
message(STATUS "Add build target: \"${build_target}\"")
add_executable(${build_target} main.c)
# 配置执行文件输出目录 & 输出名字, 这里配置所有输出文件名同为 l2fwd
set_target_properties(${build_target} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${dpdk_target}"
RUNTIME_OUTPUT_NAME l2fwd
)
# 添加DPDK include 目录
target_include_directories (
${build_target} PRIVATE
${DPDK_SDK}/${dpdk_target}/include
${CMAKE_SOURCE_DIR}/
)
# 添加DPDK链接库目录
target_link_directories (
${build_target} PRIVATE
${DPDK_SDK}/${dpdk_target}/lib
)
# 将空格分隔的编译参数转换为CMAKE支持的";"好分隔字符串
string(REPLACE " " ";" dpdk_cflags ${dpdk_machine})
message(STATUS "target_compile_options ${dpdk_cflags}")
# 配置编译参数
target_compile_options(
${build_target} PRIVATE
${dpdk_cflags}
)
# 配置链接库, MLX5 可根据需要自行修改
target_link_libraries(
${build_target}
-Wl,--start-group -Wl,--whole-archive
dpdk
-Wl,--no-whole-archive -Wl,--end-group
ibverbs
mlx5
mnl
dl
m
numa
pthread
)
endmacro()
配置多个TARGET
list(APPEND targets v1911_2670x2-clang-11.0.1 v1911_2699v4-clang-10.0.0)
list(APPEND machines -march=sandybridge -march=broadwell )
# 生成多个target
foreach(t m IN ZIP_LISTS targets machines)
message(STATUS "target=${t} marchin=${m}")
add_machine_target("${t}" "${m}")
endforeach()
完整CMakeLists.txt
注:
可添加多个DPDK版本&RTE_TARGET编译环境
cmake_minimum_required(VERSION 3.10)
set(CMAKE_SYSTEM_NAME Linux)
message(STATUS "CC: \"$ENV{CC}\"")
message(STATUS "CXX: \"$ENV{CXX}\"")
message(STATUS "CMAKE_C_COMPILER: \"${CMAKE_C_COMPILER}\"")
message(STATUS "CMAKE_CXX_COMPILER: \"${CMAKE_CXX_COMPILER}\"")
# 设置C/CXX默认编译器 clang/clang++
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
#set(ENV{VERBOSE} 1)
# 设置默认 BUILD_TYPE
if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()
message(STATUS "Build type: \"${CMAKE_BUILD_TYPE}\"")
project(l2fwd C)
# 设置 DPDK SDK/TARGET 目录
set(DPDK_SDK /DPDK/v1911)
set(DPDK_TARGET v1911_znver1-clang-11.0.0-fc29)
include_directories (
${CMAKE_SOURCE_DIR}
)
link_directories (
${CMAKE_SOURCE_DIR}/lib
)
string(CONCAT CMAKE_C_FLAGS_DEBUG
"-O0 "
"-g3 "
"-fstack-protector "
"-DFORTIFY_SOURCE=2 "
"-fno-common "
)
string(CONCAT CMAKE_C_LDFLAGS_DEBUG
"-g3 "
)
# 设置默认编译参数
string(CONCAT CMAKE_C_FLAGS_RELWITHDEBINFO
"-Ofast "
"-g3 "
"-m64 -pthread "
"-D_GNU_SOURCE "
"-DNDEBUG "
"-w -Wextra -Wall "
"-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wdeprecated -Wno-missing-field-initializers -Wno-address-of-packed-member"
)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
macro(add_machine_target dpdk_target dpdk_machine)
set(build_target ${dpdk_target}_l2fwd)
message(STATUS "Add build target: \"${build_target}\"")
add_executable(${build_target} main.c)
# 配置执行文件输出目录 & 输出名字, 这里配置所有输出文件名同为 l2fwd
set_target_properties(${build_target} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${dpdk_target}"
RUNTIME_OUTPUT_NAME l2fwd
)
# 添加DPDK include 目录
target_include_directories (
${build_target} PRIVATE
${DPDK_SDK}/${dpdk_target}/include
${CMAKE_SOURCE_DIR}
)
# 添加DPDK链接库目录
target_link_directories (
${build_target} PRIVATE
${DPDK_SDK}/${dpdk_target}/lib
)
# 将空格分隔的编译参数转换为CMAKE支持的";"好分隔字符串
string(REPLACE " " ";" dpdk_cflags ${dpdk_machine})
message(STATUS "target_compile_options ${dpdk_cflags}")
# 配置DPDK编译参数
target_compile_options(
${build_target} PRIVATE
${dpdk_cflags}
)
# 配置链接库, MLX5 可根据需要自行修改
target_link_libraries(
${build_target}
-Wl,--start-group -Wl,--whole-archive
dpdk
-Wl,--no-whole-archive -Wl,--end-group
ibverbs
mlx5
mnl
dl
m
numa
pthread
)
endmacro()
# 配置多TARGET
list(APPEND targets v1911_2670x2-clang-11.0.1 v1911_2699v4-clang-10.0.0-fc29 )
list(APPEND machines -march=sandybridge -march=broadwell )
# 生成多个target
foreach(t m IN ZIP_LISTS targets machines)
message(STATUS "target=${t} marchin=${m}")
add_machine_target("${t}" "${m}")
endforeach()