Search code examples
nixnixpkgs

nix-build nix-generate-from-cpan: expression does not evaluate to a derivation


I'm trying to use nix-generate-from-cspan to install sqitch

From nix-generate-from-cpan App::Sqitch DBD::Pg, I made this file:

{buildPerlModule, fetchurl}:
buildPerlModule rec {
    name = "App-Sqitch-0.9995";
    src = fetchurl {
        url = "mirror://cpan/authors/id/D/DW/DWHEELER/${name}.tar.gz";
        sha256 = "c29b4610ce43bd43ecfa39188f4cbb00b38c390136fcdd9984142efd99eba292";
    };
    buildInputs = [ CaptureTiny ModuleBuild TestDeep TestDir TestException TestFile TestFileContents TestMockModule TestNoWarnings ];
    propagatedBuildInputs = [ Clone ConfigGitLike DBI DateTime DateTimeTimeZone DevelStackTrace EncodeLocale FileHomeDir HashMerge IOPager IPCRun3 IPCSystemSimple ListMoreUtils Moo PathClass PerlIOutf8_strict StringFormatter StringShellQuote SubExporter TemplateTiny Throwable TryTiny TypeTiny URI URIdb libintlperl namespaceautoclean self."if" ];
    meta = {
        homepage = http://sqitch.org/;
        description = "Sane database change management";
        license = stdenv.lib.licenses.mit;
    };
}

but running nix-build -E 'with import <nixpkgs> { }; callPackage ./sqitch.nix' gives this error:

expression does not evaluate to a derivation (or a set or list of those)

To debug, I tried nix-instantiate --eval --expr 'with import <nixpkgs> { }; callPackage ./sqitch.nix' which gives:

<LAMBDA>

So I tried nix-build -E 'with import <nixpkgs> { }; callPackage callPackage ./sqitch.nix' but it still gives the same error, and nix-instantiate --eval --expr 'with import <nixpkgs> { }; callPackage callPackage ./sqitch.nix' gives:

{ __functor = <CODE>; override = <CODE>; overrideDerivation = <CODE>; }

which does not help me much.


Solution

  • Short answer

    the result of buildPerlModule is meant to be used as src in mkDerivation params.

    Long answer

    It turns out sqitch is already part of nixpkgs, and it is defined like this:

    https://github.com/NixOS/nixpkgs/blob/56904d7c423f2b13b37fbd29f39bbb4b52bc7824/pkgs/development/tools/misc/sqitch/default.nix

    { name, stdenv, perl, makeWrapper, sqitchModule, databaseModule }:
    
    stdenv.mkDerivation {
      name = "${name}-${sqitchModule.version}";
    
      buildInputs = [ perl makeWrapper sqitchModule databaseModule ];
    
      src = sqitchModule;
      dontBuild = true;
    
      installPhase = ''
        mkdir -p $out/bin
        for d in bin/sqitch etc lib share ; do
          ln -s ${sqitchModule}/$d $out/$d
        done
      '';
      dontStrip = true;
      postFixup = "wrapProgram $out/bin/sqitch --prefix PERL5LIB : $PERL5LIB";
    
      meta = {
        platforms = stdenv.lib.platforms.unix;
      };
    }
    

    https://github.com/NixOS/nixpkgs/blob/56904d7c423f2b13b37fbd29f39bbb4b52bc7824/pkgs/top-level/all-packages.nix#L10116-L10120

      sqitchPg = callPackage ../development/tools/misc/sqitch {
        name = "sqitch-pg";
        databaseModule = perlPackages.DBDPg;
        sqitchModule = perlPackages.AppSqitch;
      };
    

    https://github.com/NixOS/nixpkgs/blob/56904d7c423f2b13b37fbd29f39bbb4b52bc7824/pkgs/top-level/perl-packages.nix#L281-L305 (which is the output of nix-generate-from-cpan App::Sqitch)

     AppSqitch = buildPerlModule rec {
        version = "0.9994";
        name = "App-Sqitch-${version}";
        src = fetchurl {
          url = "mirror://cpan/authors/id/D/DW/DWHEELER/${name}.tar.gz";
          sha256 = "0in602z40s50fdlmws4g0a1pb8p7yn0wx8jgsacz26a4i1q7gpi4";
        };
        buildInputs = [
          CaptureTiny PathClass TestDeep TestDir TestException
          TestFile TestFileContents TestMockModule TestNoWarnings
        ];
        propagatedBuildInputs = [
          Clone ConfigGitLike DBI DateTime
          DevelStackTrace EncodeLocale FileHomeDir HashMerge IOPager IPCRun3
          IPCSystemSimple ListMoreUtils Moo PathClass PerlIOutf8_strict StringFormatter
          StringShellQuote SubExporter TemplateTiny Throwable TryTiny TypeTiny URI
          URIdb libintlperl namespaceautoclean
        ];
        doCheck = false;  # Can't find home directory.
        meta = {
          homepage = http://sqitch.org/;
          description = "Sane database change management";
          license = stdenv.lib.licenses.mit;
        };
      };
    

    https://github.com/NixOS/nixpkgs/blob/56904d7c423f2b13b37fbd29f39bbb4b52bc7824/pkgs/top-level/perl-packages.nix#L3555-L3558

      DBDPg = import ../development/perl-modules/DBD-Pg {
        inherit stdenv fetchurl buildPerlPackage DBI;
        inherit (pkgs) postgresql;
      };
    

    https://github.com/NixOS/nixpkgs/blob/56904d7c423f2b13b37fbd29f39bbb4b52bc7824/pkgs/development/perl-modules/DBD-Pg/default.nix (which looks like the output of nix-generate-from-cpan DBD::Pg, but not exactly)

    { stdenv, fetchurl, buildPerlPackage, DBI, postgresql }:
    
    buildPerlPackage rec {
      name = "DBD-Pg-3.5.3";
    
      src = fetchurl {
        url = "mirror://cpan/authors/id/T/TU/TURNSTEP/${name}.tar.gz";
        sha256 = "03m9w1cd0yyrbqwkwcl92j1cpmasmm69f3hwvcrlfsi5fnwsk63y";
      };
    
      buildInputs = [ postgresql ];
      propagatedBuildInputs = [ DBI ];
    
      makeMakerFlags = "POSTGRES_HOME=${postgresql}";
    
      meta = {
        homepage = http://search.cpan.org/dist/DBD-Pg/;
        description = "DBI PostgreSQL interface";
        license = with stdenv.lib.licenses; [ artistic1 gpl1Plus ];
        platforms = stdenv.lib.platforms.unix;
      };
    }
    

    So that's how it is meant to be used.

    NB : as I just noted in the comments of my question, I also forgot to add {} after my callPackages, which explains the weird types I was getting.