true_atlantis has asked for the wisdom of the Perl Monks concerning the following question:

I have a directory structure created from h2xs which initially was just a file

x.pm

it has now expanded to a large number of modules, for example:

x::y (x/y.pm)

How do I force the h2xs directory structure to build those modules as well? Do I have to modify the makefile.pl? Thanks.

Replies are listed 'Best First'.
Re: Building a CPAN module
by Joost (Canon) on Dec 19, 2007 at 19:41 UTC
    IIRC if you don't have XS modules, you can move the whole module tree into a lib subdirectory of the distro tree with the full path you'd eventually want them to have (i.e. My::Module into lib/My/Module.pm) and your Makefile.PL should pick all of them up. You may need to adjust references to the main module in Makefile.PL when you do that:
    Makefile.PL lib/X.pm lib/X/Y.pm # etc ..
    Many modules on CPAN do this. Simple example: my Text::PSP module.

    If you do need XS code, the only way I've found to make that work is to put each XS additional module in its own subdirectory immediately below the main dir together with its own Makefile.PL (they'll be used automatically when you use the top-level Makefile.PL)

      a few problems i run into when doing that...

      1. After I install, I cannot use the modules:
      [red@dhcp201 ~]$ perl -e 'include x::y;' Can't locate object method "include" via package "x::y" (perhaps you f +orgot to load "x::y"?) at -e line 1. [red@dhcp201 ~]$ perl -e 'print(@INC);' /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/usr/lib/perl5/s +ite_perl/5.8.7/i386-linux-thread-multi/usr/lib/perl5/site_perl/5.8.6/ +i386-linux-thread-multi/usr/lib/perl5/site_perl/5.8.5/i386-linux-thre +ad-multi/usr/lib/perl5/site_perl/5.8.8/usr/lib/perl5/site_perl/5.8.7/ +usr/lib/perl5/site_perl/5.8.6/usr/lib/perl5/site_perl/5.8.5/usr/lib/p +erl5/site_perl/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-mult +i/usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi/usr/lib/per +l5/vendor_perl/5.8.6/i386-linux-thread-multi/usr/lib/perl5/vendor_per +l/5.8.5/i386-linux-thread-multi/usr/lib/perl5/vendor_perl/5.8.8/usr/l +ib/perl5/vendor_perl/5.8.7/usr/lib/perl5/vendor_perl/5.8.6/usr/lib/pe +rl5/vendor_perl/5.8.5/usr/lib/perl5/vendor_perl/usr/lib/perl5/5.8.8/i +386-linux-thread-multi/usr/lib/perl5/5.8.8.[red@dhcp201 ~]$ [red@dhcp201 ~]$ find /usr/lib/perl5/ -name y.pm /usr/lib/perl5/site_perl/5.8.8/x/y.pm


      2. I cannot use cpan2rpm to build an rpm. It will only contain the x.pm file, no subdirectories.
      atlantis@atlantis-laptop:~/workspace/x/lib/x$ cpan2rpm . -- cpan2rpm - Ver: 2.027 -- Signatures not set up Upgrade check * A newer version of this program is now available. To upgrade * enter the following command: /usr/local/bin/cpan2rpm --upgrade Fetch: HTTP -- module: /home/atlantis/workspace/x/lib/x -- Metadata retrieval Generating spec file SPEC: /home/atlantis/rpm//SPECS/x.spec Checking if your kit is complete... Looks good Writing Makefile for x cp lib/x/Appliance.pm blib/lib/x/Appliance.pm cp lib/x.pm blib/lib/x.pm AutoSplitting blib/lib/x.pm (blib/lib/auto/x) cp lib/x/Session/DP.pm blib/lib/x/Session/DP.pm cp lib/x/Session/Object.pm blib/lib/x/Session/Object.pm cp lib/x/Session/ScanConfiguration.pm blib/lib/x/Session/ScanConfigura +tion.pm cp lib/x/NetworkGroup.pm blib/lib/x/NetworkGroup.pm cp lib/x/Session/.Network.pm.swp blib/lib/x/Session/.Network.pm.swp cp lib/x/Audit.pm blib/lib/x/Audit.pm cp lib/x/Session/Network.pm blib/lib/x/Session/Network.pm cp lib/x/Session.pm blib/lib/x/Session.pm cp lib/x/Session/TEMPLATE.pm blib/lib/x/Session/TEMPLATE.pm cp lib/x/Session/ScanProfile.pm blib/lib/x/Session/ScanProfile.pm cp lib/x/TEMPLATE.pm blib/lib/x/TEMPLATE.pm cp lib/x/Session/Audit.pm blib/lib/x/Session/Audit.pm cp lib/x/Network.pm blib/lib/x/Network.pm cp lib/x/User.pm blib/lib/x/User.pm cp lib/x/DP.pm blib/lib/x/DP.pm cp lib/x/Object.pm blib/lib/x/Object.pm cp lib/x/ScanConfiguration.pm blib/lib/x/ScanConfiguration.pm cp lib/x/ScanProfile.pm blib/lib/x/ScanProfile.pm cp lib/x/Session/NetworkGroup.pm blib/lib/x/Session/NetworkGroup.pm cp lib/x/Session/ASPL.pm blib/lib/x/Session/ASPL.pm Manifying blib/man3/x.3pm rm -rf x-0.01 /usr/bin/perl "-MExtUtils::Manifest=manicopy,maniread" \ -e "manicopy(maniread(),'x-0.01', 'best');" mkdir x-0.01 mkdir x-0.01/lib mkdir x-0.01/t Generating META.yml tar cvf x-0.01.tar x-0.01 x-0.01/ x-0.01/t/ x-0.01/t/x.t x-0.01/README x-0.01/Changes x-0.01/Makefile.PL x-0.01/MANIFEST x-0.01/META.yml x-0.01/lib/ x-0.01/lib/x.pm rm -rf x-0.01 gzip --best x-0.01.tar RPM: /home/atlantis/rpm//RPMS/noarch/perl-x-0.01-1.noarch.rpm SRPM: /home/atlantis/rpm//SRPMS/perl-x-0.01-1.src.rpm -- Done -- atlantis@atlantis-laptop:~/workspace/x/lib/x$ rpm -qpl /home/atlantis/ +rpm/RPMS/noarch/perl-x-0.01-1.noarch.rpm /usr/local/man /usr/local/man/man3 /usr/local/man/man3/x.3pm /usr/local/share/perl/5.8.8/auto/x /usr/local/share/perl/5.8.8/auto/x/autosplit.ix /usr/local/share/perl/5.8.8/x.pm /usr/share/doc/perl-x-0.01 /usr/share/doc/perl-x-0.01/Changes /usr/share/doc/perl-x-0.01/README atlantis@atlantis-laptop:~/workspace/x/lib/x$ find lib lib/x.pm lib/x lib/x/y.pm