]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: fix Finddpdk.cmake 23620/head
authorKefu Chai <kchai@redhat.com>
Fri, 17 Aug 2018 04:27:49 +0000 (12:27 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 17 Aug 2018 07:16:22 +0000 (15:16 +0800)
* 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=<arch> 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=<ARCH>", 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 <kchai@redhat.com>
cmake/modules/BuildDPDK.cmake
cmake/modules/Finddpdk.cmake
src/msg/CMakeLists.txt

index ea60857733640865ff3a2aecbdc9fe420cb5ba81..04eb3bc3e5680f19a9456aae83ac664271d22953 100644 (file)
@@ -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=<arch> defined, so copying them here.
+  # we need to pass the -march=<arch> 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()
index eb5973b81db3808230e8df5fbdff3c56dcf927b8..2a40ca8d3ca89d40a5690cbbb9d971ef1a228164 100644 (file)
@@ -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()
index 092d389b22c602db9de2cfbb178e7d0ff071e497..5c34d4af3e670a597bbb2c308ae8db34e16d1c78 100644 (file)
@@ -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)