diff options
Diffstat (limited to 'cmake/modules/Finddpdk.cmake')
-rw-r--r-- | cmake/modules/Finddpdk.cmake | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/cmake/modules/Finddpdk.cmake b/cmake/modules/Finddpdk.cmake new file mode 100644 index 000000000..ad2ec2548 --- /dev/null +++ b/cmake/modules/Finddpdk.cmake @@ -0,0 +1,143 @@ +# Try to find dpdk +# +# Once done, this will define +# +# dpdk::dpdk +# dpdk_FOUND +# dpdk_INCLUDE_DIR +# dpdk_LIBRARIES + +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(dpdk QUIET libdpdk) +endif() + +if(dpdk_INCLUDE_DIRS) + # good +elseif(TARGET dpdk::dpdk) + get_target_property(dpdk_INCLUDE_DIRS + dpdk::dpdk INTERFACE_INCLUDE_DIRECTORIES) +else() + find_path(dpdk_config_INCLUDE_DIR rte_config.h + HINTS + ENV DPDK_DIR + PATH_SUFFIXES + dpdk + include) + find_path(dpdk_common_INCLUDE_DIR rte_common.h + HINTS + ENV DPDK_DIR + PATH_SUFFIXES + dpdk + include) + set(dpdk_INCLUDE_DIRS "${dpdk_config_INCLUDE_DIR}") + if(dpdk_common_INCLUDE_DIR AND NOT dpdk_config_INCLUDE_DIR STREQUAL dpdk_common_INCLUDE_DIR) + list(APPEND dpdk_INCLUDE_DIRS "${dpdk_common_INCLUDE_DIR}") + endif() +endif() + +set(components + bus_pci + bus_vdev + cfgfile + cmdline + eal + ethdev + hash + kvargs + mbuf + mempool + mempool_ring + net + pci + pmd_af_packet + pmd_bnxt + pmd_bond + pmd_cxgbe + pmd_e1000 + pmd_ena + pmd_enic + pmd_i40e + pmd_ixgbe + pmd_mlx5 + pmd_nfp + pmd_qede + pmd_ring + pmd_sfc_efx + pmd_vmxnet3_uio + pmd_hns3 + pmd_hinic + ring + timer) + +# for collecting dpdk library targets, it will be used when defining dpdk::dpdk +set(_dpdk_libs) +# for list of dpdk library archive paths +set(dpdk_LIBRARIES "") +foreach(c ${components}) + set(dpdk_lib dpdk::${c}) + if(TARGET ${dpdk_lib}) + get_target_property(DPDK_rte_${c}_LIBRARY + ${dpdk_lib} IMPORTED_LOCATION) + else() + find_library(DPDK_rte_${c}_LIBRARY rte_${c} + HINTS + ENV DPDK_DIR + ${dpdk_LIBRARY_DIRS} + PATH_SUFFIXES lib) + endif() + if(DPDK_rte_${c}_LIBRARY) + if (NOT TARGET ${dpdk_lib}) + add_library(${dpdk_lib} UNKNOWN IMPORTED) + set_target_properties(${dpdk_lib} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}" + IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}") + if(c STREQUAL pmd_mlx5) + find_package(verbs QUIET) + if(verbs_FOUND) + target_link_libraries(${dpdk_lib} INTERFACE IBVerbs::verbs) + endif() + endif() + endif() + list(APPEND _dpdk_libs ${dpdk_lib}) + list(APPEND dpdk_LIBRARIES ${DPDK_rte_${c}_LIBRARY}) + endif() +endforeach() + +mark_as_advanced(dpdk_INCLUDE_DIRS ${dpdk_LIBRARIES}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(dpdk DEFAULT_MSG + dpdk_INCLUDE_DIRS + dpdk_LIBRARIES) + +if(dpdk_FOUND) + if(NOT TARGET dpdk::cflags) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64") + set(rte_cflags "-march=core2") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM") + set(rte_cflags "-march=armv7-a") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") + set(rte_cflags "-march=armv8-a+crc") + endif() + add_library(dpdk::cflags INTERFACE IMPORTED) + if (rte_cflags) + set_target_properties(dpdk::cflags PROPERTIES + INTERFACE_COMPILE_OPTIONS "${rte_cflags}") + endif() + endif() + + if(NOT TARGET dpdk::dpdk) + add_library(dpdk::dpdk INTERFACE IMPORTED) + find_package(Threads QUIET) + list(APPEND _dpdk_libs + Threads::Threads + dpdk::cflags + numa) + set_target_properties(dpdk::dpdk PROPERTIES + INTERFACE_LINK_LIBRARIES "${_dpdk_libs}" + INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}") + endif() +endif() + +unset(_dpdk_libs) |