cargo test g-ir-scanner problems
There are several issues related to cargo test when you have gobject-introspection installed. When you don't have it installed the repo version of Ctest.gir is used and all tests pass.
My first problem was in an MINGW64 session on Windows 10 which appeared to be a path issue. When the LDFLAGS is created the path is passed unescaped so all of the backslashes in the path are mis-interpreted and disappear. I worked around that with
command.env("LDFLAGS", buildconfig.library_archive().to_str().unwrap().replace("\\", "/"));
as forward slashes are also accepted and don't have an 'escaping' problems.
but the next step I couldn't get past. There are linking errors that I can't figure out no matter what combination/order of flags I use. I added some debug output to the failure case (verbose g-ir-scanner and print stdout) and this is what I get (it looks like basic gobject/gthread symbols which are in the linker arguments):
cargo:rustc-link-search=native=C:\Users\icooke\src\gnome-class\target\debug\build\gobject-gen-test-73c5b2f834692fa3\out
Running g-ir-scanner "g-ir-scanner" "-v" "-o" "C:\\Users\\icooke\\src\\gnome-class\\target\\debug\\build\\gobject-gen-test-73c5b2f834692fa3\\out\\Ctest-0.1.gir" "--namespace" "Ctest" "--nsversion" "0.1" "-lgobject-2.0" "--pkg=glib-2.0" "--include" "GObject-2.0" "c\\counter.h" "c\\counter_impl.h" "c\\interface_counter.h"
--- stderr
thread 'main' panicked at 'Error executing g-ir-scanner C:\msys64\mingw64\bin/gcc.exe -O2 -Wall -E -I. -IC:/msys64/mingw64/include -IC:/msys64/mingw64/lib/libffi-3.2.1/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -o g-ir-cpp-6av_86xq.i -C C:/Users/icooke/src/gnome-class/mixed_tests/g-ir-cpp-6av_86xq.c
C:\msys64\mingw64\bin/gcc.exe -mdll -O2 -Wall -IC:/msys64/mingw64/include -IC:/msys64/mingw64/lib/libffi-3.2.1/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include -IC:/msys64/mingw64/lib/libffi-3.2.1/include -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include -c C:/Users/icooke/src/gnome-class/mixed_tests/tmp-introspect2ylgl0ul/Ctest-0.1.c -o C:/Users/icooke/src/gnome-class/mixed_tests/tmp-introspect2ylgl0ul/Ctest-0.1.o -Wall -Wno-deprecated-declarations -pthread -mms-bitfields
g-ir-scanner: link: cc -o C:/Users/icooke/src/gnome-class/mixed_tests/tmp-introspect2ylgl0ul/Ctest-0.1.exe C:/Users/icooke/src/gnome-class/mixed_tests/tmp-introspect2ylgl0ul/Ctest-0.1.o -lgobject-2.0 -LC:/msys64/mingw64/lib -lgio-2.0 -lgobject-2.0 -pthread -lgmodule-2.0 -lintl -lglib-2.0 C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `CTEST_IS_COUNTER':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.h:20: undefined reference to `g_type_check_instance_is_a'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_class_intern_init':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_type_class_peek_parent'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_type_class_adjust_private_offset'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_get_type':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_once_init_enter'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_once_init_leave'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_get_type_once':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_intern_static_string'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_type_register_static_simple'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:13: undefined reference to `g_type_add_instance_private'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_new':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:17: undefined reference to `g_object_new'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_increment':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:24: undefined reference to `g_return_if_fail_warning'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:27: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_get':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:34: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_set_property':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:52: undefined reference to `g_value_get_int'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_get_property':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:72: undefined reference to `g_value_set_int'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `ctest_counter_class_init':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:90: undefined reference to `g_type_check_class_cast'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:96: undefined reference to `g_param_spec_int'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:103: undefined reference to `g_object_class_install_properties'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter.o): In function `main_':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter.c:123: undefined reference to `g_object_new'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `CTEST_IS_COUNTERIMPL':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.h:20: undefined reference to `g_type_check_instance_is_a'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_class_intern_init':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_type_class_peek_parent'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_type_class_adjust_private_offset'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_get_type':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_once_init_enter'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_once_init_leave'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_get_type_once':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_intern_static_string'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_type_register_static_simple'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_type_add_interface_static'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:12: undefined reference to `g_type_add_instance_private'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_new':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:19: undefined reference to `g_object_new'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_get':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:24: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_set_property':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:42: undefined reference to `g_value_get_int'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_get_property':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:62: undefined reference to `g_value_set_uint'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_class_init':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:75: undefined reference to `g_type_check_class_cast'
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:80: undefined reference to `g_object_class_override_property'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_mutable_counter_increment':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:91: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(counter_impl.o): In function `ctest_counterimpl_mutable_counter_get':
C:\Users\icooke\src\gnome-class\mixed_tests/c/counter_impl.c:99: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `CTEST_IS_MUTABLE_COUNTER':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.h:9: undefined reference to `g_type_check_instance_is_a'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `CTEST_MUTABLE_COUNTER_GET_IFACE':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.h:9: undefined reference to `g_type_interface_peek'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `ctest_mutable_counter_get_type':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:3: undefined reference to `g_once_init_enter'
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:3: undefined reference to `g_intern_static_string'
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:3: undefined reference to `g_type_register_static_simple'
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:3: undefined reference to `g_once_init_leave'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `ctest_mutable_counter_default_init':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:11: undefined reference to `g_param_spec_int'
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:11: undefined reference to `g_object_interface_install_property'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `ctest_mutable_counter_increment':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:25: undefined reference to `g_return_if_fail_warning'
C:/Users/icooke/src/gnome-class/target/debug/build/gobject-gen-test-73c5b2f834692fa3/out/libctest.a(interface_counter.o): In function `ctest_mutable_counter_get':
C:\Users\icooke\src\gnome-class\mixed_tests/c/interface_counter.c:35: undefined reference to `g_return_if_fail_warning'
collect2.exe: error: ld returned 1 exit status
linking of temporary binary failed: Command '['C:/msys64/usr/bin/bash.exe', 'C:/Users/icooke/AppData/Local/Temp/tmp50t94uc1']' returned non-zero exit status 1.
', mixed_tests\buildrs\girscanner.rs:43:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
So after working on that for a while I figured I'd try on a linux system to see what was going on and encountered different errors :) First thing was that g-ir-scanner was installed but not being found by the test. I worked aroudn that with specifying the full path in the Command and left it at that.
The second error was that g-ir-scanner couldn't find the included GObject-2.0 gir file. I added an include path argument and then that worked:
command.arg("--add-include-path=./gir");
BUT the test then successfully generated the Ctest.gir but failed on the output because of an unexpected XML element (source-position). I looked at libgir's master branch and found that they're handling it so I cargo-updated gir but now it won't compile the rust.
so... I gave up and here I am. My goal was to get a clean test before I attempted any contribution but that didn't work out.
Would someone take a look at the Gir test on Windows and Linux? It doesn't work for me on either.