class GobjectIntrospection < Formula include Language::Python::Shebang include Language::Python::Virtualenv desc "Generate introspection data for GObject libraries" homepage "https://gi.readthedocs.io/en/latest/" url "https://download.gnome.org/sources/gobject-introspection/1.86/gobject-introspection-1.86.0.tar.xz" sha256 "920d1a3fcedeadc32acff95c2e203b319039dd4b4a08dd1a2dfd283d19c0b9ae" license all_of: ["GPL-2.0-or-later", "LGPL-2.0-or-later", "MIT"] bottle do rebuild 1 sha256 arm64_tahoe: "e84d9ab63955e7da2a20bcd8d8ad72cfaa00ed17a076430c278ac6ae0a72c94c" sha256 arm64_sequoia: "5832e82a10514f44c72d380eb1e72da0e28394c0eba5b213312f9b90264c7de2" sha256 arm64_sonoma: "7bef3926c3fe7638286a63496e85a30c7e7ca8a9b2db6cc396a92ecde44ca2d6" sha256 sonoma: "981538c4d1b3c77f14bb71f3d195b9956cb3eb7d1d97a5f701152d08ddcfaad0" sha256 arm64_linux: "628866b4608a6ed08ec3619ca7aafb4307717960537ecf5c3166731b35a9b56d" sha256 x86_64_linux: "bf0ddf795ddfc70040e50d67d17c22e5e052f02e29fdfbf36832c439c11fa469" end depends_on "bison" => :build depends_on "meson" => :build depends_on "ninja" => :build depends_on "cairo" depends_on "glib" depends_on "pkgconf" # Ships a `_giscanner.cpython-314-darwin.so`, so needs a specific version. depends_on "python@3.14" uses_from_macos "flex" => :build uses_from_macos "libffi" pypi_packages package_name: "", extra_packages: %w[mako markdown setuptools] resource "mako" do url "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz" sha256 "99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28" end resource "markdown" do url "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz" sha256 "d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a" end resource "markupsafe" do url "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz" sha256 "ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0" end resource "setuptools" do url "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz" sha256 "f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" end # Fix library search path on non-/usr/local installs (e.g. Apple Silicon) # See: https://github.com/Homebrew/homebrew-core/issues/75020 # https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/273 patch :DATA def install venv = virtualenv_create(libexec, "python3.14") venv.pip_install resources ENV.prepend_path "PATH", venv.root/"bin" ENV["GI_SCANNER_DISABLE_CACHE"] = "true" if OS.mac? && MacOS.version == :ventura && DevelopmentTools.clang_build_version == 1500 ENV.append "LDFLAGS", "-Wl,-ld_classic" end inreplace "giscanner/transformer.py", "/usr/share", "#{HOMEBREW_PREFIX}/share" inreplace "meson.build", "config.set_quoted('GOBJECT_INTROSPECTION_LIBDIR', join_paths(get_option('prefix'), get_option('libdir')))", "config.set_quoted('GOBJECT_INTROSPECTION_LIBDIR', '#{HOMEBREW_PREFIX}/lib')" system "meson", "setup", "build", "-Dpython=#{venv.root}/bin/python", "-Dextra_library_paths=#{HOMEBREW_PREFIX}/lib", *std_meson_args system "meson", "compile", "-C", "build", "--verbose" system "meson", "install", "-C", "build" rewrite_shebang python_shebang_rewrite_info(venv.root/"bin/python"), *bin.children end test do (testpath/"main.c").write <<~C #include int main (int argc, char *argv[]) { GIRepository *repo = g_irepository_get_default(); g_assert_nonnull(repo); return 0; } C pkgconf_flags = shell_output("pkgconf --cflags --libs gobject-introspection-1.0").strip.split system ENV.cc, "main.c", "-o", "test", *pkgconf_flags system "./test" end end __END__ diff --git a/girepository/gitypelib.c b/girepository/gitypelib.c index 29349da..5619cfb 100644 --- a/girepository/gitypelib.c +++ b/girepository/gitypelib.c @@ -2261,6 +2261,22 @@ load_one_shared_library (const char *shlib) { GSList *p; GModule *m; +#ifdef EXTRA_LIBRARY_PATHS + static gsize extra_libs_initialized = 0; + + if (g_once_init_enter (&extra_libs_initialized)) + { + gchar **paths = g_strsplit(EXTRA_LIBRARY_PATHS, G_SEARCHPATH_SEPARATOR_S, 0); + gint i; + gsize initialized = 1; + for (i = g_strv_length(paths) - 1 ; i >= 0 ; i--) + { + g_irepository_prepend_library_path(paths[i]); + } + g_strfreev(paths); + g_once_init_leave (&extra_libs_initialized, initialized); + } +#endif #ifdef __APPLE__ /* On macOS, @-prefixed shlib paths (@rpath, @executable_path, @loader_path) diff --git a/meson.build b/meson.build index 7b8bf1c..ea29ff5 100644 --- a/meson.build +++ b/meson.build @@ -222,6 +222,10 @@ if host_system in ['windows', 'cygwin'] g_ir_scanner_env.prepend(var, gio_dep.get_variable('giomoduledir')) endif +if get_option('extra_library_paths') != '' + config.set_quoted('EXTRA_LIBRARY_PATHS', get_option('extra_library_paths')) +endif + configure_file( configuration: config, output: 'config.h' diff --git a/meson_options.txt b/meson_options.txt index cbc63ed..e2e7577 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -49,3 +49,7 @@ option('gi_cross_pkgconfig_sysroot_path', type: 'string', option('tests', type: 'boolean', value: true, description: 'Build and run tests' ) + +option('extra_library_paths', type: 'string', + description: 'A list of file paths, joined together using the searchpath separator character, that will be used to search for shared libraries' +)