У меня есть пользовательская сборка cpython 3.6.6, собранная с пользовательской установкой clang 6.0.Ни один из них не имеет фиксированных, предсказуемых абсолютных путей в файловой системе.В результате во время сборки cpython переменная окружения CC
(и CXX
, LD_LIBRARY_PATH
и т. Д.) Представляет собой относительный путь к clang из некоторого конкретного рабочего каталога, что-то вроде export CC=relative/path/to/clang
*.
Кажется, что python distutils запоминает это значение переменной окружения CC
.То есть я могу зайти в сессию REPL со встроенным питоном и выполнить следующее
$ echo $CC
/some/system/gcc
$ path/to/python3
Python 3.6.6 (default, Oct 3 2018, 10:19:41)
[GCC 4.2.1 Compatible Clang 6.0.0 (tags/RELEASE_600/final)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from distutils import sysconfig
>>> sysconfig.get_config_var('CC')
'relative/path/to/clang-6.0 -pthread'
Итак, мой вопрос: могу ли я запретить distutils запоминать CC
, используемый во время сборки?Я могу гарантировать, что CC
будет установлен соответствующим образом при каждом запуске distutils
.
Чтобы противостоять очевидному решению: разве CC=new/relative/path/to/clang python3 -m distutils ...
не решит проблему?Нет. По крайней мере, кажется, не когда вы используете pip
для установки вещей, которые требуют компилятора Си.Если в какой-то момент я использую CC=new/relative/path/to/clang python3 -m pip ...
, он попытается использовать CC
, который distutils
запомнился во время установки.Я не могу точно определить, какой из pip
, setuptools
или что-то еще здесь виновато.
* По сути, это потому, что я использую Базель для управления всем этим, но для объясненияподробности уведут меня слишком далеко от сути этого вопроса.