narsil: bbc8fc5efd779ec885045f9b8d903d0df1bec1b2 -> f5ec6bd6b8013f2a2b74fc45b6f4c5374...
[NixPkgs.git] / pkgs / by-name / uw / uwsgi / package.nix
blob2bd995ad5a4aeabf339b43c2c14260390324fef3
2   stdenv,
3   nixosTests,
4   lib,
5   pkg-config,
6   jansson,
7   pcre,
8   libxcrypt,
9   expat,
10   zlib,
11   # plugins: list of strings, eg. [ "python2" "python3" ]
12   plugins ? [ ],
13   pam,
14   withPAM ? stdenv.hostPlatform.isLinux,
15   systemd,
16   withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd,
17   libcap,
18   withCap ? stdenv.hostPlatform.isLinux,
19   python2,
20   python3,
21   ncurses,
22   ruby,
23   php,
24   makeWrapper,
25   fetchFromGitHub,
28 let
29   php-embed = php.override {
30     embedSupport = true;
31     apxs2Support = false;
32   };
34   pythonPlugin =
35     pkg:
36     lib.nameValuePair "python${if pkg.isPy2 then "2" else "3"}" {
37       interpreter = pkg.pythonOnBuildForHost.interpreter;
38       path = "plugins/python";
39       inputs = [
40         pkg
41         ncurses
42       ];
43       install = ''
44         install -Dm644 uwsgidecorators.py $out/${pkg.sitePackages}/uwsgidecorators.py
45         ${pkg.pythonOnBuildForHost.executable} -m compileall $out/${pkg.sitePackages}/
46         ${pkg.pythonOnBuildForHost.executable} -O -m compileall $out/${pkg.sitePackages}/
47       '';
48     };
50   available = lib.listToAttrs [
51     (pythonPlugin python2)
52     (pythonPlugin python3)
53     (lib.nameValuePair "rack" {
54       path = "plugins/rack";
55       inputs = [ ruby ];
56     })
57     (lib.nameValuePair "cgi" {
58       # usage: https://uwsgi-docs.readthedocs.io/en/latest/CGI.html?highlight=cgi
59       path = "plugins/cgi";
60       inputs = [ ];
61     })
62     (lib.nameValuePair "php" {
63       # usage: https://uwsgi-docs.readthedocs.io/en/latest/PHP.html#running-php-apps-with-nginx
64       path = "plugins/php";
65       inputs = [
66         php-embed
67         php-embed.extensions.session
68         php-embed.extensions.session.dev
69         php-embed.unwrapped.dev
70       ] ++ php-embed.unwrapped.buildInputs;
71     })
72   ];
74   getPlugin =
75     name:
76     let
77       all = lib.concatStringsSep ", " (lib.attrNames available);
78     in
79     if lib.hasAttr name available then
80       lib.getAttr name available // { inherit name; }
81     else
82       throw "Unknown UWSGI plugin ${name}, available : ${all}";
84   needed = builtins.map getPlugin plugins;
87 stdenv.mkDerivation (finalAttrs: {
88   pname = "uwsgi";
89   version = "2.0.28";
91   src = fetchFromGitHub {
92     owner = "unbit";
93     repo = "uwsgi";
94     rev = finalAttrs.version;
95     hash = "sha256-/7Z9lq7JiGBrTpmtbIEqpMg7nw9SVm8ypmzd1/p6xgU=";
96   };
98   patches = [
99     ./no-ext-session-php_session.h-on-NixOS.patch
100     ./additional-php-ldflags.patch
101   ];
103   nativeBuildInputs = [
104     makeWrapper
105     pkg-config
106     python3
107   ];
109   buildInputs =
110     [
111       jansson
112       pcre
113       libxcrypt
114     ]
115     ++ lib.optionals (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) [
116       expat
117       zlib
118     ]
119     ++ lib.optional withPAM pam
120     ++ lib.optional withSystemd systemd
121     ++ lib.optional withCap libcap
122     ++ lib.concatMap (x: x.inputs) needed;
124   basePlugins = lib.concatStringsSep "," (
125     lib.optional withPAM "pam" ++ lib.optional withSystemd "systemd_logger"
126   );
128   UWSGI_INCLUDES = lib.optionalString withCap "${libcap.dev}/include";
130   passthru = {
131     inherit python2 python3;
132     tests.uwsgi = nixosTests.uwsgi;
133   };
135   postPatch = ''
136     for f in uwsgiconfig.py plugins/*/uwsgiplugin.py; do
137       substituteInPlace "$f" \
138         --replace pkg-config "$PKG_CONFIG"
139     done
140     sed -e "s/ + php_version//" -i plugins/php/uwsgiplugin.py
141   '';
143   configurePhase = ''
144     runHook preConfigure
146     export pluginDir=$out/lib/uwsgi
147     substituteAll ${./nixos.ini} buildconf/nixos.ini
149     runHook postConfigure
150   '';
152   # this is a hack to make the php plugin link with session.so (which on nixos is a separate package)
153   # the hack works in coordination with ./additional-php-ldflags.patch
154   UWSGICONFIG_PHP_LDFLAGS = lib.optionalString (builtins.any (x: x.name == "php") needed) (
155     lib.concatStringsSep "," [
156       "-Wl"
157       "-rpath=${php-embed.extensions.session}/lib/php/extensions/"
158       "--library-path=${php-embed.extensions.session}/lib/php/extensions/"
159       "-l:session.so"
160     ]
161   );
163   buildPhase = ''
164     runHook preBuild
166     mkdir -p $pluginDir
167     python3 uwsgiconfig.py --build nixos
168     ${lib.concatMapStringsSep ";" (
169       x:
170       "${x.preBuild or ""}\n ${x.interpreter or "python3"} uwsgiconfig.py --plugin ${x.path} nixos ${x.name}"
171     ) needed}
173     runHook postBuild
174   '';
176   installPhase = ''
177     runHook preInstall
179     install -Dm755 uwsgi $out/bin/uwsgi
180     ${lib.concatMapStringsSep "\n" (x: x.install or "") needed}
182     runHook postInstall
183   '';
185   postFixup = lib.optionalString (builtins.any (x: x.name == "php") needed) ''
186     wrapProgram $out/bin/uwsgi --set PHP_INI_SCAN_DIR ${php-embed}/lib
187   '';
189   meta = {
190     description = "Fast, self-healing and developer/sysadmin-friendly application container server coded in pure C";
191     homepage = "https://uwsgi-docs.readthedocs.org/en/latest/";
192     license = lib.licenses.gpl2Plus;
193     maintainers = with lib.maintainers; [
194       abbradar
195       schneefux
196       globin
197     ];
198     platforms = lib.platforms.unix;
199     mainProgram = "uwsgi";
200   };