From 774d7a570d9f76903de3c3267512b8a7d252c21e Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Fri, 22 Dec 2023 22:38:27 +0000 Subject: [PATCH] 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. --- setup.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1bf0bcff558..07163d001fc 100755 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ import struct import subprocess import sys +import sysconfig import warnings from setuptools import Extension, setup @@ -504,8 +505,16 @@ def build_extensions(self): for d in os.environ[k].split(os.path.pathsep): _add_directory(library_dirs, d) - _add_directory(library_dirs, os.path.join(sys.prefix, "lib")) - _add_directory(include_dirs, os.path.join(sys.prefix, "include")) + _add_directory( + 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