nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 buildGoModule,
5 fetchFromGitHub,
6 php,
7 brotli,
8 watcher,
9 testers,
10 frankenphp,
11 cctools,
12 darwin,
13 libiconv,
14 pkg-config,
15 makeBinaryWrapper,
16 runCommand,
17 writeText,
18}:
19
20let
21 phpEmbedWithZts = php.override {
22 embedSupport = true;
23 ztsSupport = true;
24 staticSupport = stdenv.hostPlatform.isDarwin;
25 zendSignalsSupport = false;
26 zendMaxExecutionTimersSupport = stdenv.hostPlatform.isLinux;
27 };
28 phpUnwrapped = phpEmbedWithZts.unwrapped;
29 phpConfig = "${phpUnwrapped.dev}/bin/php-config";
30 pieBuild = stdenv.hostPlatform.isMusl;
31in
32buildGoModule rec {
33 pname = "frankenphp";
34 version = "1.9.1";
35
36 src = fetchFromGitHub {
37 owner = "dunglas";
38 repo = "frankenphp";
39 tag = "v${version}";
40 hash = "sha256-zkB/kN6noCkUyUsXAbaWeRq1fpNErTcZPzDRoRp+LtM=";
41 };
42
43 sourceRoot = "${src.name}/caddy";
44
45 # frankenphp requires C code that would be removed with `go mod tidy`
46 # https://github.com/golang/go/issues/26366
47 proxyVendor = true;
48 vendorHash = "sha256-scL015vSSfhuK06UZFRxK0Sk9dG6W3AOuFSPTogTCfI=";
49
50 buildInputs = [
51 phpUnwrapped
52 brotli
53 watcher
54 ]
55 ++ phpUnwrapped.buildInputs;
56 nativeBuildInputs = [
57 makeBinaryWrapper
58 ]
59 ++ lib.optionals stdenv.hostPlatform.isDarwin [
60 pkg-config
61 cctools
62 darwin.autoSignDarwinBinariesHook
63 ];
64
65 subPackages = [ "frankenphp" ];
66
67 tags = [
68 "cgo"
69 "netgo"
70 "ousergo"
71 "static_build"
72 "nobadger"
73 "nomysql"
74 "nopgx"
75 ];
76
77 ldflags = [
78 "-s"
79 "-w"
80 "-X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${version} PHP ${phpUnwrapped.version} Caddy'"
81 # pie mode is only available with pkgsMusl, it also automatically add -buildmode=pie to $GOFLAGS
82 ]
83 ++ (lib.optional pieBuild [ "-static-pie" ]);
84
85 preBuild = ''
86 export CGO_CFLAGS="$(${phpConfig} --includes)"
87 export CGO_LDFLAGS="-DFRANKENPHP_VERSION=${version} \
88 $(${phpConfig} --ldflags) \
89 $(${phpConfig} --libs)"
90 ''
91 + lib.optionalString stdenv.hostPlatform.isDarwin ''
92 # replace hard-code homebrew path
93 substituteInPlace ../frankenphp.go \
94 --replace "-L/opt/homebrew/opt/libiconv/lib" "-L${libiconv}/lib"
95 '';
96
97 preFixup = ''
98 mkdir -p $out/lib
99 ln -s "${phpEmbedWithZts}/lib/php.ini" "$out/lib/frankenphp.ini"
100
101 wrapProgram $out/bin/frankenphp --set-default PHP_INI_SCAN_DIR $out/lib
102 '';
103
104 doCheck = false;
105
106 passthru = {
107 php = phpEmbedWithZts;
108 tests = {
109 # TODO: real NixOS test with Symfony application
110 version = testers.testVersion {
111 inherit version;
112 package = frankenphp;
113 command = "frankenphp version";
114 };
115 phpinfo =
116 runCommand "php-cli-phpinfo"
117 {
118 phpScript = writeText "phpinfo.php" ''
119 <?php phpinfo();
120 '';
121 }
122 ''
123 ${lib.getExe frankenphp} php-cli $phpScript > $out
124 '';
125 };
126 };
127
128 meta = {
129 changelog = "https://github.com/dunglas/frankenphp/releases/tag/v${version}";
130 description = "Modern PHP app server";
131 homepage = "https://github.com/dunglas/frankenphp";
132 license = lib.licenses.mit;
133 mainProgram = "frankenphp";
134 maintainers = [ ];
135 platforms = lib.platforms.linux ++ lib.platforms.darwin;
136 };
137}