Merge pull request #330634 from r-ryantm/auto-update/circumflex
[NixPkgs.git] / pkgs / servers / uwsgi / default.nix
blob1f874236fbd6b5191eaa1bd090aedd1b505e9841
1 { stdenv
2 , nixosTests
3 , lib
4 , pkg-config
5 , jansson
6 , pcre
7 , libxcrypt
8 , expat
9 , zlib
10 # plugins: list of strings, eg. [ "python2" "python3" ]
11 , plugins ? []
12 , pam, withPAM ? stdenv.isLinux
13 , systemd, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
14 , libcap, withCap ? stdenv.isLinux
15 , python2, python3, ncurses
16 , ruby, php
17 , makeWrapper, fetchFromGitHub
20 let
21   php-embed = php.override {
22     embedSupport = true;
23     apxs2Support = false;
24   };
26   pythonPlugin = pkg : lib.nameValuePair "python${if pkg.isPy2 then "2" else "3"}" {
27     interpreter = pkg.pythonOnBuildForHost.interpreter;
28     path = "plugins/python";
29     inputs = [ pkg ncurses ];
30     install = ''
31       install -Dm644 uwsgidecorators.py $out/${pkg.sitePackages}/uwsgidecorators.py
32       ${pkg.pythonOnBuildForHost.executable} -m compileall $out/${pkg.sitePackages}/
33       ${pkg.pythonOnBuildForHost.executable} -O -m compileall $out/${pkg.sitePackages}/
34     '';
35   };
37   available = lib.listToAttrs [
38     (pythonPlugin python2)
39     (pythonPlugin python3)
40     (lib.nameValuePair "rack" {
41       path = "plugins/rack";
42       inputs = [ ruby ];
43     })
44     (lib.nameValuePair "cgi" {
45       # usage: https://uwsgi-docs.readthedocs.io/en/latest/CGI.html?highlight=cgi
46       path = "plugins/cgi";
47       inputs = [ ];
48     })
49     (lib.nameValuePair "php" {
50       # usage: https://uwsgi-docs.readthedocs.io/en/latest/PHP.html#running-php-apps-with-nginx
51       path = "plugins/php";
52       inputs = [
53           php-embed
54           php-embed.extensions.session
55           php-embed.extensions.session.dev
56           php-embed.unwrapped.dev
57       ] ++ php-embed.unwrapped.buildInputs;
58     })
59   ];
61   getPlugin = name:
62     let
63       all = lib.concatStringsSep ", " (lib.attrNames available);
64     in
65       if lib.hasAttr name available
66       then lib.getAttr name available // { inherit name; }
67       else throw "Unknown UWSGI plugin ${name}, available : ${all}";
69   needed = builtins.map getPlugin plugins;
72 stdenv.mkDerivation (finalAttrs: {
73   pname = "uwsgi";
74   version = "2.0.26";
76   src = fetchFromGitHub {
77     owner = "unbit";
78     repo = "uwsgi";
79     rev = finalAttrs.version;
80     hash = "sha256-3nmmVNNDvQ1RzaD5BQFrScHHnmUtMwjo3wodEGIJCvI=";
81   };
83   patches = [
84     ./no-ext-session-php_session.h-on-NixOS.patch
85     ./additional-php-ldflags.patch
86   ];
88   nativeBuildInputs = [
89     makeWrapper
90     pkg-config
91     python3
92   ];
94   buildInputs =  [ jansson pcre libxcrypt ]
95     ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ expat zlib ]
96     ++ lib.optional withPAM pam
97     ++ lib.optional withSystemd systemd
98     ++ lib.optional withCap libcap
99     ++ lib.concatMap (x: x.inputs) needed;
101   basePlugins =  lib.concatStringsSep ","
102     (  lib.optional withPAM "pam"
103     ++ lib.optional withSystemd "systemd_logger"
104     );
106   UWSGI_INCLUDES = lib.optionalString withCap "${libcap.dev}/include";
108   passthru = {
109     inherit python2 python3;
110     tests.uwsgi = nixosTests.uwsgi;
111   };
113   postPatch = ''
114     for f in uwsgiconfig.py plugins/*/uwsgiplugin.py; do
115       substituteInPlace "$f" \
116         --replace pkg-config "$PKG_CONFIG"
117     done
118     sed -e "s/ + php_version//" -i plugins/php/uwsgiplugin.py
119   '';
121   configurePhase = ''
122     runHook preConfigure
124     export pluginDir=$out/lib/uwsgi
125     substituteAll ${./nixos.ini} buildconf/nixos.ini
127     runHook postConfigure
128   '';
130   # this is a hack to make the php plugin link with session.so (which on nixos is a separate package)
131   # the hack works in coordination with ./additional-php-ldflags.patch
132   UWSGICONFIG_PHP_LDFLAGS = lib.optionalString
133     (builtins.any (x: x.name == "php") needed)
134     (lib.concatStringsSep "," [
135       "-Wl"
136       "-rpath=${php-embed.extensions.session}/lib/php/extensions/"
137       "--library-path=${php-embed.extensions.session}/lib/php/extensions/"
138       "-l:session.so"
139     ]);
141   buildPhase = ''
142     runHook preBuild
144     mkdir -p $pluginDir
145     python3 uwsgiconfig.py --build nixos
146     ${lib.concatMapStringsSep ";" (x: "${x.preBuild or ""}\n ${x.interpreter or "python3"} uwsgiconfig.py --plugin ${x.path} nixos ${x.name}") needed}
148     runHook postBuild
149   '';
151   installPhase = ''
152     runHook preInstall
154     install -Dm755 uwsgi $out/bin/uwsgi
155     ${lib.concatMapStringsSep "\n" (x: x.install or "") needed}
157     runHook postInstall
158   '';
160   postFixup = lib.optionalString (builtins.any (x: x.name == "php") needed)
161   ''
162     wrapProgram $out/bin/uwsgi --set PHP_INI_SCAN_DIR ${php-embed}/lib
163   '';
165   meta = {
166     description = "Fast, self-healing and developer/sysadmin-friendly application container server coded in pure C";
167     homepage = "https://uwsgi-docs.readthedocs.org/en/latest/";
168     license = lib.licenses.gpl2Plus;
169     maintainers = with lib.maintainers; [ abbradar schneefux globin ];
170     platforms = lib.platforms.unix;
171     mainProgram = "uwsgi";
172   };