misc: deprecate dpdk hqos
[vpp.git] / src / plugins / dpdk / CMakeLists.txt
index 09ebd11..af8c80d 100644 (file)
 ##############################################################################
 # Find lib and include files
 ##############################################################################
-find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h HINTS
-         ${DPDK_INCLUDE_DIR_HINT})
-find_library(DPDK_LIB NAMES libdpdk.a HINTS ${DPDK_LIB_DIR_HINT})
-
-##############################################################################
-# Find DPDK Version
-##############################################################################
-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.c
-"
-#include <stdio.h>
-#include <rte_version.h>
-int main()
-{
-  printf(\"VERSION=%s\\n\", strchr(rte_version(), ' ') + 1);
-  printf(\"RTE_PKTMBUF_HEADROOM=%u\\n\", RTE_PKTMBUF_HEADROOM);
-#ifdef RTE_LIBRTE_PMD_AESNI_MB
-  printf(\"RTE_LIBRTE_PMD_AESNI_MB=%u\\n\", RTE_LIBRTE_PMD_AESNI_MB);
-#endif
-#ifdef RTE_LIBRTE_PMD_AESNI_GCM
-  printf(\"RTE_LIBRTE_PMD_AESNI_GCM=%u\\n\", RTE_LIBRTE_PMD_AESNI_GCM);
-#endif
-  return 0;
-}
-")
-
-try_compile(DPDK_VARS_COMPILED
-  ${CMAKE_CURRENT_BINARY_DIR}
-  ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.c
-  CMAKE_FLAGS
-  -DINCLUDE_DIRECTORIES=${DPDK_INCLUDE_DIR}
-  COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.bin
-)
+find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h)
+vpp_plugin_find_library(dpdk DPDK_LIB "libdpdk.a")
 
-if(DPDK_VARS_COMPILED)
-  execute_process(
-    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-    COMMAND ./dpdk_vars.bin
-    OUTPUT_VARIABLE DPDK_VARS
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-  )
-  string(REPLACE "\n" ";" DPDK_VARS ${DPDK_VARS})
-  foreach(v ${DPDK_VARS})
-    string(REPLACE "=" ";" v ${v})
+if (NOT DPDK_INCLUDE_DIR)
+  message(WARNING "-- DPDK headers not found - dpdk plugin disabled")
+  return()
+endif()
+
+if (NOT DPDK_LIB)
+  vpp_plugin_find_library(dpdk DPDK_SHLIB "libdpdk.so")
+  set(DPDK_IS_SHARED_LIB 1)
+  message(WARNING "-- linking dpdk plugin against DPDK shared libs")
+endif()
+
+##############################################################################
+# Parse DPDK config and version header files
+##############################################################################
+
+file(STRINGS ${DPDK_INCLUDE_DIR}/rte_config.h rte_config)
+file(STRINGS ${DPDK_INCLUDE_DIR}/rte_version.h rte_version)
+
+foreach(l ${rte_config} ${rte_version})
+  if (l MATCHES "^#define[\t ]*RTE_")
+    STRING(REGEX REPLACE "^#define[\t ]*([A-Z1-9_]+)[\t ]*(.+)" "\\1;\\2" v "${l}")
     list(GET v 0 name)
     list(GET v 1 value)
     set(DPDK_${name} ${value})
-  endforeach()
-endif()
+  endif()
+endforeach()
 
-file(REMOVE
-  ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.c
-  ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.bin
-)
+set(DPDK_VERSION
+    "${DPDK_RTE_VER_YEAR}.${DPDK_RTE_VER_MONTH}.${DPDK_RTE_VER_MINOR}")
 
+##############################################################################
+# verify headroom size
+##############################################################################
 if(NOT ${DPDK_RTE_PKTMBUF_HEADROOM} EQUAL ${PRE_DATA_SIZE})
   message(
     FATAL_ERROR
@@ -77,63 +59,97 @@ if(NOT ${DPDK_RTE_PKTMBUF_HEADROOM} EQUAL ${PRE_DATA_SIZE})
 endif()
 
 ##############################################################################
-# DPDK plugin
+# static or dynamic linking
 ##############################################################################
-if(DPDK_INCLUDE_DIR AND DPDK_LIB)
-  include_directories (${DPDK_INCLUDE_DIR})
+unset(DPDK_LINK_LIBRARIES)
+unset(DPDK_LINK_FLAGS)
+message(STATUS "Found DPDK ${DPDK_VERSION} in ${DPDK_INCLUDE_DIR}")
+include_directories (${DPDK_INCLUDE_DIR})
 
-  message(STATUS "Found DPDK ${DPDK_VERSION} in ${DPDK_INCLUDE_DIR}")
+if(DPDK_IS_SHARED_LIB)
+  get_filename_component(DPDK_LIB_DIR ${DPDK_SHLIB} DIRECTORY)
+  string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
+  list(APPEND DPDK_LINK_LIBRARIES ${DPDK_SHLIB})
+else()
   get_filename_component(DPDK_LIB_DIR ${DPDK_LIB} DIRECTORY)
-  set(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR} -Wl,--whole-archive,${DPDK_LIB},--no-whole-archive")
-  if(DPDK_RTE_LIBRTE_PMD_AESNI_MB OR DPDK_RTE_LIBRTE_PMD_AESNI_GCM)
-    set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -Wl,--exclude-libs,libIPSec_MB.a,-l:libIPSec_MB.a")
-    message(STATUS "DPDK depends on IPSec MB library")
+  string_append(DPDK_LINK_FLAGS "-L${DPDK_LIB_DIR}")
+  string_append(DPDK_LINK_FLAGS "-Wl,--whole-archive,${DPDK_LIB},--no-whole-archive")
+endif()
+
+##############################################################################
+# libnuma
+##############################################################################
+vpp_plugin_find_library(dpdk NUMA_LIB "numa")
+list(APPEND DPDK_LINK_LIBRARIES ${NUMA_LIB})
+
+##############################################################################
+# AESNI libraries
+##############################################################################
+if(DPDK_RTE_LIBRTE_PMD_AESNI_MB OR DPDK_RTE_LIBRTE_PMD_AESNI_GCM)
+  if(DPDK_IS_SHARED_LIB)
+    vpp_plugin_find_library(dpdk IPSECMB_LIB "libIPSec_MB.so")
+    list(APPEND DPDK_LINK_LIBRARIES "${IPSECMB_LIB}")
+  else()
+    vpp_plugin_find_library(dpdk IPSECMB_LIB "libIPSec_MB.a")
+    get_filename_component(IPSECMB_LIB_DIR ${IPSECMB_LIB} DIRECTORY)
+    string_append(DPDK_LINK_FLAGS "-L${IPSECMB_LIB_DIR}")
+    string_append(DPDK_LINK_FLAGS "-Wl,--exclude-libs,libIPSec_MB.a,-l:libIPSec_MB.a")
+  endif()
+endif()
+
+##############################################################################
+# Mellanox libraries
+##############################################################################
+if(DPDK_RTE_LIBRTE_MLX4_PMD OR DPDK_RTE_LIBRTE_MLX5_PMD)
+  vpp_plugin_find_library(dpdk MNL_LIB "mnl")
+  list(APPEND DPDK_LINK_LIBRARIES "${MNL_LIB}")
+  if (DPDK_RTE_IBVERBS_LINK_DLOPEN)
+    message(STATUS "DPDK depends on libmnl (Mellanox PMD requirement)")
+  else()
+    message(WARNING "unsupported DPDK configuration: DPDK Mellanox PMD requires RTE_IBVERBS_LINK_DLOPEN")
   endif()
-  set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -Wl,-lnuma")
-  add_vpp_plugin(dpdk
-    SOURCES
-    buffer.c
-    main.c
-    thread.c
-    api/dpdk_api.c
-    api/dpdk_test.c
-    device/cli.c
-    device/common.c
-    device/device.c
-    device/flow.c
-    device/format.c
-    device/init.c
-    device/node.c
-    hqos/hqos.c
-    ipsec/cli.c
-    ipsec/crypto_node.c
-    ipsec/esp_decrypt.c
-    ipsec/esp_encrypt.c
-    ipsec/ipsec.c
-
-    MULTIARCH_SOURCES
-    buffer.c
-    device/device.c
-    device/node.c
-
-    API_FILES
-    api/dpdk.api
-
-    API_TEST_SOURCES
-    api/dpdk_test.c
-
-    INSTALL_HEADERS
-    device/dpdk.h
-    api/dpdk_all_api_h.h
-    ipsec/ipsec.h
-
-    LINK_FLAGS
-    ${DPDK_LINK_FLAGS}
-
-    COMPONENT
-    vpp-plugin-dpdk
-  )
-else()
-  message(WARNING "DPDK not found - dpdk disabled")
 endif()
 
+##############################################################################
+# DPDK plugin
+##############################################################################
+add_vpp_plugin(dpdk
+  SOURCES
+  buffer.c
+  main.c
+  thread.c
+  device/cli.c
+  device/common.c
+  device/device.c
+  device/flow.c
+  device/format.c
+  device/init.c
+  device/node.c
+  ipsec/cli.c
+  ipsec/crypto_node.c
+  ipsec/esp_decrypt.c
+  ipsec/esp_encrypt.c
+  ipsec/ipsec.c
+
+  MULTIARCH_SOURCES
+  buffer.c
+  device/device.c
+  device/node.c
+  ipsec/crypto_node.c
+  ipsec/esp_decrypt.c
+  ipsec/esp_encrypt.c
+
+  INSTALL_HEADERS
+  device/dpdk.h
+  ipsec/ipsec.h
+
+  LINK_FLAGS
+  "${DPDK_LINK_FLAGS}"
+
+  LINK_LIBRARIES
+  ${DPDK_LINK_LIBRARIES}
+
+  COMPONENT
+  vpp-plugin-dpdk
+)
+