Update: I’ve gotten it mostly working with this shell.nix:
{ pkgs ? import <nixpkgs> {} }:
let
myExtension = pkgs.stdenv.mkDerivation rec {
pname = "myExtension";
version = "0.1.0";
src = ./.;
buildInputs = [ pkgs.postgresql ];
makeFlags = [
"USE_PGXS=1"
];
installPhase = ''
mkdir -p $out/lib
mkdir -p $out/share/postgresql/extension
install -D ${pname}.so -t $out/lib
install -D ${pname}.control -t $out/share/postgresql/extension
install -D ${pname}--${version}.sql -t $out/share/postgresql/extension
'';
};
postgresqlSrc = pkgs.fetchurl {
url = "https://ftp.postgresql.org/pub/source/v${pkgs.postgresql.version}/postgresql-${pkgs.postgresql.version}.tar.bz2";
sha256 = "sha256-j1OqldeOuOglNupGtoGHeTtCu6O09lqjQvVAsjybEKY=";
};
modifiedPostgresql = pkgs.postgresql.overrideAttrs (old: {
src = postgresqlSrc;
configureFlags = old.configureFlags ++ [
"--with-includes=${myExtension}/include"
"--with-libraries=${myExtension}/lib"
];
postInstall = ''
${old.postInstall or ""}
# Copy over the extension files
mkdir -p $out/share/postgresql/extension
mkdir -p $lib/lib
cp -r ${myExtension}/share/postgresql/extension/* $out/share/postgresql/extension
cp -r ${myExtension}/lib/* $lib/lib
'';
# postInstall = ''
# ${old.postInstall or ""}
# # Copy over the extension files
# mkdir -p $out/share/postgresql/extension
# cp -r ${myExtension}/share/postgresql/extension/* $out/share/postgresql/extension
# '';
});
in
pkgs.mkShell {
buildInputs = [ modifiedPostgresql ];
shellHook = ''
export PATH=${modifiedPostgresql}/bin:$PATH
'';
}
Makefile:
EXTENSION = myExtension
DATA = myExtension--0.1.0.sql
# Check if nix exists, and set PG_CONFIG accordingly
IS_NIX := $(shell which nix > /dev/null 2>&1 && echo yes || echo no)
ifeq ($(IS_NIX),yes)
PG_CONFIG = ./pg_config_nix
else
PG_CONFIG = pg_config
endif
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
pg_config_nix:
#!/usr/bin/env bash
# pg_config on NixOS returns some wrong outputs
# this wrapper script aims to correct that
set -euo pipefail
INCLUDEDIR=$(nix-store -r $(which postgres) 2>/dev/null)/include
if [[ $# -eq 0 ]]; then
pg_config | grep -v INCLUDEDIR
echo "INCLUDEDIR = $INCLUDEDIR"
echo "PKGINCLUDEDIR = $INCLUDEDIR"
echo "INCLUDEDIR-SERVER = $INCLUDEDIR/server"
exit 0
fi
# Handle specific arguments
for arg in "$@"
do
case $arg in
--includedir) echo $INCLUDEDIR; break;;
--pkgincludedir) echo $INCLUDEDIR; break;;
--includedir-server) echo "$INCLUDEDIR/server"; break;;
*) pg_config $arg; break;;
esac
done
However, every time I want to test the extension again the entirety of postgresql needs to be rebuilt. Still working on a solution for that. Would appreciate any help!