Используя Perl ExtUtils::MakeMaker, как я могу скомпилировать исполняемый файл, используя те же настройки, что и мой модуль XS?

Учитывая, что модуль Perl XS использует библиотеку C, предположим, что существует Makefile.PL, который настроен правильно, чтобы все заголовки и расположения библиотек, флаги компилятора и компоновщика и т.д. работали правильно.

Теперь, скажем, я хочу включить небольшую C-программу с указанным XS-модулем, которая использует ту же базовую C-библиотеку. Как правильно, независимо от платформы, указать целевой исполняемый файл, чтобы он создавался с теми же настройками и флагами?

Если я сделаю следующее

sub MY::postamble {
    return <<FRAG;
target$Config{exe_ext}: target$Config{obj_ext}

target$Config{obj_ext}: target.c

FRAG
}

Я не получаю те, которые включают местоположения, списки библиотек и т. Д. Я установил в аргументах WriteMakefile, Если я начну писать правила вручную, я должен учитывать как минимум make, dmake, а также nmake, Я не могу придумать простой способ указать библиотеки для ссылки, если использовать ExtUtils:: CBuilder.

Я должен что-то упустить. Буду признателен, если вы сможете это указать.

2 ответа

EU::MM не знает, как создать исполняемый файл. Если вам нужно сделать это, вам нужно будет учитывать различные наборы инструментов компилятора. Я сделал это по крайней мере один раз, но я не утверждаю, что он полностью переносим (достаточно переносим).

Долгосрочное решение было бы правильной структурой компиляции, я работал над этим, но это довольно нетривиально.

Возможно, вы захотите взглянуть на Dist:: Zilla. Я использую его, потому что я никогда не могу вспомнить, как это сделать. С довольно маленькой и котельной dist.ini файл, чтобы сказать ему, какие плагины использовать, он сгенерирует все нужные вам строительные системы, включая все необходимые Makefile.PL, Думайте об этом как о создателе make-файлов. Я использую его для одного из моих меньших и более сломанных CPAN-модулей на основе C: https://github.com/morungos/p5-Algorithm-Diff-Fast, который не особенно хорошо работает как модуль, но имеет приличную сборку. Магия нужна в inc/DiffMakeMaker.pm,

Тем не менее, краткий ответ - взглянуть на дополнительные настройки, в которые входит этот компонент Makefile.PL:

LIBS => [''],
INC => '-I.',
OBJECT => '$(O_FILES)', # link all the C files too

Просто добавив эти опции в свой Makefile.PL должен получить его, чтобы построить Makefile это обрабатывает C так же как XS, и связывает их вместе для Perl.

Потому что, хотя EU::MM не знает, как создать исполняемый файл, большая часть того, что он делает, - это создание Makefile. И это более чем приятно сделать то, что нужно, чтобы правильно склеить C и Perl.

Другие вопросы по тегам