[libcamera-ci] [RFC PATCH v2 4/4] Add job to run lc-compliance on the virtual pipeline handler
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Dec 17 15:23:23 CET 2024
On Tue, Dec 17, 2024 at 01:34:17PM +0100, Barnabás Pőcze wrote:
> 2024. 12. 17. 13:00 keltezéssel, Laurent Pinchart írta:
> > On Tue, Dec 17, 2024 at 11:41:57AM +0100, Barnabás Pőcze wrote:
> >> 2024. 12. 17. 1:17 keltezéssel, Laurent Pinchart írta:
> >>> On Mon, Dec 16, 2024 at 06:28:27PM +0100, Barnabás Pőcze wrote:
> >>>> Add a new job named `lc-compliance:virtual` that uses the
> >>>> build artifacts created by the `build-package:debug` job
> >>>> on amd64 to run `lc-compliance` on the "Virtual0" camera
> >>>> in a virtual machine.
> >>>>
> >>>> The `force_fallback_for=gtest` option is needed because `cpp_debustl`
> >>>
> >>> s/debustl/debugstl/
> >>>
> >>>> makes ABI incompatible changes in the STL containers, so googletest
> >>>> also needs to be compiled with these changes.
> >>>
> >>> Downloading sources at build time in CI isn't great, I'd like to avoid
> >>> it when possible. If it can't be avoided, so be it. There are
> >>> precedents, we download and install the packages that are not multi-arch
> >>> compatible at build time, and we also force a fallback for gtest when
> >>> compiling with clang and libc++.
> >>
> >> I believe libyuv is also downloaded.
> >
> > Aarrrghhhhh. Why can't google get their projects packaged by
> > distributions ? :-(
>
> It seems to be packaged. The main issue is that no pkg-config or
> cmake files are supplied, so meson cannot really discover it.
Ah, I didn't know it was packaged in Debian. Thanks for the information.
> I suppose one could do something like this:
>
> diff --git a/src/meson.build b/src/meson.build
> index 76198e953..a62dc2c30 100644
> --- a/src/meson.build
> +++ b/src/meson.build
> @@ -32,6 +32,14 @@ endif
> # by distributions.
> libyuv_dep = dependency('libyuv', required : false)
>
> +if not libyuv_dep.found()
> + libyuv_dep = cxx.find_library(
> + 'yuv',
> + required : false,
> + has_headers : 'libyuv.h',
> + )
> +endif
> +
Or we could create a pkgconfig file manually, as we do for pybind11 in
setup-container.sh. Handling it in meson.build makes it usable
everywhere, so maybe that's a better approach.
Anyway, that's unrelated to this patch series. We can force the fallback
for now. I'd like to see if we could download and cache the subproject
in the container instead of doing it during every build, but that's not
urgent.
https://mesonbuild.com/Wrap-dependency-system-manual.html#specific-to-wrapfile
states
Since 0.49.0 if source_filename or patch_filename is found in the
project's subprojects/packagecache directory, it will be used instead
of downloading the file, even if --wrap-mode option is set to
nodownload. The file's hash will be checked.
Since 1.3.0 if the MESON_PACKAGE_CACHE_DIR environment variable is
set, it is used instead of the project's subprojects/packagecache.
This allows sharing the cache across multiple projects. In addition it
can contain an already extracted source tree as long as it has the
same directory name as the directory field in the wrap file. In that
case, the directory will be copied into subprojects/ before applying
patches.
which seems useful. We install meson from pip when needed, so we can use
features from version 1.3.0.
> if (pipelines.contains('virtual') or get_option('android').allowed())
> and \
> not libyuv_dep.found()
> cmake = import('cmake')
>
> >>> On a side note, I'm wondering if we shouldn't just disable lc-compliance
> >>> when building with clang and libc++, and download and cache the .deb
> >>> packages at container build time. If anyone wants to give it a try...
> >>> :-)
> >>>
> >>> Back to the topic, does cpp_debugstl give use significant benefits
> >>> compared to ASan and UBSan ?
> >>
> >> Well, there are certainly things that it recognizes that ASAN/UBSAN
> >> do not, for example:
> >>
> >> std::vector<int> v; ...
> >> auto it = /* into `v` */;
> >> v.erase(/* before `it` */);
> >> *it; // error
> >
> > That's good to catch indeed. Is the error caught at runtime or compile
> > time ?
>
> Runtime.
>
> >>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> >>>> ---
> >>>>
> >>>> Changes in v2:
> >>>> * publish lc-compliance results to gitlab
> >>>> * add and use script to install libcamera binary package
> >>>>
> >>>> ---
> >>>> .gitlab-ci/test-lc-compliance.sh | 37 +++++++++++++++++++++++++++++++
> >>>> .gitlab-ci/unpackage-libcamera.sh | 17 ++++++++++++++
> >>>> gitlab-ci.yml | 24 +++++++++++++++++++-
> >>>> 3 files changed, 77 insertions(+), 1 deletion(-)
> >>>> create mode 100755 .gitlab-ci/test-lc-compliance.sh
> >>>> create mode 100755 .gitlab-ci/unpackage-libcamera.sh
> >>>>
> >>>> diff --git a/.gitlab-ci/test-lc-compliance.sh b/.gitlab-ci/test-lc-compliance.sh
> >>>> new file mode 100755
> >>>> index 0000000..a927f1d
> >>>> --- /dev/null
> >>>> +++ b/.gitlab-ci/test-lc-compliance.sh
> >>>> @@ -0,0 +1,37 @@
> >>>> +#!/bin/bash
> >>>> +
> >>>> +# SPDX-License-Identifier: GPL-2.0-or-later
> >>>> +# SPDX-FileCopyrightText: © 2024 Google Inc.
> >>>> +
> >>>> +set -e
> >>>> +
> >>>> +source "$(dirname "$0")/lib.sh"
> >>>> +
> >>>> +libcamera_compliance() {
> >>>> + echo "Running libcamera compliance tests in a qemu VM"
> >>>> +
> >>>> + virtme-ng \
> >>>> + --verbose \
> >>>> + --skip-modules \
> >>>> + --force-9p \
> >>>> + --rwdir "$PWD/build" \
> >>>> + --run /opt/linux/bzImage \
> >>>> + --exec "\
> >>>
> >>> s/"/" /
> >>>
> >>>> + LIBCAMERA_LOG_LEVELS=*:DEBUG \
> >>>> + ASAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1 \
> >>>> + UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 \
> >>>> + GTEST_OUTPUT=xml:./build/lc-compliance-report.xml \
> >>>> + lc-compliance -c Virtual0; \
> >>>> + echo \\\$? > ./build/.test-status \
> >>>> + "
> >>>> +
> >>>> + local status=$(cat build/.test-status)
> >>>> + echo "Test result exit state: $status"
> >>>> + rm build/.test-status
> >>>> +
> >>>> + if [[ $status != 0 ]] ; then
> >>>> + exit $status
> >>>> + fi
> >>>> +}
> >>>> +
> >>>> +run libcamera_compliance
> >>>> diff --git a/.gitlab-ci/unpackage-libcamera.sh b/.gitlab-ci/unpackage-libcamera.sh
> >>>> new file mode 100755
> >>>> index 0000000..9eb3192
> >>>> --- /dev/null
> >>>> +++ b/.gitlab-ci/unpackage-libcamera.sh
> >>>> @@ -0,0 +1,17 @@
> >>>> +#!/bin/bash
> >>>> +
> >>>> +# SPDX-License-Identifier: GPL-2.0-or-later
> >>>> +# SPDX-FileCopyrightText: © 2024 Google Inc.
> >>>> +
> >>>> +set -e
> >>>> +
> >>>> +source "$(dirname "$0")/lib.sh"
> >>>> +
> >>>> +libcamera_unpackage() {
> >>>> + echo "Unpackage libcamera binaries"
> >>>> +
> >>>> + tar -xvf libcamera-${CI_COMMIT_SHA}.tar.xz -C /
> >>>> + ldconfig -v
> >>>> +}
> >>>> +
> >>>> +run libcamera_unpackage
> >>>> diff --git a/gitlab-ci.yml b/gitlab-ci.yml
> >>>> index 0a3eab3..8ea1d12 100644
> >>>> --- a/gitlab-ci.yml
> >>>> +++ b/gitlab-ci.yml
> >>>> @@ -328,11 +328,13 @@ build-package:debug:
> >>>> BUILD_TYPE: debug
> >>>> MESON_OPTIONS: >-
> >>>> -D auto_features=disabled
> >>>> + -D lc-compliance=enabled
> >>>> -D test=false
> >>>> -D v4l2=false
> >>>> -D b_sanitize=address,undefined
> >>>> -D cpp_debugstl=true
> >>>> - -D pipelines=[]
> >>>> + -D pipelines=['virtual']
> >>>> + -D force_fallback_for=['gtest']
> >>>> parallel:
> >>>> matrix:
> >>>> - ARCH: amd64
> >>>> @@ -440,3 +442,23 @@ test-unit:
> >>>> # artifacts:
> >>>> # reports:
> >>>> # junit: build/meson-logs/testlog.junit.xml
> >>>> +
> >>>> +lc-compliance:virtual:
> >>>
> >>> Nitpicking on the naming, we could name this test-lc-compliance:virtual
> >>> or test-compliance:virtual to have the same "test-" prefix as
> >>> "test-unit". Maybe "test:unit" and "test:compliance:virtual" could also
> >>> be an option ?
> >>>
> >>>> + extends:
> >>>> + - .fdo.distribution-image at debian
> >>>> + - .libcamera-ci.debian:12
> >>>> + - .libcamera-ci.scripts
> >>>> + stage: test
> >>>> + needs:
> >>>> + - job: build-package:debug
> >>>> + parallel:
> >>>> + matrix:
> >>>> + - ARCH: amd64
> >>>> + tags:
> >>>> + - kvm
> >>>> + script:
> >>>> + - $CI_PROJECT_DIR/.gitlab-ci/unpackage-libcamera.sh
> >>>> + - $CI_PROJECT_DIR/.gitlab-ci/test-lc-compliance.sh
> >>>> + artifacts:
> >>>> + reports:
> >>>> + junit: build/lc-compliance-report.xml
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list