Home Explore Blog Models CI



nixpkgs

1st chunk of `doc/languages-frameworks/perl.section.md`
5eaddf1c2ae84cc37e292d1bdcf652560090ff0b1d0021890000000100000fe2
# Perl {#sec-language-perl}

## Running Perl programs on the shell {#ssec-perl-running}

When executing a Perl script, it is possible you get an error such as `./myscript.pl: bad interpreter: /usr/bin/perl: no such file or directory`. This happens when the script expects Perl to be installed at `/usr/bin/perl`, which is not the case when using Perl from nixpkgs. You can fix the script by changing the first line to:

```perl
#!/usr/bin/env perl
```

to take the Perl installation from the `PATH` environment variable, or invoke Perl directly with:

```ShellSession
$ perl ./myscript.pl
```

When the script is using a Perl library that is not installed globally, you might get an error such as `Can't locate DB_File.pm in @INC (you may need to install the DB_File module)`. In that case, you can use `nix-shell` to start an ad-hoc shell with that library installed, for instance:

```ShellSession
$ nix-shell -p perl perlPackages.DBFile --run ./myscript.pl
```

If you are always using the script in places where `nix-shell` is available, you can embed the `nix-shell` invocation in the shebang like this:

```perl
#!/usr/bin/env nix-shell
#! nix-shell -i perl -p perl perlPackages.DBFile
```

## Packaging Perl programs {#ssec-perl-packaging}

Nixpkgs provides a function `buildPerlPackage`, a generic package builder function for any Perl package that has a standard `Makefile.PL`. It’s implemented in [pkgs/development/perl-modules/generic](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/perl-modules/generic).

Perl packages from CPAN are defined in [pkgs/top-level/perl-packages.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/perl-packages.nix) rather than `pkgs/all-packages.nix`. Most Perl packages are so straight-forward to build that they are defined here directly, rather than having a separate function for each package called from `perl-packages.nix`. However, more complicated packages should be put in a separate file, typically in `pkgs/development/perl-modules`. Here is an example of the former:

```nix
{
  ClassC3 = buildPerlPackage rec {
    pname = "Class-C3";
    version = "0.21";
    src = fetchurl {
      url = "mirror://cpan/authors/id/F/FL/FLORA/Class-C3-${version}.tar.gz";
      hash = "sha256-/5GE5xHT0uYGOQxroqj6LMU7CtKn2s6vMVoSXxL4iK4=";
    };
  };
}
```

Note the use of `mirror://cpan/`, and the `pname` and `version` in the URL definition to ensure that the `pname` attribute is consistent with the source that we’re actually downloading. Perl packages are made available in `all-packages.nix` through the variable `perlPackages`. For instance, if you have a package that needs `ClassC3`, you would typically write

```nix
{
  foo = import ../path/to/foo.nix {
    inherit
      stdenv
      fetchurl # ...
      ;
    inherit (perlPackages) ClassC3;
  };
}
```

in `all-packages.nix`. You can test building a Perl package as follows:

```ShellSession
$ nix-build -A perlPackages.ClassC3
```

To install it with `nix-env` instead: `nix-env -f. -iA perlPackages.ClassC3`.

So what does `buildPerlPackage` do? It does the following:

1. In the configure phase, it calls `perl Makefile.PL` to generate a Makefile. You can set the variable `makeMakerFlags` to pass flags to `Makefile.PL`
2. It adds the contents of the `PERL5LIB` environment variable to `#! .../bin/perl` line of Perl scripts as `-Idir` flags. This ensures that a script can find its dependencies. (This can cause this shebang line to become too long for Darwin to handle; see the note below.)
3. In the fixup phase, it writes the propagated build inputs (`propagatedBuildInputs`) to the file `$out/nix-support/propagated-user-env-packages`. `nix-env` recursively installs all packages listed in this file when you install a package that has it. This ensures that a Perl package can find its dependencies.

`buildPerlPackage` is built on top of `stdenv`, so everything can be customised in the usual way. For instance, the `BerkeleyDB` module has a `preConfigure` hook to generate a configuration file used by `Makefile.PL`:

Title: Perl on Nixpkgs: Running and Packaging
Summary
This section details how to run and package Perl programs within the Nixpkgs environment. It addresses common issues when running Perl scripts, such as 'bad interpreter' errors (suggesting `#!/usr/bin/env perl` or direct invocation) and missing libraries, which can be resolved using `nix-shell` for ad-hoc environments or by embedding `nix-shell` in the shebang. For packaging, it introduces `buildPerlPackage`, a generic function for Perl packages with `Makefile.PL`, explaining its location, usage with CPAN mirrors, and how to define and make packages available. The summary also outlines the steps `buildPerlPackage` performs, including configuring with `perl Makefile.PL`, handling `PERL5LIB`, and managing `propagatedBuildInputs` for dependencies, all while being customizable via `stdenv`.