-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dev-build/meson-1.4.0-r1: add path to unbreak Darwin builds
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
Showing
4 changed files
with
311 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |