|
| 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 |
| 5 | +# |
| 6 | +# MIT License |
| 7 | +# |
| 8 | +# Portions Copyright 2019-2021 ZomboDB, LLC. |
| 9 | +# Portions Copyright 2021-2022 Technology Concepts & Design, Inc. <support@tcdi.com>. |
| 10 | +# All rights reserved. |
| 11 | +# |
| 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: |
| 18 | +# |
| 19 | +# The above copyright notice and this permission notice shall be included in all |
| 20 | +# copies or substantial portions of the Software. |
| 21 | +# |
| 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. |
| 29 | + |
| 30 | +{ lib |
| 31 | +, cargo-pgrx |
| 32 | +, pkg-config |
| 33 | +, rustPlatform |
| 34 | +, stdenv |
| 35 | +, Security |
| 36 | +, writeShellScriptBin |
| 37 | +}: |
| 38 | + |
| 39 | +# The idea behind: Use it mostly like rustPlatform.buildRustPackage and so |
| 40 | +# we hand most of the arguments down. |
| 41 | +# |
| 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`. |
| 49 | + |
| 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 | +, usePgTestCheckFeature ? true |
| 60 | +, ... |
| 61 | +} @ args: |
| 62 | +let |
| 63 | + rustfmtInNativeBuildInputs = lib.lists.any (dep: lib.getName dep == "rustfmt") (args.nativeBuildInputs or []); |
| 64 | +in |
| 65 | + |
| 66 | +assert lib.asserts.assertMsg ((args.installPhase or "") == "") |
| 67 | + "buildPgrxExtensions overwrites the installPhase, so providing one does nothing"; |
| 68 | +assert lib.asserts.assertMsg ((args.buildPhase or "") == "") |
| 69 | + "buildPgrxExtensions overwrites the buildPhase, so providing one does nothing"; |
| 70 | +assert lib.asserts.assertMsg (useFakeRustfmt -> !rustfmtInNativeBuildInputs) |
| 71 | + "The parameter useFakeRustfmt is set to true, but rustfmt is included in nativeBuildInputs. Either set useFakeRustfmt to false or remove rustfmt from nativeBuildInputs."; |
| 72 | +assert lib.asserts.assertMsg (!useFakeRustfmt -> rustfmtInNativeBuildInputs) |
| 73 | + "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 | + |
| 75 | +let |
| 76 | + fakeRustfmt = writeShellScriptBin "rustfmt" '' |
| 77 | + exit 0 |
| 78 | + ''; |
| 79 | + maybeDebugFlag = lib.optionalString (buildType != "release") "--debug"; |
| 80 | + maybeEnterBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) '' |
| 81 | + export CARGO_TARGET_DIR="$(pwd)/target" |
| 82 | + pushd "${buildAndTestSubdir}" |
| 83 | + ''; |
| 84 | + maybeLeaveBuildAndTestSubdir = lib.optionalString (buildAndTestSubdir != null) "popd"; |
| 85 | + |
| 86 | + pgrxPostgresMajor = lib.versions.major postgresql.version; |
| 87 | + preBuildAndTest = '' |
| 88 | + export PGRX_HOME=$(mktemp -d) |
| 89 | + export PGDATA="$PGRX_HOME/data-${pgrxPostgresMajor}/" |
| 90 | + cargo-pgrx pgrx init "--pg${pgrxPostgresMajor}" ${lib.getDev postgresql}/bin/pg_config |
| 91 | + echo "unix_socket_directories = '$(mktemp -d)'" > "$PGDATA/postgresql.conf" |
| 92 | +
|
| 93 | + # This is primarily for Mac or other Nix systems that don't use the nixbld user. |
| 94 | + export USER="$(whoami)" |
| 95 | + pg_ctl start |
| 96 | + createuser -h localhost --superuser --createdb "$USER" || true |
| 97 | + pg_ctl stop |
| 98 | + ''; |
| 99 | + |
| 100 | + argsForBuildRustPackage = builtins.removeAttrs args [ "postgresql" "useFakeRustfmt" "usePgTestCheckFeature" ]; |
| 101 | + |
| 102 | + # so we don't accidentally `(rustPlatform.buildRustPackage argsForBuildRustPackage) // { ... }` because |
| 103 | + # we forgot parentheses |
| 104 | + finalArgs = argsForBuildRustPackage // { |
| 105 | + buildInputs = (args.buildInputs or [ ]) ++ lib.optionals stdenv.hostPlatform.isDarwin [ Security ]; |
| 106 | + |
| 107 | + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ |
| 108 | + cargo-pgrx |
| 109 | + postgresql |
| 110 | + pkg-config |
| 111 | + rustPlatform.bindgenHook |
| 112 | + ] ++ lib.optionals useFakeRustfmt [ fakeRustfmt ]; |
| 113 | + |
| 114 | + buildPhase = '' |
| 115 | + runHook preBuild |
| 116 | +
|
| 117 | + echo "Executing cargo-pgrx buildPhase" |
| 118 | + ${preBuildAndTest} |
| 119 | + ${maybeEnterBuildAndTestSubdir} |
| 120 | +
|
| 121 | + PGRX_BUILD_FLAGS="--frozen -j $NIX_BUILD_CORES ${builtins.concatStringsSep " " cargoBuildFlags}" \ |
| 122 | + ${lib.optionalString stdenv.hostPlatform.isDarwin ''RUSTFLAGS="''${RUSTFLAGS:+''${RUSTFLAGS} }-Clink-args=-Wl,-undefined,dynamic_lookup"''} \ |
| 123 | + cargo pgrx package \ |
| 124 | + --pg-config ${lib.getDev postgresql}/bin/pg_config \ |
| 125 | + ${maybeDebugFlag} \ |
| 126 | + --features "${builtins.concatStringsSep " " buildFeatures}" \ |
| 127 | + --out-dir "$out" |
| 128 | +
|
| 129 | + ${maybeLeaveBuildAndTestSubdir} |
| 130 | +
|
| 131 | + runHook postBuild |
| 132 | + ''; |
| 133 | + |
| 134 | + preCheck = preBuildAndTest + args.preCheck or ""; |
| 135 | + |
| 136 | + installPhase = '' |
| 137 | + runHook preInstall |
| 138 | +
|
| 139 | + echo "Executing buildPgrxExtension install" |
| 140 | +
|
| 141 | + ${maybeEnterBuildAndTestSubdir} |
| 142 | +
|
| 143 | + cargo-pgrx pgrx stop all |
| 144 | +
|
| 145 | + mv $out/${postgresql}/* $out |
| 146 | + rm -rf $out/nix |
| 147 | +
|
| 148 | + ${maybeLeaveBuildAndTestSubdir} |
| 149 | +
|
| 150 | + runHook postInstall |
| 151 | + ''; |
| 152 | + |
| 153 | + PGRX_PG_SYS_SKIP_BINDING_REWRITE = "1"; |
| 154 | + CARGO_BUILD_INCREMENTAL = "false"; |
| 155 | + RUST_BACKTRACE = "full"; |
| 156 | + |
| 157 | + checkNoDefaultFeatures = true; |
| 158 | + checkFeatures = (args.checkFeatures or [ ]) ++ (lib.optionals usePgTestCheckFeature [ "pg_test" ]) ++ [ "pg${pgrxPostgresMajor}" ]; |
| 159 | + }; |
| 160 | +in |
| 161 | +rustPlatform.buildRustPackage finalArgs |
0 commit comments