[libcamera-devel] [PATCH] test: threads: Fix link failure due to missing dependency

Jacopo Mondi jacopo at jmondi.org
Wed Oct 5 19:25:24 CEST 2022


Hi Laurent

On Wed, Oct 05, 2022 at 04:59:11PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Wed, Oct 05, 2022 at 03:02:16PM +0200, Jacopo Mondi wrote:
> > On Wed, Oct 05, 2022 at 01:56:21PM +0300, Laurent Pinchart via libcamera-devel wrote:
> > > Commit 036d26d6677e ("test: threads: Test thread cleanup upon abnormal
> > > termination") added calls to functions provided by the pthread library
> > > in the threads test, but didn't add the corresponding dependency. This
> > > caused a link breakage on some platforms:
> > >
> > > /usr/bin/ld: test/threads.p/threads.cpp.o: undefined reference to symbol 'pthread_cancel@@GLIBC_2.4'
> > > /usr/bin/ld: /lib/arm-linux-gnueabihf/libpthread.so.0: error adding symbols: DSO missing from command line
> > > collect2: error: ld returned 1 exit status
> > >
> > > Fix it by adding the missing dependency.
> > >
> > > Fixes: 036d26d6677e ("test: threads: Test thread cleanup upon abnormal termination")
> > > Reported-by: Naushir Patuck <naush at raspberrypi.com>
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > ---
> > >  src/libcamera/base/meson.build |  2 +-
> > >  src/libcamera/meson.build      |  1 +
> > >  test/meson.build               | 23 +++++++++++++++++++----
> > >  3 files changed, 21 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
> > > index 3b9d74efe935..7a75914ab2a8 100644
> > > --- a/src/libcamera/base/meson.build
> > > +++ b/src/libcamera/base/meson.build
> > > @@ -38,9 +38,9 @@ if libunwind.found()
> > >  endif
> > >
> > >  libcamera_base_deps = [
> > > -    dependency('threads'),
> > >      libatomic,
> > >      libdw,
> > > +    libthreads,
> > >      libunwind,
> > >  ]
> > >
> > > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> > > index 63b47b177fd2..7fcbb2ddc9e7 100644
> > > --- a/src/libcamera/meson.build
> > > +++ b/src/libcamera/meson.build
> > > @@ -58,6 +58,7 @@ includes = [
> > >  ]
> > >
> > >  libatomic = cc.find_library('atomic', required : false)
> > > +libthreads = dependency('threads')
> > >
> > >  subdir('base')
> > >  subdir('ipa')
> > > diff --git a/test/meson.build b/test/meson.build
> > > index 6cc778415dc8..9bf7bf34e796 100644
> > > --- a/test/meson.build
> > > +++ b/test/meson.build
> > > @@ -51,7 +51,7 @@ internal_tests = [
> > >      ['pixel-format',                    'pixel-format.cpp'],
> > >      ['shared-fd',                       'shared-fd.cpp'],
> > >      ['signal-threads',                  'signal-threads.cpp'],
> > > -    ['threads',                         'threads.cpp'],
> > > +    ['threads',                         'threads.cpp', [libthreads]],
> > >      ['timer',                           'timer.cpp'],
> > >      ['timer-thread',                    'timer-thread.cpp'],
> > >      ['unique-fd',                       'unique-fd.cpp'],
> > > @@ -65,8 +65,13 @@ internal_non_parallel_tests = [
> > >  ]
> > >
> > >  foreach t : public_tests
> > > +    deps = [libcamera_public]
> > > +    if t.length() > 2
> > > +        deps += t[2]
> > > +    endif
> > > +
> >
> > This seems very fragile.
> > Can't we had libthreads to the list of test dependencies
> > unconditionally ? Seems like it's something that should be easily
> > available everywhere, isn't it ?
>
> The library will be there, but there's no need to link each test to it.

You're right, even if we're talking about tests, and -lpthread is
certainly not the biggest dependency we have.

> This patch also prepares for adding other dependencies to individual
> tests in the future. Of course one could argue that we shouldn't prepare
> for something that is not guaranteed to be needed.
>

As discussed, moving to a dictionary would make this look less bad,
but for now
Acked-by: Jacopo Mondi <jacopo at jmondi.org>

> > >      exe = executable(t[0], t[1],
> > > -                     dependencies : libcamera_public,
> > > +                     dependencies : deps,
> > >                       link_with : test_libraries,
> > >                       include_directories : test_includes_public)
> > >
> > > @@ -74,8 +79,13 @@ foreach t : public_tests
> > >  endforeach
> > >
> > >  foreach t : internal_tests
> > > +    deps = [libcamera_private]
> > > +    if t.length() > 2
> > > +        deps += t[2]
> > > +    endif
> > > +
> > >      exe = executable(t[0], t[1],
> > > -                     dependencies : libcamera_private,
> > > +                     dependencies : deps,
> > >                       link_with : test_libraries,
> > >                       include_directories : test_includes_internal)
> > >
> > > @@ -83,8 +93,13 @@ foreach t : internal_tests
> > >  endforeach
> > >
> > >  foreach t : internal_non_parallel_tests
> > > +    deps = [libcamera_private]
> > > +    if t.length() > 2
> > > +        deps += t[2]
> > > +    endif
> > > +
> > >      exe = executable(t[0], t[1],
> > > -                     dependencies : libcamera_private,
> > > +                     dependencies : deps,
> > >                       link_with : test_libraries,
> > >                       include_directories : test_includes_internal)
> > >
> > >
> > > base-commit: 12f4708e35cde15ff9607d59eb053ece1b2bd081
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list