Perl: Difference between revisions
imported>NieDzejkob describe wrapping PERL5LIB |
m Category:Perl added |
||
(12 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
==Running a Perl script== | == Running a Perl script == | ||
=== Replacing #! with nix-shell === | |||
Perl scripts normally start something like this: | |||
<code>./myscript.pl: bad interpreter: /usr/bin/perl: no such file or directory</ | <syntaxHighlight lang=shell> | ||
#!/usr/bin/env perl | |||
</syntaxHighlight> | |||
In Nix, we often make isolated environments using [https://nixos.org/manual/nix/unstable/command-ref/nix-shell.html nix-shell]. You can do this in the <code>#!</code> (shabang) section directly in the script too. Here is an example from the manual — a Perl script that specifies that it requires Perl and the HTML::TokeParser::Simple and LWP packages: | |||
<syntaxHighlight lang=perl> | |||
#! /usr/bin/env nix-shell | |||
#! nix-shell -i perl -p perl perlPackages.HTMLTokeParserSimple perlPackages.LWP | |||
use HTML::TokeParser::Simple; | |||
# Fetch nixos.org and print all hrefs. | |||
my $p = HTML::TokeParser::Simple->new(url => 'http://nixos.org/'); | |||
while (my $token = $p->get_tag("a")) { | |||
my $href = $token->get_attr("href"); | |||
print "$href\n" if $href; | |||
} | |||
</syntaxHighlight> | |||
=== Invoking nix-shell on command-line === | |||
If you run a perl script and encounter a dependency error like this: | |||
<syntaxHighlight lang=shell> | |||
Can't locate DB_File.pm in @INC (you may need to install the DB_File module) | |||
</syntaxHighlight > | |||
... use <code>nix-shell</code> to create a shell environment which includes the dependency. Here we searched NixOS packages and found an existing perl package which suits, [https://search.nixos.org/packages?channel=unstable&from=0&size=30&sort=relevance&type=packages&query=dbfile like so]. | |||
<syntaxHighlight lang=shell> | |||
nix-shell -p perl perl534Packages.DBFile --run ./myscript.pl | |||
</syntaxHighlight > | |||
=== There is no /usr/bin/perl === | |||
By design, there is no <code>/usr/bin/perl</code> in Nix. So you may encounter messages like: | |||
<syntaxHighlight lang=shell> | |||
./myscript.pl: bad interpreter: /usr/bin/perl: no such file or directory | |||
</syntaxHighlight> | |||
Change the first line of the script to | |||
<syntaxHighlight lang=shell> | |||
#!/usr/bin/env -S perl | |||
</syntaxHighlight> | |||
or start it with <code>perl ./myscript.pl</code> | |||
==Adding something from CPAN to nixpkgs== | ==Adding something from CPAN to nixpkgs== | ||
# Enter a <tt>nix-shell</tt> that provides the necessary dependencies: <syntaxHighlight lang=shell>nix-shell -p perl perlPackages.CPANPLUS perlPackages.GetoptLongDescriptive perlPackages.LogLog4perl perlPackages.Readonly</syntaxHighlight>. | |||
# Use the <tt>nix-generate-from-cpan.pl</tt> script (see <tt>nixpkgs/maintainers/scripts/</tt>) to generate something appropriate.<br/>Example usage: <syntaxHighlight lang=shell>nix-generate-from-cpan.pl Devel::REPL</syntaxHighlight> | |||
# After reviewing the result from the previous step and making appropriate modifications, add it to <code>pkgs/top-level/perl-packages.nix</code>. Note that some things use <code>buildPerlPackage</code> while some use <code>buildPerlModule</code>. Also note the mostly-followed naming convention as well as the mostly-followed alphabetical ordering. There are plenty of examples in <tt>perl-packages.nix</tt> — use the source, Luke! | |||
# Build and test. | |||
==Wrappers for installed programs== | ==Wrappers for installed programs== | ||
To make perl modules available to a program in your derivation: | To make perl modules available to a program in your derivation: | ||
# Add <code>makeWrapper</code> to <code>nativeBuildInputs</code> | |||
# Add <syntaxhighlight lang="nix"> | |||
postFixup = '' | |||
wrapProgram $out/bin/something \ | |||
--prefix PERL5LIB : "${with perlPackages; makePerlPath [ something ]}" | |||
''; | |||
</syntaxhighlight> | |||
Also keep in mind that <code>makePerlPath</code> would not resolve transitive dependencies of Perl packages. Hence if you want to just reference top-level packages, then use <code>makeFullPerlPath</code> which would recursively resolve dependency graph for you. | |||
== See also == | |||
* [https://nixos.org/manual/nixpkgs/stable/#sec-language-perl Nixpkgs Manual - Perl section] | |||
* [https://blog.stigok.com/2020/04/16/building-a-custom-perl-package-for-nixos.html Overriding an existing Perl package in NixOS] | |||
[[Category:Languages]] | [[Category:Languages]] | ||
[[Category:Perl]] |