Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 2 additions & 13 deletions ansible/tasks/stage2-setup-postgres.yml
Original file line number Diff line number Diff line change
Expand Up @@ -217,19 +217,8 @@
recurse: yes
when: stage2_nix

- name: Check psql_version and run postgis linking if not oriole-xx
block:
- name: Check if psql_version is psql_orioledb-17
set_fact:
is_psql_oriole: "{{ psql_version == 'psql_orioledb-17' }}"

- name: Recursively create symbolic links and set permissions for the contrib/postgis-* dir
shell: >
sudo mkdir -p /usr/lib/postgresql/share/postgresql/contrib && \
sudo find /var/lib/postgresql/.nix-profile/share/postgresql/contrib/ -mindepth 1 -type d -exec sh -c 'for dir do sudo ln -s "$dir" "/usr/lib/postgresql/share/postgresql/contrib/$(basename "$dir")"; done' sh {} + \
&& chown -R postgres:postgres "/usr/lib/postgresql/share/postgresql/contrib/"
become: yes
when: stage2_nix and not is_psql_oriole
# PostGIS contrib linking removed - PostGIS doesn't install to contrib directory
# It installs extensions to /share/postgresql/extension/ which is already linked above

- name: Create symbolic links from /var/lib/postgresql/.nix-profile/share/postgresql/timezonesets to /usr/lib/postgresql/share/postgresql/timeszonesets
shell: >-
Expand Down
6 changes: 3 additions & 3 deletions ansible/vars.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ postgres_major:

# Full version strings for each major version
postgres_release:
postgresorioledb-17: 17.5.1.033-orioledb
postgres17: 17.6.1.012
postgres15: 15.14.1.012
postgresorioledb-17: 17.5.1.034-orioledb
postgres17: 17.6.1.013
postgres15: 15.14.1.013

# Non Postgres Extensions
pgbouncer_release: 1.19.0
Expand Down
242 changes: 176 additions & 66 deletions nix/ext/postgis.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15,88 +15,198 @@
pcre2,
nixosTests,
callPackage,
buildEnv,
}:

let
sfcgal = callPackage ./sfcgal/sfcgal.nix { };
gdal = callPackage ./gdal.nix { inherit postgresql; };
in
stdenv.mkDerivation rec {
pname = "postgis";
version = "3.3.7";

outputs = [
"out"
"doc"
];
# Load version configuration from external file
allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).${pname};

src = fetchurl {
url = "https://download.osgeo.org/postgis/source/postgis-${version}.tar.gz";
sha256 = "sha256-UHJKDd5JrcJT5Z4CTYsY/va+ToU0GUPG1eHhuXTkP84=";
};
# Filter versions compatible with current PostgreSQL version
supportedVersions = lib.filterAttrs (
_: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
) allVersions;

# Derived version information
versions = lib.naturalSort (lib.attrNames supportedVersions);
latestVersion = lib.last versions;
numberOfVersions = builtins.length versions;
packages = builtins.attrValues (
lib.mapAttrs (name: value: build name value.hash) supportedVersions
);

