aboutsummaryrefslogtreecommitdiffstats
path: root/host/cmake/Modules
diff options
context:
space:
mode:
authorAlex Williams <alex.williams@ni.com>2020-01-14 15:35:42 -0800
committerMartin Braun <martin.braun@ettus.com>2020-01-22 12:52:35 -0800
commit9450345649f5d502cca89658f674161a5f45a376 (patch)
tree88ef8e60e7b8113011436e8ae01e8c5caa188dc0 /host/cmake/Modules
parenta09dad7fc6da3fe0c8b6e64b6187bb8b15191ccf (diff)
downloaduhd-9450345649f5d502cca89658f674161a5f45a376.tar.gz
uhd-9450345649f5d502cca89658f674161a5f45a376.tar.bz2
uhd-9450345649f5d502cca89658f674161a5f45a376.zip
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.
Diffstat (limited to 'host/cmake/Modules')
-rw-r--r--host/cmake/Modules/FindDPDK.cmake80
1 files changed, 55 insertions, 25 deletions
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
)