]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: fix the build WITH_DPDK=ON
authorKefu Chai <kchai@redhat.com>
Mon, 20 Aug 2018 14:11:02 +0000 (22:11 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 5 Sep 2018 05:53:57 +0000 (13:53 +0800)
* add Findcryptopp.cmake back
  cryptopp support was dropped in #20015, but it's required by
  src/msg/async/dpdk/TCP.h, which `#include <cryptopp/md5.h>`
  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 <kchai@redhat.com>
cmake/modules/Finddpdk.cmake
src/msg/CMakeLists.txt

index 2a40ca8d3ca89d40a5690cbbb9d971ef1a228164..964ae5dfb0fe5efbe3466ae03870db5ecb0700ac 100644 (file)
@@ -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()
index 5c34d4af3e670a597bbb2c308ae8db34e16d1c78..28c9ad7840011ffdceab7848cc1c8867aa7d46dd 100644 (file)
@@ -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
+    $<TARGET_PROPERTY:dpdk::dpdk,INTERFACE_INCLUDE_DIRECTORIES>)
 endif(WITH_DPDK)