buildInputs = [
libxml2
postgresql
geos
proj
gdal
json_c
protobufc
pcre2.dev
sfcgal
] ++ lib.optional stdenv.isDarwin libiconv;
nativeBuildInputs = [
perl
pkg-config
# List of C extensions to be included in the build
cExtensions = [
"address_standardizer"
"postgis"
"postgis_raster"
"postgis_sfcgal"
"postgis_topology"
];
dontDisableStatic = true;

env.NIX_LDFLAGS = "-L${lib.getLib json_c}/lib";
sqlExtensions = [
"address_standardizer_data_us"
"postgis_tiger_geocoder"
];

preConfigure = ''
sed -i 's@/usr/bin/file@${file}/bin/file@' configure
configureFlags="--datadir=$out/share/postgresql --datarootdir=$out/share/postgresql --bindir=$out/bin --docdir=$doc/share/doc/${pname} --with-gdalconfig=${gdal}/bin/gdal-config --with-jsondir=${json_c.dev} --disable-extension-upgrades-install --with-sfcgal"
# Build function for individual versions
build =
version: hash:
stdenv.mkDerivation rec {
inherit pname version;

makeFlags="PERL=${perl}/bin/perl datadir=$out/share/postgresql pkglibdir=$out/lib bindir=$out/bin docdir=$doc/share/doc/${pname}"
'';
outputs = [
"out"
"doc"
];

postConfigure = ''
sed -i "s|@mkdir -p \$(DESTDIR)\$(PGSQL_BINDIR)||g ;
s|\$(DESTDIR)\$(PGSQL_BINDIR)|$prefix/bin|g
" \
"raster/loader/Makefile";
sed -i "s|\$(DESTDIR)\$(PGSQL_BINDIR)|$prefix/bin|g
" \
"raster/scripts/python/Makefile";
mkdir -p $out/bin
ln -s ${postgresql}/bin/postgres $out/bin/postgres
'';
src = fetchurl {
url = "https://download.osgeo.org/postgis/source/postgis-${version}.tar.gz";
inherit hash;
};

postInstall = ''
rm $out/bin/postgres
for prog in $out/bin/*; do # */
ln -s $prog $prog-${version}
done
# Add function definition and usage to tiger geocoder files
for file in $out/share/postgresql/extension/postgis_tiger_geocoder*--${version}.sql; do
sed -i "/SELECT postgis_extension_AddToSearchPath('tiger');/a SELECT postgis_extension_AddToSearchPath('extensions');" "$file"
done
# Original topology patching
for file in $out/share/postgresql/extension/postgis_topology*--${version}.sql; do
sed -i "/SELECT topology.AddToSearchPath('topology');/i SELECT topology.AddToSearchPath('extensions');" "$file"
done
mkdir -p $doc/share/doc/postgis
mv doc/* $doc/share/doc/postgis/
'';
buildInputs = [
libxml2
postgresql
geos
proj
gdal
json_c
protobufc
pcre2.dev
sfcgal
] ++ lib.optional stdenv.isDarwin libiconv;
nativeBuildInputs = [
perl
pkg-config
];
dontDisableStatic = true;

env.NIX_LDFLAGS = "-L${lib.getLib json_c}/lib";

preConfigure = ''
sed -i 's@/usr/bin/file@${file}/bin/file@' configure
configureFlags="--datadir=$out/share/postgresql --datarootdir=$out/share/postgresql --bindir=$out/bin --docdir=$doc/share/doc/${pname} --with-gdalconfig=${gdal}/bin/gdal-config --with-jsondir=${json_c.dev} --with-sfcgal"

makeFlags="PERL=${perl}/bin/perl datadir=$out/share/postgresql pkglibdir=$out/lib bindir=$out/bin docdir=$doc/share/doc/${pname}"
'';

postConfigure = ''
sed -i "s|@mkdir -p \$(DESTDIR)\$(PGSQL_BINDIR)||g ;
s|\$(DESTDIR)\$(PGSQL_BINDIR)|$prefix/bin|g
" \
"raster/loader/Makefile";
sed -i "s|\$(DESTDIR)\$(PGSQL_BINDIR)|$prefix/bin|g
" \
"raster/scripts/python/Makefile";
mkdir -p $out/bin
ln -s ${postgresql}/bin/postgres $out/bin/postgres
'';

postInstall = ''
MIN_MAJ_VERSION=${lib.concatStringsSep "." (lib.take 2 (builtins.splitVersion version))}
rm $out/bin/postgres

# Rename C extension libraries with full version suffix
for ext in ${lib.concatStringsSep " " cExtensions}; do
if [ -f "$out/lib/$ext-3${postgresql.dlSuffix}" ]; then
mv $out/lib/$ext-3${postgresql.dlSuffix} $out/lib/$ext-${version}${postgresql.dlSuffix}
fi
done

passthru.tests.postgis = nixosTests.postgis;
# Create version-specific control files (without default_version, pointing to unversioned library)
for ext in ${lib.concatStringsSep " " (cExtensions ++ sqlExtensions)}; do
sed -e "/^default_version =/d" \
-e "s|^module_pathname = .*|module_pathname = '\$libdir/$ext-3'|" \
$out/share/postgresql/extension/$ext.control > $out/share/postgresql/extension/$ext--${version}.control
rm $out/share/postgresql/extension/$ext.control
done

# Add function definition and usage to tiger geocoder files
for file in $out/share/postgresql/extension/postgis_tiger_geocoder*--${version}.sql; do
sed -i "/SELECT postgis_extension_AddToSearchPath('tiger');/a SELECT postgis_extension_AddToSearchPath('extensions');" "$file"
done
# Original topology patching
for file in $out/share/postgresql/extension/postgis_topology*--${version}.sql; do
sed -i "/SELECT topology.AddToSearchPath('topology');/i SELECT topology.AddToSearchPath('extensions');" "$file"
done

# For the latest version, create default control file and library symlinks
if [[ "${version}" == "${latestVersion}" ]]; then
# Copy all SQL upgrade scripts only for latest version
cp $out/share/postgresql/extension/*.sql $out/share/postgresql/extension/ 2>/dev/null || true

for ext in ${lib.concatStringsSep " " (cExtensions ++ sqlExtensions)}; do
{
echo "default_version = '${version}'"
cat $out/share/postgresql/extension/$ext--${version}.control
} > $out/share/postgresql/extension/$ext.control
done

# Create symlinks for C extension libraries (latest version becomes the default)
for ext in ${lib.concatStringsSep " " cExtensions}; do
ln -sfn $ext-${version}${postgresql.dlSuffix} $out/lib/$ext-3${postgresql.dlSuffix}
done

for prog in $out/bin/*; do # */
ln -s $prog $prog-${version}
done
else
# remove migration scripts for non-latest version
find $out/share/postgresql/extension -regex '.*--.*--.*\.sql' -delete

for prog in $out/bin/*; do # */
mv $prog $prog-${version}
done
fi

mkdir -p $doc/share/doc/postgis
mv doc/* $doc/share/doc/postgis/
'';

passthru.tests.postgis = nixosTests.postgis;

meta = with lib; {
description = "Geographic Objects for PostgreSQL";
homepage = "https://postgis.net/";
changelog = "https://git.osgeo.org/gitea/postgis/postgis/raw/tag/${version}/NEWS";
license = licenses.gpl2;
inherit (postgresql.meta) platforms;
};
};
in
buildEnv {
name = pname;
paths = packages;

pathsToLink = [
"/lib"
"/share/postgresql/extension"
];
postBuild = ''
# Verify all expected library files are present
# We expect: (numberOfVersions * cExtensions) versioned libraries + cExtensions symlinks
expectedFiles=${
toString ((numberOfVersions * builtins.length cExtensions) + builtins.length cExtensions)
}
actualFiles=$(ls -A $out/lib/*${postgresql.dlSuffix} | wc -l)

if [[ "$actualFiles" != "$expectedFiles" ]]; then
echo "Error: Expected $expectedFiles library files, found $actualFiles"
echo "Files found:"
ls -la $out/lib/*${postgresql.dlSuffix} || true
exit 1
fi
'';

meta = with lib; {
description = "Geographic Objects for PostgreSQL";
homepage = "https://postgis.net/";
changelog = "https://git.osgeo.org/gitea/postgis/postgis/raw/tag/${version}/NEWS";
license = licenses.gpl2;
inherit (postgresql.meta) platforms;
passthru = {
inherit versions numberOfVersions;
pname = "${pname}-all";
version =
"multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
};
}
Loading