diff mbox series

[ovs-dev,2/2] acinclude: Use AC_SEARCH_LIBS for linking with dl.

Message ID 20190219071228.4572-3-i.maximets@samsung.com
State Superseded
Headers show
Series acinclude: User/reader-friendly checking for DPDK dependencies. | expand

Commit Message

Ilya Maximets Feb. 19, 2019, 7:12 a.m. UTC
DPDK uses dlopen to load plugins and we need to search for
library containing this function. But we should not do this
in a loop because 'AC_SEARCH_LIBS' could do this for us.
Also, 'AC_SEARCH_LIBS' prints user-visible messages that are
useful for debuging.
Also added the new 'checking' message and code normalized to
be more readable.

With this change we'll have following additional messages:

  checking for library containing dlopen... -ldl
  checking whether linking with dpdk works... yes

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
 acinclude.m4 | 50 +++++++++++++++++++++-----------------------------
 1 file changed, 21 insertions(+), 29 deletions(-)

Comments

Flavio Leitner Feb. 21, 2019, 1:48 p.m. UTC | #1
On Tue, Feb 19, 2019 at 10:12:28AM +0300, Ilya Maximets wrote:
> DPDK uses dlopen to load plugins and we need to search for
> library containing this function. But we should not do this
> in a loop because 'AC_SEARCH_LIBS' could do this for us.
> Also, 'AC_SEARCH_LIBS' prints user-visible messages that are
> useful for debuging.
> Also added the new 'checking' message and code normalized to
> be more readable.
> 
> With this change we'll have following additional messages:


I think -ldl is only needed if MLX PMDs are enabled, right?
After this patch a library providing dlopen becomes mandatory, then
embedded folks might not like this new dependency.

Otherwise the patch looks good to me.
fbl

