From 303e3c4a6cf57cee8ca998111fd7c2215b1a9bae Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 17 Aug 2018 12:27:49 +0800 Subject: [PATCH] cmake: fix Finddpdk.cmake * add dpdk::dpdk if dpdk is built or found, as seastar checks for it before adding its component libraries. if user installs libdpdk and builds WITH_SEASTAR=ON or WITH_DPDK=ON, cmake fails to configure the building system without this fix. * add dpdk::cflags target for populating the -march= compile option. * also use pkg-config for finding dpdk. * link common_async_dpdk against dpdk::dpdk instead please note, the reason why we can remove the "-march=native" compile option from Finddpdk.cmake, is that the distro shipped header files are "generic" in the sense of "-march=", they do not enable the arch specific intrinsic by default, hence the source files including them do not need specific compiler options. Signed-off-by: Kefu Chai --- cmake/modules/BuildDPDK.cmake | 27 +++++++++- cmake/modules/Finddpdk.cmake | 92 +++++++++++++++++++++++------------ src/msg/CMakeLists.txt | 4 +- 3 files changed, 88 insertions(+), 35 deletions(-) diff --git a/cmake/modules/BuildDPDK.cmake b/cmake/modules/BuildDPDK.cmake index ea60857733640..04eb3bc3e5680 100644 --- a/cmake/modules/BuildDPDK.cmake +++ b/cmake/modules/BuildDPDK.cmake @@ -1,4 +1,9 @@ function(do_build_dpdk dpdk_dir) + # mk/machine/native/rte.vars.mk + # rte_cflags are extracted from mk/machine/${machine}/rte.vars.mk + # only 3 of them have -march= defined, so copying them here. + # we need to pass the -march= to ${cc} as some headers in dpdk + # require it to compile. for instance, dpdk/include/rte_memcpy.h. if(CMAKE_SYSTEM_PROCESSOR MATCHES "i386") set(arch "x86_64") set(machine "default") @@ -11,14 +16,17 @@ function(do_build_dpdk dpdk_dir) set(arch "x86_64") set(machine "default") set(machine_tmpl "native") + set(rte_cflags "-march=core2") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM") set(arch "arm") set(machine "armv7a") set(machine_tmpl "armv7a") + set(rte_cflags "-march=armv7-a") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") set(arch "arm64") set(machine "armv8a") set(machine_tmpl "armv8a") + set(rte_cflags "-march=armv8-a+crc") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(powerpc|ppc)64") set(arch "ppc_64") set(machine "power8") @@ -28,6 +36,13 @@ function(do_build_dpdk dpdk_dir) "unknown arch \"${CMAKE_SYSTEM_PROCESSOR}\"") endif() + if(NOT TARGET dpdk::cflags) + add_library(dpdk::cflags INTERFACE IMPORTED) + if (rte_cflags) + set_target_properties(dpdk::cflags PROPERTIES + INTERFACE_COMPILE_OPTIONS "${rte_cflags}") + endif() + endif() if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(execenv "linuxapp") elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") @@ -86,16 +101,24 @@ macro(build_dpdk) # target file(MAKE_DIRECTORY ${DPDK_INCLUDE_DIR}) foreach(c - bus_pci pci + bus_pci eal - mempool mempool_ring mempool_stack ring) + mempool + mempool_ring + mempool_stack + pci + ring) add_library(dpdk::${c} STATIC IMPORTED) add_dependencies(dpdk::${c} dpdk-ext) set(dpdk_${c}_LIBRARY "${DPDK_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rte_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}") set_target_properties(dpdk::${c} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${DPDK_INCLUDE_DIR} + INTERFACE_LINK_LIBRARIES dpdk::cflags IMPORTED_LOCATION "${dpdk_${c}_LIBRARY}") list(APPEND DPDK_LIBRARIES dpdk::${c}) endforeach() + add_library(dpdk::dpdk INTERFACE IMPORTED) + set_target_properties(dpdk::dpdk PROPERTIES + INTERFACE_LINK_LIBRARIES "${DPDK_LIBRARIES}") endmacro() diff --git a/cmake/modules/Finddpdk.cmake b/cmake/modules/Finddpdk.cmake index eb5973b81db38..2a40ca8d3ca89 100644 --- a/cmake/modules/Finddpdk.cmake +++ b/cmake/modules/Finddpdk.cmake @@ -2,50 +2,80 @@ # # Once done, this will define # -# DPDK_FOUND -# DPDK_INCLUDE_DIR -# DPDK_LIBRARIES +# dpdk_FOUND +# dpdk_INCLUDE_DIR +# dpdk_LIBRARIES -find_path(DPDK_INCLUDE_DIR rte_config.h - PATH_SUFFIXES dpdk - HINTS $ENV{DPDK_DIR}/include) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(dpdk_pc QUIET libdpdk) +endif() + +find_path(dpdk_INCLUDE_DIR rte_config.h + HINTS + ENV DPDK_DIR + ${dpdk_pc_INCLUDE_DIRS} + PATH_SUFFIXES dpdk include) set(components - pci bus_pci cmdline eal ethdev hash kvargs mbuf - mempool mempool_ring mempool_stack - pmd_bond pmd_vmxnet3_uio pmd_ixgbe pmd_i40e pmd_ring pmd_af_packet + bus_pci + cmdline + eal + ethdev + hash + kvargs + mbuf + mempool + mempool_ring + mempool_stack + pci + pmd_af_packet + pmd_bond + pmd_i40e + pmd_ixgbe + pmd_mlx5 + pmd_ring + pmd_vmxnet3_uio ring) +set(dpdk_LIBRARIES) + foreach(c ${components}) find_library(DPDK_rte_${c}_LIBRARY rte_${c} - HINTS $ENV{DPDK_DIR}/lib) - list(APPEND check_LIBRARIES "${DPDK_rte_${c}_LIBRARY}") + HINTS + ENV DPDK_DIR + ${dpdk_pc_LIBRARY_DIRS} + PATH_SUFFIXES lib) if(DPDK_rte_${c}_LIBRARY) - add_library(dpdk::${c} UNKNOWN IMPORTED) - set_target_properties(dpdk::${c} PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${DPDK_INCLUDE_DIR}" - IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}") - list(APPEND DPDK_LIBRARIES dpdk::${c}) + set(dpdk_lib dpdk::${c}) + if (NOT TARGET ${dpdk_lib}) + add_library(${dpdk_lib} UNKNOWN IMPORTED) + set_target_properties(${dpdk_lib} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIR}" + 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_LIBRARIES ${dpdk_lib}) endif() endforeach() -mark_as_advanced(DPDK_INCLUDE_DIR ${check_LIBRARIES}) - -if (EXISTS ${WITH_DPDK_MLX5}) - find_library(DPDK_rte_pmd_mlx5_LIBRARY rte_pmd_mlx5) - list(APPEND check_LIBRARIES ${DPDK_rte_pmd_mlx5_LIBRARY}) - mark_as_advanced(DPDK_rte_pmd_mlx5_LIBRARY) -endif() +mark_as_advanced(dpdk_INCLUDE_DIR ${dpdk_LIBRARIES}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(dpdk DEFAULT_MSG - DPDK_INCLUDE_DIR - check_LIBRARIES) + dpdk_INCLUDE_DIR + dpdk_LIBRARIES) -if(DPDK_FOUND) - if(EXISTS ${WITH_DPDK_MLX5}) - list(APPEND check_LIBRARIES -libverbs) +if(dpdk_FOUND) + 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}) endif() - set(DPDK_LIBRARIES - -Wl,--whole-archive ${check_LIBRARIES} -Wl,--no-whole-archive) -endif(DPDK_FOUND) +endif() diff --git a/src/msg/CMakeLists.txt b/src/msg/CMakeLists.txt index 092d389b22c60..5c34d4af3e670 100644 --- a/src/msg/CMakeLists.txt +++ b/src/msg/CMakeLists.txt @@ -63,6 +63,6 @@ if(WITH_DPDK) async/dpdk/ethernet.cc) add_library(common_async_dpdk STATIC ${async_dpdk_srcs}) - target_link_libraries(common_async_dpdk - ${DPDK_LIBRARIES}) + target_link_libraries(common_async_dpdk PRIVATE + dpdk::dpdk) endif(WITH_DPDK) -- 2.39.5