Skip to content

Commit

Permalink
work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Jun 29, 2023
1 parent 0f19cbc commit 10fe445
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 236 deletions.
157 changes: 66 additions & 91 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,108 +3,83 @@

inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-phps.url = "github:fossar/nix-phps";
nix-phps.url = "/home/pol/Code/fossar/nix-phps";
};

outputs = inputs @ {
self,
flake-parts,
...
}:
flake-parts.lib.mkFlake {inherit inputs;} {
systems = [
"x86_64-linux"
"x86_64-darwin"
"aarch64-linux"
"aarch64-darwin"
];
outputs = inputs @ { self, flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];

imports = [
inputs.flake-parts.flakeModules.easyOverlay
./src/composer.nix
./src/phps.nix
];

perSystem = {
config,
pkgs,
system,
...
}: let
defaultPhpVersion = "php81";
makePhp = self.api.makePhp system;
envPackages = [
pkgs.symfony-cli
pkgs.gh
pkgs.sqlite
pkgs.git
pkgs.gnumake
];
perSystem = { config, pkgs, system, ... }:
let
phps = [ "php56" "php70" "php71" "php72" "php73" "php74" "php80" "php81" "php82" "php83" ];

packages =
builtins.foldl' (
carry: phpConfig: let
pname = phpConfig.php;
env-pname = "env-${pname}";
php = makePhp phpConfig;
in
carry
// {
"${pname}" = php;
"${env-pname}" = pkgs.buildEnv {
name = pname;
paths =
[
php
php.packages.composer
]
++ envPackages;
};
}
) {
default = packages."${defaultPhpVersion}";
env-default = packages."env-${defaultPhpVersion}";
}
self.api.matrix;
envPackages = [
pkgs.symfony-cli
pkgs.gh
pkgs.sqlite
pkgs.git
pkgs.gnumake
];

devShells =
builtins.foldl' (
carry: phpConfig: let
pname = phpConfig.php;
env-pname = "env-${pname}";
php = makePhp phpConfig;
in
carry
// {
"${pname}" = pkgs.mkShellNoCC {
name = pname;
buildInputs = [php];
};
"${env-pname}" = pkgs.mkShellNoCC {
name = env-pname;
buildInputs =
[
php
php.packages.composer
]
++ envPackages;
};
}
) {
default = devShells."${defaultPhpVersion}";
env-default = devShells."env-${defaultPhpVersion}";
}
self.api.matrix;
in {
inherit devShells packages;
packages = builtins.foldl'
(
carry: php:
let
# TODO: How to pass `pkgs` instead of `system` from here?
phpDrv = self.api.makePhp system { php = "${php}"; };
in
carry
// {
"${php}" = pkgs.buildEnv { name = "${php}"; paths = [ phpDrv phpDrv.packages.composer ]; };
"env-${php}" = pkgs.buildEnv { name = "env-${php}"; paths = [ phpDrv phpDrv.packages.composer ] ++ envPackages; };
}
)
{
"default" = self.packages."${system}".env-php81;
"env-default" = self.packages."${system}".env-php81;
}
phps;

# TODO: Find a better way to do this.
_module.args.pkgs = import inputs.nixpkgs {
inherit system;
overlays = [inputs.nix-phps.overlays.default];
config.allowUnfree = true;
};
devShells = builtins.foldl'
(
carry: php:
let
# TODO: How to pass `pkgs` instead of `system` from here?
phpDrv = self.api.makePhp system { php = "${php}"; };
in
carry
// {
"${php}" = pkgs.mkShellNoCC { name = "${php}"; buildInputs = [ phpDrv phpDrv.packages.composer ]; };
"env-${php}" = pkgs.mkShellNoCC { name = "env-${php}"; buildInputs = [ phpDrv phpDrv.packages.composer ] ++ envPackages; };
}
)
{
"default" = self.devShells."${system}".env-php81;
"env-default" = self.devShells."${system}".env-php81;
}
phps;
in
{
# TODO: Find a better way to do this.
_module.args.pkgs = import self.inputs.nixpkgs {
inherit system;
overlays = [
inputs.nix-phps.overlays.default
self.overlays.default
];
config.allowUnfree = true;
};

formatter = pkgs.alejandra;
};
overlayAttrs = packages;

