summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Moos <nmoos@cisco.com>2021-01-20 11:34:11 -0800
committerDamjan Marion <dmarion@me.com>2021-01-21 13:11:14 +0000
commitf15a5791ba870a98a2ab7dec101bbbb9b6e266c1 (patch)
tree4ab47cb8e160936d0d56b8ecf315774a5885ff5c
parent323418dd1c7825d38e8b1f83d5a8c23766a26de2 (diff)
dpdk: add support for system libdpdk
Type: improvement This patch enables dynamically linking the dpdk plugin against a system-wide packaged version of dpdk. Change-Id: I2276d125f39986b0e1788c7b52b94485cdbcd855 Signed-off-by: Nathan Moos <nmoos@cisco.com>
-rw-r--r--src/plugins/dpdk/CMakeLists.txt181
1 files changed, 96 insertions, 85 deletions
diff --git a/src/plugins/dpdk/CMakeLists.txt b/src/plugins/dpdk/CMakeLists.txt
index d63f116b206..7db6b094be7 100644
--- a/src/plugins/dpdk/CMakeLists.txt
+++ b/src/plugins/dpdk/CMakeLists.txt
@@ -12,93 +12,104 @@
# limitations under the License.
##############################################################################
-# Find lib and include files
+# Check if we want to use the system DPDK
##############################################################################
-find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h)
-vpp_plugin_find_library(dpdk DPDK_LIB "libdpdk.a")
-
-if (NOT DPDK_INCLUDE_DIR)
- message(WARNING "-- DPDK headers not found - dpdk plugin disabled")
- return()
-endif()
-
-if (NOT DPDK_LIB)
- vpp_plugin_find_library(dpdk DPDK_SHLIB "libdpdk.so")
- set(DPDK_IS_SHARED_LIB 1)
- message(WARNING "-- linking dpdk plugin against DPDK shared libs")
-endif()
-
-##############################################################################
-# Parse DPDK config and version header files
-##############################################################################
-file(STRINGS ${DPDK_INCLUDE_DIR}/rte_config.h rte_config)
-file(STRINGS ${DPDK_INCLUDE_DIR}/rte_version.h rte_version)
-file(STRINGS ${DPDK_INCLUDE_DIR}/rte_build_config.h rte_build_config)
-
-foreach(l ${rte_config} ${rte_build_config} ${rte_version}})
- if (l MATCHES "^#define[\t ]*RTE_")
- STRING(REGEX REPLACE "^#define[\t ]*([A-Z1-9_]+)[\t ]*(.+)" "\\1;\\2" v "${l}")
- list(GET v 0 name)
- list(GET v 1 value)
- set(DPDK_${name} ${value})
- endif()
-endforeach()
-
-set(DPDK_VERSION
- "${DPDK_RTE_VER_YEAR}.${DPDK_RTE_VER_MONTH}.${DPDK_RTE_VER_MINOR}")
-
-##############################################################################
-# verify headroom size
-##############################################################################
-if(NOT ${DPDK_RTE_PKTMBUF_HEADROOM} EQUAL ${PRE_DATA_SIZE})
- message(
- FATAL_ERROR
- "DPDK RTE_PKTMBUF_HEADROOM (${DPDK_RTE_PKTMBUF_HEADROOM}) "
- "must be equal to PRE_DATA_SIZE (${PRE_DATA_SIZE})"
- )
-endif()
-
-##############################################################################
-# static or dynamic linking
-##############################################################################
-unset(DPDK_LINK_LIBRARIES)
-unset(DPDK_LINK_FLAGS)
-message(STATUS "Found DPDK ${DPDK_VERSION} in ${DPDK_INCLUDE_DIR}")
-include_directories (${DPDK_INCLUDE_DIR})
-
-if(DPDK_IS_SHARED_LIB)
- get_filename_component(DPDK_LIB_DIR ${DPDK_SHLIB} DIRECTORY)
- string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
- list(APPEND DPDK_LINK_LIBRARIES ${DPDK_SHLIB})
+option(VPP_USE_SYSTEM_DPDK "Use the system installation of DPDK." OFF)
+if(VPP_USE_SYSTEM_DPDK)
+ find_package(PkgConfig REQUIRED)
+ pkg_check_modules(DPDK REQUIRED libdpdk)
+ message(WARNING "-- linking dpdk plugin against system libdpdk, version ${DPDK_VERSION}")
+ set(DPDK_LINK_FLAGS ${DPDK_LDFLAGS})
else()
- get_filename_component(DPDK_LIB_DIR ${DPDK_LIB} DIRECTORY)
- string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
- string_append(DPDK_LINK_FLAGS "-Wl,--whole-archive,${DPDK_LIB},--no-whole-archive")
-endif()
-
-##############################################################################
-# libnuma
-##############################################################################
-vpp_plugin_find_library(dpdk NUMA_LIB "numa")
-list(APPEND DPDK_LINK_LIBRARIES ${NUMA_LIB})
-
-##############################################################################
-# Mellanox libraries
-##############################################################################
-if(DPDK_RTE_LIBRTE_MLX4_PMD OR DPDK_RTE_LIBRTE_MLX5_PMD)
- if (DPDK_RTE_IBVERBS_LINK_DLOPEN)
- message(STATUS "DPDK depends on libmnl (Mellanox PMD requirement)")
- vpp_plugin_find_library(dpdk MNL_LIB "mnl")
- list(APPEND DPDK_LINK_LIBRARIES "${MNL_LIB}")
- else()
- message(WARNING "EXPERIMENTAL: DPDK plugin without dlopen mode")
- vpp_plugin_find_library(dpdk IBVERBS_LIB "libibverbs.a")
- vpp_plugin_find_library(dpdk MLX5_LIB "libmlx5.a")
- vpp_plugin_find_library(dpdk MLX4_LIB "libmlx4.a")
- vpp_plugin_find_library(dpdk CCAN_LIB "libccan.a")
- vpp_plugin_find_library(dpdk RDMA_UTIL_LIB "rdma_util")
- string_append(DPDK_LINK_FLAGS "-Wl,--whole-archive,${IBVERBS_LIB},${MLX5_LIB},${MLX4_LIB},${CCAN_LIB},${RDMA_UTIL_LIB},--no-whole-archive")
- endif()
+ ##############################################################################
+ # Find lib and include files
+ ##############################################################################
+ find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h)
+ vpp_plugin_find_library(dpdk DPDK_LIB "libdpdk.a")
+
+ if (NOT DPDK_INCLUDE_DIR)
+ message(WARNING "-- DPDK headers not found - dpdk plugin disabled")
+ return()
+ endif()
+
+ if (NOT DPDK_LIB)
+ vpp_plugin_find_library(dpdk DPDK_SHLIB "libdpdk.so")
+ set(DPDK_IS_SHARED_LIB 1)
+ message(WARNING "-- linking dpdk plugin against DPDK shared libs")
+ endif()
+
+ ##############################################################################
+ # Parse DPDK config and version header files
+ ##############################################################################
+ file(STRINGS ${DPDK_INCLUDE_DIR}/rte_config.h rte_config)
+ file(STRINGS ${DPDK_INCLUDE_DIR}/rte_version.h rte_version)
+ file(STRINGS ${DPDK_INCLUDE_DIR}/rte_build_config.h rte_build_config)
+
+ foreach(l ${rte_config} ${rte_build_config} ${rte_version}})
+ if (l MATCHES "^#define[\t ]*RTE_")
+ STRING(REGEX REPLACE "^#define[\t ]*([A-Z1-9_]+)[\t ]*(.+)" "\\1;\\2" v "${l}")
+ list(GET v 0 name)
+ list(GET v 1 value)
+ set(DPDK_${name} ${value})
+ endif()
+ endforeach()
+
+ set(DPDK_VERSION
+ "${DPDK_RTE_VER_YEAR}.${DPDK_RTE_VER_MONTH}.${DPDK_RTE_VER_MINOR}")
+
+ ##############################################################################
+ # verify headroom size
+ ##############################################################################
+ if(NOT ${DPDK_RTE_PKTMBUF_HEADROOM} EQUAL ${PRE_DATA_SIZE})
+ message(
+ FATAL_ERROR
+ "DPDK RTE_PKTMBUF_HEADROOM (${DPDK_RTE_PKTMBUF_HEADROOM}) "
+ "must be equal to PRE_DATA_SIZE (${PRE_DATA_SIZE})"
+ )
+ endif()
+
+ ##############################################################################
+ # static or dynamic linking
+ ##############################################################################
+ unset(DPDK_LINK_LIBRARIES)
+ unset(DPDK_LINK_FLAGS)
+ message(STATUS "Found DPDK ${DPDK_VERSION} in ${DPDK_INCLUDE_DIR}")
+ include_directories (${DPDK_INCLUDE_DIR})
+
+ if(DPDK_IS_SHARED_LIB)
+ get_filename_component(DPDK_LIB_DIR ${DPDK_SHLIB} DIRECTORY)
+ string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
+ list(APPEND DPDK_LINK_LIBRARIES ${DPDK_SHLIB})
+ else()
+ get_filename_component(DPDK_LIB_DIR ${DPDK_LIB} DIRECTORY)
+ string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
+ string_append(DPDK_LINK_FLAGS "-Wl,--whole-archive,${DPDK_LIB},--no-whole-archive")
+ endif()
+
+ ##############################################################################
+ # libnuma
+ ##############################################################################
+ vpp_plugin_find_library(dpdk NUMA_LIB "numa")
+ list(APPEND DPDK_LINK_LIBRARIES ${NUMA_LIB})
+
+ ##############################################################################
+ # Mellanox libraries
+ ##############################################################################
+ if(DPDK_RTE_LIBRTE_MLX4_PMD OR DPDK_RTE_LIBRTE_MLX5_PMD)
+ if (DPDK_RTE_IBVERBS_LINK_DLOPEN)
+ message(STATUS "DPDK depends on libmnl (Mellanox PMD requirement)")
+ vpp_plugin_find_library(dpdk MNL_LIB "mnl")
+ list(APPEND DPDK_LINK_LIBRARIES "${MNL_LIB}")
+ else()
+ message(WARNING "EXPERIMENTAL: DPDK plugin without dlopen mode")
+ vpp_plugin_find_library(dpdk IBVERBS_LIB "libibverbs.a")
+ vpp_plugin_find_library(dpdk MLX5_LIB "libmlx5.a")
+ vpp_plugin_find_library(dpdk MLX4_LIB "libmlx4.a")
+ vpp_plugin_find_library(dpdk CCAN_LIB "libccan.a")
+ vpp_plugin_find_library(dpdk RDMA_UTIL_LIB "rdma_util")
+ string_append(DPDK_LINK_FLAGS "-Wl,--whole-archive,${IBVERBS_LIB},${MLX5_LIB},${MLX4_LIB},${CCAN_LIB},${RDMA_UTIL_LIB},--no-whole-archive")
+ endif()
+ endif()
endif()
##############################################################################