Fix cross-compiling by searching the right lib and include directories

We were previously searching the `{sys.prefix}/lib` and
`{sys.prefix}/include` directories unconditionally. This is problematic
when cross-compiling, as it does not take account of any sysroot where
alternative libraries and headers are located. Adding `-I/usr/include`
causes the build to explode, at least when cross-compiling from 64-bit
to 32-bit.

Python does not officially support cross-compiling, but Gentoo achieves
this by modifying the sysconfig variables like `LIBDIR` and `INCLUDEDIR`
with great results.

Assuming "lib" is bad. 64-bit Linux systems often use lib64, putting
32-bit libraries under lib. You cannot assume that either though, as
pure 64-bit Linux systems may just use lib instead. Things get even
stranger on RISC-V.

The value of `sys.prefix` changes when using a virtualenv. Dependencies
may be installed here, so it does make sense to continue supporting this
case, even if it is incompatible with cross-compiling. Unlike regular
environments, "lib" is generally used for libraries, although a lib64
symlink may also be present.
This commit is contained in:
James Le Cuirot 2023-12-22 22:38:27 +00:00
parent e9453a7b88
commit 774d7a570d
No known key found for this signature in database
GPG Key ID: 1226415D00DD3137

View File

@ -15,6 +15,7 @@ import shutil
import struct import struct
import subprocess import subprocess
import sys import sys
import sysconfig
import warnings import warnings
from setuptools import Extension, setup from setuptools import Extension, setup
@ -504,8 +505,16 @@ class pil_build_ext(build_ext):
for d in os.environ[k].split(os.path.pathsep): for d in os.environ[k].split(os.path.pathsep):
_add_directory(library_dirs, d) _add_directory(library_dirs, d)
_add_directory(library_dirs, os.path.join(sys.prefix, "lib")) _add_directory(
_add_directory(include_dirs, os.path.join(sys.prefix, "include")) library_dirs,
(sys.prefix == sys.base_prefix and sysconfig.get_config_var("LIBDIR"))
or os.path.join(sys.prefix, "lib"),
)
_add_directory(
include_dirs,
(sys.prefix == sys.base_prefix and sysconfig.get_config_var("INCLUDEDIR"))
or os.path.join(sys.prefix, "include"),
)
# #
# add platform directories # add platform directories