inherit packages devShells;
};
};
}
207 changes: 62 additions & 145 deletions src/phps.nix
Original file line number Diff line number Diff line change
@@ -1,130 +1,60 @@
{
self,
inputs,
lib,
...
}: let
matrix = let
extensions = [
"bcmath"
"calendar"
"ctype"
"curl"
"dom"
"exif"
"fileinfo"
"filter"
"gd"
"gettext"
"gmp"
"iconv"
"intl"
"mbstring"
"mysqli"
"mysqlnd"
"opcache"
"openssl"
"pdo"
"pdo_mysql"
"pdo_odbc"
"pdo_pgsql"
"pdo_sqlite"
"pgsql"
"posix"
"readline"
"session"
"simplexml"
"sockets"
"soap"
"sodium"
"sqlite3"
"sysvsem"
"tokenizer"
"xmlreader"
"xmlwriter"
"zip"
"zlib"
];
in [
{
extensions = extensions ++ ["json"];
withoutExtensions = ["sodium" "pcov"];
php = "php56";
}
{
extensions = extensions ++ ["json"];
withoutExtensions = ["sodium"];
php = "php70";
}
{
extensions = extensions ++ ["json"];
withoutExtensions = ["sodium"];
php = "php71";
}
{
extensions = extensions ++ ["json"];
withoutExtensions = [];
php = "php72";
}
{
extensions = extensions ++ ["json"];
withoutExtensions = [];
php = "php73";
}
{
extensions = extensions ++ ["json"];
withoutExtensions = [];
php = "php74";
}
{
inherit extensions;
php = "php80";
}
{
inherit extensions;
php = "php81";
}
{
inherit extensions;
php = "php82";
}
{
inherit extensions;
php = "php83";
}
];
{ self
, inputs
, ...
}:
let
makePhp = system:
let
pkgs = import inputs.nixpkgs {
inherit system;
overlays = [
self.inputs.nix-phps.overlays.default
];
config.allowUnfree = true;
};
in
{ php
, extensions ? [ ]
, withExtensions ? [ ]
, withoutExtensions ? [ ]
, extraConfig ? ""
, extraConfigFile ? "${builtins.getEnv "PWD"}/.user.ini"
, flags ? { }
}:
let
# Normalize the php parameter(string or drv) into a derivation.
phpDrv = if builtins.isString php then pkgs."${php}" else php;

buildExtensions =
{ all
, enabled
, withExtensions ? [ ]
, withoutExtensions ? [ ]
, composerExtensions ? [ ]
}:
let
# Normalize a list of extensions (string or drv) to a list of drv.
normalizeExtensions = extList: map
(ext: if builtins.isString ext then all."${ext}" else ext)
(
builtins.filter
(ext: if builtins.isString ext then all ? "${ext}" else true)
extList
);

makePhp = system: let
# See if we can do this in a better way.
pkgsWithNixPhps = import inputs.nixpkgs {
overlays = [inputs.nix-phps.overlays.default];
inherit system;
config.allowUnfree = true;
};
in
{
php,
extensions ? [],
withExtensions ? [],
withoutExtensions ? [],
extraConfig ? "",
extraConfigFile ? "${builtins.getEnv "PWD"}/.user.ini",
flags ? {},
}: let
composerExtensions =
self.composer.getExtensionFromSection "require"
++ self.composer.getExtensionFromSection "require-dev";
# Step 1: Convert user extensions to add into derivation if possible
userExtensionAsDrvToAdd = normalizeExtensions (withExtensions ++ composerExtensions);

withExtensionsFiltered =
# Step 2: Convert user extensions to remove into derivation if possible
userExtensionsAsDrvToRemove = normalizeExtensions (withoutExtensions);
in
# Step 3: Remove extensions from enabled extensions
builtins.filter
(x: !builtins.elem x withoutExtensions)
(lib.unique extensions ++ withExtensions ++ composerExtensions);
(ext: !builtins.elem ext.pname (map (e: e.pname) userExtensionsAsDrvToRemove))
(enabled ++ userExtensionAsDrvToAdd);

phpDrv =
if builtins.isString php
then pkgsWithNixPhps."${php}"
else php;
in ((phpDrv.override flags).buildEnv {
in
((phpDrv.override flags).buildEnv {
extraConfig =
extraConfig
+ "\n"
Expand All @@ -134,30 +64,17 @@
else ""
);

extensions = {all, ...}: (
# We remove "null" extensions (like json for php >= 8)
# See: https://github.com/fossar/nix-phps/pull/122
builtins.filter
(ext: ext != null)
(
map
(ext:
if builtins.isString ext
then all."${ext}"
else ext)
(
builtins.filter
(ext:
if builtins.isString ext
then all ? "${ext}"
else ext)
withExtensionsFiltered
)
)
extensions = php@{ all, enabled, ... }: (
(buildExtensions {
inherit (php) all enabled;
inherit withExtensions withoutExtensions;
composerExtensions = self.composer.getExtensionFromSection "require" ++ self.composer.getExtensionFromSection "require-dev";
})
);
});
in {
in
{
flake.api = {
inherit makePhp matrix;
inherit makePhp;
};
}

0 comments on commit 10fe445

Please sign in to comment.