From 0e78d578e643f353d6db74a8514bab28099760dc Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sat, 26 Mar 2022 03:34:58 +0100 Subject: [PATCH] glib: Fix docs on Darwin They are failing due to a Meson bug. Doing it this hacky way to avoid rebuilding the world. --- pkgs/development/libraries/glib/default.nix | 5 +- .../tools/build-managers/meson/default.nix | 5 + ...when-using-multiple-apple-frameworks.patch | 176 ++++++++++++++++++ 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 pkgs/development/tools/build-managers/meson/fix-gtkdoc-when-using-multiple-apple-frameworks.patch diff --git a/pkgs/development/libraries/glib/default.nix b/pkgs/development/libraries/glib/default.nix index 02e2293d1735..ecae47b3d2dd 100644 --- a/pkgs/development/libraries/glib/default.nix +++ b/pkgs/development/libraries/glib/default.nix @@ -115,7 +115,10 @@ stdenv.mkDerivation rec { strictDeps = true; nativeBuildInputs = [ - meson ninja pkg-config perl python3 gettext gtk-doc docbook_xsl docbook_xml_dtd_45 libxml2 + (meson.override { + withDarwinFrameworksGtkDocPatch = stdenv.isDarwin; + }) + ninja pkg-config perl python3 gettext gtk-doc docbook_xsl docbook_xml_dtd_45 libxml2 ]; propagatedBuildInputs = [ zlib libffi gettext libiconv ]; diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index aeddf457f48d..8744407fb96d 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -5,6 +5,7 @@ , pkg-config , python3 , substituteAll +, withDarwinFrameworksGtkDocPatch ? false }: python3.pkgs.buildPythonApplication rec { @@ -61,6 +62,10 @@ python3.pkgs.buildPythonApplication rec { # Meson tries to update ld.so.cache which breaks when the target architecture # differs from the build host's. ./do-not-update-ldconfig-cache.patch + ] ++ lib.optionals withDarwinFrameworksGtkDocPatch [ + # Fix building gtkdoc for GLib + # https://github.com/mesonbuild/meson/pull/10186 + ./fix-gtkdoc-when-using-multiple-apple-frameworks.patch ]; setupHook = ./setup-hook.sh; diff --git a/pkgs/development/tools/build-managers/meson/fix-gtkdoc-when-using-multiple-apple-frameworks.patch b/pkgs/development/tools/build-managers/meson/fix-gtkdoc-when-using-multiple-apple-frameworks.patch new file mode 100644 index 000000000000..eb6d9718bcb2 --- /dev/null +++ b/pkgs/development/tools/build-managers/meson/fix-gtkdoc-when-using-multiple-apple-frameworks.patch @@ -0,0 +1,176 @@ +From 0a008a6c7ecee19f35c8b7ab17b1470d0d1a8a15 Mon Sep 17 00:00:00 2001 +From: Jan Tojnar +Date: Sat, 26 Mar 2022 02:26:27 +0100 +Subject: [PATCH] gnome: Fix gtkdoc when using multiple Apple frameworks + +The `-framework Foundation -framework CoreFoundation` ended up +de-duplicated by OrderedSet into `-framework Foundation CoreFoundation`. + +Picked from https://github.com/mesonbuild/meson/pull/10186 + +Also pick https://github.com/mesonbuild/meson/commit/68e684d51f1e469e0d9f4b499ffda15146cad98a when resolving conflict. + +diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py +index 7113f28d2..d3269b53f 100644 +--- a/mesonbuild/modules/gnome.py ++++ b/mesonbuild/modules/gnome.py +@@ -384,13 +384,14 @@ class GnomeModule(ExtensionModule): + def _get_link_args(self, state, lib, depends, include_rpath=False, + use_gir_args=False): + link_command = [] ++ new_depends = list(depends) + # Construct link args + if isinstance(lib, build.SharedLibrary): + libdir = os.path.join(state.environment.get_build_dir(), state.backend.get_target_dir(lib)) + link_command.append('-L' + libdir) + if include_rpath: + link_command.append('-Wl,-rpath,' + libdir) +- depends.append(lib) ++ new_depends.append(lib) + # Needed for the following binutils bug: + # https://github.com/mesonbuild/meson/issues/1911 + # However, g-ir-scanner does not understand -Wl,-rpath +@@ -404,18 +405,24 @@ class GnomeModule(ExtensionModule): + link_command.append('--extra-library=' + lib.name) + else: + link_command.append('-l' + lib.name) +- return link_command +- +- def _get_dependencies_flags(self, deps, state, depends, include_rpath=False, +- use_gir_args=False, separate_nodedup=False): +- cflags = OrderedSet() +- internal_ldflags = OrderedSet() +- external_ldflags = OrderedSet() ++ return link_command, new_depends ++ ++ def _get_dependencies_flags_raw( ++ self, deps, ++ state, ++ depends, ++ include_rpath: bool = False, ++ use_gir_args: bool = False, ++ ) -> T.Tuple[OrderedSet[str], OrderedSet[T.Union[str, T.Tuple[str, str]]], OrderedSet[T.Union[str, T.Tuple[str, str]]], OrderedSet[str], ++ T.List]: ++ cflags: OrderedSet[str] = OrderedSet() + # External linker flags that can't be de-duped reliably because they +- # require two args in order, such as -framework AVFoundation +- external_ldflags_nodedup = [] +- gi_includes = OrderedSet() ++ # require two args in order, such as -framework AVFoundation will be stored as a tuple. ++ internal_ldflags: OrderedSet[T.Union[str, T.Tuple[str, str]]] = OrderedSet() ++ external_ldflags: OrderedSet[T.Union[str, T.Tuple[str, str]]] = OrderedSet() ++ gi_includes: OrderedSet[str] = OrderedSet() + deps = mesonlib.listify(deps) ++ depends = list(depends) + + for dep in deps: + if isinstance(dep, Dependency): +@@ -427,21 +434,20 @@ class GnomeModule(ExtensionModule): + cflags.update(state.get_include_args(dep.include_directories)) + for lib in dep.libraries: + if isinstance(lib, build.SharedLibrary): +- internal_ldflags.update(self._get_link_args(state, lib, depends, include_rpath)) +- libdepflags = self._get_dependencies_flags(lib.get_external_deps(), state, depends, include_rpath, +- use_gir_args, True) ++ _ld, depends = self._get_link_args(state, lib, depends, include_rpath) ++ internal_ldflags.update(_ld) ++ libdepflags = self._get_dependencies_flags_raw(lib.get_external_deps(), state, depends, include_rpath, ++ use_gir_args) + cflags.update(libdepflags[0]) + internal_ldflags.update(libdepflags[1]) + external_ldflags.update(libdepflags[2]) +- external_ldflags_nodedup += libdepflags[3] +- gi_includes.update(libdepflags[4]) +- extdepflags = self._get_dependencies_flags(dep.ext_deps, state, depends, include_rpath, +- use_gir_args, True) ++ gi_includes.update(libdepflags[3]) ++ extdepflags = self._get_dependencies_flags_raw(dep.ext_deps, state, depends, include_rpath, ++ use_gir_args) + cflags.update(extdepflags[0]) + internal_ldflags.update(extdepflags[1]) + external_ldflags.update(extdepflags[2]) +- external_ldflags_nodedup += extdepflags[3] +- gi_includes.update(extdepflags[4]) ++ gi_includes.update(extdepflags[3]) + for source in dep.sources: + if isinstance(source, GirTarget): + gi_includes.update([os.path.join(state.environment.get_build_dir(), +@@ -469,7 +475,7 @@ class GnomeModule(ExtensionModule): + # If it's a framework arg, slurp the framework name too + # to preserve the order of arguments + if lib == '-framework': +- external_ldflags_nodedup += [lib, next(ldflags)] ++ external_ldflags.update([(lib, next(ldflags))]) + else: + external_ldflags.update([lib]) + elif isinstance(dep, (build.StaticLibrary, build.SharedLibrary)): +@@ -480,21 +486,43 @@ class GnomeModule(ExtensionModule): + continue + + if use_gir_args and self._gir_has_option('--extra-library'): +- def fix_ldflags(ldflags): +- fixed_ldflags = OrderedSet() ++ def fix_ldflags(ldflags: T.Iterable[T.Union[str, T.Tuple[str, str]]]) -> OrderedSet[T.Union[str, T.Tuple[str, str]]]: ++ fixed_ldflags: OrderedSet[T.Union[str, T.Tuple[str, str]]] = OrderedSet() + for ldflag in ldflags: +- if ldflag.startswith("-l"): ++ if isinstance(ldflag, str) and ldflag.startswith("-l"): + ldflag = ldflag.replace('-l', '--extra-library=', 1) + fixed_ldflags.add(ldflag) + return fixed_ldflags + internal_ldflags = fix_ldflags(internal_ldflags) + external_ldflags = fix_ldflags(external_ldflags) +- if not separate_nodedup: +- external_ldflags.update(external_ldflags_nodedup) +- return cflags, internal_ldflags, external_ldflags, gi_includes +- else: +- return cflags, internal_ldflags, external_ldflags, external_ldflags_nodedup, gi_includes ++ return cflags, internal_ldflags, external_ldflags, gi_includes, depends ++ ++ def _get_dependencies_flags( ++ self, deps, ++ state, ++ depends, ++ include_rpath: bool = False, ++ use_gir_args: bool = False, ++ ) -> T.Tuple[OrderedSet[str], T.List[str], T.List[str], OrderedSet[str], ++ T.List]: ++ ++ cflags, internal_ldflags_raw, external_ldflags_raw, gi_includes, depends = self._get_dependencies_flags_raw(deps, state, depends, include_rpath, use_gir_args) ++ internal_ldflags: T.List[str] = [] ++ external_ldflags: T.List[str] = [] ++ ++ # Extract non-deduplicable argument groups out of the tuples. ++ for ldflag in internal_ldflags_raw: ++ if isinstance(ldflag, str): ++ internal_ldflags.append(ldflag) ++ else: ++ internal_ldflags.extend(ldflag) ++ for ldflag in external_ldflags_raw: ++ if isinstance(ldflag, str): ++ external_ldflags.append(ldflag) ++ else: ++ external_ldflags.extend(ldflag) + ++ return cflags, internal_ldflags, external_ldflags, gi_includes, depends + def _unwrap_gir_target(self, girtarget, state): + if not isinstance(girtarget, (build.Executable, build.SharedLibrary, + build.StaticLibrary)): +@@ -875,7 +903,7 @@ class GnomeModule(ExtensionModule): + # ldflags will be misinterpreted by gir scanner (showing + # spurious dependencies) but building GStreamer fails if they + # are not used here. +- dep_cflags, dep_internal_ldflags, dep_external_ldflags, gi_includes = \ ++ dep_cflags, dep_internal_ldflags, dep_external_ldflags, gi_includes, depends = \ + self._get_dependencies_flags(deps, state, depends, use_gir_args=True) + scan_cflags = [] + scan_cflags += list(self._get_scanner_cflags(cflags)) +@@ -1170,7 +1198,7 @@ class GnomeModule(ExtensionModule): + deps = extract_as_list(kwargs, 'dependencies') + cflags = [] + cflags.extend(mesonlib.stringlistify(kwargs.pop('c_args', []))) +- deps_cflags, internal_ldflags, external_ldflags, gi_includes = \ ++ deps_cflags, internal_ldflags, external_ldflags, gi_includes, depends = \ + self._get_dependencies_flags(deps, state, depends, include_rpath=True) + inc_dirs = mesonlib.extract_as_list(kwargs, 'include_directories') + for incd in inc_dirs: