about summary refs log tree commit diff
path: root/nixpkgs/pkgs/by-name/fr/frankenphp/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/by-name/fr/frankenphp/package.nix')
-rw-r--r--nixpkgs/pkgs/by-name/fr/frankenphp/package.nix107
1 files changed, 107 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/by-name/fr/frankenphp/package.nix b/nixpkgs/pkgs/by-name/fr/frankenphp/package.nix
new file mode 100644
index 000000000000..423a1dd1f2e5
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/fr/frankenphp/package.nix
@@ -0,0 +1,107 @@
+{ lib
+, stdenv
+, buildGoModule
+, fetchFromGitHub
+, php
+, brotli
+, testers
+, frankenphp
+, darwin
+, pkg-config
+, makeBinaryWrapper
+, runCommand
+, writeText
+}:
+
+let
+  phpEmbedWithZts = php.override {
+    embedSupport = true;
+    ztsSupport = true;
+    staticSupport = stdenv.isDarwin;
+    zendSignalsSupport = false;
+    zendMaxExecutionTimersSupport = stdenv.isLinux;
+  };
+  phpUnwrapped = phpEmbedWithZts.unwrapped;
+  phpConfig = "${phpUnwrapped.dev}/bin/php-config";
+  pieBuild = stdenv.hostPlatform.isMusl;
+in buildGoModule rec {
+  pname = "frankenphp";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "dunglas";
+    repo = "frankenphp";
+    rev = "v${version}";
+    hash = "sha256-tQ35GZuw7Ag1YfmOUarVY45yk4yugNLJetEV4m2w3GE=";
+  };
+
+  sourceRoot = "source/caddy";
+
+  # frankenphp requires C code that would be removed with `go mod tidy`
+  # https://github.com/golang/go/issues/26366
+  proxyVendor = true;
+  vendorHash = "sha256-sv3IcNj1rjolgF0HZZnJ3dLV9+QeRw3ItRguz6Un9CY=";
+
+  buildInputs = [ phpUnwrapped brotli ] ++ phpUnwrapped.buildInputs;
+  nativeBuildInputs = [ makeBinaryWrapper ] ++ lib.optionals stdenv.isDarwin [ pkg-config darwin.cctools darwin.autoSignDarwinBinariesHook ];
+
+  subPackages = [ "frankenphp" ];
+
+  tags = [ "cgo" "netgo" "ousergo" "static_build" ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${version} PHP ${phpUnwrapped.version} Caddy'"
+    # pie mode is only available with pkgsMusl, it also automaticaly add -buildmode=pie to $GOFLAGS
+  ]  ++ (lib.optional pieBuild [ "-static-pie" ]);
+
+  preBuild = ''
+    export CGO_CFLAGS="$(${phpConfig} --includes)"
+    export CGO_LDFLAGS="-DFRANKENPHP_VERSION=${version} \
+      $(${phpConfig} --ldflags) \
+      $(${phpConfig} --libs)"
+  '' + lib.optionalString stdenv.isDarwin ''
+    # replace hard-code homebrew path
+    substituteInPlace ../frankenphp.go \
+      --replace "-L/opt/homebrew/opt/libiconv/lib" "-L${darwin.libiconv}/lib"
+  '';
+
+  preFixup = ''
+    mkdir -p $out/lib
+    ln -s "${phpEmbedWithZts}/lib/php.ini" "$out/lib/frankenphp.ini"
+
+    wrapProgram $out/bin/frankenphp --set-default PHP_INI_SCAN_DIR $out/lib
+  '';
+
+  doCheck = false;
+
+  passthru = {
+    php = phpEmbedWithZts;
+    tests = {
+      # TODO: real NixOS test with Symfony application
+      version = testers.testVersion {
+        inherit version;
+        package = frankenphp;
+        command = "frankenphp version";
+      };
+      phpinfo = runCommand "php-cli-phpinfo" {
+        phpScript = writeText "phpinfo.php" ''
+          <?php phpinfo();
+        '';
+      } ''
+        ${lib.getExe frankenphp} php-cli $phpScript > $out
+      '';
+    };
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/dunglas/frankenphp/releases/tag/v${version}";
+    description = "The modern PHP app server";
+    homepage = "https://github.com/dunglas/frankenphp";
+    license = licenses.mit;
+    mainProgram = "frankenphp";
+    maintainers = with maintainers; [ gaelreyrol shyim ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}