diff mbox

[RFC,v1] libv4l: build utils only on MMU (with fork support) platforms

Message ID 41bd7a05-4254-e7e4-7846-ed5e4d99d0ad@st.com
State Changes Requested
Headers show

Commit Message

Hugues Fruchet July 18, 2017, 9:08 a.m. UTC
Hi Peter,

On 07/17/2017 08:09 PM, Peter Seiderer wrote:
> Hello Hugues,

> 

> On Mon, 17 Jul 2017 10:07:07 +0000, Hugues FRUCHET <hugues.fruchet@st.com> wrote:

> 

>> Hi Peter,

>>

>> I have tested on STM32 platform running Cortex F family having no MMU,

>> shared libraries are disabled (no dlopen) and no fork supported on our

>> setup.

>>

>> libv4lconvert should not have been built at all, because entire lib/

>> folder build is conditional to shared library support:

>> * configure.ac

>> AM_CONDITIONAL([WITH_LIBV4L],       [test x$enable_libv4l    != xno -a

>> x$enable_shared != xno])

>> * Makefile.am

>> [...]

>> +if WITH_LIBV4L

>> +SUBDIRS += lib

>> +endif

> 

> A little bit confused, one of the patches you introduced changed it to:

> 

> - without WITH_LIBV4L: no libv4l libraries at all

> - without WITH_DYN_LIBV4L: only static libraries, no dynamic libraries

> 

> And from configure --help:

> 

>    --disable-libv4l        disable libv4l compilation

>    --disable-dyn-libv4l    disable dynamic libv4l support


This package is named "libv4l" in buildroot but repo name is "v4l-utils" 
which contains:
1) some library plugins on top of V4L kernel interface in order to 
intercept user calls and hook/convert to the appropriate kernel call.
=> so called "libv4l" and located in "lib/" folder
2) some utilities located in "utils/" folder, such as the V4L compliancy 
tool "v4l2-compliance" or the CEC compliancy tool "cec-compliance" which 
are calling either the libv4l interface (default), the libv4l interface 
but statically linked inside utilities (--disable-dyn-libv4l) or the V4L 
kernel interface directly (--disable-libv4l).
Hope that helps to better understand the options.

> 

>>

>> But checking your log I see that --enable-shared is set, so it seems

>> that you are supporting shared libraries on no-MMU platform but without

>> fork() support, is my understanding correct ?

>>

> 

> Yes...

> 

>> What you can do to fix build is to force disabling of libs inside libv4l

>> package:

>>

>> package/libv4l/libv4l.mk

>> +ifeq ($(BR2_USE_MMU),)

>> +LIBV4L_CONF_OPTS += --disable-libv4l

>> +endif

> 

> Works, but feels wrong: A package named libv4l enabled and building/installing

> nothing (except when LIBV4L_UTILS is enabled)...


Right.
The aim of the no-MMU dependency removal patchset was to enable build of 
"utils" even on no-MMU platform. This is required to build at least the 
2 mandatory compliancy tools:
- v4l-compliance: its test report is required by V4L maintainers and is 
to be attached to the cover letter of any V4L driver pushed upstream.
- cec-compliance: the same for CEC drivers.


Please note that you cannot use the libv4l plugins mechanism without 
having fork() support, see libv4lconvert/helper.c, 
v4lconvert_helper_start().
Means that only V4L utilities can be currently supported on no-MMU 
platforms.

Back to your exact build issue, the best fix on my opinion is to add a 
dependency on fork() symbol in configure.ac instead of the one proposed 
in libv4l.mk, find attached a patch proposal.


Regards,
Hugues.
> 

> Regards,

> Peter

> 

>>

>> Hoping that helps.

>>

>> Best regards,

>> Hugues.

>>

>> On 07/11/2017 07:26 PM, Peter Seiderer wrote:

>>> Fixes [1]:

>>>

>>>       CXXLD    v4l2-compliance

