From 9450345649f5d502cca89658f674161a5f45a376 Mon Sep 17 00:00:00 2001 From: Alex Williams Date: Tue, 14 Jan 2020 15:35:42 -0800 Subject: cmake: Find DPDK via pkg-config, if available Debian uses pkg-config without the libdpdk.so linker script. Use the pkg-config file to grab the installed libraries and determine what to link to. --- host/cmake/Modules/FindDPDK.cmake | 80 +++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 25 deletions(-) (limited to 'host/cmake/Modules') diff --git a/host/cmake/Modules/FindDPDK.cmake b/host/cmake/Modules/FindDPDK.cmake index a5029b94c..90240e61d 100644 --- a/host/cmake/Modules/FindDPDK.cmake +++ b/host/cmake/Modules/FindDPDK.cmake @@ -1,12 +1,13 @@ # # Copyright 2018 Ettus Research, a National Instruments Company +# Copyright 2020 Ettus Research, a National Instruments Brand # # SPDX-License-Identifier: GPL-3.0-or-later # # - Find DPDK # Find the DPDK includes and client library # This module defines -# DPDK_INCLUDE_DIR, where to find rte_config.h +# DPDK_INCLUDE_DIRS, where to find rte_config.h and rte_version.h # DPDK_LIBRARIES, the libraries needed by a DPDK user # DPDK_FOUND, If false, do not try to use DPDK. # also defined, but not for general use are @@ -14,46 +15,75 @@ include(FindPackageHandleStandardArgs) -find_path ( DPDK_INCLUDE_CONFIG_DIR rte_config.h - PATHS ENV RTE_INCLUDE - PATH_SUFFIXES dpdk -) +function(DPDK_READ_VERSION DPDK_VERSION DPDK_INCLUDE_DIRS) + if(NOT DPDK_INCLUDE_DIRS) + return() + endif() + + file(READ "${DPDK_INCLUDE_DIRS}/rte_version.h" + 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}) -find_path ( DPDK_INCLUDE_ETHDEV_DIR rte_ethdev.h + set(DPDK_VERSION "${DPDK_VERSION_MAJOR}.${DPDK_VERSION_MINOR}" PARENT_SCOPE) +endfunction() + +if(DPDK_LIBRARIES AND DPDK_INCLUDE_DIRS) + set(DPDK_USER_PROVIDED ON) +else() + set(DPDK_USER_PROVIDED OFF) +endif() + +find_package(PkgConfig) +PKG_CHECK_MODULES(PC_DPDK QUIET libdpdk>=18.11) + +find_path (DPDK_VERSION_INCLUDE_DIR rte_version.h + HINTS ${PC_DPDK_INCLUDE_DIRS} PATHS ENV RTE_INCLUDE PATH_SUFFIXES dpdk ) - -find_path ( DPDK_INCLUDE_VERSION_DIR rte_version.h +find_path (DPDK_CONFIG_INCLUDE_DIR rte_config.h + HINTS ${PC_DPDK_INCLUDE_DIRS} PATHS ENV RTE_INCLUDE PATH_SUFFIXES dpdk ) -set(DPDK_INCLUDE_DIR ${DPDK_INCLUDE_CONFIG_DIR} ${DPDK_INCLUDE_ETHDEV_DIR}) -list(REMOVE_DUPLICATES DPDK_INCLUDE_DIR) - +# Check for linker script that pulls in the APIs find_library(DPDK_LIBRARY + dpdk + HINTS ${PC_DPDK_LIBDIR} PATHS $ENV{RTE_SDK_DIR}/$ENV{RTE_TARGET}/lib ) -list(APPEND DPDK_LIBRARIES dpdk) +if(NOT DPDK_USER_PROVIDED) + set(DPDK_INCLUDE_DIRS ${PC_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) +endif() -if(DPDK_INCLUDE_VERSION_DIR) - file(READ "${DPDK_INCLUDE_VERSION_DIR}/rte_version.h" - 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}) -endif(DPDK_INCLUDE_VERSION_DIR) +if(DPDK_USER_PROVIDED) + DPDK_READ_VERSION(DPDK_VERSION ${DPDK_INCLUDE_DIRS}) +else() + set(DPDK_LIBRARIES ${PC_DPDK_LIBRARIES}) + if(DPDK_LIBRARY) + list(APPEND DPDK_LIBRARIES ${DPDK_LIBRARY}) + list(REMOVE_DUPLICATES DPDK_LIBRARIES) + endif() -set(DPDK_VERSION "${DPDK_VERSION_MAJOR}.${DPDK_VERSION_MINOR}") + if(PC_DPDK_FOUND) + set(DPDK_VERSION ${PC_DPDK_VERSION}) + else() + DPDK_READ_VERSION(DPDK_VERSION ${DPDK_INCLUDE_DIRS}) + endif(PC_DPDK_FOUND) +endif() find_package_handle_standard_args(DPDK - REQUIRED_VARS DPDK_INCLUDE_DIR DPDK_LIBRARIES + REQUIRED_VARS DPDK_INCLUDE_DIRS DPDK_LIBRARIES VERSION_VAR DPDK_VERSION ) -- cgit v1.2.3