X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fdpdk%2FCMakeLists.txt;h=af8c80d8fa3adfa2c9e8d54f291dfab8017d329e;hb=548d70de68a4156d5bd4148e50a81555a0ef169f;hp=a0a083966b32e79e3768995dc6477de021e1b43a;hpb=77bc1a5fb1d5b08e9fc24fc1190a5d640aabd2a1;p=vpp.git diff --git a/src/plugins/dpdk/CMakeLists.txt b/src/plugins/dpdk/CMakeLists.txt index a0a083966b3..af8c80d8fa3 100644 --- a/src/plugins/dpdk/CMakeLists.txt +++ b/src/plugins/dpdk/CMakeLists.txt @@ -15,64 +15,41 @@ # Find lib and include files ############################################################################## find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h) -find_library(DPDK_LIB NAMES libdpdk.a) - -############################################################################## -# Find DPDK Version -############################################################################## -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dpdk_vars.c -" -#include -#include -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 -#ifdef RTE_LIBRTE_MLX4_PMD - printf(\"RTE_LIBRTE_MLX4_PMD=%u\\n\", RTE_LIBRTE_MLX4_PMD); -#endif -#ifdef RTE_LIBRTE_MLX5_PMD - printf(\"RTE_LIBRTE_MLX5_PMD=%u\\n\", RTE_LIBRTE_MLX5_PMD); -#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 -) +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 @@ -82,67 +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() - if(DPDK_RTE_LIBRTE_MLX4_PMD OR DPDK_RTE_LIBRTE_MLX5_PMD) - set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -Wl,-lmnl") +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 +) +