How to: PHP extension with Nix
Was working on porting most of our docker images at work to building them using nix [check this for more info] and found one of our older images in need of some love.
As it happens it contained ext-dbase, a php extension that has no package in nixpkgs. Dbase is such an old and odd little thing, it is a sort of Excel file combined with some sqlite abilities. Something that came from another era entirely.
Since it is that old I see no reason for me to add it to nixpkgs so how would I go to build it just for me?
Surprinsingly, Nix loves php. So it is pretty straight forward if the darn thing is in PECL. I wanted to share this in case some other bloke looking for a dbase fix stumbles upon this somehow:
# php.nix
{ pkgs ? import <nixpkgs> { }, php}:
with pkgs;
let
  dbase = php.buildPecl
    rec {
      pname = "dbase";
      version = "7.1.1";
      src = fetchFromGitHub {
        owner = "php";
        repo = "pecl-database-dbase";
        rev = "ba33dfe16f13c2093d19f93deb316390151aa729";
        sha256 = "djtRnx5rFGkRzs/Jai8m5zCBkJtHk1xZmJ0fra7EXeY=";
      };
      buildInputs = [ libuv ];
      meta = with lib; {
        description = "Interface to dbase for php";
        license = licenses.php301;
        homepage = "https://github.com/php/pecl-database-dbase";
        maintainers = teams.php.members;
        platforms = platforms.linux;
      };
    };
in
php.buildEnv {
  extensions = ({ enabled, all }: enabled ++ (with all; [
    dbase
  ]));
}
Then, instead of the php package you normally use, use the above to create a derivation based on the php version you want with your extension enabled:
... 
php82WithDbase = import ./php.nix { php = pkgs.php82; };
...That's it! Very simple.