>>>     .../output/build/libv4l-1.12.5/lib/libv4lconvert/.libs/libv4lconvert.so: undefined reference to `fork'

>>>     collect2: error: ld returned 1 exit status

>>>

>>> [1] http://autobuild.buildroot.net/results/7e8/7e8fbd99a8c091d7bbeedd16066297682bbe29fe

>>>

>>> Signed-off-by: Peter Seiderer <ps.report@gmx.net>

>>> ---

>>> The libv4l build for noMMU platforms was enabled with commit 'package/libv4l:

>>> allow build of v4l2 utilities on noMMU platforms' (see [2]). But libv4lconvert uses

>>> fork internally, so all utils linking against fail to build. Fix this by disabling

>>> the utils on noMMU platforms (so keep building all libraries).

>>>

>>> Alternatives would be:

>>>

>>> - disable libv4l on all noMMU platforms (not only the utils), revert a part

>>>     of commit [2]

>>>

>>> - create a patch to disable only libv4lconvert (and all dependend utils)

>>>     on noMMU platforms

>>>

>>> [2] https://git.buildroot.net/buildroot/commit/?id=f837251785e9389f53d695ddb8a094707865171b

>>> ---

>>>    package/libv4l/Config.in | 1 +

>>>    1 file changed, 1 insertion(+)

>>>

>>> diff --git a/package/libv4l/Config.in b/package/libv4l/Config.in

>>> index e7f78dc70f..61c290f251 100644

>>> --- a/package/libv4l/Config.in

>>> +++ b/package/libv4l/Config.in

>>> @@ -19,6 +19,7 @@ comment "libv4l JPEG support not enabled"

>>>    

>>>    config BR2_PACKAGE_LIBV4L_UTILS

>>>    	bool "v4l-utils tools"

>>> +	depends on BR2_USE_MMU # fork(), used in libv4lconvert linked by various utils eg. v4l2-compliance

>>>    	help

>>>    	  v4l-utils is a collection of various video4linux and DVB utilities.

>>>    	  Enable this if you want to build the following tools:

>>>

>> _______________________________________________

>> buildroot mailing list

>> buildroot@busybox.net

>> http://lists.busybox.net/mailman/listinfo/buildroot

>

Comments

Thomas Petazzoni July 22, 2017, 7:44 p.m. UTC | #1
Hello,

On Tue, 18 Jul 2017 09:08:18 +0000, Hugues FRUCHET wrote:

> Back to your exact build issue, the best fix on my opinion is to add a 
> dependency on fork() symbol in configure.ac instead of the one proposed 
> in libv4l.mk, find attached a patch proposal.

Does your patch actually work? A lot of the utils in utils/ do require
the libraries, won't they fail to build if the libraries are not built ?

Could you make a clean patch submission to resolve this issue ?

Thanks,

Thomas
Peter Seiderer July 22, 2017, 9:36 p.m. UTC | #2
Hello Hugues,

On Tue, 18 Jul 2017 09:08:18 +0000, Hugues FRUCHET <hugues.fruchet@st.com> wrote:

> Hi Peter,
> 
> On 07/17/2017 08:09 PM, Peter Seiderer wrote:
> > Hello Hugues,
> > 
> > On Mon, 17 Jul 2017 10:07:07 +0000, Hugues FRUCHET <hugues.fruchet@st.com> wrote:
> > 
> >> Hi Peter,
> >>
> >> I have tested on STM32 platform running Cortex F family having no MMU,
> >> shared libraries are disabled (no dlopen) and no fork supported on our
> >> setup.
> >>
> >> libv4lconvert should not have been built at all, because entire lib/
> >> folder build is conditional to shared library support:
> >> * configure.ac
> >> AM_CONDITIONAL([WITH_LIBV4L],       [test x$enable_libv4l    != xno -a
> >> x$enable_shared != xno])
> >> * Makefile.am
> >> [...]
> >> +if WITH_LIBV4L
> >> +SUBDIRS += lib
> >> +endif
> > 
> > A little bit confused, one of the patches you introduced changed it to:
> > 
> > - without WITH_LIBV4L: no libv4l libraries at all
> > - without WITH_DYN_LIBV4L: only static libraries, no dynamic libraries
> > 
> > And from configure --help:
> > 
> >    --disable-libv4l        disable libv4l compilation
> >    --disable-dyn-libv4l    disable dynamic libv4l support
> 
> This package is named "libv4l" in buildroot but repo name is "v4l-utils" 
> which contains:
> 1) some library plugins on top of V4L kernel interface in order to 
> intercept user calls and hook/convert to the appropriate kernel call.
> => so called "libv4l" and located in "lib/" folder
> 2) some utilities located in "utils/" folder, such as the V4L compliancy 
> tool "v4l2-compliance" or the CEC compliancy tool "cec-compliance" which 
> are calling either the libv4l interface (default), the libv4l interface 
> but statically linked inside utilities (--disable-dyn-libv4l) or the V4L 
> kernel interface directly (--disable-libv4l).
> Hope that helps to better understand the options.
> 
> > 
> >>
> >> But checking your log I see that --enable-shared is set, so it seems
> >> that you are supporting shared libraries on no-MMU platform but without
> >> fork() support, is my understanding correct ?
> >>
> > 
> > Yes...
> > 
> >> What you can do to fix build is to force disabling of libs inside libv4l
> >> package:
> >>
> >> package/libv4l/libv4l.mk
> >> +ifeq ($(BR2_USE_MMU),)
> >> +LIBV4L_CONF_OPTS += --disable-libv4l
> >> +endif
> > 
> > Works, but feels wrong: A package named libv4l enabled and building/installing
> > nothing (except when LIBV4L_UTILS is enabled)...
> 
> Right.
> The aim of the no-MMU dependency removal patchset was to enable build of 
> "utils" even on no-MMU platform. This is required to build at least the 
> 2 mandatory compliancy tools:
> - v4l-compliance: its test report is required by V4L maintainers and is 
> to be attached to the cover letter of any V4L driver pushed upstream.
> - cec-compliance: the same for CEC drivers.
> 
> 
> Please note that you cannot use the libv4l plugins mechanism without 
> having fork() support, see libv4lconvert/helper.c, 
> v4lconvert_helper_start().

Yes, but only libv4lconvert needs fork, all other libraries not...,
without fork support only libv4lconvert (and all dependent utils)
should not be built...

> Means that only V4L utilities can be currently supported on no-MMU 
> platforms.
> 
> Back to your exact build issue, the best fix on my opinion is to add a 
> dependency on fork() symbol in configure.ac instead of the one proposed 
> in libv4l.mk, find attached a patch proposal.

Patch did not work:

	$ make libv4l
[...]
compile time options summary
============================

    Host OS                    : linux-uclibc
    X11                        : no
    GL                         : no
    glu                        : no
    libjpeg                    : 
    libudev                    : no
    pthread                    : yes
    fork                       : no
    QT version                 : none
    ALSA support               : no

    build dynamic libs         : yes
    build static libs          : no

    gconv                      : no

    libv4l                     : yes
    dynamic libv4l             : yes
    v4l_plugins                : yes
    v4l_wrappers               : yes
    libdvbv5                   : no
    dvbv5-daemon               : no
    v4lutils                   : yes
    qv4l2                      : no
    v4l2-ctl uses libv4l       : yes
    v4l2-compliance uses libv4l: yes
[...]
helper.c: In function ‘v4lconvert_helper_start’:
helper.c:64:25: warning: implicit declaration of function ‘fork’ [-Wimplicit-function-declaration]
  data->decompress_pid = fork();
                         ^~~~
[...]
  CXXLD    v4l2-compliance
.../build_bfin_libv4l_fix_fork_001/build/libv4l-1.12.5/lib/libv4lconvert/.libs/libv4lconvert.so: undefined reference to `fork'
collect2: error: ld returned 1 exit status

