fix: support debian multiarch with local toolchains (#3100)
Apparently, there is a "multiarch" style of Python installations, where
the shared
libraries can be in a sub-directory. The best docs I could find about
this are
https://wiki.debian.org/Python/MultiArch.
To fix, looking at the `MULTIARCH` sysconfig var tells what
subdirectory, if any
should be looked in.
Along the way, fix a changelog issue reference url.
Fixes https://github.com/bazel-contrib/rules_python/issues/3099
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7248e1f..b36ceaf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -85,10 +85,12 @@
([#2503](https://github.com/bazel-contrib/rules_python/issues/2503)).
* (toolchains) `local_runtime_repo` now checks if the include directory exists
before attempting to watch it, fixing issues on macOS with system Python
- ({gh-issue}`3043`).
+ ([#3043](https://github.com/bazel-contrib/rules_python/issues/3043)).
* (pypi) The pipstar `defaults` configuration now supports any custom platform
name.
* Multi-line python imports (e.g. with escaped newlines) are now correctly processed by Gazelle.
+* (toolchains) `local_runtime_repo` works with multiarch Debian with Python 3.8
+ ([#3099](https://github.com/bazel-contrib/rules_python/issues/3099)).
{#v0-0-0-added}
### Added
diff --git a/python/private/get_local_runtime_info.py b/python/private/get_local_runtime_info.py
index 19db3a2..c837135 100644
--- a/python/private/get_local_runtime_info.py
+++ b/python/private/get_local_runtime_info.py
@@ -35,7 +35,15 @@
# of settings.
# https://stackoverflow.com/questions/47423246/get-pythons-lib-path
# For now, it seems LIBDIR has what is needed, so just use that.
+ # See also: MULTIARCH
"LIBDIR",
+ # On Debian, with multiarch enabled, prior to Python 3.10, `LIBDIR` didn't
+ # tell the location of the libs, just the base directory. The `MULTIARCH`
+ # sysconfig variable tells the subdirectory within it with the libs.
+ # See:
+ # https://wiki.debian.org/Python/MultiArch
+ # https://git.launchpad.net/ubuntu/+source/python3.12/tree/debian/changelog#n842
+ "MULTIARCH",
# The versioned libpythonX.Y.so.N file. Usually?
# It might be a static archive (.a) file instead.
"INSTSONAME",
diff --git a/python/private/local_runtime_repo.bzl b/python/private/local_runtime_repo.bzl
index 3b4b4c0..b8b7164 100644
--- a/python/private/local_runtime_repo.bzl
+++ b/python/private/local_runtime_repo.bzl
@@ -126,6 +126,7 @@
# In some cases, the same value is returned for multiple keys. Not clear why.
shared_lib_names = {v: None for v in shared_lib_names}.keys()
shared_lib_dir = info["LIBDIR"]
+ multiarch = info["MULTIARCH"]
# The specific files are symlinked instead of the whole directory
# because it can point to a directory that has more than just
@@ -135,6 +136,11 @@
for name in shared_lib_names:
origin = rctx.path("{}/{}".format(shared_lib_dir, name))
+ # If the origin doesn't exist, try the multiarch location, in case
+ # it's an older Python / Debian release.
+ if not origin.exists and multiarch:
+ origin = rctx.path("{}/{}/{}".format(shared_lib_dir, multiarch, name))
+
# The reported names don't always exist; it depends on the particulars
# of the runtime installation.
if origin.exists: