From ee3810a1c98a5118998287f0dea4be410a079f05 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABl=20Reyrol?= <me@gaelreyrol.dev>
Date: Sat, 18 Nov 2023 17:06:29 +0100
Subject: [PATCH] frankenphp: init at 1.0.0-rc3

---
 pkgs/by-name/fr/frankenphp/package.nix | 88 ++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100644 pkgs/by-name/fr/frankenphp/package.nix

diff --git a/pkgs/by-name/fr/frankenphp/package.nix b/pkgs/by-name/fr/frankenphp/package.nix
new file mode 100644
index 0000000000000..ffe66b30279a4
--- /dev/null
+++ b/pkgs/by-name/fr/frankenphp/package.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, buildGoModule
+, fetchFromGitHub
+, php
+, testers
+, frankenphp
+, runCommand
+, writeText
+}:
+
+let
+  phpEmbedWithZts = php.override {
+    embedSupport = true;
+    ztsSupport = true;
+  };
+  phpUnwrapped = phpEmbedWithZts.unwrapped;
+  phpConfig = "${phpUnwrapped.dev}/bin/php-config";
+  pieBuild = stdenv.hostPlatform.isMusl;
+in buildGoModule rec {
+  pname = "frankenphp";
+  version = "1.0.0-rc.3";
+
+  src = fetchFromGitHub {
+    owner = "dunglas";
+    repo = "frankenphp";
+    rev = "v${version}";
+    hash = "sha256-Al0gCxTb6s41ugX9J8N8lshop9kP3RPGCzlq5etk1RY=";
+  };
+
+  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-Lgj/pFtSQIgjrycajJ1zNY3ytvArmuk0E3IjsAzsNdM=";
+
+  buildInputs = [ phpUnwrapped ] ++ phpUnwrapped.buildInputs;
+
+  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) \
+      -Wl,--start-group $(${phpConfig} --libs) -Wl,--end-group"
+  '';
+
+  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 ];
+    platforms = platforms.linux;
+  };
+}