diff --git a/flake.nix b/flake.nix index 3e60780bc..34e757212 100644 --- a/flake.nix +++ b/flake.nix @@ -417,8 +417,12 @@ fi done createdb -p 5432 -h localhost testing - psql -p 5432 -h localhost -d testing -Xaf ${./nix/tests/prime.sql} - + if ! psql -p 5432 -h localhost -d testing -v ON_ERROR_STOP=1 -Xaf ${./nix/tests/prime.sql}; then + echo "Error executing SQL file. PostgreSQL log content:" + cat $TMPDIR/logfile/postgresql.log + pg_ctl -D "$PGDATA" stop + exit 1 + fi pg_prove -p 5432 -h localhost -d testing ${sqlTests}/*.sql mkdir -p $out/regression_output diff --git a/nix/ext/plv8.nix b/nix/ext/plv8.nix index 29b611b08..ef476f0ab 100644 --- a/nix/ext/plv8.nix +++ b/nix/ext/plv8.nix @@ -8,14 +8,14 @@ , runCommand , coreutils , gnugrep -, gcc +, clang +, patchelf +, xcbuild +, darwin }: stdenv.mkDerivation (finalAttrs: { pname = "plv8"; - # plv8 latest is https://github.com/plv8/plv8/releases/tag/v3.2.2 - # FIXME we need to increment this build toward 3.2.2 - # 3.1.7 is the highest version that can be built with pg 16 version = "3.1.5"; src = fetchFromGitHub { @@ -26,58 +26,105 @@ stdenv.mkDerivation (finalAttrs: { }; patches = [ - # Allow building with system v8. - # https://github.com/plv8/plv8/pull/505 (rejected) ./0001-build-Allow-using-V8-from-system.patch ]; nativeBuildInputs = [ perl ] ++ lib.optionals stdenv.isDarwin [ - gcc + clang + xcbuild ]; buildInputs = [ - v8 + (v8.overrideAttrs (oldAttrs: { + version = "9.7.106.18"; + })) postgresql + ] ++ lib.optionals stdenv.isDarwin [ + darwin.apple_sdk.frameworks.CoreFoundation + darwin.apple_sdk.frameworks.Kerberos ]; buildFlags = [ "all" ]; makeFlags = [ - # Nixpkgs build a v8 monolith instead of separate v8_libplatform. "USE_SYSTEM_V8=1" - "SHLIB_LINK=-lv8" "V8_OUTDIR=${v8}/lib" + "PG_CONFIG=${postgresql}/bin/pg_config" + ] ++ lib.optionals stdenv.isDarwin [ + "CC=${clang}/bin/clang" + "CXX=${clang}/bin/clang++" + "SHLIB_LINK=-L${v8}/lib -lv8_monolith -Wl,-rpath,${v8}/lib" + ] ++ lib.optionals (!stdenv.isDarwin) [ + "SHLIB_LINK=-L${v8}/lib -lv8_monolith -Wl,-rpath,${v8}/lib" ]; - NIX_LDFLAGS = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) - "-undefined dynamic_lookup"; - NIX_CFLAGS_COMPILE = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ + NIX_LDFLAGS = (lib.optionals stdenv.isDarwin [ + "-L${postgresql}/lib" + "-L${v8}/lib" + "-lv8_monolith" + "-lpq" + "-lpgcommon" + "-lpgport" + "-F${darwin.apple_sdk.frameworks.CoreFoundation}/Library/Frameworks" + "-framework" "CoreFoundation" + "-F${darwin.apple_sdk.frameworks.Kerberos}/Library/Frameworks" + "-framework" "Kerberos" + "-undefined" "dynamic_lookup" + "-flat_namespace" + ]) ++ (lib.optionals (!stdenv.isDarwin) [ + "-L${postgresql}/lib" + "-L${v8}/lib" + "-lv8_monolith" + "-lpq" + "-lpgcommon" + "-lpgport" + ]); + + NIX_CFLAGS_COMPILE = [ "-I${v8}/include" "-I${postgresql}/include" + "-I${postgresql}/include/server" + "-I${postgresql}/include/internal" ]; + installFlags = [ - # PGXS only supports installing to postgresql prefix so we need to redirect this "DESTDIR=${placeholder "out"}" ]; - # No configure script. dontConfigure = true; postPatch = '' patchShebangs ./generate_upgrade.sh - # https://github.com/plv8/plv8/pull/506 substituteInPlace generate_upgrade.sh \ --replace " 2.3.10 " " 2.3.10 2.3.11 2.3.12 2.3.13 2.3.14 2.3.15 " + + ${lib.optionalString stdenv.isDarwin '' + # Replace g++ with clang++ in Makefile + sed -i 's/g++/clang++/g' Makefile + ''} + ''; + + preBuild = lib.optionalString stdenv.isDarwin '' + export CC=${clang}/bin/clang + export CXX=${clang}/bin/clang++ ''; postInstall = '' - # Move the redirected to proper directory. - # There appear to be no references to the install directories - # so changing them does not cause issues. mv "$out/nix/store"/*/* "$out" rmdir "$out/nix/store"/* "$out/nix/store" "$out/nix" + + ${lib.optionalString stdenv.isDarwin '' + install_name_tool -add_rpath "${v8}/lib" $out/lib/plv8-${finalAttrs.version}.so + install_name_tool -add_rpath "${postgresql}/lib" $out/lib/plv8-${finalAttrs.version}.so + install_name_tool -add_rpath "${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}.so + install_name_tool -change @rpath/libv8_monolith.dylib ${v8}/lib/libv8_monolith.dylib $out/lib/plv8-${finalAttrs.version}.so + ''} + + ${lib.optionalString (!stdenv.isDarwin) '' + ${patchelf}/bin/patchelf --set-rpath "${v8}/lib:${postgresql}/lib:${stdenv.cc.cc.lib}/lib" $out/lib/plv8-${finalAttrs.version}.so + ''} ''; passthru = { diff --git a/nix/tests/expected/extensions_sql_interface.out b/nix/tests/expected/extensions_sql_interface.out index 2f4c8385e..70d153fc3 100644 --- a/nix/tests/expected/extensions_sql_interface.out +++ b/nix/tests/expected/extensions_sql_interface.out @@ -20,13 +20,10 @@ where installed_version is null order by name asc; - name ----------- + name +--------- pg_cron - plcoffee - plls - plv8 -(4 rows) +(1 row) /* @@ -98,8 +95,11 @@ order by pgsodium | f pgstattuple | t pgtap | t + plcoffee | f + plls | f plpgsql | f plpgsql_check | f + plv8 | f postgis | f postgis_raster | f postgis_sfcgal | t @@ -121,7 +121,7 @@ order by vector | t wrappers | f xml2 | f -(78 rows) +(81 rows) /* @@ -3030,6 +3030,12 @@ order by pgtap | public | volatility_is | name, name[], text, text | text pgtap | public | volatility_is | name, text | text pgtap | public | volatility_is | name, text, text | text + plcoffee | pg_catalog | plcoffee_call_handler | | language_handler + plcoffee | pg_catalog | plcoffee_call_validator | oid | void + plcoffee | pg_catalog | plcoffee_inline_handler | internal | void + plls | pg_catalog | plls_call_handler | | language_handler + plls | pg_catalog | plls_call_validator | oid | void + plls | pg_catalog | plls_inline_handler | internal | void plpgsql | pg_catalog | plpgsql_call_handler | | language_handler plpgsql | pg_catalog | plpgsql_inline_handler | internal | void plpgsql | pg_catalog | plpgsql_validator | oid | void @@ -3055,6 +3061,12 @@ order by plpgsql_check | public | plpgsql_profiler_reset_all | | void plpgsql_check | public | plpgsql_show_dependency_tb | fnname text, relid regclass | TABLE(type text, oid oid, schema text, name text, params text) plpgsql_check | public | plpgsql_show_dependency_tb | funcoid regprocedure, relid regclass | TABLE(type text, oid oid, schema text, name text, params text) + plv8 | pg_catalog | plv8_call_handler | | language_handler + plv8 | pg_catalog | plv8_call_validator | oid | void + plv8 | pg_catalog | plv8_info | | json + plv8 | pg_catalog | plv8_inline_handler | internal | void + plv8 | pg_catalog | plv8_reset | | void + plv8 | pg_catalog | plv8_version | | text postgis | public | _postgis_deprecate | oldname text, newname text, version text | void postgis | public | _postgis_index_extent | tbl regclass, col text | box2d postgis | public | _postgis_join_selectivity | regclass, text, regclass, text, text | double precision @@ -5092,7 +5104,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(4941 rows) +(4953 rows) /* diff --git a/nix/tests/prime.sql b/nix/tests/prime.sql index 23101262b..0c16d3ef0 100644 --- a/nix/tests/prime.sql +++ b/nix/tests/prime.sql @@ -67,9 +67,9 @@ TODO: PLs can not be enabled on M1 Macs locally ERROR: could not load library "/nix/store/..../lib/plv8-3.1.5.so symbol not found in flat namespace */ --- create extension plv8; --- create extension plcoffee; --- create extension plls; +create extension plv8; +create extension plcoffee; +create extension plls; create extension postgis; create extension postgis_raster;