From: Kefu Chai Date: Mon, 20 Aug 2018 14:11:02 +0000 (+0800) Subject: cmake: fix the build WITH_DPDK=ON X-Git-Tag: v14.0.1~292^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c976f580e7f0a4f548e850cf7b04a74019242066;p=ceph.git cmake: fix the build WITH_DPDK=ON * add Findcryptopp.cmake back cryptopp support was dropped in #20015, but it's required by src/msg/async/dpdk/TCP.h, which `#include ` so, to fix the FTBFS of WITH_DPDK=ON, we need to bring Findcryptopp.cmake back. it was also removed in #20015. * pass "-march=core2" when building sources which include dpdk headers. i was wrong that the headers shipped by distro are generic. the headers use the sse instructions for speedup memcpy, see /usr/include/x86_64-linux-gnu/dpdk/rte_memcpy.h . * also, we need to include the arch specific include directory for building with dpdk. Signed-off-by: Kefu Chai --- diff --git a/cmake/modules/Finddpdk.cmake b/cmake/modules/Finddpdk.cmake index 2a40ca8d3ca8..964ae5dfb0fe 100644 --- a/cmake/modules/Finddpdk.cmake +++ b/cmake/modules/Finddpdk.cmake @@ -8,14 +8,27 @@ find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND) - pkg_check_modules(dpdk_pc QUIET libdpdk) + pkg_check_modules(dpdk QUIET libdpdk) endif() -find_path(dpdk_INCLUDE_DIR rte_config.h - HINTS - ENV DPDK_DIR - ${dpdk_pc_INCLUDE_DIRS} - PATH_SUFFIXES dpdk include) +if(NOT dpdk_INCLUDE_DIRS) + 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 + ENC DPDK_DIR + PATH_SUFFIXES + dpdk + include) + set(dpdk_INCLUDE_DIRS "${dpdk_config_INCLUDE_DIR}") + if(NOT dpdk_config_INCLUDE_DIR EQUAL dpdk_common_INCLUDE_DIR) + list(APPEND dpdk_INCLUDE_DIRS "${dpdk_common_INCLUDE_DIR}") + endif() +endif() set(components bus_pci @@ -44,14 +57,14 @@ foreach(c ${components}) find_library(DPDK_rte_${c}_LIBRARY rte_${c} HINTS ENV DPDK_DIR - ${dpdk_pc_LIBRARY_DIRS} + ${dpdk_LIBRARY_DIRS} PATH_SUFFIXES lib) if(DPDK_rte_${c}_LIBRARY) 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}" + INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}" IMPORTED_LOCATION "${DPDK_rte_${c}_LIBRARY}") if(c STREQUAL pmd_mlx5) find_package(verbs QUIET) @@ -64,18 +77,37 @@ foreach(c ${components}) endif() endforeach() -mark_as_advanced(dpdk_INCLUDE_DIR ${dpdk_LIBRARIES}) +mark_as_advanced(dpdk_INCLUDE_DIRS ${dpdk_LIBRARIES}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(dpdk DEFAULT_MSG - dpdk_INCLUDE_DIR + 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_LIBRARIES + Threads::Threads + dpdk::cflags) set_target_properties(dpdk::dpdk PROPERTIES - INTERFACE_LINK_LIBRARIES ${dpdk_LIBRARIES}) + INTERFACE_LINK_LIBRARIES "${dpdk_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}") endif() endif() diff --git a/src/msg/CMakeLists.txt b/src/msg/CMakeLists.txt index 5c34d4af3e67..28c9ad784001 100644 --- a/src/msg/CMakeLists.txt +++ b/src/msg/CMakeLists.txt @@ -65,4 +65,7 @@ if(WITH_DPDK) ${async_dpdk_srcs}) target_link_libraries(common_async_dpdk PRIVATE dpdk::dpdk) + # Stack.cc includes DPDKStack.h, which includes rte_config.h indirectly + target_include_directories(common-msg-objs PRIVATE + $) endif(WITH_DPDK)