Cannot build against upstream libcamera since it's commit "1c4d4801 libcamera: controls: Use std::optional to handle invalid control values"
- PipeWire version (
pipewire --version
): - Distribution and distribution version (
PRETTY_NAME
from/etc/os-release
): Arch - Desktop Environment: KDE
- Kernel version (
uname -r
): 5.18.12 ZEN
Description of Problem:
Compiling against libcamera upstream fails libcamera's #1c4d4801850559d6f919eef5c2ffbaf7675dbc46 commit
How Reproducible:
100% of the time
Steps to Reproduce:
1.Compile and install libcamera-git 2.Compile pipewire
Actual Results:
FAILED: spa/plugins/libcamera/libspa-libcamera.so.p/libcamera-device.cpp.o
ccache c++ -Ispa/plugins/libcamera/libspa-libcamera.so.p -Ispa/plugins/libcamera -I../pipewire/spa/plugins/libcamera -Ispa/include -I../pipewire/spa/include -I/usr/include/libcamera -I/usr/include/libdrm -flto=auto -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Wpedantic -std=c++17 -O0 -fvisibility=hidden -Werror=suggest-attribute=format -Wsign-compare -Wpointer-arith -Wformat -Wformat-security -Wimplicit-fallthrough -Wmissing-braces -Wtype-limits -Wvariadic-macros -Wmaybe-uninitialized -Wno-missing-field-initializers -Wno-unused-parameter -Wno-pedantic -Wdeprecated-declarations -Wunused-result -march=native -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/home/quack/.cache/paru/clone/pipewire-git/src=/usr/src/debug -fPIC -pthread -MD -MQ spa/plugins/libcamera/libspa-libcamera.so.p/libcamera-device.cpp.o -MF spa/plugins/libcamera/libspa-libcamera.so.p/libcamera-device.cpp.o.d -o spa/plugins/libcamera/libspa-libcamera.so.p/libcamera-device.cpp.o -c ../pipewire/spa/plugins/libcamera/libcamera-device.cpp
../pipewire/spa/plugins/libcamera/libcamera-device.cpp: In function ‘std::string cameraModel(const libcamera::Camera*)’:
../pipewire/spa/plugins/libcamera/libcamera-device.cpp:86:51: error: no match for ‘operator=’ (operand types are ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} and ‘std::optional<std::__cxx11::basic_string<char> >’)
86 | name = props.get(properties::Model);
| ^
In file included from /usr/include/c++/12.1.0/string:53,
from /usr/include/libcamera/libcamera/camera_manager.h:11,
from ../pipewire/spa/plugins/libcamera/libcamera-manager.hpp:25,
from ../pipewire/spa/plugins/libcamera/libcamera-device.cpp:50:
/usr/include/c++/12.1.0/bits/basic_string.h:928:8: note: candidate: ‘template<class _Tp> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_If_sv<_Tp, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
928 | operator=(const _Tp& __svt)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:928:8: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/12.1.0/bits/stl_pair.h:60,
from /usr/include/c++/12.1.0/bits/stl_algobase.h:64,
from /usr/include/c++/12.1.0/memory:63,
from /usr/include/libcamera/libcamera/camera_manager.h:10:
/usr/include/c++/12.1.0/type_traits: In substitution of ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = std::__cxx11::basic_string<char>&]’:
/usr/include/c++/12.1.0/bits/basic_string.h:156:8: required by substitution of ‘template<class _CharT, class _Traits, class _Alloc> template<class _Tp, class _Res> using _If_sv = std::enable_if_t<std::__and_<std::is_convertible<const _Tp&, std::basic_string_view<_CharT, _Traits> >, std::__not_<std::is_convertible<const _Tp*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>*> >, std::__not_<std::is_convertible<const _Tp&, const _CharT*> > >::value, _Res> [with _Tp = std::optional<std::__cxx11::basic_string<char> >; _Res = std::__cxx11::basic_string<char>&; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
/usr/include/c++/12.1.0/bits/basic_string.h:928:8: required by substitution of ‘template<class _Tp> std::__cxx11::basic_string<char>::_If_sv<_Tp, std::__cxx11::basic_string<char>&> std::__cxx11::basic_string<char>::operator=(const _Tp&) [with _Tp = std::optional<std::__cxx11::basic_string<char> >]’
../pipewire/spa/plugins/libcamera/libcamera-device.cpp:86:37: required from here
/usr/include/c++/12.1.0/type_traits:2614:11: error: no type named ‘type’ in ‘struct std::enable_if<false, std::__cxx11::basic_string<char>&>’
2614 | using enable_if_t = typename enable_if<_Cond, _Tp>::type;
| ^~~~~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:803:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
803 | operator=(const basic_string& __str)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:803:37: note: no known conversion for argument 1 from ‘std::optional<std::__cxx11::basic_string<char> >’ to ‘const std::__cxx11::basic_string<char>&’
803 | operator=(const basic_string& __str)
| ~~~~~~~~~~~~~~~~~~~~^~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:814:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
814 | operator=(const _CharT* __s)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:814:31: note: no known conversion for argument 1 from ‘std::optional<std::__cxx11::basic_string<char> >’ to ‘const char*’
814 | operator=(const _CharT* __s)
| ~~~~~~~~~~~~~~^~~
/usr/include/c++/12.1.0/bits/basic_string.h:826:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
826 | operator=(_CharT __c)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:826:24: note: no known conversion for argument 1 from ‘std::optional<std::__cxx11::basic_string<char> >’ to ‘char’
826 | operator=(_CharT __c)
| ~~~~~~~^~~
/usr/include/c++/12.1.0/bits/basic_string.h:844:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
844 | operator=(basic_string&& __str)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:844:32: note: no known conversion for argument 1 from ‘std::optional<std::__cxx11::basic_string<char> >’ to ‘std::__cxx11::basic_string<char>&&’
844 | operator=(basic_string&& __str)
| ~~~~~~~~~~~~~~~^~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:913:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::initializer_list<_Tp>) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
913 | operator=(initializer_list<_CharT> __l)
| ^~~~~~~~
/usr/include/c++/12.1.0/bits/basic_string.h:913:42: note: no known conversion for argument 1 from ‘std::optional<std::__cxx11::basic_string<char> >’ to ‘std::initializer_list<char>’
913 | operator=(initializer_list<_CharT> __l)
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~
../pipewire/spa/plugins/libcamera/libcamera-device.cpp: In function ‘std::string cameraLoc(const libcamera::Camera*)’:
../pipewire/spa/plugins/libcamera/libcamera-device.cpp:97:34: error: switch quantity not an integer
97 | switch (props.get(properties::Location)) {
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
[245/793] Linking target spa/plugins/audioconvert/test-fmt-ops
ninja: build stopped: subcommand failed.