我如何用Perl库为自定义bash命令编写makefile

u4vypkhs  于 2023-03-30  发布在  Perl
关注(0)|答案(2)|浏览(146)

我写了一个bash命令,它使用了一个扩展的perl模块库。我知道我可以在usr/bin中安装一个自定义的bash命令足够简单,但我以前从未有过命令的依赖关系。
我的makefile,不管是好是坏,看起来像这样

install:
    cp program.pl /usr/bin/program -f -v
    chmod +x /usr/bin/program -v

它很短,但我真的不需要编译任何东西。program.pl是一个简短的perl脚本,它使用Getopt::Long与模块交互。我一直使用MakeMaker单独安装模块,如文档here所示。
我的文件结构感觉有点矫枉过正,因为命令应该是多么简单,但由于MakeMaker的工作方式,它最终像这样

program/
    program.pl
    makefile
    perl/
        Makefile.PL
        MANIFEST
        lib/
            Program/
                Package01.pm
                Package02.pm
                Package03.pm

而且,我没有在根目录中运行递归make,而是在两个地方都运行make,我知道这是不对的(同时也很烦人)。
我看到所有这些模块都在/usr/local/share/perl/5.34.0/Program中结束,但我宁愿它更容易移植,而不是自己把它放在我的根makefile中。正确的方法是什么?我希望最终公开这个命令,我不想搞砸安装

pkwftd7m

pkwftd7m1#

很可能你可以在添加所需库的路径时运行该命令。在顶层 Makefile 中,你可以运行:

perl -Iperl/lib program.pl

还有其他各种方法可以设置Perl的库搜索路径。
诀窍可能是你的本地Perl模块需要其他模块,而这些模块在 Makefile.PL 中指定。你可以在local::lib的帮助下在本地安装这些模块:

% perl -Mlocal::lib
PATH="/Users/brian/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/brian/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/Users/brian/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/Users/brian/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/brian/perl5"; export PERL_MM_OPT;

这些是默认值,但您可以指定自己的基:

% perl -Mlocal::lib=/Users/brian/Dev/perl-lib
Attempting to create directory /Users/brian/Dev/perl-lib
PATH="/Users/brian/Dev/perl-lib/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/brian/Dev/perl-lib/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/Users/brian/Dev/perl-lib${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/Users/brian/Dev/perl-lib\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/brian/Dev/perl-lib"; export PERL_MM_OPT;

根据您的需要调整这些值,并将其放入您的环境中,cpan应该遵守它们:

% cd perl && cpan .

如果你不介意将依赖项安装在你的主目录而不是项目目录中,那么就不要设置任何env变量。cpan-I开关将为你使用local::lib并创建和安装到~/perl5/lib中:

% cd perl && cpan -I .

在你的程序中,拉入local::lib,它应该能解决这个问题:

use local::lib;

或者使用相对路径:

use local::lib 'perl-lib';
gdx19jrr

gdx19jrr2#

听起来像program.pl和Program::PackageXX.pm是一个捆绑包。
如果是这样,你应该安装Perl,不仅要安装模块,还要安装脚本。

Makefile.PL
MANIFEST
bin/
   program.pl
lib/
   App/
      Program.pm
      Program/01.pm
      Program/02.pm
      Program/03.pm

Makefile.PL

use strict;
use warnings

use ExtUtils::MakeMaker;
 
WriteMakefile(
   NAME          => 'App::Program',
   VERSION_FROM  => 'lib/App/Program.pm',
   ABSTRACT_FROM => 'lib/App/Program.pm',
   PREREQ_PM     => { ... },
   EXE_FILES     => [ 'bin/program.pl' ],
   AUTHOR       => 'Name E<lt>name[at]cpan.orgE<gt>',
   ...,
);

(App::...是这类东西的首选名称空间。)
然后,只需正常安装发行版。

perl Makefile.PL
make test
make install

这将把模块安装在由

perl -V:installsitescript

它应该已经在你的PATH中了。如果没有,添加它。

相关问题