# ~~~ # - Try to find DPDK include dirs and libraries # # Find the DPDK includes and client library # This module defines: # DPDK_FOUND, If false, do not try to use DPDK. # DPDK_INCLUDE_DIRS, where to find rte_config.h and rte_version.h # DPDK_LIBRARIES, the libraries needed by a DPDK user # DPDK_CFLAGS_OTHER, the compile flags to use # DPDK_VERSION, the version of the library # ~~~ include(FindPackageHandleStandardArgs) function(DPDK_READ_VERSION DPDK_VERSION DPDK_VERSION_FILE) if(NOT DPDK_VERSION_FILE) return() endif() file(READ "${DPDK_VERSION_FILE}" DPDK_VERSION_STR) string( REGEX MATCH "#define RTE_VER_YEAR ([0-9]+)" _ ${DPDK_VERSION_STR}) set(DPDK_VERSION_MAJOR ${CMAKE_MATCH_1}) string( REGEX MATCH "#define RTE_VER_MONTH ([0-9]+)" _ ${DPDK_VERSION_STR}) set(DPDK_VERSION_MINOR ${CMAKE_MATCH_1}) string( REGEX MATCH "#define RTE_VER_MINOR ([0-9]+)" _ ${DPDK_VERSION_STR}) set(DPDK_VERSION_PATCH ${CMAKE_MATCH_1}) set(DPDK_VERSION "${DPDK_VERSION_MAJOR}.${DPDK_VERSION_MINOR}.${DPDK_VERSION_PATCH}" PARENT_SCOPE) endfunction() # Try to find DPDK with pkg-config first! find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND) pkg_check_modules( DPDK QUIET IMPORTED_TARGET libdpdk>=18.11) endif() # We found using Pkg-Config! if(DPDK_FOUND) message("DPDK found with pkg-config") if(DPDK_DEBUG) message("-----------") message("Libraries: ${DPDK_LIBRARIES}") message("Link Libraries: ${DPDK_LINK_LIBRARIES}") message("Library DIr: ${DPDK_LIBRARY_DIRS}") message("Ldflags: ${DPDK_LDFLAGS}") message("Include Dirs: ${DPDK_INCLUDE_DIRS}") message("Cflags: ${DPDK_CFLAGS}") message("Cflags Other: ${DPDK_CFLAGS_OTHER}") message("Version: ${DPDK_VERSION}") message("-----------") endif() else() message("DPDK not found with pkg-config trying legacy mode") # Find the include dirs and get the version find_path(DPDK_VERSION_INCLUDE_DIR rte_version.h REQUIRED PATH_SUFFIXES dpdk include) find_path(DPDK_CONFIG_INCLUDE_DIR rte_config.h REQUIRED PATH_SUFFIXES dpdk include) set(DPDK_INCLUDE_DIRS ${DPDK_INCLUDE_DIRS}) list(APPEND DPDK_INCLUDE_DIRS ${DPDK_VERSION_INCLUDE_DIR}) list(APPEND DPDK_INCLUDE_DIRS ${DPDK_CONFIG_INCLUDE_DIR}) list(REMOVE_DUPLICATES DPDK_INCLUDE_DIRS) dpdk_read_version(DPDK_VERSION "${DPDK_VERSION_INCLUDE_DIR}/rte_version.h") # If no version found fall back to rte_build_config.h if(DPDK_VERSION STREQUAL "..") find_file(DPDK_BUILD_CONFIG_INCLUDE rte_build_config.h PATHS ${DPDK_INCLUDE_DIRS}) if(DPDK_BUILD_CONFIG_INCLUDE) dpdk_read_version(DPDK_VERSION "${DPDK_BUILD_CONFIG_INCLUDE_DIR}/rte_build_config.h") endif() if(DPDK_VERSION STREQUAL "..") message(WARN "Can't parse DPDK version!") endif() endif() # Get all the libraries regarding the version list( APPEND _DPDK_LOOK_FOR_LIBS net kni ethdev mbuf eal mempool ring kvargs hash cmdline pci bus_pci bus_vdev mempool_ring) if(DPDK_VERSION VERSION_LESS "20.11") list( APPEND _DPDK_LOOK_FOR_LIBS pmd_bond pmd_vmxnet3 pmd_virtio pmd_enic pmd_i40e pmd_fm10k pmd_ixgbe pmd_e1000 pmd_ring pmd_af_packet) endif() # Check that all libraries exists foreach(lib ${_DPDK_LOOK_FOR_LIBS}) # Regarding the build system used make or meson the librte_pmd_vmxnet3 could be named librte_pmd_vmxnet3_uio find_library( rte_${lib} NAMES rte_${lib} rte_${lib}_uio NAMES_PER_DIR REQUIRED) list(APPEND DPDK_LIBRARIES ${rte_${lib}}) get_filename_component(_DPDK_LIBRARY_DIR ${rte_${lib}} PATH) list(APPEND DPDK_LIBRARY_DIRS ${_DPDK_LIBRARY_DIR}) endforeach() unset(_DPDK_LOOK_FOR_LIBS) unset(_DPDK_LIBRARY_DIR) list(REMOVE_DUPLICATES DPDK_LIBRARY_DIRS) # We also need NUMA, Threads and DL find_package(NUMA REQUIRED) find_package(Threads REQUIRED) list(APPEND DPDK_LIBRARIES Threads::Threads) list(APPEND DPDK_LIBRARIES NUMA::NUMA) list(APPEND DPDK_LIBRARIES ${CMAKE_DL_LIBS}) # Add the CFLAGS list(APPEND DPDK_CFLAGS_OTHER "-include;rte_config.h") if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64") list(APPEND DPDK_CFLAGS_OTHER "-march=native") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM") list(APPEND DPDK_CFLAGS_OTHER "-march=armv7-a") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") list(APPEND DPDK_CFLAGS_OTHER "-march=armv8-a+crc") endif() if(DPDK_DEBUG) message("-----------") message("Libraries: ${DPDK_LIBRARIES}") message("Library Dir: ${DPDK_LIBRARY_DIRS}") message("Include Dirs: ${DPDK_INCLUDE_DIRS}") message("Cflags Other: ${DPDK_CFLAGS_OTHER}") message("Version: ${DPDK_VERSION}") message("-----------") endif() endif() find_package_handle_standard_args( DPDK REQUIRED_VARS DPDK_INCLUDE_DIRS DPDK_LIBRARIES VERSION_VAR DPDK_VERSION) 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}" INTERFACE_INCLUDE_DIRECTORIES "${DPDK_INCLUDE_DIRS}" INTERFACE_COMPILE_OPTIONS "${DPDK_CFLAGS_OTHER}") endif() if(DPDK_DEBUG) include(CMakePrintHelpers) cmake_print_properties(TARGETS DPDK::DPDK PROPERTIES INTERFACE_LINK_LIBRARIES INTERFACE_COMPILE_OPTIONS INTERFACE_INCLUDE_DIRECTORIES) endif()