MakeMaker обновляет список файлов в `make` time

Я работаю над модулем Perl под названием Mite. Это "компилятор". Вы пишете классы Perl, используя синтаксис OO, похожий на Moose. Вместо того, чтобы выполнять всю работу по объединению класса каждый раз, когда он выполняется, Mite делает это во время сборки. Он генерирует дополнительный файл, содержащий код Perl для ваших аксессуаров и наследования, а также многое другое.

Этот дополнительный файл помещается в lib с остальной частью вашего кода и будет выпущен вместе с вашим проектом. В результате пользователю установки не нужно устанавливать Mite, и код загружается быстрее.

Во время разработки компилятор клещей запускается при запуске make или Build. Так что вещи вроде make test и ./Build test просто работают. Это достигается с помощью специальных прокладок для MakeMaker или Module:: Build.

Это отлично работает для модуля:: Build, но ExtUtils:: MakeMaker не видит файлы клещей. MakeMaker жестко кодирует список того, что находится в lib, когда выполняется Makefile.PL. Шаг pm_to_lib затем не может скопировать сгенерированные файлы в blib, где будет отображаться make test.

Как лучше всего обойти эту проблему? Я хочу, чтобы процесс оставался прозрачным для разработчика (после загрузки соответствующей прокладки) и не требует особых зависимостей для пользователя установки.

UPDATE. Вот более ясный пример. Скажем, у вас есть такой проект.

Makefile.PL
lib/
 Foo.pm
 Bar.pm
 Foo/
 Thing.pm
t/
 foo.t
 bar.t

Вы запустите perl Makefile.PL, а затем make. Шаг make был изменен для создания дополнительного файла .mite.pm для каждого файла .pm. После шага make я хочу это.

Makefile.PL
Makefile
lib/
 Foo.pm
 Foo.pm.mite.pm
 Bar.pm
 Bar.pm.mite.pm
 Foo/
 Thing.pm
 Thing.pm.mite.pm
blib/
 lib/
 Foo.pm
 Foo.pm.mite.pm
 Bar.pm
 Bar.pm.mite.pm
 Foo/
 Thing.pm
 Thing.pm.mite.pm
t/
 foo.t
 bar.t

Все новые файлы, введенные в lib, были скопированы в blib/lib, где их можно рассматривать как часть make test. Вместо этого я получаю это.

Makefile.PL
Makefile
lib/
 Foo.pm
 Foo.pm.mite.pm
 Bar.pm
 Bar.pm.mite.pm
 Foo/
 Thing.pm
 Thing.pm.mite.pm
blib/
 lib/
 Foo.pm
 Bar.pm
 Foo/
 Thing.pm
t/
 foo.t
 bar.t

Это потому, что Makefile создается Makefile.PL с жестко закодированным списком того, что находится в lib.

(Это особенно глупо, я поддерживал MakeMaker уже 10 лет и не смог это исправить.)

1 ответ

Я завершил добавление новой цели и зависеть от нее pm_to_blib. Новая цель просто перемещает все файлы .pm с lib/ на blib/lib/. Резервирование не должно иметь значения.

Я не доволен этим решением, но он работает.

https://github.com/evalEmpire/Mite/commit/feff24e4d68e062a06a721591ff0d785c5dad80b

licensed under cc by-sa 3.0 with attribution.