Python CFFI: сборка одного модуля из нескольких исходных файлов - PullRequest
0 голосов
/ 26 сентября 2019

Моя цель - собрать один модуль / расширение из нескольких исходных файлов на языке Си.Какая лучшая практика для достижения этой цели?

Что я пробовал:

Я знаю, что функция ffi.set_source имеет дополнительные sources и include_dir kwargsи что должна быть возможность использовать эти kwargs для создания единого общего объекта из нескольких исходных файлов.К сожалению, я не могу найти ничего относительно этих kwargs в справочнике API CFFI Documentation .Поэтому я не могу понять детали.Есть ли какой-нибудь документ, который объясняет, как правильно использовать эти kwargs?

В настоящее время я использую:

SOURCES = ('file_1.c', 'file_2.c')
SRC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../src')

ffi_builder = FFI()
ffi_builder.set_source(
    'module_name._module_name',
    ''.join(f'#include "{source}"\n' for source in SOURCES),
    include_dirs=[SRC_ROOT],
)

...

Хотя это на самом деле работает, мне кажется, это немного хакерски,Можно ли использовать sources kwarg вместо 2-го позиционного arg source?Это позволило бы мне избавиться от хакерской ''.join(f'#include "{source}"\n' for source in SOURCES) части.

Если есть даже более простой подход, мне также было бы интересно!

Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2019

В документации для set_source указано

Аргументы ключевых слов для set_source() определяют, как будет вызываться компилятор Си.Они передаются непосредственно в distutils или setuptools и включают по крайней мере sources, include_dirs, define_macros, undef_macros, libraries, library_dirs, extra_objects, extra_compile_args и extra_link_args.Обычно вам требуется по крайней мере libraries=['foo'] для связи с libfoo.so, libfoo.so.X.Y или foo.dll в Windows. sources - это список дополнительных .c файлов, скомпилированных и связанных между собой (файл module_name.c, показанный выше, всегда генерируется и автоматически добавляется в качестве первого аргумента sources).См. Документацию distutils для получения дополнительной информации о других аргументах.

Так что да, вы можете использовать sources в качестве kwarg

...