[libcamera-devel] lc-compliance: Only download a gtest subproject as a fallback
diff mbox series

Message ID 20220202143141.160660-1-javierm@redhat.com
State Accepted
Commit e526a57d09a3cb9fe226e70f896b4beaa8f9180a
Headers show
Series
  • [libcamera-devel] lc-compliance: Only download a gtest subproject as a fallback
Related show

Commit Message

Javier Martinez Canillas Feb. 2, 2022, 2:31 p.m. UTC
Currently, a subproject is used to fetch gtest dependency unconditionally
for any Linux distribution besides ChromeOS. But it leads to a regression
in distros whose builders are not allowed to download files during build.

This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
with gtest in subprojects") and the rationale is that some distros, such
as Debian ship libgtest-dev as a static library. And this could be built
with a different toolchain than the one used to build libcamera itself.

But this seems to be a corner case, usually users will either build both
libcamera and all its dependencies using the same toolchain or build it
using both the libgtest library and toolchain as provided by the distro.

If someone doesn't want for meson to pick up the non-compatible static
library provided by the distro, then instead should make sure that their
build root does not have the package providing this installed.

Let's simplify the logic to find the dependency and just use the built-in
support in dependency() function to fallback to a subproject if not found.

This covers to common case of attempting to use the gtest provided by the
system or pulling from source if not found or is not preferred.

Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
Reported-by: Eric Curtin <ecurtin@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---

 src/lc-compliance/meson.build | 17 +++--------------
 1 file changed, 3 insertions(+), 14 deletions(-)

Comments

Laurent Pinchart Feb. 2, 2022, 5:32 p.m. UTC | #1
Hi Javier,

Thank you for the patch.

On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> Currently, a subproject is used to fetch gtest dependency unconditionally
> for any Linux distribution besides ChromeOS. But it leads to a regression
> in distros whose builders are not allowed to download files during build.
> 
> This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> with gtest in subprojects") and the rationale is that some distros, such
> as Debian ship libgtest-dev as a static library. And this could be built
> with a different toolchain than the one used to build libcamera itself.
> 
> But this seems to be a corner case, usually users will either build both
> libcamera and all its dependencies using the same toolchain or build it
> using both the libgtest library and toolchain as provided by the distro.
> 
> If someone doesn't want for meson to pick up the non-compatible static
> library provided by the distro, then instead should make sure that their
> build root does not have the package providing this installed.
> 
> Let's simplify the logic to find the dependency and just use the built-in
> support in dependency() function to fallback to a subproject if not found.
> 
> This covers to common case of attempting to use the gtest provided by the
> system or pulling from source if not found or is not preferred.
> 
> Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> Reported-by: Eric Curtin <ecurtin@redhat.com>
> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>

As discussed on IRC, this breaks the build when compiling libcamera with
clang + libc++ on a system providing a gtest package compiled with g++ +
libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
corresponding libstdc++ having different versions of some symbols:

/usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'

