in reply to Building a CPAN module

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)

Replies are listed 'Best First'.
Re^2: Building a CPAN module
by true_atlantis (Acolyte) on Dec 19, 2007 at 20:01 UTC
    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
        mozletov!!
        i did mean use... trying to use too many programming languages at once. but, modifying the MANIFEST file to add all files does not do the trick. The RPM still contains only the files mentioned above... any other ideas?