Создание модулей python 3 c в macOS — настройка с использованием нечетных параметров компилятора

#python-3.x #macos #ld

Вопрос:

Я пытаюсь создать модуль c в macOS. Сборка завершается неудачно во время процесса компоновщика с ошибкой:

 ld: warning: object file (build/temp.macosx-11.1-x86_64-3.7/pparser.o) was built for newer macOS version (11.1) than being linked (11.0)
 

Я понимаю, что это просто предупреждение, но полученный файл so не удается импортировать в скрипт python. Я выполняю сборку со следующим setup.py

 from distutils.core import setup, Extension

setup(name='pparser', version='1.0',  
            ext_modules=[Extension('pparser', 
                                  ['pparser.cpp'],
                         extra_compile_args = ["-Wno-nullability-completeness",
                                               "-Wno-undef-prefix",
                                               "-I/usr/local/opt/flex/include",
                                               "-I/usr/local/opt/bison/include",
                                               "-std=gnu  14"])])
 

Что странно, так это то, что я могу захватить вызов clang и запустить его сам в командной строке с помощью опции verbose

 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c   -bundle -undefined dynamic_lookup -L/Users/john/.pyenv/versions/3.7.9/lib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk -std=gnu  14 -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/tcl-tk/lib build/temp.macosx-11.1-x86_64-3.7/pparser.o -o build/lib.macosx-11.1-x86_64-3.7/pparser.cpython-37m-darwin.so --verbose
 

и я вижу следующее:

 InstalledDir:     /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -bundle -platform_version macos 11.0.0 11.3 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk -undefined dynamic_lookup -undefined dynamic_lookup -o build/lib.macosx-11.1-x86_64-3.7/pparser.cpython-37m-darwin.so -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/readline/lib -L/Users/john/.pyenv/versions/3.7.9/lib -L/usr/local/opt/tcl-tk/lib build/temp.macosx-11.1-x86_64-3.7/pparser.o -lc   -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.5/lib/darwin/libclang_rt.osx.a
 

Я подозреваю, что проблема заключается в версии macOS 11.0.0 11.3 для коммутатора ld, но откуда это взялось? Этого нет ни в файле установки, ни в командной строке, которую я ввел.

Моя настройка-заварить python 3.7.9 в виртуальной среде pyenv.

Любая помощь в понимании того, откуда программа установки python извлекает параметры командной строки, была бы весьма полезна.

Ответ №1:

Покопавшись еще немного, я нашел ответ здесь:

Настройка компилятора и компоновщика, используемых setuptools

Похоже, что CPython создает файл sysconfig, содержащий все переменные среды, используемые для его компиляции. Затем они используются python при создании установочного файла.

Вы можете просмотреть эти переменные в python:

 import distutils.sysconfig
distutils.sysconfig.get_config_var()
 

Далее автор описывает, как переопределить любую желаемую переменную.