1# Try to find dpdk
2#
3# Once done, this will define
4#
5# dpdk_FOUND
6# dpdk_INCLUDE_DIRS
7# dpdk_LIBRARIES
8
9if(PKG_CONFIG_FOUND)
10  pkg_check_modules(dpdk QUIET libdpdk)
11endif()
12message(STATUS "Executing Finddpdk")
13if(NOT dpdk_INCLUDE_DIRS)
14  message(STATUS "Executing find_path")
15  find_path(dpdk_config_INCLUDE_DIR rte_config.h
16    HINTS
17      ENV DPDK_DIR
18    PATH_SUFFIXES
19      dpdk
20      include
21)
22  find_path(dpdk_common_INCLUDE_DIR rte_common.h
23    HINTS
24      ENV DPDK_DIR
25    PATH_SUFFIXES
26      dpdk
27      include
28)
29  set(dpdk_INCLUDE_DIRS "${dpdk_config_INCLUDE_DIR}")
30  if(NOT dpdk_config_INCLUDE_DIR STREQUAL dpdk_common_INCLUDE_DIR)
31    list(APPEND dpdk_INCLUDE_DIRS "${dpdk_common_INCLUDE_DIR}")
32  endif()
33
34  set(components
35    bus_pci
36    cmdline
37    eal
38    ethdev
39    hash
40    kvargs
41    mbuf
42    mempool
43    mempool_ring
44    mempool_stack
45    pci
46    pmd_af_packet
47    pmd_bond
48    pmd_i40e
49    pmd_ixgbe
50    pmd_mlx5
51    pmd_ring
52    pmd_vmxnet3_uio
53    ring)
54
55  set(dpdk_LIBRARIES)
56
57  foreach(c ${components})
58    find_library(DPDK_rte_${c}_LIBRARY rte_${c}
59      HINTS
60        ENV DPDK_DIR
61        ${dpdk_LIBRARY_DIRS}
62      PATH_SUFFIXES lib)
63    if(DPDK_rte_${c}_LIBRARY)
64      set(dpdk_lib dpdk::${c})
65      if (NOT TARGET ${dpdk_lib})
66        add_library(${dpdk_lib} UNKNOWN IMPORTED)
67        set_target_properties(${dpdk_lib} PROPERTIES
68          INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}"
69          IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}")
70        if(c STREQUAL pmd_mlx5)
71          find_package(verbs QUIET)
72          if(verbs_FOUND)
73            target_link_libraries(${dpdk_lib} INTERFACE IBVerbs::verbs)
74          endif()
75        endif()
76      endif()
77      list(APPEND dpdk_LIBRARIES ${dpdk_lib})
78    endif()
79  endforeach()
80
81  #
82  # Where the heck did this list come from?  libdpdk on Ubuntu 20.04,
83  # for example, doesn't even *have* -ldpdk; that's why we go with
84  # pkg-config, in the hopes that it provides a correct set of flags
85  # for this tangled mess.
86  #
87  list(APPEND dpdk_LIBRARIES dpdk rt m numo dl)
88endif()
89
90mark_as_advanced(dpdk_INCLUDE_DIRS ${dpdk_LIBRARIES})
91
92include(FindPackageHandleStandardArgs)
93find_package_handle_standard_args(dpdk DEFAULT_MSG
94  dpdk_INCLUDE_DIRS
95  dpdk_LIBRARIES)
96
97if(dpdk_FOUND)
98  if(NOT TARGET dpdk::cflags)
99     if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64")
100      set(rte_cflags "-march=core2")
101    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM")
102      set(rte_cflags "-march=armv7-a")
103    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
104      set(rte_cflags "-march=armv8-a+crc")
105    endif()
106    add_library(dpdk::cflags INTERFACE IMPORTED)
107    if (rte_cflags)
108      set_target_properties(dpdk::cflags PROPERTIES
109        INTERFACE_COMPILE_OPTIONS "${rte_cflags}")
110    endif()
111  endif()
112
113  if(NOT TARGET dpdk::dpdk)
114    add_library(dpdk::dpdk INTERFACE IMPORTED)
115    find_package(Threads QUIET)
116    list(APPEND dpdk_LIBRARIES
117      Threads::Threads
118      dpdk::cflags)
119    set_target_properties(dpdk::dpdk PROPERTIES
120      INTERFACE_LINK_LIBRARIES "${dpdk_LIBRARIES}"
121      INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}")
122  endif()
123endif()
124