Могут ли distutils Python скомпилировать .S (сборку)?
Вопрос
Я написал небольшое расширение Python, которое объединяет, компилирует и статически связывает небольшую библиотеку C с одним дополнительным файлом .S (ассемблер).Расширение Distutils() по умолчанию не распознает .S.Есть ли хороший способ скомпилировать этот файл, или мне следует просто раскошелиться на make
?Сейчас я компилирую код C только для немного более медленной библиотеки.
Решение
Я не знаю, насколько это ново, но Extension
в классе есть extra_objects
Аргумент, который я нашел, может указывать файлы сборки.Так, например, мой setup.py
выглядит примерно так:
example_module = Extension('_example',
extra_compile_args = ['-Wall', '-g', '-std=c++11'],
sources=['something.cpp'],
extra_objects=['asm_amd64.s'])
Я дважды проверил, и если вы проверите сгенерированную библиотеку с помощью nm -D example.so
, ассемблерные функции будут правильно собраны и связаны, если вы включите их в extra_objects
, но они не будут связаны, если вы не включите его в этот аргумент.Так что, похоже, это работает.
Другие советы
При распространении distutils не знает ассемблерного кода, и я не знаю расширений к нему, которые позволяли бы ему автоматически обрабатывать его.В подобной ситуации я всегда собирал библиотеку отдельно (с использованием C и ассемблера по мере необходимости и возможности) и использовал только полученный результат. .a
с помощью setup.py.
По этому поводу существует открытый запрос функции: http://bugs.python.org/issue2942