#!/bin/sh # run_gir_check.sh - generate bindings with gir2def.py, parse-check every # generated module, then compile/link/run a small program against a few. # # Usage: tools/run_gir_check.sh (default GIR=Gtk-4.0) # GIR=Adw-1 tools/run_gir_check.sh set -e CDIR=$(dirname "$0") ROOT=$(cd "$CDIR/.." && pwd) GM2="${GM2:-gm2}" GM2FLAGS="${GM2FLAGS:--fiso}" GIR="${GIR:-Gtk-4.0}" GEN="$ROOT/build/gir" TMP="$ROOT/build/girparse" mkdir -p "$GEN" "$TMP" python3 "$ROOT/tools/gir2def.py" "$GIR" -o "$GEN" # Parse-check: import every generated module from a tiny stub. fail=0 total=0 for f in "$GEN"/*.def; do name=$(basename "$f" .def) total=$((total + 1)) printf 'MODULE parse_%s ; IMPORT %s ; BEGIN END parse_%s.\n' \ "$name" "$name" "$name" > "$TMP/parse_$name.mod" # shellcheck disable=SC2086 if ! $GM2 $GM2FLAGS -I"$GEN" -c "$TMP/parse_$name.mod" \ -o "$TMP/parse_$name.o" 2>"$TMP/parse_$name.err"; then fail=$((fail + 1)) echo "PARSE FAIL: $name" sed -n '1,4p' "$TMP/parse_$name.err" fi done echo "gir-check: parsed $total modules from $GIR, $fail failed" if [ "$GIR" = "Gtk-4.0" ]; then # Link-check: reference a generated (namespace) function and enum. cat > "$TMP/gircheck.mod" <<'EOF' MODULE gircheck ; FROM GtkFunctions IMPORT gtk_get_major_version, gtk_get_minor_version; FROM GtkButton IMPORT GtkButton; FROM GtkEnums IMPORT GTK_ALIGN_FILL; FROM SYSTEM IMPORT ADDRESS; FROM libc IMPORT printf; VAR b: GtkButton; BEGIN b := NIL; printf("generated: gtk=%d.%d align=%d\n", gtk_get_major_version(), gtk_get_minor_version(), GTK_ALIGN_FILL); IF (b = NIL) AND (GTK_ALIGN_FILL = 0) THEN printf("gircheck: PASS\n"); HALT(0) ELSE printf("gircheck: FAIL\n"); HALT(1) END END gircheck. EOF # shellcheck disable=SC2086 $GM2 $GM2FLAGS -I"$GEN" "$TMP/gircheck.mod" -o "$TMP/gircheck" \ $(pkg-config --cflags --libs gtk4) "$TMP/gircheck" fi [ "$fail" -eq 0 ]