summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2024-03-27 18:46:56 +0100
committerFabian Groffen <grobian@gentoo.org>2024-03-27 18:46:56 +0100
commit77fa58d79b6f22e7095cf4bcdb2a417c446eade4 (patch)
treed95afb4de612c6614109f34bbb8de33d39828029 /dev-build
parentsys-devel/gcc-13.2.0: fix bootstrap using CLT 15.3 on macOS (diff)
downloadprefix-77fa58d79b6f22e7095cf4bcdb2a417c446eade4.tar.gz
prefix-77fa58d79b6f22e7095cf4bcdb2a417c446eade4.tar.bz2
prefix-77fa58d79b6f22e7095cf4bcdb2a417c446eade4.zip
dev-build/meson-1.4.0-r1: add path to unbreak Darwin builds
Submitted upstream, https://github.com/mesonbuild/meson/pull/13012 in the meanwhile unbreak Darwin hosts. Closes: https://bugs.gentoo.org/923706 Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'dev-build')
-rw-r--r--dev-build/meson/Manifest3
-rw-r--r--dev-build/meson/files/meson-1.2.1-python-path.patch26
-rw-r--r--dev-build/meson/files/meson-1.4.0-darwin-rpath.patch101
-rw-r--r--dev-build/meson/meson-1.4.0-r1.ebuild181
4 files changed, 311 insertions, 0 deletions
diff --git a/dev-build/meson/Manifest b/dev-build/meson/Manifest
new file mode 100644
index 0000000000..d7742feeed
--- /dev/null
+++ b/dev-build/meson/Manifest
@@ -0,0 +1,3 @@
+DIST meson-1.4.0.tar.gz 2224663 BLAKE2B 7f742ef870c182e552c1ff3508d65f251009d610def6a08e01fddb6c6a4ed6d608ead0d52cf8ca7d66b5bd7a4732dccd7ab5d98f141a4a61e275398885f79486 SHA512 2787941fbc77d5ad95011753df52fe39812929a06d84dbce8bdc965c9c1e62fd6bfa819712eb1f5934c2ebe6919a65f7874ecac2caf40d111ea024343108cfbd
+DIST meson-1.4.0.tar.gz.asc 833 BLAKE2B 6e4002303da16bcaa3d1d3c76a3485b23174074de2d29bd34347a4671d7fb0f1c0767559ed9267e0f0b52c02638b85a11a5980f4ee188e7e4d35c733b0821c62 SHA512 ea73e72d929bf30d28c033f103fd1d26bac7cef175aabbf9b3a24c7b336682c28f5aae184e04d2189731cf80dd7571939cb02de642bb5b412cea996ca30dfdad
+DIST meson-reference-1.4.0.3 339324 BLAKE2B 8ad24592c1a9100832dead97a55d4cb358892fc1cd6aee641f9610cb6a5df211831e6cfc42e047d5e835ed53de1bb9c7d711dd1a0a8cfe18a0f85e92a1a3f925 SHA512 8df06f63db6db01a6c8c0a5b4a8b26c868bb027f26580d290288b1067429a526fb654fae01a45085c1f20ee8dab1b5325e8b2fd285faf175d2fcfc2c704b4768
diff --git a/dev-build/meson/files/meson-1.2.1-python-path.patch b/dev-build/meson/files/meson-1.2.1-python-path.patch
new file mode 100644
index 0000000000..d6151881f8
--- /dev/null
+++ b/dev-build/meson/files/meson-1.2.1-python-path.patch
@@ -0,0 +1,26 @@
+From 2b33c94e6315e9a397dd48a58a5becb0df3b8aba Mon Sep 17 00:00:00 2001
+From: James Le Cuirot <chewi@gentoo.org>
+Date: Sat, 12 Aug 2023 09:56:44 +0100
+Subject: [PATCH 2/2] python module: Respect PATH when python is not given in
+ machine file
+
+We should only fall back to the Python interpreter running Meson itself
+if `python3` is not found in the PATH.
+
+https://github.com/mesonbuild/meson/pull/12116
+
+diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
+index 5654e4231..2b2395a9b 100644
+--- a/mesonbuild/modules/python.py
++++ b/mesonbuild/modules/python.py
+@@ -381,7 +381,9 @@ class PythonModule(ExtensionModule):
+
+ def _find_installation_impl(self, state: 'ModuleState', display_name: str, name_or_path: str, required: bool) -> MaybePythonProg:
+ if not name_or_path:
+- python = PythonExternalProgram('python3', mesonlib.python_command)
++ python = PythonExternalProgram('python3')
++ if not python.found():
++ python = PythonExternalProgram('python3', mesonlib.python_command)
+ else:
+ tmp_python = ExternalProgram.from_entry(display_name, name_or_path)
+ python = PythonExternalProgram(display_name, ext_prog=tmp_python)
diff --git a/dev-build/meson/files/meson-1.4.0-darwin-rpath.patch b/dev-build/meson/files/meson-1.4.0-darwin-rpath.patch
new file mode 100644
index 0000000000..abcb9be6bb
--- /dev/null
+++ b/dev-build/meson/files/meson-1.4.0-darwin-rpath.patch
@@ -0,0 +1,101 @@
+From c9565bd44149041d613046d02be4cb9a5bd9ee2b Mon Sep 17 00:00:00 2001
+From: Fabian Groffen <grobian@gentoo.org>
+Date: Wed, 27 Mar 2024 17:20:16 +0000
+Subject: [PATCH] depfixer: change fix_darwin to act like fix_rpathtype_entry
+
+This somewhat aligns "darwin" (Mach-O) with how ELF RPATHs are treated.
+Instead of blindly removing all RPATHs, only remove the ones that are in
+the rpath_dirs_to_remove set. This way, RPATHs that were added by the
+toolchain or user are left untouched.
+
+It is important not to remove RPATHs as they may be vital for the
+executable at runtime. Issues #12045 and #12288 are examples of this.
+
+Issue: https://github.com/mesonbuild/meson/issues/12045
+Signed-off-by: Fabian Groffen <grobian@gentoo.org>
+---
+ mesonbuild/scripts/depfixer.py | 53 ++++++++++++++--------------------
+ 1 file changed, 21 insertions(+), 32 deletions(-)
+
+diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py
+index 61b7ffa642f1..71599f784e73 100644
+--- a/mesonbuild/scripts/depfixer.py
++++ b/mesonbuild/scripts/depfixer.py
+@@ -379,7 +379,7 @@ def fix_elf(fname: str, rpath_dirs_to_remove: T.Set[bytes], new_rpath: T.Optiona
+ # note: e.get_rpath() and e.get_runpath() may be useful
+ e.fix_rpath(fname, rpath_dirs_to_remove, new_rpath)
+
+-def get_darwin_rpaths_to_remove(fname: str) -> T.List[str]:
++def get_darwin_rpaths(fname: str) -> T.List[str]:
+ p, out, _ = Popen_safe(['otool', '-l', fname], stderr=subprocess.DEVNULL)
+ if p.returncode != 0:
+ raise subprocess.CalledProcessError(p.returncode, p.args, out)
+@@ -397,43 +397,32 @@ def get_darwin_rpaths_to_remove(fname: str) -> T.List[str]:
+ result.append(rp)
+ return result
+
+-def fix_darwin(fname: str, new_rpath: str, final_path: str, install_name_mappings: T.Dict[str, str]) -> None:
++def fix_darwin(fname: str, rpath_dirs_to_remove: T.Set[bytes], new_rpath: str, final_path: str, install_name_mappings: T.Dict[str, str]) -> None:
+ try:
+- rpaths = get_darwin_rpaths_to_remove(fname)
++ old_rpaths = get_darwin_rpaths(fname)
+ except subprocess.CalledProcessError:
+ # Otool failed, which happens when invoked on a
+ # non-executable target. Just return.
+ return
++ new_rpaths: OrderedSet[str] = OrderedSet()
++ if new_rpath:
++ new_rpaths.update(new_rpath)
++ # filter out build-only rpath entries, like in
++ # fix_rpathtype_entry
++ remove_rpaths = [x.decode('utf8') for x in rpath_dirs_to_remove]
++ for rpath_dir in old_rpaths:
++ if rpath_dir and rpath_dir not in remove_rpaths:
++ new_rpaths.add(rpath_dir)
+ try:
+ args = []
+- if rpaths:
+- # TODO: fix this properly, not totally clear how
+- #
+- # removing rpaths from binaries on macOS has tons of
+- # weird edge cases. For instance, if the user provided
+- # a '-Wl,-rpath' argument in LDFLAGS that happens to
+- # coincide with an rpath generated from a dependency,
+- # this would cause installation failures, as meson would
+- # generate install_name_tool calls with two identical
+- # '-delete_rpath' arguments, which install_name_tool
+- # fails on. Because meson itself ensures that it never
+- # adds duplicate rpaths, duplicate rpaths necessarily
+- # come from user variables. The idea of using OrderedSet
+- # is to remove *at most one* duplicate RPATH entry. This
+- # is not optimal, as it only respects the user's choice
+- # partially: if they provided a non-duplicate '-Wl,-rpath'
+- # argument, it gets removed, if they provided a duplicate
+- # one, it remains in the final binary. A potentially optimal
+- # solution would split all user '-Wl,-rpath' arguments from
+- # LDFLAGS, and later add them back with '-add_rpath'.
+- for rp in OrderedSet(rpaths):
+- args += ['-delete_rpath', rp]
+- subprocess.check_call(['install_name_tool', fname] + args,
+- stdout=subprocess.DEVNULL,
+- stderr=subprocess.DEVNULL)
+- args = []
+- if new_rpath:
+- args += ['-add_rpath', new_rpath]
++ # compute diff, translate it into -delete_rpath and -add_rpath
++ # calls
++ for path in new_rpaths:
++ if path not in old_rpaths:
++ args += ['-add_rpath', path]
++ for path in old_rpaths:
++ if path not in new_rpaths:
++ args += ['-delete_rpath', path]
+ # Rewrite -install_name @rpath/libfoo.dylib to /path/to/libfoo.dylib
+ if fname.endswith('dylib'):
+ args += ['-id', final_path]
+@@ -492,4 +481,4 @@ def fix_rpath(fname: str, rpath_dirs_to_remove: T.Set[bytes], new_rpath: T.Union
+ if INSTALL_NAME_TOOL:
+ if isinstance(new_rpath, bytes):
+ new_rpath = new_rpath.decode('utf8')
+- fix_darwin(fname, new_rpath, final_path, install_name_mappings)
++ fix_darwin(fname, rpath_dirs_to_remove, new_rpath, final_path, install_name_mappings)
diff --git a/dev-build/meson/meson-1.4.0-r1.ebuild b/dev-build/meson/meson-1.4.0-r1.ebuild
new file mode 100644
index 0000000000..e29322ee47
--- /dev/null
+++ b/dev-build/meson/meson-1.4.0-r1.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2016-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{10..12} pypy3 )
+DISTUTILS_USE_PEP517=setuptools
+
+inherit bash-completion-r1 edo distutils-r1 flag-o-matic toolchain-funcs
+
+if [[ ${PV} = *9999* ]]; then
+ EGIT_REPO_URI="https://github.com/mesonbuild/meson"
+ inherit ninja-utils git-r3
+
+ BDEPEND="
+ ${NINJA_DEPEND}
+ $(python_gen_any_dep 'dev-python/pyyaml[${PYTHON_USEDEP}]')
+ "
+
+else
+ inherit verify-sig
+
+ MY_PV=${PV/_/}
+ MY_P=${P/_/}
+ S=${WORKDIR}/${MY_P}
+
+ SRC_URI="
+ https://github.com/mesonbuild/meson/releases/download/${MY_PV}/${MY_P}.tar.gz
+ verify-sig? ( https://github.com/mesonbuild/meson/releases/download/${MY_PV}/${MY_P}.tar.gz.asc )
+ https://github.com/mesonbuild/meson/releases/download/${MY_PV}/meson-reference.3 -> meson-reference-${MY_PV}.3
+ "
+ BDEPEND="verify-sig? ( sec-keys/openpgp-keys-jpakkane )"
+ VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/jpakkane.gpg
+
+ if [[ ${PV} != *_rc* ]] ; then
+ KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris"
+ fi
+fi
+
+DESCRIPTION="Open source build system"
+HOMEPAGE="https://mesonbuild.com/"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+IUSE="test"
+RESTRICT="!test? ( test )"
+
+DEPEND="
+ test? (
+ dev-libs/glib:2
+ dev-libs/gobject-introspection
+ app-alternatives/ninja
+ dev-vcs/git
+ sys-libs/zlib[static-libs(+)]
+ virtual/pkgconfig
+ )
+"
+RDEPEND="
+ !<dev-build/muon-0.2.0-r2[man(-)]
+ virtual/pkgconfig
+"
+
+PATCHES=(
+ "${FILESDIR}"/${PN}-1.2.1-python-path.patch
+ "${FILESDIR}"/${PN}-1.4.0-darwin-rpath.patch
+)
+
+src_unpack() {
+ if [[ ${PV} = *9999* ]]; then
+ git-r3_src_unpack
+ else
+ default
+ use verify-sig && verify-sig_verify_detached "${DISTDIR}"/${MY_P}.tar.gz{,.asc}
+ fi
+}
+
+python_prepare_all() {
+ local disable_unittests=(
+ # ASAN and sandbox both want control over LD_PRELOAD
+ # https://bugs.gentoo.org/673016
+ -e 's/test_generate_gir_with_address_sanitizer/_&/'
+
+ # ASAN is unsupported on some targets
+ # https://bugs.gentoo.org/692822
+ -e 's/test_pch_with_address_sanitizer/_&/'
+ )
+
+ sed -i "${disable_unittests[@]}" unittests/*.py || die
+
+ # Broken due to python2 script created by python_wrapper_setup
+ rm -r "test cases/frameworks/1 boost" || die
+
+ distutils-r1_python_prepare_all
+}
+
+python_check_deps() {
+ if [[ ${PV} = *9999* ]]; then
+ python_has_version "dev-python/pyyaml[${PYTHON_USEDEP}]"
+ fi
+}
+
+python_configure_all() {
+ if [[ ${PV} = *9999* ]]; then
+ # We use the unsafe_yaml loader because strictyaml is not packaged. In
+ # theory they produce the same results, but pyyaml is faster and
+ # without safety checks.
+ edo ./meson.py setup \
+ --prefix "${EPREFIX}/usr" \
+ -Dhtml=false \
+ -Dunsafe_yaml=true \
+ docs/ docs/builddir
+ fi
+}
+
+python_compile_all() {
+ if [[ ${PV} = *9999* ]]; then
+ eninja -C docs/builddir
+ fi
+}
+
+src_test() {
+ tc-export PKG_CONFIG
+ if ${PKG_CONFIG} --exists Qt5Core && ! ${PKG_CONFIG} --exists Qt5Gui; then
+ ewarn "Found Qt5Core but not Qt5Gui; skipping tests"
+ else
+ distutils-r1_src_test
+ fi
+}
+
+python_test() {
+ (
+ # meson has its own tests for LTO support. We don't need to verify that
+ # all tests work when they happen to use it. And in particular, this
+ # breaks rust.
+ filter-lto
+
+ # remove unwanted python_wrapper_setup contents
+ # We actually do want to non-error if python2 is installed and tested.
+ remove="${T}/${EPYTHON}/bin:"
+ PATH=${PATH/${remove}/}
+
+ # test_meson_installed
+ unset PYTHONDONTWRITEBYTECODE
+
+ # https://bugs.gentoo.org/687792
+ unset PKG_CONFIG
+
+ # test_cross_file_system_paths
+ unset XDG_DATA_HOME
+
+ # 'test cases/unit/73 summary' expects 80 columns
+ export COLUMNS=80
+
+ # If JAVA_HOME is not set, meson looks for javac in PATH.
+ # If javac is in /usr/bin, meson assumes /usr/include is a valid
+ # JDK include path. Setting JAVA_HOME works around this broken
+ # autodetection. If no JDK is installed, we should end up with an empty
+ # value in JAVA_HOME, and the tests should get skipped.
+ export JAVA_HOME=$(java-config -O 2>/dev/null)
+
+ ${EPYTHON} -u run_tests.py
+ ) || die "Testing failed with ${EPYTHON}"
+}
+
+python_install_all() {
+ distutils-r1_python_install_all
+
+ insinto /usr/share/vim/vimfiles
+ doins -r data/syntax-highlighting/vim/{ftdetect,indent,syntax}
+
+ insinto /usr/share/zsh/site-functions
+ doins data/shell-completions/zsh/_meson
+
+ dobashcomp data/shell-completions/bash/meson
+
+ if [[ ${PV} = *9999* ]]; then
+ DESTDIR="${ED}" eninja -C docs/builddir install
+ else
+ newman "${DISTDIR}"/meson-reference-${PV}.3 meson-reference.3
+ fi
+}