Используя 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.