Such "cross" compilation isn't expected in most cases, but can be useful
for CI to test multiple compilers on a host system without a fully
separate build root. Setting the meson force_fallback_for option to
gtest fixes the CI compilation tests, so

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
> 
>  src/lc-compliance/meson.build | 17 +++--------------
>  1 file changed, 3 insertions(+), 14 deletions(-)
> 
> diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> index 130ddbb55916..8b57474be2b2 100644
> --- a/src/lc-compliance/meson.build
> +++ b/src/lc-compliance/meson.build
> @@ -1,25 +1,14 @@
>  # SPDX-License-Identifier: CC0-1.0
>  
>  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> +                      fallback : ['gtest', 'gtest_dep'])
>  
> -if not libevent.found()
> +if not (libevent.found() and libgtest.found())
>      lc_compliance_enabled = false
>      subdir_done()
>  endif
>  
> -if get_option('android_platform') == 'cros'
> -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> -
> -    if not libgtest.found()
> -        lc_compliance_enabled = false
> -        subdir_done()
> -    endif
> -
> -else
> -    libgtest_sp = subproject('gtest')
> -    libgtest = libgtest_sp.get_variable('gtest_dep')
> -endif
> -
>  lc_compliance_enabled = true
>  
>  lc_compliance_sources = files([
Hirokazu Honda Feb. 3, 2022, 12:57 a.m. UTC | #2
Hi Javier, thank you for the patch.

On Thu, Feb 3, 2022 at 2:32 AM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Javier,
>
> Thank you for the patch.
>
> On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> > Currently, a subproject is used to fetch gtest dependency unconditionally
> > for any Linux distribution besides ChromeOS. But it leads to a regression
> > in distros whose builders are not allowed to download files during build.
> >
> > This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> > with gtest in subprojects") and the rationale is that some distros, such
> > as Debian ship libgtest-dev as a static library. And this could be built
> > with a different toolchain than the one used to build libcamera itself.
> >
> > But this seems to be a corner case, usually users will either build both
> > libcamera and all its dependencies using the same toolchain or build it
> > using both the libgtest library and toolchain as provided by the distro.
> >
> > If someone doesn't want for meson to pick up the non-compatible static
> > library provided by the distro, then instead should make sure that their
> > build root does not have the package providing this installed.
> >
> > Let's simplify the logic to find the dependency and just use the built-in
> > support in dependency() function to fallback to a subproject if not found.
> >
> > This covers to common case of attempting to use the gtest provided by the
> > system or pulling from source if not found or is not preferred.
> >
> > Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> > Reported-by: Eric Curtin <ecurtin@redhat.com>
> > Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>

The fallback option happens if there is no libgtest in a system.
https://mesonbuild.com/Dependencies.html#building-dependencies-as-subprojects
It is at linking time that we find the libgtest doesn't work.
So I think the problem happens in an environment where libgtest is
installed and a different compiler from one building the libgtest is
used for libcamera.
If I understand correctly, the built-in libgest is compiled always with gcc?
 I am not sure how edge case it is to build libcamera with a different compiler.

Best Regards,
-Hiro
>
> As discussed on IRC, this breaks the build when compiling libcamera with
> clang + libc++ on a system providing a gtest package compiled with g++ +
> libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
> corresponding libstdc++ having different versions of some symbols:
>
> /usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
>
> Such "cross" compilation isn't expected in most cases, but can be useful
> for CI to test multiple compilers on a host system without a fully
> separate build root. Setting the meson force_fallback_for option to
> gtest fixes the CI compilation tests, so
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> > ---
> >
> >  src/lc-compliance/meson.build | 17 +++--------------
> >  1 file changed, 3 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> > index 130ddbb55916..8b57474be2b2 100644
> > --- a/src/lc-compliance/meson.build
> > +++ b/src/lc-compliance/meson.build
> > @@ -1,25 +1,14 @@
> >  # SPDX-License-Identifier: CC0-1.0
> >
> >  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> > +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> > +                      fallback : ['gtest', 'gtest_dep'])
> >
> > -if not libevent.found()
> > +if not (libevent.found() and libgtest.found())
> >      lc_compliance_enabled = false
> >      subdir_done()
> >  endif
> >
> > -if get_option('android_platform') == 'cros'
> > -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> > -
> > -    if not libgtest.found()
> > -        lc_compliance_enabled = false
> > -        subdir_done()
> > -    endif
> > -
> > -else
> > -    libgtest_sp = subproject('gtest')
> > -    libgtest = libgtest_sp.get_variable('gtest_dep')
> > -endif
> > -
> >  lc_compliance_enabled = true
> >
> >  lc_compliance_sources = files([
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Feb. 3, 2022, 1:09 a.m. UTC | #3
Hi Hiro,

On Thu, Feb 03, 2022 at 09:57:38AM +0900, Hirokazu Honda wrote:
> On Thu, Feb 3, 2022 at 2:32 AM Laurent Pinchart wrote:
> > On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> > > Currently, a subproject is used to fetch gtest dependency unconditionally
> > > for any Linux distribution besides ChromeOS. But it leads to a regression
> > > in distros whose builders are not allowed to download files during build.
> > >
> > > This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> > > with gtest in subprojects") and the rationale is that some distros, such
> > > as Debian ship libgtest-dev as a static library. And this could be built
> > > with a different toolchain than the one used to build libcamera itself.
> > >
> > > But this seems to be a corner case, usually users will either build both
> > > libcamera and all its dependencies using the same toolchain or build it
> > > using both the libgtest library and toolchain as provided by the distro.
> > >
> > > If someone doesn't want for meson to pick up the non-compatible static
> > > library provided by the distro, then instead should make sure that their
> > > build root does not have the package providing this installed.
> > >
> > > Let's simplify the logic to find the dependency and just use the built-in
> > > support in dependency() function to fallback to a subproject if not found.
> > >
> > > This covers to common case of attempting to use the gtest provided by the
> > > system or pulling from source if not found or is not preferred.
> > >
> > > Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> > > Reported-by: Eric Curtin <ecurtin@redhat.com>
> > > Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> 
> The fallback option happens if there is no libgtest in a system.
> https://mesonbuild.com/Dependencies.html#building-dependencies-as-subprojects
> It is at linking time that we find the libgtest doesn't work.
> So I think the problem happens in an environment where libgtest is
> installed and a different compiler from one building the libgtest is
> used for libcamera.

That's correct.

> If I understand correctly, the built-in libgest is compiled always with gcc?
>  I am not sure how edge case it is to build libcamera with a different compiler.

In most cases libcamera will be built with the same compiler as the rest
of the system, including the gtest version provided by the distribution.
Things should thus work fine. However, in our CI environment, we
typically compile-test libcamera with different versions of gcc and
clang, without using a separate build root that is compiled with the
same compiler. It failed linking to gtest with building with libcamera
with clang while the system is built with gcc, which is the usual case
(actually I believe it's not related to clang vs. gcc but to libc++ vs.
libstdc++). I used to disable lc-compliance when building with clang for
this reason, and your patch that added the gtest wrap helped increasing
the CI coverage.

I'm not entirely sure what other issues, if any, your patch fixes
though. On Chrome OS we kept building with the system-provided gtest, so
I suppose it wasn't about Chrome OS.

> > As discussed on IRC, this breaks the build when compiling libcamera with
> > clang + libc++ on a system providing a gtest package compiled with g++ +
> > libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
> > corresponding libstdc++ having different versions of some symbols:
> >
> > /usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
> >
> > Such "cross" compilation isn't expected in most cases, but can be useful
> > for CI to test multiple compilers on a host system without a fully
> > separate build root. Setting the meson force_fallback_for option to
> > gtest fixes the CI compilation tests, so
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >
> > > ---
> > >
> > >  src/lc-compliance/meson.build | 17 +++--------------
> > >  1 file changed, 3 insertions(+), 14 deletions(-)
> > >
> > > diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> > > index 130ddbb55916..8b57474be2b2 100644
> > > --- a/src/lc-compliance/meson.build
> > > +++ b/src/lc-compliance/meson.build
> > > @@ -1,25 +1,14 @@
> > >  # SPDX-License-Identifier: CC0-1.0
> > >
> > >  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> > > +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> > > +                      fallback : ['gtest', 'gtest_dep'])
> > >
> > > -if not libevent.found()
> > > +if not (libevent.found() and libgtest.found())
> > >      lc_compliance_enabled = false
> > >      subdir_done()
> > >  endif
> > >
> > > -if get_option('android_platform') == 'cros'
> > > -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> > > -
> > > -    if not libgtest.found()
> > > -        lc_compliance_enabled = false
> > > -        subdir_done()
> > > -    endif
> > > -
> > > -else
> > > -    libgtest_sp = subproject('gtest')
> > > -    libgtest = libgtest_sp.get_variable('gtest_dep')
> > > -endif
> > > -
> > >  lc_compliance_enabled = true
> > >
> > >  lc_compliance_sources = files([
Hirokazu Honda Feb. 3, 2022, 1:47 a.m. UTC | #4
Hi Laurent,

On Thu, Feb 3, 2022 at 10:09 AM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Hiro,
>
> On Thu, Feb 03, 2022 at 09:57:38AM +0900, Hirokazu Honda wrote:
> > On Thu, Feb 3, 2022 at 2:32 AM Laurent Pinchart wrote:
> > > On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> > > > Currently, a subproject is used to fetch gtest dependency unconditionally
> > > > for any Linux distribution besides ChromeOS. But it leads to a regression
> > > > in distros whose builders are not allowed to download files during build.
> > > >
> > > > This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> > > > with gtest in subprojects") and the rationale is that some distros, such
> > > > as Debian ship libgtest-dev as a static library. And this could be built
> > > > with a different toolchain than the one used to build libcamera itself.
> > > >
> > > > But this seems to be a corner case, usually users will either build both
> > > > libcamera and all its dependencies using the same toolchain or build it
> > > > using both the libgtest library and toolchain as provided by the distro.
> > > >
> > > > If someone doesn't want for meson to pick up the non-compatible static
> > > > library provided by the distro, then instead should make sure that their
> > > > build root does not have the package providing this installed.
> > > >
> > > > Let's simplify the logic to find the dependency and just use the built-in
> > > > support in dependency() function to fallback to a subproject if not found.
> > > >
> > > > This covers to common case of attempting to use the gtest provided by the
> > > > system or pulling from source if not found or is not preferred.
> > > >
> > > > Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> > > > Reported-by: Eric Curtin <ecurtin@redhat.com>
> > > > Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> >
> > The fallback option happens if there is no libgtest in a system.
> > https://mesonbuild.com/Dependencies.html#building-dependencies-as-subprojects
> > It is at linking time that we find the libgtest doesn't work.
> > So I think the problem happens in an environment where libgtest is
> > installed and a different compiler from one building the libgtest is
> > used for libcamera.
>
> That's correct.
>
> > If I understand correctly, the built-in libgest is compiled always with gcc?
> >  I am not sure how edge case it is to build libcamera with a different compiler.
>
> In most cases libcamera will be built with the same compiler as the rest
> of the system, including the gtest version provided by the distribution.
> Things should thus work fine. However, in our CI environment, we
> typically compile-test libcamera with different versions of gcc and
> clang, without using a separate build root that is compiled with the
> same compiler. It failed linking to gtest with building with libcamera
> with clang while the system is built with gcc, which is the usual case
> (actually I believe it's not related to clang vs. gcc but to libc++ vs.
> libstdc++). I used to disable lc-compliance when building with clang for
> this reason, and your patch that added the gtest wrap helped increasing
> the CI coverage.

Ah yeah, it is libc++ vs. libstdc++. I forgot that.

>
> I'm not entirely sure what other issues, if any, your patch fixes
> though. On Chrome OS we kept building with the system-provided gtest, so
> I suppose it wasn't about Chrome OS.
>

That's right. Both libgtest and libcamera are built with libc++ on
ChromeOS build environment.
Therefore this is not problem. But I build libmcaera on Debian, I use
clang for various convenient c++ checks e.g. thread-safety, so libc++
is used. https://git.linuxtv.org/libcamera.git/tree/meson.build#n71
I have to not use clang or uninstall either libc++ or libgtest.
This change makes it impossible to build libcamera with clang++, if
the installed libgest is built with different c++ standard library,
unless meson.build is manually modified.
Hmm, yeah maybe I should uninstall libgtest on my Debian.

-Hiro
> > > As discussed on IRC, this breaks the build when compiling libcamera with
> > > clang + libc++ on a system providing a gtest package compiled with g++ +
> > > libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
> > > corresponding libstdc++ having different versions of some symbols:
> > >
> > > /usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
> > >
> > > Such "cross" compilation isn't expected in most cases, but can be useful
> > > for CI to test multiple compilers on a host system without a fully
> > > separate build root. Setting the meson force_fallback_for option to
> > > gtest fixes the CI compilation tests, so
> > >
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > >
> > > > ---
> > > >
> > > >  src/lc-compliance/meson.build | 17 +++--------------
> > > >  1 file changed, 3 insertions(+), 14 deletions(-)
> > > >
> > > > diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> > > > index 130ddbb55916..8b57474be2b2 100644
> > > > --- a/src/lc-compliance/meson.build
> > > > +++ b/src/lc-compliance/meson.build
> > > > @@ -1,25 +1,14 @@
> > > >  # SPDX-License-Identifier: CC0-1.0
> > > >
> > > >  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> > > > +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> > > > +                      fallback : ['gtest', 'gtest_dep'])
> > > >
> > > > -if not libevent.found()
> > > > +if not (libevent.found() and libgtest.found())
> > > >      lc_compliance_enabled = false
> > > >      subdir_done()
> > > >  endif
> > > >
> > > > -if get_option('android_platform') == 'cros'
> > > > -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> > > > -
> > > > -    if not libgtest.found()
> > > > -        lc_compliance_enabled = false
> > > > -        subdir_done()
> > > > -    endif
> > > > -
> > > > -else
> > > > -    libgtest_sp = subproject('gtest')
> > > > -    libgtest = libgtest_sp.get_variable('gtest_dep')
> > > > -endif
> > > > -
> > > >  lc_compliance_enabled = true
> > > >
> > > >  lc_compliance_sources = files([
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Feb. 3, 2022, 1:56 a.m. UTC | #5
Hi Hiro,

On Thu, Feb 03, 2022 at 10:47:25AM +0900, Hirokazu Honda wrote:
> On Thu, Feb 3, 2022 at 10:09 AM Laurent Pinchart wrote:
> > On Thu, Feb 03, 2022 at 09:57:38AM +0900, Hirokazu Honda wrote:
> > > On Thu, Feb 3, 2022 at 2:32 AM Laurent Pinchart wrote:
> > > > On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> > > > > Currently, a subproject is used to fetch gtest dependency unconditionally
> > > > > for any Linux distribution besides ChromeOS. But it leads to a regression
> > > > > in distros whose builders are not allowed to download files during build.
> > > > >
> > > > > This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> > > > > with gtest in subprojects") and the rationale is that some distros, such
> > > > > as Debian ship libgtest-dev as a static library. And this could be built
> > > > > with a different toolchain than the one used to build libcamera itself.
> > > > >
> > > > > But this seems to be a corner case, usually users will either build both
> > > > > libcamera and all its dependencies using the same toolchain or build it
> > > > > using both the libgtest library and toolchain as provided by the distro.
> > > > >
> > > > > If someone doesn't want for meson to pick up the non-compatible static
> > > > > library provided by the distro, then instead should make sure that their
> > > > > build root does not have the package providing this installed.
> > > > >
> > > > > Let's simplify the logic to find the dependency and just use the built-in
> > > > > support in dependency() function to fallback to a subproject if not found.
> > > > >
> > > > > This covers to common case of attempting to use the gtest provided by the
> > > > > system or pulling from source if not found or is not preferred.
> > > > >
> > > > > Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> > > > > Reported-by: Eric Curtin <ecurtin@redhat.com>
> > > > > Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> > >
> > > The fallback option happens if there is no libgtest in a system.
> > > https://mesonbuild.com/Dependencies.html#building-dependencies-as-subprojects
> > > It is at linking time that we find the libgtest doesn't work.
> > > So I think the problem happens in an environment where libgtest is
> > > installed and a different compiler from one building the libgtest is
> > > used for libcamera.
> >
> > That's correct.
> >
> > > If I understand correctly, the built-in libgest is compiled always with gcc?
> > >  I am not sure how edge case it is to build libcamera with a different compiler.
> >
> > In most cases libcamera will be built with the same compiler as the rest
> > of the system, including the gtest version provided by the distribution.
> > Things should thus work fine. However, in our CI environment, we
> > typically compile-test libcamera with different versions of gcc and
> > clang, without using a separate build root that is compiled with the
> > same compiler. It failed linking to gtest with building with libcamera
> > with clang while the system is built with gcc, which is the usual case
> > (actually I believe it's not related to clang vs. gcc but to libc++ vs.
> > libstdc++). I used to disable lc-compliance when building with clang for
> > this reason, and your patch that added the gtest wrap helped increasing
> > the CI coverage.
> 
> Ah yeah, it is libc++ vs. libstdc++. I forgot that.
> 
> > I'm not entirely sure what other issues, if any, your patch fixes
> > though. On Chrome OS we kept building with the system-provided gtest, so
> > I suppose it wasn't about Chrome OS.
> 
> That's right. Both libgtest and libcamera are built with libc++ on
> ChromeOS build environment.
> Therefore this is not problem. But I build libmcaera on Debian, I use
> clang for various convenient c++ checks e.g. thread-safety, so libc++
> is used. https://git.linuxtv.org/libcamera.git/tree/meson.build#n71
> I have to not use clang or uninstall either libc++ or libgtest.
> This change makes it impossible to build libcamera with clang++, if
> the installed libgest is built with different c++ standard library,
> unless meson.build is manually modified.
> Hmm, yeah maybe I should uninstall libgtest on my Debian.

No need to, you can use meson magic :-)

meson configure -Dforce_fallback_for=gtest

and meson will fallback to the wrap for gtest, even if it is detected in
the system.

> > > > As discussed on IRC, this breaks the build when compiling libcamera with
> > > > clang + libc++ on a system providing a gtest package compiled with g++ +
> > > > libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
> > > > corresponding libstdc++ having different versions of some symbols:
> > > >
> > > > /usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
> > > >
> > > > Such "cross" compilation isn't expected in most cases, but can be useful
> > > > for CI to test multiple compilers on a host system without a fully
> > > > separate build root. Setting the meson force_fallback_for option to
> > > > gtest fixes the CI compilation tests, so
> > > >
> > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > >
> > > > > ---
> > > > >
> > > > >  src/lc-compliance/meson.build | 17 +++--------------
> > > > >  1 file changed, 3 insertions(+), 14 deletions(-)
> > > > >
> > > > > diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> > > > > index 130ddbb55916..8b57474be2b2 100644
> > > > > --- a/src/lc-compliance/meson.build
> > > > > +++ b/src/lc-compliance/meson.build
> > > > > @@ -1,25 +1,14 @@
> > > > >  # SPDX-License-Identifier: CC0-1.0
> > > > >
> > > > >  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> > > > > +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> > > > > +                      fallback : ['gtest', 'gtest_dep'])
> > > > >
> > > > > -if not libevent.found()
> > > > > +if not (libevent.found() and libgtest.found())
> > > > >      lc_compliance_enabled = false
> > > > >      subdir_done()
> > > > >  endif
> > > > >
> > > > > -if get_option('android_platform') == 'cros'
> > > > > -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> > > > > -
> > > > > -    if not libgtest.found()
> > > > > -        lc_compliance_enabled = false
> > > > > -        subdir_done()
> > > > > -    endif
> > > > > -
> > > > > -else
> > > > > -    libgtest_sp = subproject('gtest')
> > > > > -    libgtest = libgtest_sp.get_variable('gtest_dep')
> > > > > -endif
> > > > > -
> > > > >  lc_compliance_enabled = true
> > > > >
> > > > >  lc_compliance_sources = files([
Hirokazu Honda Feb. 3, 2022, 2:50 a.m. UTC | #6
Hi Laurent,

On Thu, Feb 3, 2022 at 10:57 AM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Hiro,
>
> On Thu, Feb 03, 2022 at 10:47:25AM +0900, Hirokazu Honda wrote:
> > On Thu, Feb 3, 2022 at 10:09 AM Laurent Pinchart wrote:
> > > On Thu, Feb 03, 2022 at 09:57:38AM +0900, Hirokazu Honda wrote:
> > > > On Thu, Feb 3, 2022 at 2:32 AM Laurent Pinchart wrote:
> > > > > On Wed, Feb 02, 2022 at 03:31:40PM +0100, Javier Martinez Canillas wrote:
> > > > > > Currently, a subproject is used to fetch gtest dependency unconditionally
> > > > > > for any Linux distribution besides ChromeOS. But it leads to a regression
> > > > > > in distros whose builders are not allowed to download files during build.
> > > > > >
> > > > > > This change was introduced by commit 0d50a04cc918 ("lc-compliance: Build
> > > > > > with gtest in subprojects") and the rationale is that some distros, such
> > > > > > as Debian ship libgtest-dev as a static library. And this could be built
> > > > > > with a different toolchain than the one used to build libcamera itself.
> > > > > >
> > > > > > But this seems to be a corner case, usually users will either build both
> > > > > > libcamera and all its dependencies using the same toolchain or build it
> > > > > > using both the libgtest library and toolchain as provided by the distro.
> > > > > >
> > > > > > If someone doesn't want for meson to pick up the non-compatible static
> > > > > > library provided by the distro, then instead should make sure that their
> > > > > > build root does not have the package providing this installed.
> > > > > >
> > > > > > Let's simplify the logic to find the dependency and just use the built-in
> > > > > > support in dependency() function to fallback to a subproject if not found.
> > > > > >
> > > > > > This covers to common case of attempting to use the gtest provided by the
> > > > > > system or pulling from source if not found or is not preferred.
> > > > > >
> > > > > > Fixes: commit 0d50a04cc918 ("lc-compliance: Build with gtest in subprojects")
> > > > > > Reported-by: Eric Curtin <ecurtin@redhat.com>
> > > > > > Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> > > >
> > > > The fallback option happens if there is no libgtest in a system.
> > > > https://mesonbuild.com/Dependencies.html#building-dependencies-as-subprojects
> > > > It is at linking time that we find the libgtest doesn't work.
> > > > So I think the problem happens in an environment where libgtest is
> > > > installed and a different compiler from one building the libgtest is
> > > > used for libcamera.
> > >
> > > That's correct.
> > >
> > > > If I understand correctly, the built-in libgest is compiled always with gcc?
> > > >  I am not sure how edge case it is to build libcamera with a different compiler.
> > >
> > > In most cases libcamera will be built with the same compiler as the rest
> > > of the system, including the gtest version provided by the distribution.
> > > Things should thus work fine. However, in our CI environment, we
> > > typically compile-test libcamera with different versions of gcc and
> > > clang, without using a separate build root that is compiled with the
> > > same compiler. It failed linking to gtest with building with libcamera
> > > with clang while the system is built with gcc, which is the usual case
> > > (actually I believe it's not related to clang vs. gcc but to libc++ vs.
> > > libstdc++). I used to disable lc-compliance when building with clang for
> > > this reason, and your patch that added the gtest wrap helped increasing
> > > the CI coverage.
> >
> > Ah yeah, it is libc++ vs. libstdc++. I forgot that.
> >
> > > I'm not entirely sure what other issues, if any, your patch fixes
> > > though. On Chrome OS we kept building with the system-provided gtest, so
> > > I suppose it wasn't about Chrome OS.
> >
> > That's right. Both libgtest and libcamera are built with libc++ on
> > ChromeOS build environment.
> > Therefore this is not problem. But I build libmcaera on Debian, I use
> > clang for various convenient c++ checks e.g. thread-safety, so libc++
> > is used. https://git.linuxtv.org/libcamera.git/tree/meson.build#n71
> > I have to not use clang or uninstall either libc++ or libgtest.
> > This change makes it impossible to build libcamera with clang++, if
> > the installed libgest is built with different c++ standard library,
> > unless meson.build is manually modified.
> > Hmm, yeah maybe I should uninstall libgtest on my Debian.
>
> No need to, you can use meson magic :-)
>
> meson configure -Dforce_fallback_for=gtest
>
> and meson will fallback to the wrap for gtest, even if it is detected in
> the system.

Aha, I didn't know the way. Thanks.

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>

-Hiro
>
> > > > > As discussed on IRC, this breaks the build when compiling libcamera with
> > > > > clang + libc++ on a system providing a gtest package compiled with g++ +
> > > > > libstdc++. Compilation also breaks with gcc 7 and gcc 8, due to the
> > > > > corresponding libstdc++ having different versions of some symbols:
> > > > >
> > > > > /usr/lib/gcc/x86_64-pc-linux-gnu/7.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgtest.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
> > > > >
> > > > > Such "cross" compilation isn't expected in most cases, but can be useful
> > > > > for CI to test multiple compilers on a host system without a fully
> > > > > separate build root. Setting the meson force_fallback_for option to
> > > > > gtest fixes the CI compilation tests, so
> > > > >
> > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > > > >
> > > > > > ---
> > > > > >
> > > > > >  src/lc-compliance/meson.build | 17 +++--------------
> > > > > >  1 file changed, 3 insertions(+), 14 deletions(-)
> > > > > >
> > > > > > diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
> > > > > > index 130ddbb55916..8b57474be2b2 100644
> > > > > > --- a/src/lc-compliance/meson.build
> > > > > > +++ b/src/lc-compliance/meson.build
> > > > > > @@ -1,25 +1,14 @@
> > > > > >  # SPDX-License-Identifier: CC0-1.0
> > > > > >
> > > > > >  libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
> > > > > > +libgtest = dependency('gtest', required : get_option('lc-compliance'),
> > > > > > +                      fallback : ['gtest', 'gtest_dep'])
> > > > > >
> > > > > > -if not libevent.found()
> > > > > > +if not (libevent.found() and libgtest.found())
> > > > > >      lc_compliance_enabled = false
> > > > > >      subdir_done()
> > > > > >  endif
> > > > > >
> > > > > > -if get_option('android_platform') == 'cros'
> > > > > > -    libgtest = dependency('gtest', required : get_option('lc-compliance'))
> > > > > > -
> > > > > > -    if not libgtest.found()
> > > > > > -        lc_compliance_enabled = false
> > > > > > -        subdir_done()
> > > > > > -    endif
> > > > > > -
> > > > > > -else
> > > > > > -    libgtest_sp = subproject('gtest')
> > > > > > -    libgtest = libgtest_sp.get_variable('gtest_dep')
> > > > > > -endif
> > > > > > -
> > > > > >  lc_compliance_enabled = true
> > > > > >
> > > > > >  lc_compliance_sources = files([
>
> --
> Regards,
>
> Laurent Pinchart
Javier Martinez Canillas Feb. 3, 2022, 9:28 a.m. UTC | #7
On 2/3/22 03:50, Hirokazu Honda wrote:
> Hi Laurent,

[snip]

>>> This change makes it impossible to build libcamera with clang++, if
>>> the installed libgest is built with different c++ standard library,
>>> unless meson.build is manually modified.
>>> Hmm, yeah maybe I should uninstall libgtest on my Debian.
>>
>> No need to, you can use meson magic :-)
>>
>> meson configure -Dforce_fallback_for=gtest
>>

I should probably had mentioned this in the commit message and also
that you can make meson to fallback for all wrap subprojects with:

    meson build --wrap-mode=forcefallback

I'll post a v2 mentioning these two commands to prevent others to
make this more clear.

>> and meson will fallback to the wrap for gtest, even if it is detected in
>> the system.
> 
> Aha, I didn't know the way. Thanks.
> 
> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
>

Thanks!

Best regards,

Patch
diff mbox series

diff --git a/src/lc-compliance/meson.build b/src/lc-compliance/meson.build
index 130ddbb55916..8b57474be2b2 100644
--- a/src/lc-compliance/meson.build
+++ b/src/lc-compliance/meson.build
@@ -1,25 +1,14 @@ 
 # SPDX-License-Identifier: CC0-1.0
 
 libevent = dependency('libevent_pthreads', required : get_option('lc-compliance'))
+libgtest = dependency('gtest', required : get_option('lc-compliance'),
+                      fallback : ['gtest', 'gtest_dep'])
 
-if not libevent.found()
+if not (libevent.found() and libgtest.found())
     lc_compliance_enabled = false
     subdir_done()
 endif
 
-if get_option('android_platform') == 'cros'
-    libgtest = dependency('gtest', required : get_option('lc-compliance'))
-
-    if not libgtest.found()
-        lc_compliance_enabled = false
-        subdir_done()
-    endif
-
-else
-    libgtest_sp = subproject('gtest')
-    libgtest = libgtest_sp.get_variable('gtest_dep')
-endif
-
 lc_compliance_enabled = true
 
 lc_compliance_sources = files([