Regards,
Peter


> 
> 
> Regards,
> Hugues.
> > 
> > Regards,
> > Peter
> > 
> >>
> >> Hoping that helps.
> >>
> >> Best regards,
> >> Hugues.
> >>
> >> On 07/11/2017 07:26 PM, Peter Seiderer wrote:
> >>> Fixes [1]:
> >>>
> >>>       CXXLD    v4l2-compliance
> >>>     .../output/build/libv4l-1.12.5/lib/libv4lconvert/.libs/libv4lconvert.so: undefined reference to `fork'
> >>>     collect2: error: ld returned 1 exit status
> >>>
> >>> [1] http://autobuild.buildroot.net/results/7e8/7e8fbd99a8c091d7bbeedd16066297682bbe29fe
> >>>
> >>> Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> >>> ---
> >>> The libv4l build for noMMU platforms was enabled with commit 'package/libv4l:
> >>> allow build of v4l2 utilities on noMMU platforms' (see [2]). But libv4lconvert uses
> >>> fork internally, so all utils linking against fail to build. Fix this by disabling
> >>> the utils on noMMU platforms (so keep building all libraries).
> >>>
> >>> Alternatives would be:
> >>>
> >>> - disable libv4l on all noMMU platforms (not only the utils), revert a part
> >>>     of commit [2]
> >>>
> >>> - create a patch to disable only libv4lconvert (and all dependend utils)
> >>>     on noMMU platforms
> >>>
> >>> [2] https://git.buildroot.net/buildroot/commit/?id=f837251785e9389f53d695ddb8a094707865171b
> >>> ---
> >>>    package/libv4l/Config.in | 1 +
> >>>    1 file changed, 1 insertion(+)
> >>>
> >>> diff --git a/package/libv4l/Config.in b/package/libv4l/Config.in
> >>> index e7f78dc70f..61c290f251 100644
> >>> --- a/package/libv4l/Config.in
> >>> +++ b/package/libv4l/Config.in
> >>> @@ -19,6 +19,7 @@ comment "libv4l JPEG support not enabled"
> >>>    
> >>>    config BR2_PACKAGE_LIBV4L_UTILS
> >>>    	bool "v4l-utils tools"
> >>> +	depends on BR2_USE_MMU # fork(), used in libv4lconvert linked by various utils eg. v4l2-compliance
> >>>    	help
> >>>    	  v4l-utils is a collection of various video4linux and DVB utilities.
> >>>    	  Enable this if you want to build the following tools:
> >>>
> >> _______________________________________________
> >> buildroot mailing list
> >> buildroot@busybox.net
> >> http://lists.busybox.net/mailman/listinfo/buildroot
> >
Hugues Fruchet July 24, 2017, 8:14 a.m. UTC | #3
Hi Thomas,

On 07/22/2017 09:44 PM, Thomas Petazzoni wrote:
> Hello,
> 
> On Tue, 18 Jul 2017 09:08:18 +0000, Hugues FRUCHET wrote:
> 
>> Back to your exact build issue, the best fix on my opinion is to add a
>> dependency on fork() symbol in configure.ac instead of the one proposed
>> in libv4l.mk, find attached a patch proposal.
> 
> Does your patch actually work? A lot of the utils in utils/ do require
> the libraries, won't they fail to build if the libraries are not built ?
Those which depends on libraries won't be built, but some will remains 
built, as the compliancy tools. This was the aim of the initial patch.

> 
> Could you make a clean patch submission to resolve this issue ?
There was a typo in proposed patch, I've sent to Peter a fixed version.
When build is confirmed OK by Peter, I'll push to both V4L2 and 
buildroot lists.

> 
> Thanks,
> 
> Thomas
> 

BR,
Hugues.
diff mbox

Patch

--- a/configure.ac
+++ b/configure.ac
@@ -298,6 +298,9 @@  argp_saved_libs=$LIBS
   AC_SUBST([ARGP_LIBS])
 LIBS=$argp_saved_libs
 
+# Check for fork(), needed by libv4lconvert
+AC_CHECK_FUNCS([fork], have_fork=yes, have_fork=no)
+
 AC_CHECK_HEADER([linux/i2c-dev.h], [linux_i2c_dev=yes], [linux_i2c_dev=no])
 AM_CONDITIONAL([HAVE_LINUX_I2C_DEV], [test x$linux_i2c_dev = xyes])
 
@@ -436,7 +439,7 @@  AM_CONDITIONAL([WITH_LIBDVBV5],     [tes
 AM_CONDITIONAL([WITH_DVBV5_REMOTE], [test x$enable_libdvbv5  != xno -a x$have_libudev = xyes -a x$have_pthread = xyes])
 
 AM_CONDITIONAL([WITH_DYN_LIBV4L],   [test x$enable_dyn_libv4l != xno])
-AM_CONDITIONAL([WITH_LIBV4L],       [test x$enable_libv4l    != xno -a x$enable_shared != xno])
+AM_CONDITIONAL([WITH_LIBV4L],       [test x$enable_libv4l    != xno -a x$enable_shared != xno -a x$have_forked != xno])
 AM_CONDITIONAL([WITH_V4LUTILS],	    [test x$enable_v4l_utils != xno -a x$linux_os = xyes])
 AM_CONDITIONAL([WITH_QV4L2],	    [test x${qt_pkgconfig} = xtrue -a x$enable_qv4l2 != xno])
 AM_CONDITIONAL([WITH_V4L_PLUGINS],  [test x$enable_dyn_libv4l != xno -a x$enable_shared != xno])
@@ -492,6 +495,7 @@  compile time options summary
     libjpeg                    : $have_jpeg
     libudev                    : $have_libudev
     pthread                    : $have_pthread
+    fork                       : $have_fork
     QT version                 : $QT_VERSION
     ALSA support               : $USE_ALSA