New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
swig errors on latest GNURadio maint-3.8 #17
Comments
No, I can't check this, as I don't have such an old gnuradio installation. My code reflects this in gr-ax25/include/afsk/afsk1200.h Lines 39 to 43 in 6589f63
and Lines 78 to 80 in 6589f63
As you mentioned, that it worked before your update, I think it's a swig problem, as your output suggest that swigs generates #ifdef BOOST_SHARED_PTR typedef boost::shared_ptr< afsk1200 > sptr; in I hope, this helps. |
Thank you so much.
Late Yesterday evening I discovered this as well and made that change. I was able to successfully build and install!
I will be migrating to 3.9, but it’s taking a while.
Thanks again for a really cool project!
<end transmission>
… On Aug 6, 2021, at 05:28, Volker Schroer ***@***.***> wrote:
No, I can't check this, as I don't have such an old gnuradio installation.
gnuradio changed from boost::shared_ptr to std::shared_ptr. This transition took place from 3.8 to 3.9.
And swig was removed meanwhile.
My code reflects this in
https://github.com/dl1ksv/gr-ax25/blob/6589f635c5b48ca3c220f79658a0754a50488f15/include/afsk/afsk1200.h#L39-L43
and
https://github.com/dl1ksv/gr-ax25/blob/6589f635c5b48ca3c220f79658a0754a50488f15/CMakeLists.txt#L78-L80
As you mentioned, that it worked before your update, I think it's a swig problem, as your output suggest that swigs generates
std::shared_pointer and boost::shared_pointer
I suggest you change
#ifdef BOOST_SHARED_PTR
typedef boost::shared_ptr< afsk1200 > sptr;
#else
typedef std::shared_ptr< afsk1200 > sptr;
#endif
typedef boost::shared_ptr< afsk1200 > sptr;
in
gr-ax25/include/afsk/afsk1200.h
gr-ax25/include/afsk/aprs2inet.h
gr-ax25/include/afsk/ax25decode.h
I hope, this helps.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
|
Thanks for reporting and testing. |
Hi there,
Thank you so much for maintaining this, I’ve used it for quite a while for educational reasons with students teaching them about ham radio and SDR!
Unfortunately I’m having build issues on my updated systems. This has definitely worked in the past, but after trying to build on some fresh systems I’m getting errors.
I have three different machines running the following:
Ubuntu 18.04
UHD 4.0
GNURadio maint-3.8
All three machines are source builds, only one is pybombs.
I’m getting the same swig errors when I run make, either through the manual build process or via pybombs.
Here's the full output:
[ 6%] Building CXX object lib/CMakeFiles/gnuradio-afsk.dir/afsk1200_impl.cc.o
[ 12%] Generating init.pyc
[ 12%] Built target pygen_apps_9a6dd
[ 18%] Building CXX object swig/CMakeFiles/_afsk_swig_doc_tag.dir/_afsk_swig_doc_tag.cpp.o
[ 25%] Generating init.pyo
[ 31%] Linking CXX executable _afsk_swig_doc_tag
[ 37%] Generating documentation with doxygen
[ 37%] Built target _afsk_swig_doc_tag
[ 43%] Building CXX object lib/CMakeFiles/gnuradio-afsk.dir/ax25decode_impl.cc.o
[ 43%] Built target pygen_python_0c3d5
[ 50%] Building CXX object lib/CMakeFiles/gnuradio-afsk.dir/aprs2inet_impl.cc.o
[ 50%] Built target doxygen_target
[ 56%] Generating doxygen xml for afsk_swig_doc docs
[ 62%] Generating python docstrings for afsk_swig_doc
[ 62%] Built target afsk_swig_swig_doc
Scanning dependencies of target afsk_swig_swig_compilation
[ 68%] Swig source afsk_swig.i
[ 68%] Built target afsk_swig_swig_compilation
[ 75%] Linking CXX shared library libgnuradio-afsk.so
[ 75%] Built target gnuradio-afsk
[ 81%] Building CXX object swig/CMakeFiles/afsk_swig.dir/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx.o
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject* _wrap_afsk1200_make(PyObject*, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:5191:50: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >’ and ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’)
result = gr::afsk::afsk1200::make(arg1,arg2);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::afsk1200]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::afsk1200]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’ to ‘const std::shared_ptrgr::afsk::afsk1200&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:5201:117: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::afsk1200&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::afsk1200::sptr(static_cast< const gr::afsk::afsk1200::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__afsk1200_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject _wrap_afsk1200_sptr_make(PyObject*, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:5442:39: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >’ and ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’)
result = (arg1)->make(arg2,arg3);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::afsk1200]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::afsk1200]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::afsk1200::sptr {aka boost::shared_ptrgr::afsk::afsk1200}’ to ‘const std::shared_ptrgr::afsk::afsk1200&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:5452:117: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::afsk1200 >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::afsk1200&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::afsk1200::sptr(static_cast< const gr::afsk::afsk1200::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__afsk1200_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject _wrap_ax25decode_make(PyObject, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:8576:52: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >’ and ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’)
result = gr::afsk::ax25decode::make(arg1,arg2);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::ax25decode]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::ax25decode]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’ to ‘const std::shared_ptrgr::afsk::ax25decode&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:8586:121: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::ax25decode&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::ax25decode::sptr(static_cast< const gr::afsk::ax25decode::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__ax25decode_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject _wrap_ax25decode_sptr_make(PyObject*, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:8827:39: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >’ and ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’)
result = (arg1)->make(arg2,arg3);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::ax25decode]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::ax25decode]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::ax25decode::sptr {aka boost::shared_ptrgr::afsk::ax25decode}’ to ‘const std::shared_ptrgr::afsk::ax25decode&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:8837:121: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::ax25decode >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::ax25decode&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::ax25decode::sptr(static_cast< const gr::afsk::ax25decode::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__ax25decode_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject _wrap_aprs2inet_make(PyObject, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:11959:51: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >’ and ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’)
result = gr::afsk::aprs2inet::make(arg1,arg2);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::aprs2inet]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::aprs2inet]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’ to ‘const std::shared_ptrgr::afsk::aprs2inet&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:11969:119: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::aprs2inet&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::aprs2inet::sptr(static_cast< const gr::afsk::aprs2inet::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__aprs2inet_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx: In function ‘PyObject _wrap_aprs2inet_sptr_make(PyObject*, PyObject*, PyObject*)’:
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:12208:39: error: no match for ‘operator=’ (operand types are ‘SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >’ and ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’)
result = (*arg1)->make(arg2,arg3);
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const SwigValueWrapper&) [with T = std::shared_ptrgr::afsk::aprs2inet]
SwigValueWrapper& operator=(const SwigValueWrapper& rhs);
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:32:21: note: no known conversion for argument 1 from ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’ to ‘const SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: candidate: SwigValueWrapper& SwigValueWrapper::operator=(const T&) [with T = std::shared_ptrgr::afsk::aprs2inet]
SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
^~~~~~~~
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:36:21: note: no known conversion for argument 1 from ‘gr::afsk::aprs2inet::sptr {aka boost::shared_ptrgr::afsk::aprs2inet}’ to ‘const std::shared_ptrgr::afsk::aprs2inet&’
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:12218:119: error: invalid static_cast from type ‘SwigValueWrapper<std::shared_ptrgr::afsk::aprs2inet >’ to type ‘const sptr& {aka const boost::shared_ptrgr::afsk::aprs2inet&}’
resultobj = SWIG_NewPointerObj((new gr::afsk::aprs2inet::sptr(static_cast< const gr::afsk::aprs2inet::sptr& >(result))), SWIGTYPE_p_std__shared_ptrT_gr__afsk__aprs2inet_t, SWIG_POINTER_OWN | 0 );
^
/home/user/gr-ax25/build/swig/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx:1191:89: note: in definition of macro ‘SWIG_NewPointerObj’
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
^~~
swig/CMakeFiles/afsk_swig.dir/build.make:75: recipe for target 'swig/CMakeFiles/afsk_swig.dir/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx.o' failed
make[2]: *** [swig/CMakeFiles/afsk_swig.dir/CMakeFiles/afsk_swig.dir/afsk_swigPYTHON_wrap.cxx.o] Error 1
CMakeFiles/Makefile2:358: recipe for target 'swig/CMakeFiles/afsk_swig.dir/all' failed
make[1]: *** [swig/CMakeFiles/afsk_swig.dir/all] Error 2
Makefile:135: recipe for target 'all' failed
make: *** [all] Error 2
Can you confirm your GNURadio 3.8 branch still works with the latest maint-3.8
The text was updated successfully, but these errors were encountered: