glib/tools/grab-gio-dll-paths.py
Chun-wei Fan ef73ce4f7f Introspection: Fix running g-ir-scanner 1.80.x+ on Windows
Since we are now building introspection files for GLib while building
GLib, so we want to make sure that we indeed load the freshly-built
DLLs when running g-ir-scanner, so we add the various needed subdirs
(and if needed, subprojects), to set the GI_EXTRA_BASE_DLL_DIRS
envvar so that g-ir-scanner will look for the newly-built GLib DLLs.

Ideally, upstream g-ir-scanner will need to be updated accordingly to do
something similar to what we are doing here, but this is needed until
the time that we require a g-ir-scanner that contains the update.

This will also fix the g-ir-scanner erroring out when there is no
pre-existing GLib on the system, as the needed DLLs are now found.

Related issue: https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/499
Related MR in G-I:
https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/458
2024-05-17 18:37:32 +08:00

69 lines
2.1 KiB
Python

#!/usr/bin/env python3
#
# Copyright © 2024 Chun-wei Fan.
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# Original author: Chun-wei Fan <fanc999@yahoo.com.tw>
"""
This script runs pkg-config against the uninstalled pkg-config files to obtain the
paths where the newly-built GLib and subproject DLLs reside
"""
import argparse
import os
import subprocess
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--build-path", required=True, help="Root build directory")
parser.add_argument(
"--pkg-config", help="pkg-config or compatible executable", default="pkg-config"
)
parser.add_argument(
"--pkg-config-path",
help="Additional paths to look for pkg-config .pc files",
)
args = parser.parse_args()
build_path = args.build_path
uninstalled_pc_path = os.path.join(build_path, "meson-uninstalled")
if not os.path.isdir(uninstalled_pc_path):
raise ValueError("%s is not a valid build path" % build_path)
additional_pkg_config_paths = [uninstalled_pc_path]
if args.pkg_config_path is not None:
additional_pkg_config_paths += args.pkg_config_path.split(os.pathsep)
if "PKG_CONFIG_PATH" in os.environ:
additional_pkg_config_paths += os.environ["PKG_CONFIG_PATH"].split(os.pathsep)
os.environ["PKG_CONFIG_PATH"] = os.pathsep.join(additional_pkg_config_paths)
# The _giscanner Python module depends on GIO, so use gio-2.0-uninstalled.pc
pkg_config_result = subprocess.run(
[args.pkg_config, "--libs-only-L", "gio-2.0"],
capture_output=True,
text=True,
check=True,
)
lib_args = pkg_config_result.stdout.split()
libpaths = []
for arg in lib_args:
# Get rid of the "-L" prefix in the library paths
if arg[2:] not in libpaths:
libpaths.append(arg[2:])
# Now append the paths in %PATH%, if the paths exist
paths = os.environ["PATH"].split(os.pathsep)
for path in paths:
if os.path.isdir(path):
libpaths.append(path)
print(os.pathsep.join(libpaths).rstrip())
if __name__ == "__main__":
main()