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
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
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"
53 , cargoBuildFlags ? [ ]
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
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.";
75 fakeRustfmt = writeShellScriptBin "rustfmt" ''
78 maybeDebugFlag = lib.optionalString (buildType != "release") "--debug";
79 maybeEnterBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) ''
80 export CARGO_TARGET_DIR="$(pwd)/target"
81 pushd "${buildAndTestSubdir}"
83 maybeLeaveBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) "popd";
85 pgrxPostgresMajor = lib.versions.major postgresql.version;
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)"
95 createuser -h localhost --superuser --createdb "$USER" || true
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 [ ]) ++ [
110 rustPlatform.bindgenHook
111 ] ++ lib.optionals useFakeRustfmt [ fakeRustfmt ];
116 echo "Executing cargo-pgrx buildPhase"
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 \
125 --features "${builtins.concatStringsSep " " buildFeatures}" \
128 ${maybeLeaveBuildAndTestSubdir}
133 preCheck = preBuildAndTest + args.preCheck or "";
138 echo "Executing buildPgrxExtension install"
140 ${maybeEnterBuildAndTestSubdir}
142 cargo-pgrx pgrx stop all
144 mv $out/${postgresql}/* $out
147 ${maybeLeaveBuildAndTestSubdir}
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}" ];
160 rustPlatform.buildRustPackage finalArgs