модуль сборки perl с исходным кодом c из другого модуля

Я работаю над модулем, в котором я хотел бы иметь два бэкэнда, Module(::PerlArray) и Module::PDL (которые могут зависеть от Module). Обоим нужен доступ к файлу functions.c/.h для сборки. Этот файл имеет довольно сложную логику, необходимую для модуля. Вместо того, чтобы распространять его отдельно с каждым модулем, есть ли способ сохранить его с Module::PP в системе, а затем добавить его к соответствующим флагам сборки в EU::MM или M::B (учитывая сложность здесь, вероятно, последнее)?

Чтобы выразить это более наглядно

--Module--
Module.pm
Module/PerlArray.pm
Module/PerlArray.xs (#include functions.h
              #include perlarray_backend.h)
Module/src/functions.c
Module/src/perlarray_backend.c
Module/inc/functions.h
Module/inc/perlarray_backend.h

--Module::PDL--
Module/PDL.pm
Module/PDL.xs (#include functions.h /*from Module*/
               #include pdl_backend.h)
Module/src/pdl_backend.c
Module/inc/pdl_backend.h

и компиляцию делает functions.o и ссылки. Я уверен, что смогу понять, как правильно установить флаги, но как мне заставить модуль сохранять файл functions.c во время установки, и как я могу найти его при установке Module::PDL? Есть ли место, где я могу разместить functions.c/.h?


person Joel Berger    schedule 12.10.2011    source источник
comment
Модуль PP должен быть зарезервирован для Pure Perl (это соглашение), поэтому он не должен зависеть от файлов .[ch].   -  person Jonathan Leffler    schedule 12.10.2011
comment
правда, буду работать над неймингом. Мой pp (как я его назвал) использует собственные массивы Perl, а не PDL, но вы правы, я не должен называть его PP, если он использует XS.   -  person Joel Berger    schedule 12.10.2011


Ответы (2)


Вы смотрели DBI? Он делает то, что вы предлагаете: он устанавливает некоторые файлы .h, которые драйверы DBD могут включать в свой код XS, а также библиотеку, которую могут вызывать драйверы DBD.

person Tanktalus    schedule 12.10.2011

Модули должны устанавливаться независимо друг от друга. То есть, при условии, что у меня установлены необходимые модули Perl (но не обязательно все еще лежат в виде исходного кода), тогда должна быть возможность установить все модули в одном распределенном tar-файле без ссылки на исходный код для любого другого модуля.

У вас есть варианты. Один из них заключается в том, чтобы один исходный каталог создавал несколько распределенных tar-шаров, и каждый из них мог иметь копию общего function.[ch] в распределенном исходном коде.

Другой основной вариант — объединить оба модуля в один распределенный tar-шар.

person Jonathan Leffler    schedule 12.10.2011
comment
Хотя я в целом согласен с тем, что вы сказали, причина, по которой я хочу сделать это таким образом, заключается в том, что PDL — это огромная и раздражающая цепочка для установки, и все, что она предоставляет моему модулю, — это более чистая единица хранения данных. Я не думаю, что все (потенциальные) пользователи моего Module захотят и будут нуждаться в головной боли PDL. Есть меньшее сообщество, которое выиграет, и для них зачем создавать гигантский массив SV* только для того, чтобы они могли затем преобразовать в объект PDL в конце. Поэтому, поскольку Module::PDL будет зависеть от Module и в любом случае не будет устанавливаться независимо, я думаю, что эта ситуация может работать. - person Joel Berger; 12.10.2011