aboutsummaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorDmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>2017-12-31 04:13:06 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-01-15 23:45:09 +0300
commit4b06ab1aadb653958dd49b62899929e2720b5c9f (patch)
tree320f0ab3e77a6c297f6ba401656f0c5a14ca9116 /m4
parentea2c187b7ba3ca3b9e21624b139c871c2bd8f11c (diff)
linux-gen: dpdk: simplify linking with shared libdpdk
There is no need to pass PMDs when linking with shared DPDK library. Just pass -ldpdk which will pick up all PMDS dynamically. When linking with static DPKD library it is required to pass additional libraries after whole PMD string to fix linking when Libtool will reorder flags. So provide just two variables DPDK_LIBS and DPDK_LIBS_LT. Former should be passed directly to gcc, while later should be passed to libtool. Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'm4')
-rw-r--r--m4/odp_dpdk.m483
1 files changed, 66 insertions, 17 deletions
diff --git a/m4/odp_dpdk.m4 b/m4/odp_dpdk.m4
index 05e60cc06..1887b0431 100644
--- a/m4/odp_dpdk.m4
+++ b/m4/odp_dpdk.m4
@@ -1,22 +1,38 @@
# ODP_DPDK_PMDS(DPDK_DRIVER_PATH)
# -------------------------------
-# Build a list of DPDK PMD drivers in DPDK_PMDS variable
+# Build a list of DPDK PMD drivers in DPDK_PMDS variable.
+# Updated DPDK_LIBS to include dependencies.
AC_DEFUN([ODP_DPDK_PMDS], [dnl
-AS_VAR_SET([DPDK_PMDS], [-Wl,--whole-archive,])
+AS_VAR_SET([DPDK_PMDS], ["-Wl,--whole-archive,"])
for filename in "$1"/librte_pmd_*.a; do
cur_driver=`basename "$filename" .a | sed -e 's/^lib//'`
-# rte_pmd_nfp has external dependencies which break linking
-if test "$cur_driver" = "rte_pmd_nfp"; then
- echo "skip linking rte_pmd_nfp"
-else
- AS_VAR_APPEND([DPDK_PMDS], [-l$cur_driver,])
-fi
+AS_VAR_APPEND([DPDK_PMDS], [-l$cur_driver,])
+AS_CASE([$cur_driver],
+ [rte_pmd_nfp], [AS_VAR_APPEND([DPDK_LIBS], [" -lm"])],
+ [rte_pmd_pcap], [AS_VAR_APPEND([DPDK_LIBS], [" -lpcap"])],
+ [rte_pmd_openssl], [AS_VAR_APPEND([DPDK_LIBS], [" -lcrypto"])])
done
AS_VAR_APPEND([DPDK_PMDS], [--no-whole-archive])
-AC_SUBST([DPDK_PMDS])
])
-# _ODP_DPDK_CHECK_LIB(LDFLAGS, [LIBS], [EXTRA_LIBS])
+# _ODP_DPDK_SET_LIBS
+# --------------------
+# Set DPDK_LIBS/DPDK_LIBS_LT depending on DPDK setup
+AC_DEFUN([_ODP_DPDK_SET_LIBS], [dnl
+AS_IF([test "x$DPDK_SHARED" = "xyes"], [dnl
+ DPDK_LIBS_LT=""
+ DPDK_LIBS="$DPDK_LDFLAGS $DPDK_RPATH $DPDK_LIBS"
+], [dnl
+ ODP_DPDK_PMDS([$DPDK_PMD_PATH])
+ DPDK_LIBS_LT="`echo $DPDK_LIBS | sed -e 's/^/-Wc,/' -e 's/ /,/g'`"
+ DPDK_LIBS_LT="$DPDK_LDFLAGS $DPDK_PMDS $DPDK_LIBS_LT $DPDK_LIBS"
+ DPDK_LIBS="$DPDK_LDFLAGS $DPDK_PMDS $DPDK_LIBS"
+])
+AC_SUBST([DPDK_LIBS])
+AC_SUBST([DPDK_LIBS_LT])
+])
+
+# _ODP_DPDK_CHECK_LIB(LDFLAGS, [LIBS])
# ----------------------------------
# Check if one can use -ldpdk with provided set of libs
AC_DEFUN([_ODP_DPDK_CHECK_LIB], [dnl
@@ -31,7 +47,7 @@ LIBS="$LIBS -ldpdk $2"
AC_MSG_CHECKING([for rte_eal_init in -ldpdk $2])
AC_LINK_IFELSE([AC_LANG_CALL([], [rte_eal_init])],
[AC_MSG_RESULT([yes])
- DPDK_LIBS="$1 -ldpdk $3 $2"],
+ DPDK_LIBS="-ldpdk $2"],
[AC_MSG_RESULT([no])])
##########################################################################
@@ -41,10 +57,10 @@ LDFLAGS=$OLD_LDFLAGS
LIBS=$OLD_LIBS
])
-# ODP_DPDK_CHECK(CPPFLAGS, LDFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-# -----------------------------------------------------------------------
+# _ODP_DPDK_CHECK(CPPFLAGS, LDFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
+# ------------------------------------------------------------------------
# Check for DPDK availability
-AC_DEFUN([ODP_DPDK_CHECK], [dnl
+AC_DEFUN([_ODP_DPDK_CHECK], [dnl
##########################################################################
# Save and set temporary compilation flags
##########################################################################
@@ -59,13 +75,14 @@ AC_CHECK_HEADERS([rte_config.h], [],
DPDK_LIBS=""
_ODP_DPDK_CHECK_LIB([$2])
AS_IF([test "x$DPDK_LIBS" = "x"],
- [_ODP_DPDK_CHECK_LIB([$2], [-ldl -lpthread], [-lm])])
+ [_ODP_DPDK_CHECK_LIB([$2], [-ldl -lpthread])])
AS_IF([test "x$DPDK_LIBS" = "x"],
- [_ODP_DPDK_CHECK_LIB([$2], [-ldl -lpthread -lnuma], [-lm])])
+ [_ODP_DPDK_CHECK_LIB([$2], [-ldl -lpthread -lnuma])])
AS_IF([test "x$DPDK_LIBS" = "x"],
[dpdk_check_ok=no])
AS_IF([test "x$dpdk_check_ok" != "xno"],
- [AC_SUBST([DPDK_LIBS])
+ [_ODP_DPDK_SET_LIBS
+ AC_SUBST([DPDK_CPPFLAGS])
m4_default([$3], [:])],
[m4_default([$4], [:])])
@@ -74,3 +91,35 @@ AS_IF([test "x$dpdk_check_ok" != "xno"],
##########################################################################
CPPFLAGS=$OLD_CPPFLAGS
])
+
+# ODP_DPDK(DPDK_PATH, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -----------------------------------------------------------------------
+# Check for DPDK availability
+AC_DEFUN([ODP_DPDK], [dnl
+AS_IF([test "x$1" = "xsystem"], [dnl
+ DPDK_CPPFLAGS="-isystem/usr/include/dpdk"
+ DPDK_LDFLAGS=""
+ DPDK_RPATH=""
+ DPDK_LIB_PATH="`$CC --print-file-name=libdpdk.so`"
+ if test "x$DPDK_LIB_PATH" = "x" ; then
+ DPDK_LIB_PATH="`$CC --print-file-name=libdpdk.a`"
+ else
+ DPDK_SHARED=yes
+ fi
+ AS_IF([test "x$DPDK_LIB_PATH" = "x"],
+ [AC_MSG_FAILURE([Could not locate system DPDK library directory])])
+ DPDK_PMD_PATH=`AS_DIRNAME(["$DPDK_PMD_PATH"])`
+], [dnl
+ DPDK_CPPFLAGS="-isystem $1/include"
+ DPDK_LIB_PATH="$1/lib"
+ DPDK_LDFLAGS="-L$DPDK_LIB_PATH"
+ DPDK_PMD_PATH="$DPDK_LIB_PATH"
+ if test -r "$DPDK_LIB_PATH"/libdpdk.so ; then
+ DPDK_RPATH="-R$DPDK_LIB_PATH"
+ DPDK_SHARED=yes
+ else
+ DPDK_RPATH=
+ fi
+])
+_ODP_DPDK_CHECK([$DPDK_CPPFLAGS], [$DPDK_LDFLAGS], [$2], [$3])
+])