biglybt: 3.5.0.0 -> 3.6.0.0
[NixPkgs.git] / pkgs / development / tools / rust / cargo-pgrx / buildPgrxExtension.nix
blob6aae84d3463bc0034d989a286ecf973c03b36b5f
1 # preBuildAndTest and some small other bits
2 # taken from https://github.com/tcdi/pgrx/blob/v0.9.4/nix/extension.nix
3 # (but now heavily modified)
4 # which uses MIT License with the following license file
6 # MIT License
8 # Portions Copyright 2019-2021 ZomboDB, LLC.
9 # Portions Copyright 2021-2022 Technology Concepts & Design, Inc. <support@tcdi.com>.
10 # All rights reserved.
12 # Permission is hereby granted, free of charge, to any person obtaining a copy
13 # of this software and associated documentation files (the "Software"), to deal
14 # in the Software without restriction, including without limitation the rights
15 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16 # copies of the Software, and to permit persons to whom the Software is
17 # furnished to do so, subject to the following conditions:
19 # The above copyright notice and this permission notice shall be included in all
20 # copies or substantial portions of the Software.
22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 # SOFTWARE.
30 { lib
31 , cargo-pgrx
32 , pkg-config
33 , rustPlatform
34 , stdenv
35 , Security
36 , writeShellScriptBin
39 # The idea behind: Use it mostly like rustPlatform.buildRustPackage and so
40 # we hand most of the arguments down.
42 # Additional arguments are:
43 #   - `postgresql` postgresql package of the version of postgresql this extension should be build for.
44 #                  Needs to be the build platform variant.
45 #   - `useFakeRustfmt` Whether to use a noop fake command as rustfmt. cargo-pgrx tries to call rustfmt.
46 #                      If the generated rust bindings aren't needed to use the extension, its a
47 #                      unnecessary and heavy dependency. If you set this to true, you also
48 #                      have to add `rustfmt` to `nativeBuildInputs`.
50 { buildAndTestSubdir ? null
51 , buildType ? "release"
52 , buildFeatures ? [ ]
53 , cargoBuildFlags ? [ ]
54 , postgresql
55 # cargo-pgrx calls rustfmt on generated bindings, this is not strictly necessary, so we avoid the
56 # dependency here. Set to false and provide rustfmt in nativeBuildInputs, if you need it, e.g.
57 # if you include the generated code in the output via postInstall.
58 , useFakeRustfmt ? true
59 , ...
60 } @ args:
61 let
62   rustfmtInNativeBuildInputs = lib.lists.any (dep: lib.getName dep == "rustfmt") (args.nativeBuildInputs or []);
65 assert lib.asserts.assertMsg ((args.installPhase or "") == "")
66   "buildPgrxExtensions overwrites the installPhase, so providing one does nothing";
67 assert lib.asserts.assertMsg ((args.buildPhase or "") == "")
68   "buildPgrxExtensions overwrites the buildPhase, so providing one does nothing";
69 assert lib.asserts.assertMsg (useFakeRustfmt -> !rustfmtInNativeBuildInputs)
70   "The parameter useFakeRustfmt is set to true, but rustfmt is included in nativeBuildInputs. Either set useFakeRustfmt to false or remove rustfmt from nativeBuildInputs.";
71 assert lib.asserts.assertMsg (!useFakeRustfmt -> rustfmtInNativeBuildInputs)
72   "The parameter useFakeRustfmt is set to false, but rustfmt is not included in nativeBuildInputs. Either set useFakeRustfmt to true or add rustfmt from nativeBuildInputs.";
74 let
75   fakeRustfmt = writeShellScriptBin "rustfmt" ''
76     exit 0
77     '';
78   maybeDebugFlag = lib.optionalString (buildType != "release") "--debug";
79   maybeEnterBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) ''
80     export CARGO_TARGET_DIR="$(pwd)/target"
81     pushd "${buildAndTestSubdir}"
82   '';
83   maybeLeaveBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) "popd";
85   pgrxPostgresMajor = lib.versions.major postgresql.version;
86   preBuildAndTest = ''
87     export PGRX_HOME=$(mktemp -d)
88     export PGDATA="$PGRX_HOME/data-${pgrxPostgresMajor}/"
89     cargo-pgrx pgrx init "--pg${pgrxPostgresMajor}" ${postgresql}/bin/pg_config
90     echo "unix_socket_directories = '$(mktemp -d)'" > "$PGDATA/postgresql.conf"
92     # This is primarily for Mac or other Nix systems that don't use the nixbld user.
93     export USER="$(whoami)"
94     pg_ctl start
95     createuser -h localhost --superuser --createdb "$USER" || true
96     pg_ctl stop
97   '';
99   argsForBuildRustPackage = builtins.removeAttrs args [ "postgresql" "useFakeRustfmt" ];
101   # so we don't accidentally `(rustPlatform.buildRustPackage argsForBuildRustPackage) // { ... }` because
102   # we forgot parentheses
103   finalArgs = argsForBuildRustPackage // {
104     buildInputs = (args.buildInputs or [ ]) ++ lib.optionals stdenv.isDarwin [ Security ];
106     nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [
107       cargo-pgrx
108       postgresql
109       pkg-config
110       rustPlatform.bindgenHook
111     ] ++ lib.optionals useFakeRustfmt [ fakeRustfmt ];
113     buildPhase = ''
114       runHook preBuild
116       echo "Executing cargo-pgrx buildPhase"
117       ${preBuildAndTest}
118       ${maybeEnterBuildAndTestSubdir}
120       NIX_PGLIBDIR="${postgresql}/lib" \
121       PGRX_BUILD_FLAGS="--frozen -j $NIX_BUILD_CORES ${builtins.concatStringsSep " " cargoBuildFlags}" \
122       cargo-pgrx pgrx package \
123         --pg-config ${postgresql}/bin/pg_config \
124         ${maybeDebugFlag} \
125         --features "${builtins.concatStringsSep " " buildFeatures}" \
126         --out-dir "$out"
128       ${maybeLeaveBuildAndTestSubdir}
130       runHook postBuild
131     '';
133     preCheck = preBuildAndTest + args.preCheck or "";
135     installPhase = ''
136       runHook preInstall
138       echo "Executing buildPgrxExtension install"
140       ${maybeEnterBuildAndTestSubdir}
142       cargo-pgrx pgrx stop all
144       mv $out/${postgresql}/* $out
145       rm -rf $out/nix
147       ${maybeLeaveBuildAndTestSubdir}
149       runHook postInstall
150     '';
152     PGRX_PG_SYS_SKIP_BINDING_REWRITE = "1";
153     CARGO_BUILD_INCREMENTAL = "false";
154     RUST_BACKTRACE = "full";
156     checkNoDefaultFeatures = true;
157     checkFeatures = (args.checkFeatures or [ ]) ++ [ "pg_test pg${pgrxPostgresMajor}" ];
158   };
160 rustPlatform.buildRustPackage finalArgs