Skip to content

Commit

Permalink
dev-build/meson-1.4.0-r1: add path to unbreak Darwin builds
Browse files Browse the repository at this point in the history
Submitted upstream,
mesonbuild/meson#13012
in the meanwhile unbreak Darwin hosts.

Closes: https://bugs.gentoo.org/923706
Signed-off-by: Fabian Groffen <grobian@gentoo.org>
  • Loading branch information
grobian committed Mar 27, 2024
1 parent bf8c6e9 commit 77fa58d
Show file tree
Hide file tree
Showing 4 changed files with 311 additions and 0 deletions.
3 changes: 3 additions & 0 deletions dev-build/meson/Manifest
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions dev-build/meson/files/meson-1.2.1-python-path.patch
Original file line number Diff line number Diff line change
@@ -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)
101 changes: 101 additions & 0 deletions dev-build/meson/files/meson-1.4.0-darwin-rpath.patch
Original file line number Diff line number Diff line change
@@ -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)
181 changes: 181 additions & 0 deletions dev-build/meson/meson-1.4.0-r1.ebuild
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 77fa58d

Please sign in to comment.