function(do_build_dpdk dpdk_dir)
+ # mk/machine/native/rte.vars.mk
+ # rte_cflags are extracted from mk/machine/${machine}/rte.vars.mk
+ # only 3 of them have -march=<arch> defined, so copying them here.
+ # we need to pass the -march=<arch> to ${cc} as some headers in dpdk
+ # require it to compile. for instance, dpdk/include/rte_memcpy.h.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "i386")
set(arch "x86_64")
set(machine "default")
set(arch "x86_64")
set(machine "default")
set(machine_tmpl "native")
+ set(rte_cflags "-march=core2")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM")
set(arch "arm")
set(machine "armv7a")
set(machine_tmpl "armv7a")
+ set(rte_cflags "-march=armv7-a")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
set(arch "arm64")
set(machine "armv8a")
set(machine_tmpl "armv8a")
+ set(rte_cflags "-march=armv8-a+crc")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(powerpc|ppc)64")
set(arch "ppc_64")
set(machine "power8")
"unknown arch \"${CMAKE_SYSTEM_PROCESSOR}\"")
endif()
+ if(NOT TARGET dpdk::cflags)
+ add_library(dpdk::cflags INTERFACE IMPORTED)
+ if (rte_cflags)
+ set_target_properties(dpdk::cflags PROPERTIES
+ INTERFACE_COMPILE_OPTIONS "${rte_cflags}")
+ endif()
+ endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(execenv "linuxapp")
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
# target
file(MAKE_DIRECTORY ${DPDK_INCLUDE_DIR})
foreach(c
- bus_pci pci
+ bus_pci
eal
- mempool mempool_ring mempool_stack ring)
+ mempool
+ mempool_ring
+ mempool_stack
+ pci
+ ring)
add_library(dpdk::${c} STATIC IMPORTED)
add_dependencies(dpdk::${c} dpdk-ext)
set(dpdk_${c}_LIBRARY
"${DPDK_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rte_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}")
set_target_properties(dpdk::${c} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${DPDK_INCLUDE_DIR}
+ INTERFACE_LINK_LIBRARIES dpdk::cflags
IMPORTED_LOCATION "${dpdk_${c}_LIBRARY}")
list(APPEND DPDK_LIBRARIES dpdk::${c})
endforeach()
+ add_library(dpdk::dpdk INTERFACE IMPORTED)
+ set_target_properties(dpdk::dpdk PROPERTIES
+ INTERFACE_LINK_LIBRARIES "${DPDK_LIBRARIES}")
endmacro()
#
# Once done, this will define
#
-# DPDK_FOUND
-# DPDK_INCLUDE_DIR
-# DPDK_LIBRARIES
+# dpdk_FOUND
+# dpdk_INCLUDE_DIR
+# dpdk_LIBRARIES
-find_path(DPDK_INCLUDE_DIR rte_config.h
- PATH_SUFFIXES dpdk
- HINTS $ENV{DPDK_DIR}/include)
+find_package(PkgConfig QUIET)
+if(PKG_CONFIG_FOUND)
+ pkg_check_modules(dpdk_pc QUIET libdpdk)
+endif()
+
+find_path(dpdk_INCLUDE_DIR rte_config.h
+ HINTS
+ ENV DPDK_DIR
+ ${dpdk_pc_INCLUDE_DIRS}
+ PATH_SUFFIXES dpdk include)
set(components
- pci bus_pci cmdline eal ethdev hash kvargs mbuf
- mempool mempool_ring mempool_stack
- pmd_bond pmd_vmxnet3_uio pmd_ixgbe pmd_i40e pmd_ring pmd_af_packet
+ bus_pci
+ cmdline
+ eal
+ ethdev
+ hash
+ kvargs
+ mbuf
+ mempool
+ mempool_ring
+ mempool_stack
+ pci
+ pmd_af_packet
+ pmd_bond
+ pmd_i40e
+ pmd_ixgbe
+ pmd_mlx5
+ pmd_ring
+ pmd_vmxnet3_uio
ring)
+set(dpdk_LIBRARIES)
+
foreach(c ${components})
find_library(DPDK_rte_${c}_LIBRARY rte_${c}
- HINTS $ENV{DPDK_DIR}/lib)
- list(APPEND check_LIBRARIES "${DPDK_rte_${c}_LIBRARY}")
+ HINTS
+ ENV DPDK_DIR
+ ${dpdk_pc_LIBRARY_DIRS}
+ PATH_SUFFIXES lib)
if(DPDK_rte_${c}_LIBRARY)
- add_library(dpdk::${c} UNKNOWN IMPORTED)
- set_target_properties(dpdk::${c} PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${DPDK_INCLUDE_DIR}"
- IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}")
- list(APPEND DPDK_LIBRARIES dpdk::${c})
+ set(dpdk_lib dpdk::${c})
+ if (NOT TARGET ${dpdk_lib})
+ add_library(${dpdk_lib} UNKNOWN IMPORTED)
+ set_target_properties(${dpdk_lib} PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIR}"
+ IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}")
+ if(c STREQUAL pmd_mlx5)
+ find_package(verbs QUIET)
+ if(verbs_FOUND)
+ target_link_libraries(${dpdk_lib} INTERFACE IBVerbs::verbs)
+ endif()
+ endif()
+ endif()
+ list(APPEND dpdk_LIBRARIES ${dpdk_lib})
endif()
endforeach()
-mark_as_advanced(DPDK_INCLUDE_DIR ${check_LIBRARIES})
-
-if (EXISTS ${WITH_DPDK_MLX5})
- find_library(DPDK_rte_pmd_mlx5_LIBRARY rte_pmd_mlx5)
- list(APPEND check_LIBRARIES ${DPDK_rte_pmd_mlx5_LIBRARY})
- mark_as_advanced(DPDK_rte_pmd_mlx5_LIBRARY)
-endif()
+mark_as_advanced(dpdk_INCLUDE_DIR ${dpdk_LIBRARIES})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(dpdk DEFAULT_MSG
- DPDK_INCLUDE_DIR
- check_LIBRARIES)
+ dpdk_INCLUDE_DIR
+ dpdk_LIBRARIES)
-if(DPDK_FOUND)
- if(EXISTS ${WITH_DPDK_MLX5})
- list(APPEND check_LIBRARIES -libverbs)
+if(dpdk_FOUND)
+ if(NOT TARGET dpdk::dpdk)
+ add_library(dpdk::dpdk INTERFACE IMPORTED)
+ find_package(Threads QUIET)
+ set_target_properties(dpdk::dpdk PROPERTIES
+ INTERFACE_LINK_LIBRARIES ${dpdk_LIBRARIES})
endif()
- set(DPDK_LIBRARIES
- -Wl,--whole-archive ${check_LIBRARIES} -Wl,--no-whole-archive)
-endif(DPDK_FOUND)
+endif()