From Fedora Project Wiki

m (1 revision(s))
(Redirected page to Perl/Tips)
 
Line 1: Line 1:
This page is intended to be a repository of "gotchas", and other little quick fixes, that aren't rare but are just uncommon enough that you forget how you did it last time:)  This page is NOT part of the official packaging guidelines.
#REDIRECT [[Perl/Tips]]
 
 
 
= Makefile.PL vs Build.PL =
 
Perl modules typically utilize one of two different buildsystems:
 
* Ext<code></code>Utils::Make<code></code>Maker
* Ext<code></code>Utils::Build
 
The two different styles are easily recognizable:  ::Make<code></code>Maker employs the Makefile.PL build file, and is the "classical" approach; ::Build is the (relative) new kid on the block, with support for things Make<code></code>Maker cannot do.  While the ultimate choice of which system to employ is clearly in the hands of upstream, if Build.PL is present in a distribution the packager should employ that build framework, unless there is an awfully good reason otherwise.
 
See also ["Perl/Build.PL VsMakefile.PL"] .
 
= Tests / build steps requiring network access =
 
This happens from time to time.  Some package's tests (or other steps, e.g. signature validation) require network access to return success, but their actual execution isn't essential to the proper building of the package.  In these cases, it's often nice to have a simple, transparent, clean way of enabling these steps on your local system (for, e.g., maximum testing), but to have them disabled when actually run through the buildsys/mock.
 
One easy way to do this is with the "--with" system of conditionals rpmbuild can handle.  Running, e.g., "rpmbuild --with network_tests foo.src.rpm" is analagous to including a "--define '_with_network_tests 1'" on the command line.  We can test for the existance of that conditional, and take (or not take!) certain actions based on it.
 
See, e.g., the ''perl-POE-Component-Client-HTTP'' spec file for an example.
 
One way to indicate this inside your spec is to prepend a notice along the lines of:
 
<pre>
#
#
</pre>
 
Then, at the point of the operation, e.g. "make test", that needs to be disabled silently under mock to enable the package build to succeed:
 
<pre>
%check
%{?!_with_network_tests:rm t/01* t/02* t/09* t/11* t/50* t/54*}
 
make test
</pre>
 
Now to execute local builds with the network bits enabled, either call rpmbuild with "--with network_tests" or add the line "%_with_network_tests 1" to your ~/.rpmmacros file.  Remember to test with _with_network_tests undefined before submitting to the buildsys, to check for syntax errors!
 
= rpmlint errors =
 
== script-without-shellbang ==
 
'''''Problem:'''''
 
Rpmlint returns something to the effect of:
 
<pre>
E: perl-WWW-Myspace script-without-shellbang /usr/lib/perl5/vendor_perl/5.8.8/WWW/Myspace/Comment.pm
E: perl-WWW-Myspace script-without-shellbang /usr/lib/perl5/vendor_perl/5.8.8/WWW/Myspace/MyBase.pm
E: perl-WWW-Myspace script-without-shellbang /usr/lib/perl5/vendor_perl/5.8.8/WWW/Myspace/FriendAdder.pm
</pre>
 
'''''Solution:'''''
 
This error is caused by the exec bit being set on one or more .pm files.  The solution is to strip the exec bit, for example, in the %install section:
 
<pre>
find %{buildroot} -type f -name '*.pm' -exec chmod -x {} 2>/dev/null ';'
</pre>
 
== file-not-utf8 ==
 
'''''Problem:'''''
 
<pre>
W: perl-Class-MakeMethods file-not-utf8 /usr/share/man/man3/Class::MakeMethods::Docs::ReadMe.3pm.gz
W: perl-Class-MakeMethods file-not-utf8 /usr/share/man/man3/Class::MakeMethods::Attribute.3pm.gz
</pre>
 
'''''Solution:'''''
 
Convert the errant file to UTF-8.  Assuming the codepage the file is currently under is ISO-8859-1, this will do the trick (typically in, e.g., %build):
 
<pre>
cd blib/man3
for i in Docs::ReadMe.3pm Attribute.3pm ; do
iconv --from=ISO-8859-1 --to=UTF-8 Class::MakeMethods::$i > new
mv new Class::MakeMethods::$i
done
</pre>

Latest revision as of 16:09, 3 November 2010

Redirect to: