[libcamera-ci] [RFC PATCH v2 4/4] Add job to run lc-compliance on the virtual pipeline handler
Barnabás Pőcze
barnabas.pocze at ideasonboard.com
Tue Dec 17 13:34:17 CET 2024
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:
>>> Hi Barnabás,
>>>
>>> Thank you for the patch.
>>>
>>> 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.
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
+
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
>
More information about the libcamera-devel
mailing list