diff --git a/gio/tests/meson.build b/gio/tests/meson.build index ba04916c3..26091b6e7 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -1175,6 +1175,7 @@ endforeach python_test_env = test_env python_test_env.prepend('PYTHONPATH', python_test_libraries_path) +python_test_env.prepend('PYTHONPATH', python_test_libraries_built) foreach test_name, extra_args : python_tests depends = [extra_args.get('depends', [])] diff --git a/girepository/girparser.c b/girepository/girparser.c index 0cf341533..63143718d 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -303,6 +303,8 @@ static GMarkupParser firstpass_parser = NULL, }; +/* If you change this search order, gobject-introspection.git and + * tests/installed/glibconfig.py.in will probably also need updating */ static char * locate_gir (GIIrParser *parser, const char *girname) diff --git a/girepository/meson.build b/girepository/meson.build index db14088b9..3010099aa 100644 --- a/girepository/meson.build +++ b/girepository/meson.build @@ -29,7 +29,10 @@ else gir_dir_pc_prefix = join_paths('${prefix}', gir_dir_prefix) endif -glib_girdir = get_option('prefix') / gir_dir_prefix / 'gir-1.0' +# This is effectively the GIR XML format major version +gir_suffix = 'gir-1.0' + +glib_girdir = get_option('prefix') / gir_dir_prefix / gir_suffix gir_includedir = glib_includedir / 'girepository' @@ -81,7 +84,7 @@ install_headers(girepo_headers + girepo_ffi_headers, install_dir: gir_includedir gir_c_args = [ '-DGI_COMPILATION', '-DG_LOG_DOMAIN="GLib-GIRepository"', - '-DGIR_SUFFIX="gir-1.0"', + '-DGIR_SUFFIX="@0@"'.format(gir_suffix), '-DGIR_DIR="@0@"'.format(glib_girdir), '-DGOBJECT_INTROSPECTION_LIBDIR="@0@"'.format(glib_libdir), '-DGOBJECT_INTROSPECTION_DATADIR="@0@"'.format(glib_datadir), @@ -227,7 +230,7 @@ executable('gi-dump-types', pkgconfig_variables = [ 'gidatadir=${datadir}/gobject-introspection-1.0', - 'girdir=' + gir_dir_pc_prefix / 'gir-1.0', + 'girdir=' + gir_dir_pc_prefix / gir_suffix, 'typelibdir=${libdir}/girepository-1.0', 'gi_compile_repository=' + pkgconfig_multiarch_bindir / 'gi-compile-repository' ] diff --git a/girepository/tests/gi-compile-repository.py b/girepository/tests/gi-compile-repository.py index a0b2bcf7e..8718796b5 100644 --- a/girepository/tests/gi-compile-repository.py +++ b/girepository/tests/gi-compile-repository.py @@ -20,11 +20,12 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA -""" Integration tests for gi-compile-repository. """ +"""Integration tests for gi-compile-repository.""" import os import unittest +import glibconfig import taptestrunner import testprogramrunner @@ -39,20 +40,9 @@ class TestGICompileRepositoryBase(testprogramrunner.TestProgramRunner): def setUpClass(cls): super().setUpClass() - if "G_TEST_BUILDDIR" in os.environ: - cls._gir_path = os.path.join( - os.environ["G_TEST_BUILDDIR"], "..", "introspection" - ) - else: - cls._gir_path = os.path.join( - os.path.dirname(os.path.realpath(__file__)), - "..", - "..", - "..", - "share", - "gir-1.0", - ) - print(f"gir path set to {cls._gir_path}") + # list of pathlib.Path + cls._gir_paths = glibconfig.GIR_XML_SEARCH_PATHS + print(f"gir path set to {cls._gir_paths}") class TestGICompileRepository(TestGICompileRepositoryBase): @@ -73,13 +63,20 @@ class TestGICompileRepositoryForGLib(TestGICompileRepositoryBase): GIR_NAME = "GLib-2.0" def runTestProgram(self, *args, **kwargs): - gir_file = os.path.join(self._gir_path, f"{self.GIR_NAME}.gir") - self.assertTrue(os.path.exists(gir_file)) - argv = [gir_file] + for d in self._gir_paths: + gir_file = d / f"{self.GIR_NAME}.gir" + + if gir_file.exists(): + break + else: + self.fail(f"Could not find {self.GIR_NAME}.gir in {self._gir_paths}") + + argv = [str(gir_file)] argv.extend(*args) if self.GIR_NAME != "GLib-2.0": - argv.extend(["--includedir", self._gir_path]) + for d in self._gir_paths: + argv.extend(["--includedir", str(d)]) return super().runTestProgram(argv, **kwargs) diff --git a/girepository/tests/meson.build b/girepository/tests/meson.build index fb3b5b031..ab5e9f748 100644 --- a/girepository/tests/meson.build +++ b/girepository/tests/meson.build @@ -183,6 +183,7 @@ endif python_test_env = test_env python_test_env.prepend('PYTHONPATH', python_test_libraries_path) +python_test_env.prepend('PYTHONPATH', python_test_libraries_built) foreach test_name, extra_args : python_tests depends = [extra_args.get('depends', [])] diff --git a/glib/tests/meson.build b/glib/tests/meson.build index 5734001e2..b662c3713 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -514,6 +514,7 @@ endif python_test_env = test_env python_test_env.prepend('PYTHONPATH', python_test_libraries_path) +python_test_env.prepend('PYTHONPATH', python_test_libraries_built) foreach test_name, extra_args : python_tests depends = [extra_args.get('depends', [])] diff --git a/gobject/tests/meson.build b/gobject/tests/meson.build index 933461f5a..268dd5dd9 100644 --- a/gobject/tests/meson.build +++ b/gobject/tests/meson.build @@ -234,6 +234,7 @@ endforeach python_test_env = test_env python_test_env.prepend('PYTHONPATH', python_test_libraries_path) +python_test_env.prepend('PYTHONPATH', python_test_libraries_built) foreach test_name, extra_args : python_tests depends = [extra_args.get('depends', [])] diff --git a/meson.build b/meson.build index a8bcadc8d..af344634f 100644 --- a/meson.build +++ b/meson.build @@ -2500,6 +2500,7 @@ assert(fs.exists(python_test_libraries_path)) if not python_version.version_compare(python_version_req) error('Requires Python @0@, @1@ found.'.format(python_version_req, python_version)) endif +python_test_libraries_built = meson.project_build_root() / 'tests' / 'lib' # Determine which user environment-dependent files that we want to install bash = find_program('bash', required : false) diff --git a/tests/black.sh b/tests/black.sh index 37473bef5..2e214900e 100755 --- a/tests/black.sh +++ b/tests/black.sh @@ -16,7 +16,7 @@ export TEST_REQUIRES_TOOLS="black git" run_lint () { # shellcheck disable=SC2046 - black --diff --check $(git ls-files '*.py') + black --diff --check $(git ls-files '*.py' 'tests/lib/*.py.in') } # shellcheck source=tests/lint-common.sh diff --git a/tests/flake8.sh b/tests/flake8.sh index 10a0a6ffd..627a2aed7 100755 --- a/tests/flake8.sh +++ b/tests/flake8.sh @@ -21,7 +21,7 @@ run_lint () { # shellcheck disable=SC2046 flake8 \ --max-line-length=88 --ignore="$formatting_warnings" \ - $(git ls-files '*.py') + $(git ls-files '*.py' 'tests/lib/*.py.in') } # shellcheck source=tests/lint-common.sh diff --git a/tests/lib/glibconfig.py.in b/tests/lib/glibconfig.py.in new file mode 100644 index 000000000..7962fbab3 --- /dev/null +++ b/tests/lib/glibconfig.py.in @@ -0,0 +1,29 @@ +# Copyright 2025 Simon McVittie +# SPDX-License-Identifier: LGPL-2.1-or-later + +import os +from pathlib import Path + + +if "G_TEST_BUILDDIR" in os.environ: + # During build-time testing, we search the build tree. + # We can't use the value of G_TEST_BUILDDIR here because we don't + # know how deeply nested the current build directory is. + project_build_root = Path(__file__).resolve().parent.parent.parent + + # Where to find GLib-2.0.gir, etc. as a list of Path, highest priority first + GIR_XML_SEARCH_PATHS = [ + project_build_root / "girepository" / "introspection", + ] + +else: + # During as-installed testing, we search the final paths. + + # This is a subset of the search path from girparser.c locate_gir(), + # with only the directories that are part of GLib's prefix, + # excluding XDG_DATA_HOME, XDG_DATA_DIRS and the hard-coded + # /usr/share fallback + GIR_XML_SEARCH_PATHS = [ + Path(r"@glib_girdir@"), + Path(r"@glib_datadir@") / r"@gir_suffix@", + ] diff --git a/tests/lib/meson.build b/tests/lib/meson.build new file mode 100644 index 000000000..25990a481 --- /dev/null +++ b/tests/lib/meson.build @@ -0,0 +1,26 @@ +# Copyright 2024 Collabora Ltd. +# Copyright 2025 Simon McVittie +# SPDX-License-Identifier: LGPL-2.1-or-later + +install_data( + files( + 'taptestrunner.py', + 'testprogramrunner.py', + ), + install_dir: installed_tests_execdir, + install_tag: 'tests', +) + +tests_conf = configuration_data() +tests_conf.set('gir_suffix', gir_suffix) +tests_conf.set('glib_datadir', glib_datadir) +tests_conf.set('glib_girdir', glib_girdir) + +configure_file( + configuration: tests_conf, + input: 'glibconfig.py.in', + output: 'glibconfig.py', + install: installed_tests_enabled, + install_dir: installed_tests_execdir, + install_tag: 'tests', +) diff --git a/tests/meson.build b/tests/meson.build index e5518c64d..42162f4c3 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -34,18 +34,4 @@ test( protocol : 'tap', ) -# TAP test runner for Python tests -if installed_tests_enabled - lib_path = fs.relative_to( - meson.project_source_root() / python_test_libraries_path, - meson.current_source_dir()) - - install_data( - files( - lib_path / 'taptestrunner.py', - lib_path / 'testprogramrunner.py', - ), - install_dir: installed_tests_execdir, - install_tag: 'tests', - ) -endif +subdir('lib')