> 
>   checking for library containing dlopen... -ldl
>   checking whether linking with dpdk works... yes
> 
> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
> ---
>  acinclude.m4 | 50 +++++++++++++++++++++-----------------------------
>  1 file changed, 21 insertions(+), 29 deletions(-)
> 
> diff --git a/acinclude.m4 b/acinclude.m4
> index 2bb82b9c2..e4aed4690 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -294,36 +294,28 @@ AC_DEFUN([OVS_CHECK_DPDK], [
>        ], [[#include <rte_config.h>]])
>      ], [], [[#include <rte_config.h>]])
>  
> -    # On some systems we have to add -ldl to link with dpdk
> -    #
> -    # This code, at first, tries to link without -ldl (""),
> -    # then adds it and tries again.
> -    # Before each attempt the search cache must be unset,
> -    # otherwise autoconf will stick with the old result
> +    # DPDK uses dlopen to load plugins.
> +    OVS_FIND_DEPENDENCY([dlopen], [dl], [libdl])
> +
> +    AC_MSG_CHECKING([whether linking with dpdk works])
> +    LIBS="$DPDK_LIB $LIBS"
> +    AC_LINK_IFELSE(
> +      [AC_LANG_PROGRAM([#include <rte_config.h>
> +                        #include <rte_eal.h>],
> +                       [int rte_argc; char ** rte_argv;
> +                        rte_eal_init(rte_argc, rte_argv);])],
> +      [AC_MSG_RESULT([yes])
> +       DPDKLIB_FOUND=true],
> +      [AC_MSG_RESULT([no])
> +       if test "$DPDK_AUTO_DISCOVER" = "true"; then
> +         AC_MSG_ERROR(m4_normalize([
> +            Could not find DPDK library in default search path, Use --with-dpdk
> +            to specify the DPDK library installed in non-standard location]))
> +       else
> +         AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
> +       fi
> +      ])
>  
> -    DPDKLIB_FOUND=false
> -    save_LIBS=$LIBS
> -    for extras in "" "-ldl"; do
> -        LIBS="$DPDK_LIB $extras $save_LIBS"
> -        AC_LINK_IFELSE(
> -           [AC_LANG_PROGRAM([#include <rte_config.h>
> -                             #include <rte_eal.h>],
> -                            [int rte_argc; char ** rte_argv;
> -                             rte_eal_init(rte_argc, rte_argv);])],
> -           [DPDKLIB_FOUND=true])
> -        if $DPDKLIB_FOUND; then
> -            break
> -        fi
> -    done
> -
> -    # If linking unsuccessful
> -    if test "$DPDKLIB_FOUND" = "false" ; then
> -      if $DPDK_AUTO_DISCOVER; then
> -        AC_MSG_ERROR([Could not find DPDK library in default search path, Use --with-dpdk to specify the DPDK library installed in non-standard location])
> -      else
> -        AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
> -      fi
> -    fi
>      CFLAGS="$ovs_save_CFLAGS"
>      LDFLAGS="$ovs_save_LDFLAGS"
>      if test "$DPDK_AUTO_DISCOVER" = "false"; then
> -- 
> 2.17.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Ilya Maximets Feb. 21, 2019, 1:54 p.m. UTC | #2
On 21.02.2019 16:48, Flavio Leitner wrote:
> On Tue, Feb 19, 2019 at 10:12:28AM +0300, Ilya Maximets wrote:
>> DPDK uses dlopen to load plugins and we need to search for
>> library containing this function. But we should not do this
>> in a loop because 'AC_SEARCH_LIBS' could do this for us.
>> Also, 'AC_SEARCH_LIBS' prints user-visible messages that are
>> useful for debuging.
>> Also added the new 'checking' message and code normalized to
>> be more readable.
>>
>> With this change we'll have following additional messages:
> 
> 
> I think -ldl is only needed if MLX PMDs are enabled, right?

Unfortunately, not. It's used in 'eal_plugins_init()' inside
lib/librte_eal/common/eal_common_options.c.
And it's not guarded by any CONFIG. So, we have to look for library
with 'dlopen' in any configuration.

> After this patch a library providing dlopen becomes mandatory, then
> embedded folks might not like this new dependency.
> 
> Otherwise the patch looks good to me.
> fbl
> 
>>
>>   checking for library containing dlopen... -ldl
>>   checking whether linking with dpdk works... yes
>>
>> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
>> ---
>>  acinclude.m4 | 50 +++++++++++++++++++++-----------------------------
>>  1 file changed, 21 insertions(+), 29 deletions(-)
>>
>> diff --git a/acinclude.m4 b/acinclude.m4
>> index 2bb82b9c2..e4aed4690 100644
>> --- a/acinclude.m4
>> +++ b/acinclude.m4
>> @@ -294,36 +294,28 @@ AC_DEFUN([OVS_CHECK_DPDK], [
>>        ], [[#include <rte_config.h>]])
>>      ], [], [[#include <rte_config.h>]])
>>  
>> -    # On some systems we have to add -ldl to link with dpdk
>> -    #
>> -    # This code, at first, tries to link without -ldl (""),
>> -    # then adds it and tries again.
>> -    # Before each attempt the search cache must be unset,
>> -    # otherwise autoconf will stick with the old result
>> +    # DPDK uses dlopen to load plugins.
>> +    OVS_FIND_DEPENDENCY([dlopen], [dl], [libdl])
>> +
>> +    AC_MSG_CHECKING([whether linking with dpdk works])
>> +    LIBS="$DPDK_LIB $LIBS"
>> +    AC_LINK_IFELSE(
>> +      [AC_LANG_PROGRAM([#include <rte_config.h>
>> +                        #include <rte_eal.h>],
>> +                       [int rte_argc; char ** rte_argv;
>> +                        rte_eal_init(rte_argc, rte_argv);])],
>> +      [AC_MSG_RESULT([yes])
>> +       DPDKLIB_FOUND=true],
>> +      [AC_MSG_RESULT([no])
>> +       if test "$DPDK_AUTO_DISCOVER" = "true"; then
>> +         AC_MSG_ERROR(m4_normalize([
>> +            Could not find DPDK library in default search path, Use --with-dpdk
>> +            to specify the DPDK library installed in non-standard location]))
>> +       else
>> +         AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
>> +       fi
>> +      ])
>>  
>> -    DPDKLIB_FOUND=false
>> -    save_LIBS=$LIBS
>> -    for extras in "" "-ldl"; do
>> -        LIBS="$DPDK_LIB $extras $save_LIBS"
>> -        AC_LINK_IFELSE(
>> -           [AC_LANG_PROGRAM([#include <rte_config.h>
>> -                             #include <rte_eal.h>],
>> -                            [int rte_argc; char ** rte_argv;
>> -                             rte_eal_init(rte_argc, rte_argv);])],
>> -           [DPDKLIB_FOUND=true])
>> -        if $DPDKLIB_FOUND; then
>> -            break
>> -        fi
>> -    done
>> -
>> -    # If linking unsuccessful
>> -    if test "$DPDKLIB_FOUND" = "false" ; then
>> -      if $DPDK_AUTO_DISCOVER; then
>> -        AC_MSG_ERROR([Could not find DPDK library in default search path, Use --with-dpdk to specify the DPDK library installed in non-standard location])
>> -      else
>> -        AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
>> -      fi
>> -    fi
>>      CFLAGS="$ovs_save_CFLAGS"
>>      LDFLAGS="$ovs_save_LDFLAGS"
>>      if test "$DPDK_AUTO_DISCOVER" = "false"; then
>> -- 
>> 2.17.1
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 
> 
>
Flavio Leitner Feb. 21, 2019, 2:04 p.m. UTC | #3
On Thu, Feb 21, 2019 at 04:54:39PM +0300, Ilya Maximets wrote:
> On 21.02.2019 16:48, Flavio Leitner wrote:
> > On Tue, Feb 19, 2019 at 10:12:28AM +0300, Ilya Maximets wrote:
> >> DPDK uses dlopen to load plugins and we need to search for
> >> library containing this function. But we should not do this
> >> in a loop because 'AC_SEARCH_LIBS' could do this for us.
> >> Also, 'AC_SEARCH_LIBS' prints user-visible messages that are
> >> useful for debuging.
> >> Also added the new 'checking' message and code normalized to
> >> be more readable.
> >>
> >> With this change we'll have following additional messages:
> > 
> > 
> > I think -ldl is only needed if MLX PMDs are enabled, right?
> 
> Unfortunately, not. It's used in 'eal_plugins_init()' inside
> lib/librte_eal/common/eal_common_options.c.
> And it's not guarded by any CONFIG. So, we have to look for library
> with 'dlopen' in any configuration.
 
True, I missed that when I grep'ed.

Acked-by: Flavio Leitner <fbl@sysclose.org>
  

> > After this patch a library providing dlopen becomes mandatory, then
> > embedded folks might not like this new dependency.
> > 
> > Otherwise the patch looks good to me.
> > fbl
> > 
> >>
> >>   checking for library containing dlopen... -ldl
> >>   checking whether linking with dpdk works... yes
> >>
> >> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
> >> ---
> >>  acinclude.m4 | 50 +++++++++++++++++++++-----------------------------
> >>  1 file changed, 21 insertions(+), 29 deletions(-)
> >>
> >> diff --git a/acinclude.m4 b/acinclude.m4
> >> index 2bb82b9c2..e4aed4690 100644
> >> --- a/acinclude.m4
> >> +++ b/acinclude.m4
> >> @@ -294,36 +294,28 @@ AC_DEFUN([OVS_CHECK_DPDK], [
> >>        ], [[#include <rte_config.h>]])
> >>      ], [], [[#include <rte_config.h>]])
> >>  
> >> -    # On some systems we have to add -ldl to link with dpdk
> >> -    #
> >> -    # This code, at first, tries to link without -ldl (""),
> >> -    # then adds it and tries again.
> >> -    # Before each attempt the search cache must be unset,
> >> -    # otherwise autoconf will stick with the old result
> >> +    # DPDK uses dlopen to load plugins.
> >> +    OVS_FIND_DEPENDENCY([dlopen], [dl], [libdl])
> >> +
> >> +    AC_MSG_CHECKING([whether linking with dpdk works])
> >> +    LIBS="$DPDK_LIB $LIBS"
> >> +    AC_LINK_IFELSE(
> >> +      [AC_LANG_PROGRAM([#include <rte_config.h>
> >> +                        #include <rte_eal.h>],
> >> +                       [int rte_argc; char ** rte_argv;
> >> +                        rte_eal_init(rte_argc, rte_argv);])],
> >> +      [AC_MSG_RESULT([yes])
> >> +       DPDKLIB_FOUND=true],
> >> +      [AC_MSG_RESULT([no])
> >> +       if test "$DPDK_AUTO_DISCOVER" = "true"; then
> >> +         AC_MSG_ERROR(m4_normalize([
> >> +            Could not find DPDK library in default search path, Use --with-dpdk
> >> +            to specify the DPDK library installed in non-standard location]))
> >> +       else
> >> +         AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
> >> +       fi
> >> +      ])
> >>  
> >> -    DPDKLIB_FOUND=false
> >> -    save_LIBS=$LIBS
> >> -    for extras in "" "-ldl"; do
> >> -        LIBS="$DPDK_LIB $extras $save_LIBS"
> >> -        AC_LINK_IFELSE(
> >> -           [AC_LANG_PROGRAM([#include <rte_config.h>
> >> -                             #include <rte_eal.h>],
> >> -                            [int rte_argc; char ** rte_argv;
> >> -                             rte_eal_init(rte_argc, rte_argv);])],
> >> -           [DPDKLIB_FOUND=true])
> >> -        if $DPDKLIB_FOUND; then
> >> -            break
> >> -        fi
> >> -    done
> >> -
> >> -    # If linking unsuccessful
> >> -    if test "$DPDKLIB_FOUND" = "false" ; then
> >> -      if $DPDK_AUTO_DISCOVER; then
> >> -        AC_MSG_ERROR([Could not find DPDK library in default search path, Use --with-dpdk to specify the DPDK library installed in non-standard location])
> >> -      else
> >> -        AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
> >> -      fi
> >> -    fi
> >>      CFLAGS="$ovs_save_CFLAGS"
> >>      LDFLAGS="$ovs_save_LDFLAGS"
> >>      if test "$DPDK_AUTO_DISCOVER" = "false"; then
> >> -- 
> >> 2.17.1
> >>
> >> _______________________________________________
> >> dev mailing list
> >> dev@openvswitch.org
> >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> > 
> > 
> >
diff mbox series

Patch

diff --git a/acinclude.m4 b/acinclude.m4
index 2bb82b9c2..e4aed4690 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -294,36 +294,28 @@  AC_DEFUN([OVS_CHECK_DPDK], [
       ], [[#include <rte_config.h>]])
     ], [], [[#include <rte_config.h>]])
 
-    # On some systems we have to add -ldl to link with dpdk
-    #
-    # This code, at first, tries to link without -ldl (""),
-    # then adds it and tries again.
-    # Before each attempt the search cache must be unset,
-    # otherwise autoconf will stick with the old result
+    # DPDK uses dlopen to load plugins.
+    OVS_FIND_DEPENDENCY([dlopen], [dl], [libdl])
+
+    AC_MSG_CHECKING([whether linking with dpdk works])
+    LIBS="$DPDK_LIB $LIBS"
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([#include <rte_config.h>
+                        #include <rte_eal.h>],
+                       [int rte_argc; char ** rte_argv;
+                        rte_eal_init(rte_argc, rte_argv);])],
+      [AC_MSG_RESULT([yes])
+       DPDKLIB_FOUND=true],
+      [AC_MSG_RESULT([no])
+       if test "$DPDK_AUTO_DISCOVER" = "true"; then
+         AC_MSG_ERROR(m4_normalize([
+            Could not find DPDK library in default search path, Use --with-dpdk
+            to specify the DPDK library installed in non-standard location]))
+       else
+         AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
+       fi
+      ])
 
-    DPDKLIB_FOUND=false
-    save_LIBS=$LIBS
-    for extras in "" "-ldl"; do
-        LIBS="$DPDK_LIB $extras $save_LIBS"
-        AC_LINK_IFELSE(
-           [AC_LANG_PROGRAM([#include <rte_config.h>
-                             #include <rte_eal.h>],
-                            [int rte_argc; char ** rte_argv;
-                             rte_eal_init(rte_argc, rte_argv);])],
-           [DPDKLIB_FOUND=true])
-        if $DPDKLIB_FOUND; then
-            break
-        fi
-    done
-
-    # If linking unsuccessful
-    if test "$DPDKLIB_FOUND" = "false" ; then
-      if $DPDK_AUTO_DISCOVER; then
-        AC_MSG_ERROR([Could not find DPDK library in default search path, Use --with-dpdk to specify the DPDK library installed in non-standard location])
-      else
-        AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
-      fi
-    fi
     CFLAGS="$ovs_save_CFLAGS"
     LDFLAGS="$ovs_save_LDFLAGS"
     if test "$DPDK_AUTO_DISCOVER" = "false"; then