pg.ddx.io pgsql-hackers@postgresql.org mailing list archive
help / color / mirror / Atom feedRe: [RFC] building postgres with meson - v11
17+ messages / 3 participants
[nested] [flat]
Commits from this thread:
2022-09-20 c3382a3c3c Refactor PG_TEST_EXTRA logic in autoconf build
2022-09-19 70df2df1cc Extend gendef.pl in preparation for meson
2022-08-25 3fb0687d32 solaris: Use versioning scripts instead of -Bsymbolic
2022-08-24 161355ee6d Change shared library installation naming on macOS
2022-08-18 4ab53b647a Don't add HAVE_LDAP_H HAVE_WINLDAP_H to pg_config.h
* Re: [RFC] building postgres with meson - v11
@ 2022-08-11 00:20 Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 17+ messages in thread
From: Andres Freund @ 2022-08-11 00:20 UTC (permalink / raw)
To: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Andrew Dunstan <andrew@dunslane.net>
Hi,
Attached is a new version of the meson patchset. Plenty changes:
- Added a postgresql-extension.pc pkg-config file. That allows building server
extensions without integrating directly with the postgres buildsystem. I
have tested that this allows to build a simple out-of-tree extension on
linux and windows - the latter is something that we didn't really support
before. I think we could add something similar to the autoconf build in the
back branches, which'd make it easier to build extensions using this
mechanism across server versions.
- A significant number of the preparatory patches has been committed
- Lots of cleanup / simplification around exporting symbols, including
reunifying gendef.pl that I had previously copied
- Ecpg is now built and tested on windows, thanks to the above
- If there are any leftover generated files in the source tree, we now error
out, with instructions for how to fix it. That might need a better answer at
some point (think building from tarball), but I think that's good enough for
now.
It might be worth generating a file to perform the cleanups, it can be a
long list.
- CI for Openbsd, Netbsd (thanks Bilal!), that found a few minor issues
- I hadn't fully implemented the defaults for semaphores. Turns out named
semaphores are really slow on openbsd and netbsd.
- I went through all the "configure" tests to see if there are mismatches, and
either fixed them or added FIXMEs. There's maybe a handful.
- The PGXS compat layer is good enough to build at least a few moderately
complicated extensions (postgis, postgis), but currently their tests fail
against 15 (independent of the buildsystem)...
- Improved configure summary to show CFLAGS
- Some other CI improvements, we e.g. didn't use the same test concurrency and
CFLAGSs between the meson and autoconf tasks.
- Lots of small cleanups
- The testrunner now creates a test.start file when starting and either a
test.success or test.failure when ending. I'd like to use that to select the
list of log files etc to report in CI / the buildfarm, while still allowing
concurrent testing. Andrew, does that make sense to you?
- Lots of other small stuff
I think this is getting closer to being initially mergeable. As we'd
discussed, we're more likely to succeed if we accept working somewhat
incrementally on this.
Samay, with a bit of input from me, started on adding a docs chapter for
building with meson. I hope to include that in the next version.
I'll next send out an email discussing where test outputs should be when
running them with meson and how tests and "testsuites" should be named.
Greetings,
Andres
Attachments: download all (9 files, .tar.gz)
v11-0001-meson-prereq-regress-allow-to-specify-director-c.patch (text/x-diff, 6.7K) download
From 63cb79ca9dc79b2d96df143a75d34e144575045b Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 30 Jun 2022 18:28:17 -0700
Subject: [PATCH v11 1/9] meson: prereq: regress: allow to specify director
containing expected files
The ecpg tests have their input directory in the build directory as the tests
need to be built. Until now that required copying the expected/ directory to
the build directory in VPATH builds. To avoid needing to implement the same
for the meson build, add support for specifying the expected directory/.
Remove the copying of ecpg's expected/ to the build dir in VPATH builds.
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/20220718202327.pspcqz5mwbi2yb7w@awork3.anarazel.de
---
src/interfaces/ecpg/test/Makefile | 28 ++++++++--------------
src/interfaces/ecpg/test/pg_regress_ecpg.c | 8 +++----
src/test/regress/pg_regress.c | 7 ++++++
src/test/regress/pg_regress.h | 1 +
4 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index 10f53c708c8..d7a7d1d1ca5 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -59,24 +59,16 @@ pg_regress_ecpg.o: pg_regress_ecpg.c $(top_builddir)/src/port/pg_config_paths.h
$(top_builddir)/src/port/pg_config_paths.h: $(top_builddir)/src/Makefile.global
$(MAKE) -C $(top_builddir)/src/port pg_config_paths.h
-# When doing a VPATH build, copy over the .pgc, .stdout and .stderr
-# files so that the driver script can find them. We have to use an
-# absolute path for the targets, because otherwise make will try to
-# locate the missing files using VPATH, and will find them in
-# $(srcdir), but the point here is that we want to copy them from
-# $(srcdir) to the build directory.
-
-ifdef VPATH
-remaining_files_src := $(wildcard $(srcdir)/*/*.pgc) $(wildcard $(srcdir)/expected/*.c) $(wildcard $(srcdir)/expected/*.stdout) $(wildcard $(srcdir)/expected/*.stderr)
-remaining_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, $(remaining_files_src))
-
-all: $(remaining_files_build)
-$(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
- ln -s $< $@
-endif
-
-# Common options for tests. Also pick up anything passed in EXTRA_REGRESS_OPTS
-REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
+# Common options for tests
+#
+# Need to specify expecteddir explicitly, as the inputdir is located in the
+# build directory, because the files need to be compiled. Other pg_regress
+# style tests have the expecteddir in the source directory.
+#
+# Also pick up anything passed in EXTRA_REGRESS_OPTS.
+REGRESS_OPTS = --expecteddir=$(srcdir) \
+ --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 \
+ $(EXTRA_REGRESS_OPTS)
check: all
$(with_temp_install) ./pg_regress $(REGRESS_OPTS) --temp-instance=./tmp_check $(TEMP_CONF) --bindir= $(pg_regress_locale_flags) $(THREAD) --schedule=$(srcdir)/ecpg_schedule sql/twophase
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index f920af4560c..84e45ceebe0 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -164,7 +164,7 @@ ecpg_start_test(const char *testname,
char *appnameenv;
snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname);
- snprintf(insource, sizeof(insource), "%s.c", testname);
+ snprintf(insource, sizeof(insource), "%s/%s.c", inputdir, testname);
/* make a version of the test name that has dashes in place of slashes */
initStringInfo(&testname_dash);
@@ -177,13 +177,13 @@ ecpg_start_test(const char *testname,
snprintf(expectfile_stdout, sizeof(expectfile_stdout),
"%s/expected/%s.stdout",
- outputdir, testname_dash.data);
+ expecteddir, testname_dash.data);
snprintf(expectfile_stderr, sizeof(expectfile_stderr),
"%s/expected/%s.stderr",
- outputdir, testname_dash.data);
+ expecteddir, testname_dash.data);
snprintf(expectfile_source, sizeof(expectfile_source),
"%s/expected/%s.c",
- outputdir, testname_dash.data);
+ expecteddir, testname_dash.data);
snprintf(outfile_stdout, sizeof(outfile_stdout),
"%s/results/%s.stdout",
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 04ab513b7cb..920974c1541 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -76,6 +76,7 @@ _stringlist *dblist = NULL;
bool debug = false;
char *inputdir = ".";
char *outputdir = ".";
+char *expecteddir = ".";
char *bindir = PGBINDIR;
char *launcher = NULL;
static _stringlist *loadextension = NULL;
@@ -1989,6 +1990,7 @@ help(void)
printf(_(" --debug turn on debug mode in programs that are run\n"));
printf(_(" --dlpath=DIR look for dynamic libraries in DIR\n"));
printf(_(" --encoding=ENCODING use ENCODING as the encoding\n"));
+ printf(_(" --expecteddir=DIR take expected files from DIR (default \".\")\n"));
printf(_(" -h, --help show this help, then exit\n"));
printf(_(" --inputdir=DIR take input files from DIR (default \".\")\n"));
printf(_(" --launcher=CMD use CMD as launcher of psql\n"));
@@ -2052,6 +2054,7 @@ regression_main(int argc, char *argv[],
{"load-extension", required_argument, NULL, 22},
{"config-auth", required_argument, NULL, 24},
{"max-concurrent-tests", required_argument, NULL, 25},
+ {"expecteddir", required_argument, NULL, 26},
{NULL, 0, NULL, 0}
};
@@ -2181,6 +2184,9 @@ regression_main(int argc, char *argv[],
case 25:
max_concurrent_tests = atoi(optarg);
break;
+ case 26:
+ expecteddir = pg_strdup(optarg);
+ break;
default:
/* getopt_long already emitted a complaint */
fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"),
@@ -2220,6 +2226,7 @@ regression_main(int argc, char *argv[],
inputdir = make_absolute_path(inputdir);
outputdir = make_absolute_path(outputdir);
+ expecteddir = make_absolute_path(expecteddir);
dlpath = make_absolute_path(dlpath);
/*
diff --git a/src/test/regress/pg_regress.h b/src/test/regress/pg_regress.h
index 2143ee0e727..d8772fec8ed 100644
--- a/src/test/regress/pg_regress.h
+++ b/src/test/regress/pg_regress.h
@@ -53,6 +53,7 @@ extern _stringlist *dblist;
extern bool debug;
extern char *inputdir;
extern char *outputdir;
+extern char *expecteddir;
extern char *launcher;
extern const char *basic_diff_opts;
--
2.37.0.3.g30cc8d0f14
v11-0002-meson-prereq-Don-t-add-HAVE_LDAP_H-HAVE_WINLDAP_.patch (text/x-diff, 4.5K) download
From 717a22e3e674e778da0d488dd26a01d7fa233ba6 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 5 Aug 2022 14:09:42 -0700
Subject: [PATCH v11 2/9] meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H
to pg_config.h.
They're not referenced.
---
src/include/pg_config.h.in | 6 ------
configure | 16 ++--------------
configure.ac | 12 ++++++------
src/tools/msvc/Solution.pm | 2 --
4 files changed, 8 insertions(+), 28 deletions(-)
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index fc5ad5fd658..dc8b13c0533 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -259,9 +259,6 @@
/* Define to 1 if you have the <langinfo.h> header file. */
#undef HAVE_LANGINFO_H
-/* Define to 1 if you have the <ldap.h> header file. */
-#undef HAVE_LDAP_H
-
/* Define to 1 if you have the `ldap_initialize' function. */
#undef HAVE_LDAP_INITIALIZE
@@ -589,9 +586,6 @@
/* Define to 1 if you have the `wcstombs_l' function. */
#undef HAVE_WCSTOMBS_L
-/* Define to 1 if you have the <winldap.h> header file. */
-#undef HAVE_WINLDAP_H
-
/* Define to 1 if you have the `X509_get_signature_nid' function. */
#undef HAVE_X509_GET_SIGNATURE_NID
diff --git a/configure b/configure
index cf2c4b85fe2..e527363a9c6 100755
--- a/configure
+++ b/configure
@@ -14311,19 +14311,13 @@ fi
if test "$with_ldap" = yes ; then
if test "$PORTNAME" != "win32"; then
- for ac_header in ldap.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "ldap.h" "ac_cv_header_ldap_h" "$ac_includes_default"
+ ac_fn_c_check_header_mongrel "$LINENO" "ldap.h" "ac_cv_header_ldap_h" "$ac_includes_default"
if test "x$ac_cv_header_ldap_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LDAP_H 1
-_ACEOF
else
as_fn_error $? "header file <ldap.h> is required for LDAP" "$LINENO" 5
fi
-done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compatible LDAP implementation" >&5
$as_echo_n "checking for compatible LDAP implementation... " >&6; }
@@ -14367,22 +14361,16 @@ $as_echo "$as_me: WARNING:
*** also uses LDAP will crash on exit." >&2;}
fi
else
- for ac_header in winldap.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "winldap.h" "ac_cv_header_winldap_h" "$ac_includes_default
+ ac_fn_c_check_header_compile "$LINENO" "winldap.h" "ac_cv_header_winldap_h" "$ac_includes_default
#include <windows.h>
"
if test "x$ac_cv_header_winldap_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_WINLDAP_H 1
-_ACEOF
else
as_fn_error $? "header file <winldap.h> is required for LDAP" "$LINENO" 5
fi
-done
fi
fi
diff --git a/configure.ac b/configure.ac
index b5798bcb0a1..1c392684bb8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1559,15 +1559,15 @@ fi
if test "$with_ldap" = yes ; then
if test "$PORTNAME" != "win32"; then
- AC_CHECK_HEADERS(ldap.h, [],
- [AC_MSG_ERROR([header file <ldap.h> is required for LDAP])])
+ AC_CHECK_HEADER(ldap.h, [],
+ [AC_MSG_ERROR([header file <ldap.h> is required for LDAP])])
PGAC_LDAP_SAFE
else
- AC_CHECK_HEADERS(winldap.h, [],
- [AC_MSG_ERROR([header file <winldap.h> is required for LDAP])],
- [AC_INCLUDES_DEFAULT
+ AC_CHECK_HEADER(winldap.h, [],
+ [AC_MSG_ERROR([header file <winldap.h> is required for LDAP])],
+ [AC_INCLUDES_DEFAULT
#include <windows.h>
- ])
+ ])
fi
fi
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index cc82668457f..e832bf0c814 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -283,7 +283,6 @@ sub GenerateFiles
HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P => undef,
HAVE_KQUEUE => undef,
HAVE_LANGINFO_H => undef,
- HAVE_LDAP_H => undef,
HAVE_LDAP_INITIALIZE => undef,
HAVE_LIBCRYPTO => undef,
HAVE_LIBLDAP => undef,
@@ -390,7 +389,6 @@ sub GenerateFiles
HAVE_UUID_OSSP => undef,
HAVE_UUID_H => undef,
HAVE_UUID_UUID_H => undef,
- HAVE_WINLDAP_H => undef,
HAVE_WCSTOMBS_L => 1,
HAVE_VISIBILITY_ATTRIBUTE => undef,
HAVE_X509_GET_SIGNATURE_NID => 1,
--
2.37.0.3.g30cc8d0f14
v11-0003-meson-prereq-Extend-gendef.pl-in-preparation-for.patch (text/x-diff, 4.7K) download
From b5fd87aa2f38001c81547346f576f9d599d57b18 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 9 Aug 2022 00:29:57 -0700
Subject: [PATCH v11 3/9] meson: prereq: Extend gendef.pl in preparation for
meson
The main issue with using gendef.pl as is for meson is that with meson the
filenames are a bit longer, exceeding the max commandline length when calling
dumpbin with all objects. It's easier to pass a library in anyway.
The .def file location, input and temporary file location need to be tunable
as well.
This also fixes a bug in gendef.pl: The logic when to regenerate was broken
and never avoid regenerating.
Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
src/tools/msvc/MSBuildProject.pm | 4 +-
src/tools/msvc/gendef.pl | 72 ++++++++++++++++++++++----------
2 files changed, 54 insertions(+), 22 deletions(-)
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index 62acdda3a19..3581fa4a123 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -312,6 +312,8 @@ sub WriteItemDefinitionGroup
my $targetmachine =
$self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64';
+ my $arch =
+ $self->{platform} eq 'Win32' ? 'x86' : 'x86_64';
my $includes = join ';', @{ $self->{includes} }, "";
@@ -381,7 +383,7 @@ EOF
print $f <<EOF;
<PreLinkEvent>
<Message>Generate DEF file</Message>
- <Command>perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform}</Command>
+ <Command>perl src\\tools\\msvc\\gendef.pl --arch $arch --deffile $cfgname\\$self->{name}\\$self->{name}.def $cfgname\\$self->{name}</Command>
</PreLinkEvent>
EOF
}
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index b8c514a8311..1e25c0e4d38 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -4,7 +4,8 @@
use strict;
use warnings;
use 5.8.0;
-use List::Util qw(max);
+use List::Util qw(min);
+use Getopt::Long;
my @def;
@@ -113,7 +114,7 @@ sub extract_syms
sub writedef
{
- my ($deffile, $platform, $def) = @_;
+ my ($deffile, $arch, $def) = @_;
open(my $fh, '>', $deffile) || die "Could not write to $deffile\n";
print $fh "EXPORTS\n";
foreach my $f (sort keys %{$def})
@@ -122,7 +123,7 @@ sub writedef
# Strip the leading underscore for win32, but not x64
$f =~ s/^_//
- unless ($platform eq "x64");
+ unless ($arch eq "x86_64");
# Emit just the name if it's a function symbol, or emit the name
# decorated with the DATA option for variables.
@@ -142,40 +143,69 @@ sub writedef
sub usage
{
- die( "Usage: gendef.pl <modulepath> <platform>\n"
- . " modulepath: path to dir with obj files, no trailing slash"
- . " platform: Win32 | x64");
+ my $add = shift;
+
+ die( "Usage: gendef.pl --arch <arch> --deffile <deffile> --tempdir <tempdir> files or directories\n"
+ . " arch: x86 | x86_64\n"
+ . " outfile: \n"
+ . " tempdir: directory for temporary objects\n"
+ . " $add\n"
+ );
}
-usage()
- unless scalar(@ARGV) == 2
- && ( ($ARGV[0] =~ /\\([^\\]+$)/)
- && ($ARGV[1] eq 'Win32' || $ARGV[1] eq 'x64'));
-my $defname = uc $1;
-my $deffile = "$ARGV[0]/$defname.def";
-my $platform = $ARGV[1];
+my $arch;
+my $deffile;
+my $tempdir = '.';
+
+GetOptions(
+ 'arch:s' => \$arch,
+ 'deffile:s' => \$deffile,
+ 'tempdir:s' => \$tempdir,
+ ) or die 'bluebeard';
+
+usage("arch: $arch") unless
+ ($arch eq 'x86' || $arch eq 'x86_64');
+
+print join(' ', @ARGV)."\n";
+
+my @files;
+
+foreach my $in (@ARGV)
+{
+ if (-d $in)
+ {
+ push @files, <$in/*.obj>;
+ }
+ else
+ {
+ push @files, $in;
+ }
+}
# if the def file exists and is newer than all input object files, skip
# its creation
if (-f $deffile
- && (-M $deffile > max(map { -M } <$ARGV[0]/*.obj>)))
+ && (-M $deffile < min(map { -M } @files)))
{
- print "Not re-generating $defname.DEF, file already exists.\n";
+ print "Not re-generating $deffile, file already exists.\n";
exit(0);
}
-print "Generating $defname.DEF from directory $ARGV[0], platform $platform\n";
+print STDERR "Generating $deffile in tempdir $tempdir\n";
my %def = ();
-my $symfile = "$ARGV[0]/all.sym";
-my $tmpfile = "$ARGV[0]/tmp.sym";
-system("dumpbin /symbols /out:$tmpfile $ARGV[0]/*.obj >NUL")
- && die "Could not call dumpbin";
+my $symfile = "$tempdir/all.sym";
+my $tmpfile = "$tempdir/tmp.sym";
+mkdir($tempdir) unless -d $tempdir;
+
+my $cmd = "dumpbin /symbols /out:$tmpfile ".join(' ', @files);
+
+system($cmd) && die "Could not call dumpbin";
rename($tmpfile, $symfile);
extract_syms($symfile, \%def);
print "\n";
-writedef($deffile, $platform, \%def);
+writedef($deffile, $arch, \%def);
print "Generated " . scalar(keys(%def)) . " symbols\n";
--
2.37.0.3.g30cc8d0f14
v11-0004-meson-prereq-Add-src-tools-gen_export.pl.patch (text/x-diff, 2.2K) download
From 468a52cfd74daef772b379630b0e6fef78ba52ec Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v11 4/9] meson: prereq: Add src/tools/gen_export.pl
Currently the logic is all in src/Makefile.shlib. This adds a sketch of a
generation script that can be used from meson.
---
src/tools/gen_export.pl | 83 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
create mode 100644 src/tools/gen_export.pl
diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
new file mode 100644
index 00000000000..6a8b196ad89
--- /dev/null
+++ b/src/tools/gen_export.pl
@@ -0,0 +1,83 @@
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $format;
+my $libname;
+my $input;
+my $output;
+
+GetOptions(
+ 'format:s' => \$format,
+ 'libname:s' => \$libname,
+ 'input:s' => \$input,
+ 'output:s' => \$output) or die "wrong arguments";
+
+if (not ($format eq 'aix' or $format eq 'darwin' or $format eq 'gnu' or $format eq 'win'))
+{
+ die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n";
+}
+
+open(my $input_handle, '<', $input)
+ or die "$0: could not open input file '$input': $!\n";
+
+open(my $output_handle, '>', $output)
+ or die "$0: could not open output file '$output': $!\n";
+
+
+if ($format eq 'gnu')
+{
+ print $output_handle "{
+ global:
+";
+}
+elsif ($format eq 'win')
+{
+ # XXX: Looks like specifying LIBRARY $libname is optional, which makes it
+ # easier to build a generic command for generating export files...
+ if ($libname)
+ {
+ print $output_handle "LIBRARY $libname\n";
+ }
+ print $output_handle "EXPORTS\n";
+}
+
+while (<$input_handle>)
+{
+ if (/^#/)
+ {
+ # don't do anything with a comment
+ }
+ elsif (/^([^\s]+)\s+([^\s]+)/)
+ {
+ if ($format eq 'aix')
+ {
+ print $output_handle " $1\n";
+ }
+ elsif ($format eq 'darwin')
+ {
+ print $output_handle " _$1\n";
+ }
+ elsif ($format eq 'gnu')
+ {
+ print $output_handle " $1;\n";
+ }
+ elsif ($format eq 'win')
+ {
+ print $output_handle " $1 @ $2\n";
+ }
+ }
+ else
+ {
+ die "$0: unexpected line $_\n";
+ }
+}
+
+if ($format eq 'gnu')
+{
+ print $output_handle " local: *;
+};
+";
+}
+
+exit(0);
--
2.37.0.3.g30cc8d0f14
v11-0005-meson-prereq-Refactor-PG_TEST_EXTRA-logic-in-aut.patch (text/x-diff, 4.0K) download
From 60fd52f6ba5a0f69af8f988308954d1a096db7dc Mon Sep 17 00:00:00 2001
From: nbyavuz <byavuz81@gmail.com>
Date: Fri, 25 Mar 2022 10:55:08 +0300
Subject: [PATCH v11 5/9] meson: prereq: Refactor PG_TEST_EXTRA logic in
autoconf build
---
src/test/Makefile | 15 +++++----------
src/test/kerberos/t/001_auth.pl | 4 ++++
src/test/ldap/t/001_auth.pl | 4 ++++
src/test/ssl/t/001_ssltests.pl | 4 ++++
src/test/ssl/t/002_scram.pl | 4 ++++
src/test/ssl/t/003_sslinfo.pl | 4 ++++
6 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/src/test/Makefile b/src/test/Makefile
index 69ef074d75e..dbd3192874d 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -17,25 +17,20 @@ SUBDIRS = perl regress isolation modules authentication recovery subscription
ifeq ($(with_icu),yes)
SUBDIRS += icu
endif
-
-# Test suites that are not safe by default but can be run if selected
-# by the user via the whitespace-separated list in variable
-# PG_TEST_EXTRA:
ifeq ($(with_gssapi),yes)
-ifneq (,$(filter kerberos,$(PG_TEST_EXTRA)))
SUBDIRS += kerberos
endif
-endif
ifeq ($(with_ldap),yes)
-ifneq (,$(filter ldap,$(PG_TEST_EXTRA)))
SUBDIRS += ldap
endif
-endif
ifeq ($(with_ssl),openssl)
-ifneq (,$(filter ssl,$(PG_TEST_EXTRA)))
SUBDIRS += ssl
endif
-endif
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA to check it in individual tap tests.
+export PG_TEST_EXTRA
# We don't build or execute these by default, but we do want "make
# clean" etc to recurse into them. (We must filter out those that we
diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl
index 62e05426393..e403d24c0c2 100644
--- a/src/test/kerberos/t/001_auth.pl
+++ b/src/test/kerberos/t/001_auth.pl
@@ -25,6 +25,10 @@ if ($ENV{with_gssapi} ne 'yes')
{
plan skip_all => 'GSSAPI/Kerberos not supported by this build';
}
+elsif ($ENV{PG_TEST_EXTRA} !~ /kerberos/)
+{
+ plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA';
+}
my ($krb5_bin_dir, $krb5_sbin_dir);
diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl
index 86dff8bd1f3..a5afddc5272 100644
--- a/src/test/ldap/t/001_auth.pl
+++ b/src/test/ldap/t/001_auth.pl
@@ -16,6 +16,10 @@ if ($ENV{with_ldap} ne 'yes')
{
plan skip_all => 'LDAP not supported by this build';
}
+elsif ($ENV{PG_TEST_EXTRA} !~ /ldap/)
+{
+ plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA';
+}
elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap')
{
# typical paths for Homebrew
diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl
index fa26212de9a..f58ff8d578b 100644
--- a/src/test/ssl/t/001_ssltests.pl
+++ b/src/test/ssl/t/001_ssltests.pl
@@ -17,6 +17,10 @@ if ($ENV{with_ssl} ne 'openssl')
{
plan skip_all => 'OpenSSL not supported by this build';
}
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+ plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
my $ssl_server = SSL::Server->new();
diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl
index 588f47a39b9..15d45c88e50 100644
--- a/src/test/ssl/t/002_scram.pl
+++ b/src/test/ssl/t/002_scram.pl
@@ -20,6 +20,10 @@ if ($ENV{with_ssl} ne 'openssl')
{
plan skip_all => 'OpenSSL not supported by this build';
}
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+ plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
my $ssl_server = SSL::Server->new();
diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl
index 87fb18a31e0..acd0ba8e828 100644
--- a/src/test/ssl/t/003_sslinfo.pl
+++ b/src/test/ssl/t/003_sslinfo.pl
@@ -18,6 +18,10 @@ if ($ENV{with_ssl} ne 'openssl')
{
plan skip_all => 'OpenSSL not supported by this build';
}
+elsif ($ENV{PG_TEST_EXTRA} !~ /ssl/)
+{
+ plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA';
+}
#### Some configuration
my $ssl_server = SSL::Server->new();
--
2.37.0.3.g30cc8d0f14
v11-0006-wip-split-TESTDIR-into-two.patch (text/x-diff, 5.9K) download
From f107bef0bc1fb5e1bbec53213c03924921dac4c0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 14 Feb 2022 21:47:07 -0800
Subject: [PATCH v11 6/9] wip: split TESTDIR into two
---
src/bin/psql/t/010_tab_completion.pl | 34 +++++++++++++-------------
src/test/perl/PostgreSQL/Test/Utils.pm | 2 +-
src/Makefile.global.in | 9 ++++---
src/tools/msvc/vcregress.pl | 2 ++
4 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 2eea515e871..1e4e79fe7e1 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -70,23 +70,23 @@ delete $ENV{LS_COLORS};
# to run in the build directory so that we can use relative paths to
# access the tmp_check subdirectory; otherwise the output from filename
# completion tests is too variable.
-if ($ENV{TESTDIR})
+if ($ENV{TESTOUTDIR})
{
- chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+ chdir "$ENV{TESTOUTDIR}" or die "could not chdir to \"$ENV{TESTOUTDIR}\": $!";
}
# Create some junk files for filename completion testing.
my $FH;
-open $FH, ">", "tmp_check/somefile"
- or die("could not create file \"tmp_check/somefile\": $!");
+open $FH, ">", "somefile"
+ or die("could not create file \"somefile\": $!");
print $FH "some stuff\n";
close $FH;
-open $FH, ">", "tmp_check/afile123"
- or die("could not create file \"tmp_check/afile123\": $!");
+open $FH, ">", "afile123"
+ or die("could not create file \"afile123\": $!");
print $FH "more stuff\n";
close $FH;
-open $FH, ">", "tmp_check/afile456"
- or die("could not create file \"tmp_check/afile456\": $!");
+open $FH, ">", "afile456"
+ or die("could not create file \"afile456\": $!");
print $FH "other stuff\n";
close $FH;
@@ -272,16 +272,16 @@ clear_query();
# check filename completion
check_completion(
- "\\lo_import tmp_check/some\t",
- qr|tmp_check/somefile |,
+ "\\lo_import some\t",
+ qr|somefile |,
"filename completion with one possibility");
clear_query();
# note: readline might print a bell before the completion
check_completion(
- "\\lo_import tmp_check/af\t",
- qr|tmp_check/af\a?ile|,
+ "\\lo_import af\t",
+ qr|af\a?ile|,
"filename completion with multiple possibilities");
# broken versions of libedit require clear_line not clear_query here
@@ -291,15 +291,15 @@ clear_line();
# note: broken versions of libedit want to backslash the closing quote;
# not much we can do about that
check_completion(
- "COPY foo FROM tmp_check/some\t",
- qr|'tmp_check/somefile\\?' |,
+ "COPY foo FROM some\t",
+ qr|'somefile\\?' |,
"quoted filename completion with one possibility");
clear_line();
check_completion(
- "COPY foo FROM tmp_check/af\t",
- qr|'tmp_check/afile|,
+ "COPY foo FROM af\t",
+ qr|'afile|,
"quoted filename completion with multiple possibilities");
# some versions of readline/libedit require two tabs here, some only need one
@@ -307,7 +307,7 @@ check_completion(
# the quotes might appear, too
check_completion(
"\t\t",
- qr|afile123'? +'?(tmp_check/)?afile456|,
+ qr|afile123'? +'?afile456|,
"offer multiple file choices");
clear_line();
diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm
index 1ca2cc59170..24017a82955 100644
--- a/src/test/perl/PostgreSQL/Test/Utils.pm
+++ b/src/test/perl/PostgreSQL/Test/Utils.pm
@@ -192,7 +192,7 @@ INIT
# Determine output directories, and create them. The base path is the
# TESTDIR environment variable, which is normally set by the invoking
# Makefile.
- $tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check";
+ $tmp_check = $ENV{TESTOUTDIR} ? "$ENV{TESTOUTDIR}" : "tmp_check";
$log_path = "$tmp_check/log";
mkdir $tmp_check;
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 0625b60c434..d8319626d8b 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -454,7 +454,8 @@ echo "+++ tap install-check in $(subdir) +++" && \
rm -rf '$(CURDIR)'/tmp_check && \
$(MKDIR_P) '$(CURDIR)'/tmp_check && \
cd $(srcdir) && \
- TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
+ TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+ PATH="$(bindir):$(CURDIR):$$PATH" \
PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' \
PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
$(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
@@ -465,8 +466,9 @@ echo "+++ tap install-check in $(subdir) +++" && \
rm -rf '$(CURDIR)'/tmp_check && \
$(MKDIR_P) '$(CURDIR)'/tmp_check && \
cd $(srcdir) && \
- TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \
- PGPORT='6$(DEF_PGPORT)' top_builddir='$(top_builddir)' \
+ TESTOUTDIR='$(CURDIR)/tmp_check' TESTDIR='$(CURDIR)' \
+ PATH="$(bindir):$(CURDIR):$$PATH" PGPORT='6$(DEF_PGPORT)' \
+ top_builddir='$(top_builddir)' \
PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \
$(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
endef
@@ -477,6 +479,7 @@ echo "+++ tap check in $(subdir) +++" && \
rm -rf '$(CURDIR)'/tmp_check && \
$(MKDIR_P) '$(CURDIR)'/tmp_check && \
cd $(srcdir) && \
+ TESTOUTDIR='$(CURDIR)/tmp_check' \
TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \
PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \
$(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index c3729f6be5e..6f07a31464d 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -296,6 +296,8 @@ sub tap_check
# add the module build dir as the second element in the PATH
$ENV{PATH} =~ s!;!;$topdir/$Config/$module;!;
+ $ENV{TESTOUTDIR} = "$dir/tmp_check";
+
rmtree('tmp_check');
system(@args);
my $status = $? >> 8;
--
2.37.0.3.g30cc8d0f14
v11-0007-meson-prereq-fix-warning-compat_informix-rnull.p.patch (text/x-diff, 1.4K) download
From 22f6b3c1c0eb2d562eb178d78255304a58266126 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 8 Aug 2022 21:01:39 -0700
Subject: [PATCH v11 7/9] meson: prereq: fix warning compat_informix/rnull.pgc
with msvc
src/interfaces/ecpg/test/compat_informix/rnull.pgc(19,1): warning C4305: 'initializing': truncation from 'double' to 'float'
---
src/interfaces/ecpg/test/compat_informix/rnull.pgc | 2 +-
src/interfaces/ecpg/test/expected/compat_informix-rnull.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/interfaces/ecpg/test/compat_informix/rnull.pgc b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
index a6ad35e3bc9..232629fcd4a 100644
--- a/src/interfaces/ecpg/test/compat_informix/rnull.pgc
+++ b/src/interfaces/ecpg/test/compat_informix/rnull.pgc
@@ -16,7 +16,7 @@ int main(void)
$short s = 17;
$int i = -74874;
$bool b = 1;
- $float f = 3.71;
+ $float f = (float) 3.71;
$long l = 487444;
$double dbl = 404.404;
$decimal dec;
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
index d7ba69c1fbf..3efb2be117b 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-rnull.c
@@ -58,7 +58,7 @@ int main(void)
#line 19 "rnull.pgc"
- float f = 3.71 ;
+ float f = ( float ) 3.71 ;
#line 19 "rnull.pgc"
--
2.37.0.3.g30cc8d0f14
v11-0008-meson-Add-meson-based-buildsystem.patch (text/x-diff, 366.4K) download
From cad29ca4616c2b36f488563a0bcf3d3cac642ce0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 19 Jan 2022 23:36:50 -0800
Subject: [PATCH v11 8/9] meson: Add meson based buildsystem
Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Peter Eisentraut <peter@eisentraut.org>
Author: Thomas Munro <thomas.munro@gmail.com>
Author: John Naylor <john.naylor@enterprisedb.com>
Author: Stone Tickle <lattis@mochiro.moe>
---
src/include/catalog/meson.build | 142 +
src/include/meson.build | 175 +
src/include/nodes/meson.build | 58 +
src/include/parser/meson.build | 14 +
src/include/pch/c_pch.h | 1 +
src/include/pch/meson.build | 3 +
src/include/pch/postgres_pch.h | 1 +
src/include/pg_config_ext.h.meson | 7 +
src/include/storage/meson.build | 15 +
src/include/utils/meson.build | 51 +
src/common/meson.build | 176 +
src/common/unicode/meson.build | 101 +
src/port/meson.build | 187 +
src/port/win32ver.rc.in | 41 +
config/meson.build | 4 +
src/backend/access/brin/meson.build | 12 +
src/backend/access/common/meson.build | 18 +
src/backend/access/gin/meson.build | 17 +
src/backend/access/gist/meson.build | 13 +
src/backend/access/hash/meson.build | 12 +
src/backend/access/heap/meson.build | 11 +
src/backend/access/index/meson.build | 6 +
src/backend/access/meson.build | 13 +
src/backend/access/nbtree/meson.build | 13 +
src/backend/access/rmgrdesc/meson.build | 26 +
src/backend/access/spgist/meson.build | 13 +
src/backend/access/table/meson.build | 6 +
src/backend/access/tablesample/meson.build | 5 +
src/backend/access/transam/meson.build | 31 +
src/backend/backup/meson.build | 13 +
src/backend/bootstrap/meson.build | 13 +
src/backend/catalog/meson.build | 44 +
src/backend/commands/meson.build | 51 +
src/backend/executor/meson.build | 67 +
src/backend/foreign/meson.build | 3 +
src/backend/jit/llvm/meson.build | 41 +
src/backend/jit/meson.build | 3 +
src/backend/lib/meson.build | 12 +
src/backend/libpq/meson.build | 32 +
src/backend/main/meson.build | 2 +
src/backend/meson.build | 322 ++
src/backend/nodes/meson.build | 30 +
src/backend/optimizer/geqo/meson.build | 17 +
src/backend/optimizer/meson.build | 5 +
src/backend/optimizer/path/meson.build | 11 +
src/backend/optimizer/plan/meson.build | 10 +
src/backend/optimizer/prep/meson.build | 7 +
src/backend/optimizer/util/meson.build | 16 +
src/backend/parser/meson.build | 49 +
src/backend/partitioning/meson.build | 5 +
src/backend/po/meson.build | 1 +
src/backend/port/meson.build | 31 +
src/backend/port/win32/meson.build | 6 +
src/backend/postmaster/meson.build | 15 +
src/backend/regex/meson.build | 8 +
.../replication/libpqwalreceiver/meson.build | 13 +
src/backend/replication/logical/meson.build | 14 +
src/backend/replication/meson.build | 42 +
src/backend/replication/pgoutput/meson.build | 11 +
src/backend/rewrite/meson.build | 9 +
src/backend/snowball/meson.build | 85 +
src/backend/statistics/meson.build | 6 +
src/backend/storage/buffer/meson.build | 7 +
src/backend/storage/file/meson.build | 8 +
src/backend/storage/freespace/meson.build | 5 +
src/backend/storage/ipc/meson.build | 20 +
src/backend/storage/large_object/meson.build | 3 +
src/backend/storage/lmgr/meson.build | 13 +
src/backend/storage/meson.build | 9 +
src/backend/storage/page/meson.build | 5 +
src/backend/storage/smgr/meson.build | 4 +
src/backend/storage/sync/meson.build | 4 +
src/backend/tcop/meson.build | 8 +
src/backend/tsearch/meson.build | 21 +
src/backend/utils/activity/meson.build | 18 +
src/backend/utils/adt/meson.build | 120 +
src/backend/utils/cache/meson.build | 16 +
src/backend/utils/error/meson.build | 6 +
src/backend/utils/fmgr/meson.build | 8 +
src/backend/utils/hash/meson.build | 4 +
src/backend/utils/init/meson.build | 4 +
.../utils/mb/conversion_procs/meson.build | 38 +
src/backend/utils/mb/meson.build | 9 +
src/backend/utils/meson.build | 17 +
src/backend/utils/misc/meson.build | 33 +
src/backend/utils/mmgr/meson.build | 10 +
src/backend/utils/resowner/meson.build | 3 +
src/backend/utils/sort/meson.build | 9 +
src/backend/utils/time/meson.build | 4 +
src/fe_utils/meson.build | 30 +
src/bin/initdb/meson.build | 39 +
src/bin/initdb/po/meson.build | 1 +
src/bin/meson.build | 20 +
src/bin/pg_amcheck/meson.build | 26 +
src/bin/pg_amcheck/po/meson.build | 1 +
src/bin/pg_archivecleanup/meson.build | 18 +
src/bin/pg_archivecleanup/po/meson.build | 1 +
src/bin/pg_basebackup/meson.build | 58 +
src/bin/pg_basebackup/po/meson.build | 1 +
src/bin/pg_checksums/meson.build | 20 +
src/bin/pg_checksums/po/meson.build | 1 +
src/bin/pg_config/meson.build | 18 +
src/bin/pg_config/po/meson.build | 1 +
src/bin/pg_controldata/meson.build | 18 +
src/bin/pg_controldata/po/meson.build | 1 +
src/bin/pg_ctl/meson.build | 21 +
src/bin/pg_ctl/po/meson.build | 1 +
src/bin/pg_dump/meson.build | 84 +
src/bin/pg_dump/po/meson.build | 1 +
src/bin/pg_resetwal/meson.build | 19 +
src/bin/pg_resetwal/po/meson.build | 1 +
src/bin/pg_rewind/meson.build | 39 +
src/bin/pg_rewind/po/meson.build | 1 +
src/bin/pg_test_fsync/meson.build | 18 +
src/bin/pg_test_fsync/po/meson.build | 1 +
src/bin/pg_test_timing/meson.build | 18 +
src/bin/pg_test_timing/po/meson.build | 1 +
src/bin/pg_upgrade/meson.build | 40 +
src/bin/pg_upgrade/po/meson.build | 1 +
src/bin/pg_verifybackup/meson.build | 32 +
src/bin/pg_verifybackup/po/meson.build | 1 +
src/bin/pg_waldump/meson.build | 28 +
src/bin/pg_waldump/po/meson.build | 1 +
src/bin/pgbench/meson.build | 42 +
src/bin/pgevent/meson.build | 38 +
src/bin/psql/meson.build | 72 +
src/bin/psql/po/meson.build | 1 +
src/bin/scripts/meson.build | 50 +
src/bin/scripts/po/meson.build | 1 +
src/interfaces/libpq/meson.build | 103 +
src/interfaces/libpq/po/meson.build | 1 +
src/interfaces/libpq/test/meson.build | 15 +
src/pl/meson.build | 5 +
src/pl/plperl/meson.build | 92 +
src/pl/plperl/po/meson.build | 1 +
src/pl/plpgsql/meson.build | 1 +
src/pl/plpgsql/src/meson.build | 83 +
src/pl/plpgsql/src/po/meson.build | 1 +
src/pl/plpython/meson.build | 99 +
src/pl/plpython/po/meson.build | 1 +
src/pl/tcl/meson.build | 55 +
src/pl/tcl/po/meson.build | 1 +
contrib/adminpack/meson.build | 22 +
contrib/amcheck/meson.build | 36 +
contrib/auth_delay/meson.build | 4 +
contrib/auto_explain/meson.build | 15 +
contrib/basebackup_to_shell/meson.build | 22 +
contrib/basic_archive/meson.build | 23 +
contrib/bloom/meson.build | 36 +
contrib/bool_plperl/meson.build | 39 +
contrib/btree_gin/meson.build | 53 +
contrib/btree_gist/meson.build | 84 +
contrib/citext/meson.build | 33 +
contrib/cube/meson.build | 52 +
contrib/dblink/meson.build | 30 +
contrib/dict_int/meson.build | 21 +
contrib/dict_xsyn/meson.build | 28 +
contrib/earthdistance/meson.build | 22 +
contrib/file_fdw/meson.build | 21 +
contrib/fuzzystrmatch/meson.build | 25 +
contrib/hstore/meson.build | 44 +
contrib/hstore_plperl/meson.build | 40 +
contrib/hstore_plpython/meson.build | 36 +
contrib/intagg/meson.build | 6 +
contrib/intarray/meson.build | 36 +
contrib/isn/meson.build | 32 +
contrib/jsonb_plperl/meson.build | 40 +
contrib/jsonb_plpython/meson.build | 35 +
contrib/lo/meson.build | 26 +
contrib/ltree/meson.build | 43 +
contrib/ltree_plpython/meson.build | 36 +
contrib/meson.build | 66 +
contrib/oid2name/meson.build | 16 +
contrib/old_snapshot/meson.build | 14 +
contrib/pageinspect/meson.build | 59 +
contrib/passwordcheck/meson.build | 29 +
contrib/pg_buffercache/meson.build | 27 +
contrib/pg_freespacemap/meson.build | 29 +
contrib/pg_prewarm/meson.build | 27 +
contrib/pg_stat_statements/meson.build | 34 +
contrib/pg_surgery/meson.build | 25 +
contrib/pg_trgm/meson.build | 35 +
contrib/pg_visibility/meson.build | 27 +
contrib/pg_walinspect/meson.build | 37 +
contrib/pgcrypto/meson.build | 100 +
contrib/pgrowlocks/meson.build | 15 +
contrib/pgstattuple/meson.build | 32 +
contrib/postgres_fdw/meson.build | 33 +
contrib/seg/meson.build | 50 +
contrib/sepgsql/meson.build | 34 +
contrib/spi/meson.build | 47 +
contrib/sslinfo/meson.build | 21 +
contrib/tablefunc/meson.build | 25 +
contrib/tcn/meson.build | 24 +
contrib/test_decoding/meson.build | 62 +
contrib/tsm_system_rows/meson.build | 24 +
contrib/tsm_system_time/meson.build | 24 +
contrib/unaccent/meson.build | 32 +
contrib/uuid-ossp/meson.build | 33 +
contrib/vacuumlo/meson.build | 16 +
contrib/xml2/meson.build | 32 +
src/interfaces/ecpg/compatlib/meson.build | 19 +
src/interfaces/ecpg/ecpglib/meson.build | 34 +
src/interfaces/ecpg/ecpglib/po/meson.build | 1 +
src/interfaces/ecpg/include/meson.build | 51 +
src/interfaces/ecpg/meson.build | 5 +
src/interfaces/ecpg/pgtypeslib/meson.build | 27 +
src/interfaces/ecpg/preproc/meson.build | 104 +
src/interfaces/ecpg/preproc/po/meson.build | 1 +
.../ecpg/test/compat_informix/meson.build | 31 +
.../ecpg/test/compat_oracle/meson.build | 20 +
src/interfaces/ecpg/test/connect/meson.build | 22 +
src/interfaces/ecpg/test/meson.build | 77 +
.../ecpg/test/pgtypeslib/meson.build | 21 +
src/interfaces/ecpg/test/preproc/meson.build | 38 +
src/interfaces/ecpg/test/sql/meson.build | 46 +
src/interfaces/ecpg/test/thread/meson.build | 21 +
src/interfaces/meson.build | 2 +
doc/src/sgml/meson.build | 258 ++
doc/src/sgml/resolv.xsl | 7 +
doc/src/sgml/version.sgml.in | 2 +
src/test/authentication/meson.build | 11 +
src/test/icu/meson.build | 11 +
src/test/isolation/meson.build | 54 +
src/test/kerberos/meson.build | 15 +
src/test/ldap/meson.build | 11 +
src/test/meson.build | 23 +
src/test/modules/brin/meson.build | 16 +
src/test/modules/commit_ts/meson.build | 18 +
src/test/modules/delay_execution/meson.build | 17 +
src/test/modules/dummy_index_am/meson.build | 22 +
src/test/modules/dummy_seclabel/meson.build | 22 +
src/test/modules/libpq_pipeline/meson.build | 20 +
src/test/modules/meson.build | 27 +
src/test/modules/plsample/meson.build | 22 +
src/test/modules/snapshot_too_old/meson.build | 14 +
src/test/modules/spgist_name_ops/meson.build | 22 +
.../ssl_passphrase_callback/meson.build | 47 +
src/test/modules/test_bloomfilter/meson.build | 22 +
src/test/modules/test_ddl_deparse/meson.build | 42 +
src/test/modules/test_extensions/meson.build | 45 +
.../modules/test_ginpostinglist/meson.build | 22 +
src/test/modules/test_integerset/meson.build | 22 +
src/test/modules/test_lfind/meson.build | 22 +
src/test/modules/test_misc/meson.build | 12 +
src/test/modules/test_oat_hooks/meson.build | 17 +
src/test/modules/test_parser/meson.build | 22 +
src/test/modules/test_pg_dump/meson.build | 22 +
src/test/modules/test_predtest/meson.build | 22 +
src/test/modules/test_rbtree/meson.build | 22 +
src/test/modules/test_regex/meson.build | 23 +
src/test/modules/test_rls_hooks/meson.build | 16 +
src/test/modules/test_shm_mq/meson.build | 26 +
src/test/modules/unsafe_tests/meson.build | 11 +
src/test/modules/worker_spi/meson.build | 25 +
src/test/recovery/meson.build | 43 +
src/test/regress/meson.build | 58 +
src/test/ssl/meson.build | 13 +
src/test/subscription/meson.build | 42 +
configure | 6 +
configure.ac | 6 +
conversion_helpers.txt | 9 +
meson.build | 3020 +++++++++++++++++
meson_options.txt | 175 +
src/meson.build | 271 ++
src/timezone/meson.build | 53 +
src/timezone/tznames/meson.build | 21 +
src/tools/find_meson | 27 +
src/tools/irlink | 39 +
src/tools/pgflex | 63 +
src/tools/rcgen | 34 +
.../relativize_shared_library_references | 84 +
src/tools/relpath.py | 6 +
src/tools/testwrap | 46 +
274 files changed, 11333 insertions(+)
create mode 100644 src/include/catalog/meson.build
create mode 100644 src/include/meson.build
create mode 100644 src/include/nodes/meson.build
create mode 100644 src/include/parser/meson.build
create mode 100644 src/include/pch/c_pch.h
create mode 100644 src/include/pch/meson.build
create mode 100644 src/include/pch/postgres_pch.h
create mode 100644 src/include/pg_config_ext.h.meson
create mode 100644 src/include/storage/meson.build
create mode 100644 src/include/utils/meson.build
create mode 100644 src/common/meson.build
create mode 100644 src/common/unicode/meson.build
create mode 100644 src/port/meson.build
create mode 100644 src/port/win32ver.rc.in
create mode 100644 config/meson.build
create mode 100644 src/backend/access/brin/meson.build
create mode 100644 src/backend/access/common/meson.build
create mode 100644 src/backend/access/gin/meson.build
create mode 100644 src/backend/access/gist/meson.build
create mode 100644 src/backend/access/hash/meson.build
create mode 100644 src/backend/access/heap/meson.build
create mode 100644 src/backend/access/index/meson.build
create mode 100644 src/backend/access/meson.build
create mode 100644 src/backend/access/nbtree/meson.build
create mode 100644 src/backend/access/rmgrdesc/meson.build
create mode 100644 src/backend/access/spgist/meson.build
create mode 100644 src/backend/access/table/meson.build
create mode 100644 src/backend/access/tablesample/meson.build
create mode 100644 src/backend/access/transam/meson.build
create mode 100644 src/backend/backup/meson.build
create mode 100644 src/backend/bootstrap/meson.build
create mode 100644 src/backend/catalog/meson.build
create mode 100644 src/backend/commands/meson.build
create mode 100644 src/backend/executor/meson.build
create mode 100644 src/backend/foreign/meson.build
create mode 100644 src/backend/jit/llvm/meson.build
create mode 100644 src/backend/jit/meson.build
create mode 100644 src/backend/lib/meson.build
create mode 100644 src/backend/libpq/meson.build
create mode 100644 src/backend/main/meson.build
create mode 100644 src/backend/meson.build
create mode 100644 src/backend/nodes/meson.build
create mode 100644 src/backend/optimizer/geqo/meson.build
create mode 100644 src/backend/optimizer/meson.build
create mode 100644 src/backend/optimizer/path/meson.build
create mode 100644 src/backend/optimizer/plan/meson.build
create mode 100644 src/backend/optimizer/prep/meson.build
create mode 100644 src/backend/optimizer/util/meson.build
create mode 100644 src/backend/parser/meson.build
create mode 100644 src/backend/partitioning/meson.build
create mode 100644 src/backend/po/meson.build
create mode 100644 src/backend/port/meson.build
create mode 100644 src/backend/port/win32/meson.build
create mode 100644 src/backend/postmaster/meson.build
create mode 100644 src/backend/regex/meson.build
create mode 100644 src/backend/replication/libpqwalreceiver/meson.build
create mode 100644 src/backend/replication/logical/meson.build
create mode 100644 src/backend/replication/meson.build
create mode 100644 src/backend/replication/pgoutput/meson.build
create mode 100644 src/backend/rewrite/meson.build
create mode 100644 src/backend/snowball/meson.build
create mode 100644 src/backend/statistics/meson.build
create mode 100644 src/backend/storage/buffer/meson.build
create mode 100644 src/backend/storage/file/meson.build
create mode 100644 src/backend/storage/freespace/meson.build
create mode 100644 src/backend/storage/ipc/meson.build
create mode 100644 src/backend/storage/large_object/meson.build
create mode 100644 src/backend/storage/lmgr/meson.build
create mode 100644 src/backend/storage/meson.build
create mode 100644 src/backend/storage/page/meson.build
create mode 100644 src/backend/storage/smgr/meson.build
create mode 100644 src/backend/storage/sync/meson.build
create mode 100644 src/backend/tcop/meson.build
create mode 100644 src/backend/tsearch/meson.build
create mode 100644 src/backend/utils/activity/meson.build
create mode 100644 src/backend/utils/adt/meson.build
create mode 100644 src/backend/utils/cache/meson.build
create mode 100644 src/backend/utils/error/meson.build
create mode 100644 src/backend/utils/fmgr/meson.build
create mode 100644 src/backend/utils/hash/meson.build
create mode 100644 src/backend/utils/init/meson.build
create mode 100644 src/backend/utils/mb/conversion_procs/meson.build
create mode 100644 src/backend/utils/mb/meson.build
create mode 100644 src/backend/utils/meson.build
create mode 100644 src/backend/utils/misc/meson.build
create mode 100644 src/backend/utils/mmgr/meson.build
create mode 100644 src/backend/utils/resowner/meson.build
create mode 100644 src/backend/utils/sort/meson.build
create mode 100644 src/backend/utils/time/meson.build
create mode 100644 src/fe_utils/meson.build
create mode 100644 src/bin/initdb/meson.build
create mode 100644 src/bin/initdb/po/meson.build
create mode 100644 src/bin/meson.build
create mode 100644 src/bin/pg_amcheck/meson.build
create mode 100644 src/bin/pg_amcheck/po/meson.build
create mode 100644 src/bin/pg_archivecleanup/meson.build
create mode 100644 src/bin/pg_archivecleanup/po/meson.build
create mode 100644 src/bin/pg_basebackup/meson.build
create mode 100644 src/bin/pg_basebackup/po/meson.build
create mode 100644 src/bin/pg_checksums/meson.build
create mode 100644 src/bin/pg_checksums/po/meson.build
create mode 100644 src/bin/pg_config/meson.build
create mode 100644 src/bin/pg_config/po/meson.build
create mode 100644 src/bin/pg_controldata/meson.build
create mode 100644 src/bin/pg_controldata/po/meson.build
create mode 100644 src/bin/pg_ctl/meson.build
create mode 100644 src/bin/pg_ctl/po/meson.build
create mode 100644 src/bin/pg_dump/meson.build
create mode 100644 src/bin/pg_dump/po/meson.build
create mode 100644 src/bin/pg_resetwal/meson.build
create mode 100644 src/bin/pg_resetwal/po/meson.build
create mode 100644 src/bin/pg_rewind/meson.build
create mode 100644 src/bin/pg_rewind/po/meson.build
create mode 100644 src/bin/pg_test_fsync/meson.build
create mode 100644 src/bin/pg_test_fsync/po/meson.build
create mode 100644 src/bin/pg_test_timing/meson.build
create mode 100644 src/bin/pg_test_timing/po/meson.build
create mode 100644 src/bin/pg_upgrade/meson.build
create mode 100644 src/bin/pg_upgrade/po/meson.build
create mode 100644 src/bin/pg_verifybackup/meson.build
create mode 100644 src/bin/pg_verifybackup/po/meson.build
create mode 100644 src/bin/pg_waldump/meson.build
create mode 100644 src/bin/pg_waldump/po/meson.build
create mode 100644 src/bin/pgbench/meson.build
create mode 100644 src/bin/pgevent/meson.build
create mode 100644 src/bin/psql/meson.build
create mode 100644 src/bin/psql/po/meson.build
create mode 100644 src/bin/scripts/meson.build
create mode 100644 src/bin/scripts/po/meson.build
create mode 100644 src/interfaces/libpq/meson.build
create mode 100644 src/interfaces/libpq/po/meson.build
create mode 100644 src/interfaces/libpq/test/meson.build
create mode 100644 src/pl/meson.build
create mode 100644 src/pl/plperl/meson.build
create mode 100644 src/pl/plperl/po/meson.build
create mode 100644 src/pl/plpgsql/meson.build
create mode 100644 src/pl/plpgsql/src/meson.build
create mode 100644 src/pl/plpgsql/src/po/meson.build
create mode 100644 src/pl/plpython/meson.build
create mode 100644 src/pl/plpython/po/meson.build
create mode 100644 src/pl/tcl/meson.build
create mode 100644 src/pl/tcl/po/meson.build
create mode 100644 contrib/adminpack/meson.build
create mode 100644 contrib/amcheck/meson.build
create mode 100644 contrib/auth_delay/meson.build
create mode 100644 contrib/auto_explain/meson.build
create mode 100644 contrib/basebackup_to_shell/meson.build
create mode 100644 contrib/basic_archive/meson.build
create mode 100644 contrib/bloom/meson.build
create mode 100644 contrib/bool_plperl/meson.build
create mode 100644 contrib/btree_gin/meson.build
create mode 100644 contrib/btree_gist/meson.build
create mode 100644 contrib/citext/meson.build
create mode 100644 contrib/cube/meson.build
create mode 100644 contrib/dblink/meson.build
create mode 100644 contrib/dict_int/meson.build
create mode 100644 contrib/dict_xsyn/meson.build
create mode 100644 contrib/earthdistance/meson.build
create mode 100644 contrib/file_fdw/meson.build
create mode 100644 contrib/fuzzystrmatch/meson.build
create mode 100644 contrib/hstore/meson.build
create mode 100644 contrib/hstore_plperl/meson.build
create mode 100644 contrib/hstore_plpython/meson.build
create mode 100644 contrib/intagg/meson.build
create mode 100644 contrib/intarray/meson.build
create mode 100644 contrib/isn/meson.build
create mode 100644 contrib/jsonb_plperl/meson.build
create mode 100644 contrib/jsonb_plpython/meson.build
create mode 100644 contrib/lo/meson.build
create mode 100644 contrib/ltree/meson.build
create mode 100644 contrib/ltree_plpython/meson.build
create mode 100644 contrib/meson.build
create mode 100644 contrib/oid2name/meson.build
create mode 100644 contrib/old_snapshot/meson.build
create mode 100644 contrib/pageinspect/meson.build
create mode 100644 contrib/passwordcheck/meson.build
create mode 100644 contrib/pg_buffercache/meson.build
create mode 100644 contrib/pg_freespacemap/meson.build
create mode 100644 contrib/pg_prewarm/meson.build
create mode 100644 contrib/pg_stat_statements/meson.build
create mode 100644 contrib/pg_surgery/meson.build
create mode 100644 contrib/pg_trgm/meson.build
create mode 100644 contrib/pg_visibility/meson.build
create mode 100644 contrib/pg_walinspect/meson.build
create mode 100644 contrib/pgcrypto/meson.build
create mode 100644 contrib/pgrowlocks/meson.build
create mode 100644 contrib/pgstattuple/meson.build
create mode 100644 contrib/postgres_fdw/meson.build
create mode 100644 contrib/seg/meson.build
create mode 100644 contrib/sepgsql/meson.build
create mode 100644 contrib/spi/meson.build
create mode 100644 contrib/sslinfo/meson.build
create mode 100644 contrib/tablefunc/meson.build
create mode 100644 contrib/tcn/meson.build
create mode 100644 contrib/test_decoding/meson.build
create mode 100644 contrib/tsm_system_rows/meson.build
create mode 100644 contrib/tsm_system_time/meson.build
create mode 100644 contrib/unaccent/meson.build
create mode 100644 contrib/uuid-ossp/meson.build
create mode 100644 contrib/vacuumlo/meson.build
create mode 100644 contrib/xml2/meson.build
create mode 100644 src/interfaces/ecpg/compatlib/meson.build
create mode 100644 src/interfaces/ecpg/ecpglib/meson.build
create mode 100644 src/interfaces/ecpg/ecpglib/po/meson.build
create mode 100644 src/interfaces/ecpg/include/meson.build
create mode 100644 src/interfaces/ecpg/meson.build
create mode 100644 src/interfaces/ecpg/pgtypeslib/meson.build
create mode 100644 src/interfaces/ecpg/preproc/meson.build
create mode 100644 src/interfaces/ecpg/preproc/po/meson.build
create mode 100644 src/interfaces/ecpg/test/compat_informix/meson.build
create mode 100644 src/interfaces/ecpg/test/compat_oracle/meson.build
create mode 100644 src/interfaces/ecpg/test/connect/meson.build
create mode 100644 src/interfaces/ecpg/test/meson.build
create mode 100644 src/interfaces/ecpg/test/pgtypeslib/meson.build
create mode 100644 src/interfaces/ecpg/test/preproc/meson.build
create mode 100644 src/interfaces/ecpg/test/sql/meson.build
create mode 100644 src/interfaces/ecpg/test/thread/meson.build
create mode 100644 src/interfaces/meson.build
create mode 100644 doc/src/sgml/meson.build
create mode 100644 doc/src/sgml/resolv.xsl
create mode 100644 doc/src/sgml/version.sgml.in
create mode 100644 src/test/authentication/meson.build
create mode 100644 src/test/icu/meson.build
create mode 100644 src/test/isolation/meson.build
create mode 100644 src/test/kerberos/meson.build
create mode 100644 src/test/ldap/meson.build
create mode 100644 src/test/meson.build
create mode 100644 src/test/modules/brin/meson.build
create mode 100644 src/test/modules/commit_ts/meson.build
create mode 100644 src/test/modules/delay_execution/meson.build
create mode 100644 src/test/modules/dummy_index_am/meson.build
create mode 100644 src/test/modules/dummy_seclabel/meson.build
create mode 100644 src/test/modules/libpq_pipeline/meson.build
create mode 100644 src/test/modules/meson.build
create mode 100644 src/test/modules/plsample/meson.build
create mode 100644 src/test/modules/snapshot_too_old/meson.build
create mode 100644 src/test/modules/spgist_name_ops/meson.build
create mode 100644 src/test/modules/ssl_passphrase_callback/meson.build
create mode 100644 src/test/modules/test_bloomfilter/meson.build
create mode 100644 src/test/modules/test_ddl_deparse/meson.build
create mode 100644 src/test/modules/test_extensions/meson.build
create mode 100644 src/test/modules/test_ginpostinglist/meson.build
create mode 100644 src/test/modules/test_integerset/meson.build
create mode 100644 src/test/modules/test_lfind/meson.build
create mode 100644 src/test/modules/test_misc/meson.build
create mode 100644 src/test/modules/test_oat_hooks/meson.build
create mode 100644 src/test/modules/test_parser/meson.build
create mode 100644 src/test/modules/test_pg_dump/meson.build
create mode 100644 src/test/modules/test_predtest/meson.build
create mode 100644 src/test/modules/test_rbtree/meson.build
create mode 100644 src/test/modules/test_regex/meson.build
create mode 100644 src/test/modules/test_rls_hooks/meson.build
create mode 100644 src/test/modules/test_shm_mq/meson.build
create mode 100644 src/test/modules/unsafe_tests/meson.build
create mode 100644 src/test/modules/worker_spi/meson.build
create mode 100644 src/test/recovery/meson.build
create mode 100644 src/test/regress/meson.build
create mode 100644 src/test/ssl/meson.build
create mode 100644 src/test/subscription/meson.build
create mode 100644 conversion_helpers.txt
create mode 100644 meson.build
create mode 100644 meson_options.txt
create mode 100644 src/meson.build
create mode 100644 src/timezone/meson.build
create mode 100644 src/timezone/tznames/meson.build
create mode 100755 src/tools/find_meson
create mode 100644 src/tools/irlink
create mode 100755 src/tools/pgflex
create mode 100755 src/tools/rcgen
create mode 100755 src/tools/relativize_shared_library_references
create mode 100755 src/tools/relpath.py
create mode 100755 src/tools/testwrap
diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
new file mode 100644
index 00000000000..9627e082344
--- /dev/null
+++ b/src/include/catalog/meson.build
@@ -0,0 +1,142 @@
+catalog_headers = [
+ 'pg_proc.h',
+ 'pg_type.h',
+ 'pg_attribute.h',
+ 'pg_class.h',
+ 'pg_attrdef.h',
+ 'pg_constraint.h',
+ 'pg_inherits.h',
+ 'pg_index.h',
+ 'pg_operator.h',
+ 'pg_opfamily.h',
+ 'pg_opclass.h',
+ 'pg_am.h',
+ 'pg_amop.h',
+ 'pg_amproc.h',
+ 'pg_language.h',
+ 'pg_largeobject_metadata.h',
+ 'pg_largeobject.h',
+ 'pg_aggregate.h',
+ 'pg_statistic.h',
+ 'pg_statistic_ext.h',
+ 'pg_statistic_ext_data.h',
+ 'pg_rewrite.h',
+ 'pg_trigger.h',
+ 'pg_event_trigger.h',
+ 'pg_description.h',
+ 'pg_cast.h',
+ 'pg_enum.h',
+ 'pg_namespace.h',
+ 'pg_conversion.h',
+ 'pg_depend.h',
+ 'pg_database.h',
+ 'pg_db_role_setting.h',
+ 'pg_tablespace.h',
+ 'pg_authid.h',
+ 'pg_auth_members.h',
+ 'pg_shdepend.h',
+ 'pg_shdescription.h',
+ 'pg_ts_config.h',
+ 'pg_ts_config_map.h',
+ 'pg_ts_dict.h',
+ 'pg_ts_parser.h',
+ 'pg_ts_template.h',
+ 'pg_extension.h',
+ 'pg_foreign_data_wrapper.h',
+ 'pg_foreign_server.h',
+ 'pg_user_mapping.h',
+ 'pg_foreign_table.h',
+ 'pg_policy.h',
+ 'pg_replication_origin.h',
+ 'pg_default_acl.h',
+ 'pg_init_privs.h',
+ 'pg_seclabel.h',
+ 'pg_shseclabel.h',
+ 'pg_collation.h',
+ 'pg_parameter_acl.h',
+ 'pg_partitioned_table.h',
+ 'pg_range.h',
+ 'pg_transform.h',
+ 'pg_sequence.h',
+ 'pg_publication.h',
+ 'pg_publication_namespace.h',
+ 'pg_publication_rel.h',
+ 'pg_subscription.h',
+ 'pg_subscription_rel.h',
+]
+
+bki_data = [
+ 'pg_aggregate.dat',
+ 'pg_am.dat',
+ 'pg_amop.dat',
+ 'pg_amproc.dat',
+ 'pg_authid.dat',
+ 'pg_cast.dat',
+ 'pg_class.dat',
+ 'pg_collation.dat',
+ 'pg_conversion.dat',
+ 'pg_database.dat',
+ 'pg_language.dat',
+ 'pg_namespace.dat',
+ 'pg_opclass.dat',
+ 'pg_operator.dat',
+ 'pg_opfamily.dat',
+ 'pg_proc.dat',
+ 'pg_range.dat',
+ 'pg_tablespace.dat',
+ 'pg_ts_config.dat',
+ 'pg_ts_config_map.dat',
+ 'pg_ts_dict.dat',
+ 'pg_ts_parser.dat',
+ 'pg_ts_template.dat',
+ 'pg_type.dat',
+]
+bki_data_f = files(bki_data)
+
+
+input = []
+output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
+output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+
+foreach h : catalog_headers
+ fname = h.split('.h')[0]+'_d.h'
+ input += files(h)
+ output_files += fname
+ output_install += dir_include_server / 'catalog'
+endforeach
+
+generated_catalog_headers = custom_target('generated_catalog_headers',
+ output: output_files,
+ install_dir: output_install,
+ input: input,
+ depend_files: bki_data_f,
+ build_by_default: true,
+ install: true,
+ command: [
+ perl,
+ files('../../backend/catalog/genbki.pl'),
+ '--include-path=@SOURCE_ROOT@/src/include',
+ '--set-version='+pg_version_major.to_string(),
+ '--output=@OUTDIR@', '@INPUT@'
+ ],
+)
+
+generated_headers += generated_catalog_headers.to_list()
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += { 'src/backend/catalog': output_files + ['bki-stamp']}
+generated_sources_ac += { 'src/include/catalog': ['header-stamp']}
+
+# 'reformat-dat-files' is a convenience target for rewriting the
+# catalog data files in our standard format. This includes collapsing
+# out any entries that are redundant with a BKI_DEFAULT annotation.
+run_target('reformat-dat-files',
+ command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f],
+)
+
+# 'expand-dat-files' is a convenience target for expanding out all
+# default values in the catalog data files. This should be run before
+# altering or removing any BKI_DEFAULT annotation.
+run_target('expand-dat-files',
+ command: [perl, files('reformat_dat_file.pl'), '--output', '@CURRENT_SOURCE_DIR@', bki_data_f, '--full-tuples'],
+)
diff --git a/src/include/meson.build b/src/include/meson.build
new file mode 100644
index 00000000000..eaba831f3cc
--- /dev/null
+++ b/src/include/meson.build
@@ -0,0 +1,175 @@
+pg_config_ext = configure_file(input: 'pg_config_ext.h.meson',
+ output : 'pg_config_ext.h',
+ configuration : cdata,
+ install: true,
+ install_dir: dir_include)
+configure_files += pg_config_ext
+
+pg_config_os = configure_file(
+ output : 'pg_config_os.h',
+ input: files('port/@0@.h'.format(host_system)),
+ install: true,
+ install_dir : dir_include,
+ copy : true)
+configure_files += pg_config_os
+
+pg_config = configure_file(
+ output : 'pg_config.h',
+ install : true,
+ install_dir : dir_include,
+ configuration : cdata)
+configure_files += pg_config
+
+
+config_paths_data = configuration_data()
+config_paths_data.set_quoted('PGBINDIR', dir_prefix / dir_bin)
+config_paths_data.set_quoted('PGSHAREDIR', dir_prefix / dir_data)
+config_paths_data.set_quoted('SYSCONFDIR', dir_prefix / dir_sysconf)
+config_paths_data.set_quoted('INCLUDEDIR', dir_prefix / dir_include)
+config_paths_data.set_quoted('PKGINCLUDEDIR', dir_prefix / dir_include_pkg)
+config_paths_data.set_quoted('INCLUDEDIRSERVER', dir_prefix / dir_include_server)
+config_paths_data.set_quoted('LIBDIR', dir_prefix / dir_lib)
+config_paths_data.set_quoted('PKGLIBDIR', dir_prefix / dir_lib_pkg)
+config_paths_data.set_quoted('LOCALEDIR', dir_prefix / dir_locale)
+config_paths_data.set_quoted('DOCDIR', dir_prefix / dir_doc)
+config_paths_data.set_quoted('HTMLDIR', dir_prefix / dir_doc_html)
+config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
+
+
+var_cc = ' '.join(cc.cmd_array())
+var_cpp = ' '.join(g_c_args)
+var_cflags = ' '.join(functional_cflags + warning_cflags)
+var_cxxflags = ' '.join(functional_cxxflags + warning_cxxflags)
+var_cppflags = ' '.join(g_c_args)
+var_cflags_sl = '-fPIC' #FIXME
+var_ldflags = ' '.join(ldflags)
+# FIXME:
+var_ldflags_sl = ''
+var_ldflags_ex = ''
+# FIXME - some extensions might directly use symbols from one of libs. If
+# that symbol isn't used by postgres, and statically linked, it'll cause an
+# undefined symbol at runtime. And obviously it'll cause problems for
+# executables, although those are probably less common.
+var_libs = ''
+
+
+pg_config_paths = configure_file(
+ output: 'pg_config_paths.h',
+ configuration: config_paths_data,
+ install: false
+)
+configure_files += pg_config_paths
+
+install_headers(
+ 'pg_config_manual.h',
+ 'postgres_ext.h',
+ 'pg_config_manual.h',
+)
+
+install_headers(
+ 'libpq/libpq-fs.h',
+ install_dir: dir_include / 'libpq',
+)
+
+install_headers(
+ 'c.h',
+ 'port.h',
+ 'postgres_fe.h',
+ install_dir: dir_include_internal
+)
+
+install_headers(
+ 'libpq/pqcomm.h',
+ install_dir: dir_include_internal / 'libpq',
+)
+
+install_headers(
+ 'c.h',
+ 'fmgr.h',
+ 'funcapi.h',
+ 'getaddrinfo.h',
+ 'getopt_long.h',
+ 'miscadmin.h',
+ 'pg_config_manual.h',
+ 'pg_getopt.h',
+ 'pg_trace.h',
+ 'pgstat.h',
+ 'pgtar.h',
+ 'pgtime.h',
+ 'port.h',
+ 'postgres.h',
+ 'postgres_ext.h',
+ 'postgres_fe.h',
+ 'rusagestub.h',
+ 'windowapi.h',
+ pg_config_ext,
+ pg_config_os,
+ pg_config,
+ install_dir: dir_include_server,
+)
+
+subdir('catalog')
+subdir('nodes')
+subdir('parser')
+subdir('pch')
+subdir('storage')
+subdir('utils')
+
+header_subdirs = [
+ 'access',
+ 'catalog',
+ 'bootstrap',
+ 'commands',
+ 'common',
+ 'datatype',
+ 'executor',
+ 'fe_utils',
+ 'foreign',
+ 'jit',
+ 'lib',
+ 'libpq',
+ 'mb',
+ 'nodes',
+ 'optimizer',
+ 'parser',
+ 'partitioning',
+ 'postmaster',
+ 'regex',
+ 'replication',
+ 'rewrite',
+ 'statistics',
+ 'storage',
+ 'tcop',
+ 'snowball',
+ 'tsearch',
+ 'utils',
+ 'port',
+ 'portability',
+]
+
+# XXX: installing headers this way has the danger of installing editor files
+# etc, unfortunately install_subdir() doesn't allow including / excluding by
+# pattern currently.
+foreach d : header_subdirs
+ if d == 'catalog'
+ continue
+ endif
+ install_subdir(d, install_dir: dir_include_server,
+ exclude_files: ['.gitignore', 'meson.build'])
+endforeach
+
+install_subdir('catalog',
+ install_dir: dir_include_server,
+ exclude_files: [
+ '.gitignore',
+ 'Makefile',
+ 'duplicate_oids',
+ 'meson.build',
+ 'reformat_dat_file.pl',
+ 'renumber_oids.pl',
+ 'unused_oids',
+ ] + bki_data,
+)
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']}
diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build
new file mode 100644
index 00000000000..4575e081560
--- /dev/null
+++ b/src/include/nodes/meson.build
@@ -0,0 +1,58 @@
+node_support_input_i = [
+ 'nodes/nodes.h',
+ 'nodes/primnodes.h',
+ 'nodes/parsenodes.h',
+ 'nodes/pathnodes.h',
+ 'nodes/plannodes.h',
+ 'nodes/execnodes.h',
+ 'access/amapi.h',
+ 'access/sdir.h',
+ 'access/tableam.h',
+ 'access/tsmapi.h',
+ 'commands/event_trigger.h',
+ 'commands/trigger.h',
+ 'executor/tuptable.h',
+ 'foreign/fdwapi.h',
+ 'nodes/extensible.h',
+ 'nodes/lockoptions.h',
+ 'nodes/replnodes.h',
+ 'nodes/supportnodes.h',
+ 'nodes/value.h',
+ 'utils/rel.h',
+]
+
+node_support_input = []
+foreach i : node_support_input_i
+ node_support_input += meson.source_root() / 'src' / 'include' / i
+endforeach
+
+node_support_output = [
+ 'nodetags.h',
+ 'outfuncs.funcs.c', 'outfuncs.switch.c',
+ 'readfuncs.funcs.c', 'readfuncs.switch.c',
+ 'copyfuncs.funcs.c', 'copyfuncs.switch.c',
+ 'equalfuncs.funcs.c', 'equalfuncs.switch.c',
+]
+node_support_install = [
+ dir_include_server / 'nodes',
+ false, false,
+ false, false,
+ false, false,
+ false, false,
+]
+
+generated_nodes = custom_target('nodetags.h',
+ input: node_support_input,
+ output: node_support_output,
+ command: [
+ perl, files('../../backend/nodes/gen_node_support.pl'),
+ '-o', '@OUTDIR@',
+ '@INPUT@'],
+ install: true,
+ install_dir: node_support_install,
+)
+generated_headers += generated_nodes[0]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/nodes': node_support_output + ['node-support-stamp']}
+generated_sources_ac += {'src/include/nodes': ['header-stamp']}
diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build
new file mode 100644
index 00000000000..942d9acd733
--- /dev/null
+++ b/src/include/parser/meson.build
@@ -0,0 +1,14 @@
+backend_parser = custom_target('gram',
+ input: [files('../../backend/parser/gram.y')],
+ output: ['gram.c', 'gram.h'],
+ command: [bison_cmd, '-d', '@INPUT@'],
+ install: true,
+ # Only install gram.h, not gram.c
+ install_dir: [false, dir_include_server / 'parser'],
+)
+
+backend_parser_code = backend_parser[0]
+backend_parser_header = backend_parser[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/parser': ['gram.c', 'gram.h']}
diff --git a/src/include/pch/c_pch.h b/src/include/pch/c_pch.h
new file mode 100644
index 00000000000..f40c757ca62
--- /dev/null
+++ b/src/include/pch/c_pch.h
@@ -0,0 +1 @@
+#include "c.h"
diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build
new file mode 100644
index 00000000000..8fb0a1d6b56
--- /dev/null
+++ b/src/include/pch/meson.build
@@ -0,0 +1,3 @@
+# See https://github.com/mesonbuild/meson/issues/10338
+pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h'
+pch_postgres_h = meson.source_root() / meson.current_source_dir() / 'postgres_pch.h'
diff --git a/src/include/pch/postgres_pch.h b/src/include/pch/postgres_pch.h
new file mode 100644
index 00000000000..71b2f35f76b
--- /dev/null
+++ b/src/include/pch/postgres_pch.h
@@ -0,0 +1 @@
+#include "postgres.h"
diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson
new file mode 100644
index 00000000000..57cdfca0cfd
--- /dev/null
+++ b/src/include/pg_config_ext.h.meson
@@ -0,0 +1,7 @@
+/*
+ * src/include/pg_config_ext.h.in. This is generated manually, not by
+ * autoheader, since we want to limit which symbols get defined here.
+ */
+
+/* Define to the name of a signed 64-bit integer type. */
+#mesondefine PG_INT64_TYPE
diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build
new file mode 100644
index 00000000000..2f0434a6614
--- /dev/null
+++ b/src/include/storage/meson.build
@@ -0,0 +1,15 @@
+lwlocknames = custom_target('lwlocknames',
+ input : files('../../backend/storage/lmgr/lwlocknames.txt'),
+ output : ['lwlocknames.h', 'lwlocknames.c'],
+ command : [perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'],
+ build_by_default: true,
+ install: true,
+ install_dir: [dir_include_server / 'storage', false],
+)
+
+lwlocknames_h = lwlocknames[0]
+
+generated_backend_headers += lwlocknames_h
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']}
diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build
new file mode 100644
index 00000000000..3bc22e2e37e
--- /dev/null
+++ b/src/include/utils/meson.build
@@ -0,0 +1,51 @@
+errcodes = custom_target('errcodes',
+ input : files('../../backend/utils/errcodes.txt'),
+ output : ['errcodes.h'],
+ command : [perl, files('../../backend/utils/generate-errcodes.pl'), '--outfile', '@OUTPUT@', '@INPUT@'],
+ install: true,
+ install_dir: dir_include_server/'utils',
+)
+generated_headers += errcodes
+
+if dtrace.found()
+ probes_tmp = custom_target('probes.h.tmp',
+ input: files('../../backend/utils/probes.d'),
+ output : 'probes.h.tmp',
+ command : [dtrace, '-C', '-h', '-s', '@INPUT@', '-o', '@OUTPUT@'],
+ )
+ probes = custom_target('probes.h',
+ input: probes_tmp[0],
+ output : 'probes.h',
+ capture: true,
+ command : [sed, '-f', files('../../backend/utils/postprocess_dtrace.sed'), '@INPUT@'],
+ install: true,
+ install_dir: dir_include_server/'utils',
+ )
+else
+ probes = custom_target('probes.h',
+ input: files('../../backend/utils/probes.d'),
+ output : 'probes.h',
+ capture: true,
+ command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'],
+ install: true,
+ install_dir: dir_include_server/'utils',
+ )
+endif
+
+generated_backend_headers += probes
+
+fmgrtab_output = ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c']
+fmgrtab_target = custom_target('fmgrtab',
+ input: '../catalog/pg_proc.dat',
+ output : fmgrtab_output,
+ command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'],
+ install: true,
+ install_dir: [dir_include_server/'utils', dir_include_server/'utils', false],
+)
+
+generated_backend_headers += fmgrtab_target[0]
+generated_backend_headers += fmgrtab_target[1]
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += { 'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp']}
+generated_sources_ac += { 'src/include/utils': ['header-stamp']}
diff --git a/src/common/meson.build b/src/common/meson.build
new file mode 100644
index 00000000000..9d66d77b033
--- /dev/null
+++ b/src/common/meson.build
@@ -0,0 +1,176 @@
+common_sources = files(
+ 'archive.c',
+ 'base64.c',
+ 'checksum_helper.c',
+ 'compression.c',
+ 'controldata_utils.c',
+ 'encnames.c',
+ 'exec.c',
+ 'file_perm.c',
+ 'file_utils.c',
+ 'hashfn.c',
+ 'ip.c',
+ 'jsonapi.c',
+ 'keywords.c',
+ 'kwlookup.c',
+ 'link-canary.c',
+ 'md5_common.c',
+ 'pg_get_line.c',
+ 'pg_lzcompress.c',
+ 'pg_prng.c',
+ 'pgfnames.c',
+ 'psprintf.c',
+ 'relpath.c',
+ 'rmtree.c',
+ 'saslprep.c',
+ 'scram-common.c',
+ 'string.c',
+ 'stringinfo.c',
+ 'unicode_norm.c',
+ 'username.c',
+ 'wait_error.c',
+ 'wchar.c',
+)
+
+if ssl.found()
+ common_sources += files(
+ 'cryptohash_openssl.c',
+ 'hmac_openssl.c',
+ 'protocol_openssl.c',
+ )
+else
+ common_sources += files(
+ 'cryptohash.c',
+ 'hmac.c',
+ 'md5.c',
+ 'sha1.c',
+ 'sha2.c',
+ )
+endif
+
+common_kwlist = custom_target('kwlist',
+ input: files('../include/parser/kwlist.h'),
+ output: 'kwlist_d.h',
+ command: [perl, '-I', '@SOURCE_ROOT@/src/tools', files('../tools/gen_keywordlist.pl'),
+ '--extern', '--output', '@OUTDIR@', '@INPUT@'])
+generated_sources += common_kwlist
+common_sources += common_kwlist
+
+# The code imported from Ryu gets a pass on declaration-after-statement,
+# in order to keep it more closely aligned with its upstream.
+ryu_sources = files(
+ 'd2s.c',
+ 'f2s.c',
+)
+ryu_cflags = []
+
+if using_declaration_after_statement_warning
+ ryu_cflags += ['-Wno-declaration-after-statement']
+endif
+
+config_info_sources = files('config_info.c',)
+config_info_cflags = [
+ '-DVAL_CC="@0@"'.format(var_cc),
+ '-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
+ '-DVAL_CFLAGS="@0@"'.format(var_cflags),
+ '-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
+ '-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
+ '-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
+ '-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
+ '-DVAL_LIBS="@0@"'.format(var_libs),
+]
+
+# Some files need to be built with different cflags. The different sets are
+# defined here.
+common_cflags = {
+ 'ryu': ryu_cflags,
+ 'config_info': config_info_cflags,
+}
+common_sources_cflags = {
+ 'ryu': ryu_sources,
+ 'config_info': config_info_sources
+}
+
+
+# A few files are currently only built for frontend, not server
+# (Mkvcbuild.pm has a copy of this list, too). logging.c is excluded
+# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
+# because it is not appropriate for general purpose libraries such
+# as libpq to report errors directly.
+
+common_sources_frontend_shlib = common_sources
+common_sources_frontend_shlib += files(
+ 'fe_memutils.c',
+ 'restricted_token.c',
+ 'sprompt.c',
+)
+
+common_sources_frontend_static = common_sources_frontend_shlib
+common_sources_frontend_static += files(
+ 'logging.c',
+)
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+#
+# XXX: in most environments we could probably link_whole pgcommon_shlib
+# against pgcommon_static, instead of compiling twice.
+#
+# For the server build of pgcommon, depend on lwlocknames_h, because at least
+# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a
+# layering violation, but ...
+pgcommon = {}
+pgcommon_variants = {
+ '_srv' : internal_lib_args + {
+ 'sources': common_sources + [lwlocknames_h],
+ 'dependencies': [backend_common_code],
+ },
+ '' : default_lib_args + {
+ 'sources': common_sources_frontend_static,
+ 'dependencies': [frontend_common_code],
+ },
+ '_shlib' : default_lib_args + {
+ 'pic': true,
+ 'sources': common_sources_frontend_shlib,
+ 'dependencies': [frontend_common_code],
+ },
+}
+
+foreach name, opts : pgcommon_variants
+
+ # Build internal static libraries for sets of files that need to be built
+ # with different cflags
+ cflag_libs = []
+ foreach cflagname, sources: common_sources_cflags
+ if sources.length() == 0
+ continue
+ endif
+ c_args = opts.get('c_args', []) + common_cflags[cflagname]
+ cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
+ c_pch: pch_c_h,
+ include_directories: include_directories('.'),
+ kwargs: opts + {
+ 'sources': sources,
+ 'c_args': c_args,
+ 'build_by_default': false,
+ 'install': false,
+ },
+ )
+ endforeach
+
+ lib = static_library('libpgcommon@0@'.format(name),
+ link_with: cflag_libs,
+ c_pch: pch_c_h,
+ include_directories: include_directories('.'),
+ kwargs: opts + {
+ 'dependencies': opts['dependencies'] + [ssl],
+ }
+ )
+ pgcommon += {name: lib}
+endforeach
+
+common_srv = pgcommon['_srv']
+common_shlib = pgcommon['_shlib']
+common_static = pgcommon['']
+
+subdir('unicode')
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
new file mode 100644
index 00000000000..cc25f881875
--- /dev/null
+++ b/src/common/unicode/meson.build
@@ -0,0 +1,101 @@
+# These files are part of the Unicode Character Database. Download
+# them on demand.
+
+UNICODE_VERSION = '14.0.0'
+
+unicode_data = {}
+unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
+
+if not wget.found()
+ subdir_done()
+endif
+
+foreach f : ['UnicodeData.txt', 'EastAsianWidth.txt', 'DerivedNormalizationProps.txt', 'CompositionExclusions.txt', 'NormalizationTest.txt']
+ url = unicode_baseurl.format(UNICODE_VERSION, f)
+ target = custom_target(f,
+ output: f,
+ command: [wget, wget_flags, url],
+ build_by_default: false,
+ )
+ unicode_data += {f: target}
+endforeach
+
+
+update_unicode_targets = []
+
+update_unicode_targets += \
+ custom_target('unicode_norm_table.h',
+ input: [unicode_data['UnicodeData.txt'], unicode_data['CompositionExclusions.txt']],
+ output: ['unicode_norm_table.h', 'unicode_norm_hashfunc.h'],
+ command: [
+ perl, files('generate-unicode_norm_table.pl'),
+ '--outdir', '@OUTDIR@', '@INPUT@'],
+ build_by_default: false,
+ )
+
+update_unicode_targets += \
+ custom_target('unicode_combining_table.h',
+ input: [unicode_data['UnicodeData.txt']],
+ output: ['unicode_combining_table.h'],
+ command: [perl, files('generate-unicode_combining_table.pl'), '@INPUT@'],
+ build_by_default: false,
+ capture: true,
+ )
+
+update_unicode_targets += \
+ custom_target('unicode_east_asian_fw_table.h',
+ input: [unicode_data['EastAsianWidth.txt']],
+ output: ['unicode_east_asian_fw_table.h'],
+ command: [perl, files('generate-unicode_east_asian_fw_table.pl'), '@INPUT@'],
+ build_by_default: false,
+ capture: true,
+ )
+
+update_unicode_targets += \
+ custom_target('unicode_normprops_table.h',
+ input: [unicode_data['DerivedNormalizationProps.txt']],
+ output: ['unicode_normprops_table.h'],
+ command: [perl, files('generate-unicode_normprops_table.pl'), '@INPUT@'],
+ build_by_default: false,
+ capture: true,
+ )
+
+norm_test_table = custom_target('norm_test_table.h',
+ input: [unicode_data['NormalizationTest.txt']],
+ output: ['norm_test_table.h'],
+ command: [perl, files('generate-norm_test_table.pl'), '@INPUT@', '@OUTPUT@'],
+ build_by_default: false,
+ )
+
+inc = include_directories('.')
+
+norm_test = executable('norm_test',
+ ['norm_test.c', norm_test_table],
+ dependencies: [frontend_port_code],
+ include_directories: inc,
+ link_with: [pgport_static, common_static],
+ build_by_default: false,
+ kwargs: default_bin_args + {
+ 'install': false,
+ }
+)
+
+if not meson.is_cross_build()
+ norm_test_valid = custom_target('norm_test.valid',
+ output: 'norm_test.valid',
+ depends: update_unicode_targets,
+ command: [norm_test],
+ build_by_default: false,
+ capture: true,
+ )
+
+ run_target('update-unicode',
+ depends: norm_test_valid,
+ command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+ )
+else
+ run_target('update-unicode',
+ depends: update_unicode_targets,
+ command: ['cp', update_unicode_targets, '@SOURCE_ROOT@/src/include/common/']
+ )
+endif
diff --git a/src/port/meson.build b/src/port/meson.build
new file mode 100644
index 00000000000..d1ed7f1c55f
--- /dev/null
+++ b/src/port/meson.build
@@ -0,0 +1,187 @@
+pgport_sources = [
+ 'bsearch_arg.c',
+ 'chklocale.c',
+ 'inet_net_ntop.c',
+ 'noblock.c',
+ 'path.c',
+ 'pg_bitutils.c',
+ 'pg_strong_random.c',
+ 'pgcheckdir.c',
+ 'pgmkdirp.c',
+ 'pgsleep.c',
+ 'pgstrcasecmp.c',
+ 'pgstrsignal.c',
+ 'pqsignal.c',
+ 'qsort.c',
+ 'qsort_arg.c',
+ 'quotes.c',
+ 'snprintf.c',
+ 'strerror.c',
+ 'tar.c',
+ 'thread.c',
+]
+
+if host_system == 'win32'
+ pgport_sources += files(
+ 'dirmod.c',
+ 'getrusage.c',
+ 'kill.c',
+ 'open.c',
+ 'system.c',
+ 'win32dlopen.c',
+ 'win32env.c',
+ 'win32error.c',
+ 'win32fdatasync.c',
+ 'win32link.c',
+ 'win32ntdll.c',
+ 'win32pread.c',
+ 'win32pwrite.c',
+ 'win32security.c',
+ 'win32setlocale.c',
+ 'win32stat.c',
+ )
+endif
+
+if cc.get_id() == 'msvc'
+ pgport_sources += files(
+ 'win32gettimeofday.c',
+ 'dirent.c',
+ )
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is false
+replace_funcs_neg = [
+ ['explicit_bzero'],
+ ['getaddrinfo'],
+ ['getopt'],
+ ['getopt_long'],
+ ['getpeereid'],
+ ['inet_aton'],
+ ['mkdtemp'],
+ ['preadv', 'HAVE_DECL_PREADV'],
+ ['pwritev', 'HAVE_DECL_PWRITEV'],
+ ['strlcat'],
+ ['strlcpy'],
+ ['strnlen'],
+]
+
+if host_system != 'win32'
+ replace_funcs_neg += [['pthread_barrier_wait']]
+endif
+
+# Replacement functionality to be built if corresponding configure symbol
+# is true
+replace_funcs_pos = [
+ # x86/x64
+ ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'],
+ ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+ ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+ ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'],
+
+ # arm / aarch64
+ ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'],
+ ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 'crc'],
+ ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+ ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'],
+
+ # generic fallback
+ ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'],
+]
+
+pgport_cflags = {'crc': cflags_crc}
+pgport_sources_cflags = {'crc': []}
+
+foreach f : replace_funcs_neg
+ func = f.get(0)
+ varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+ filename = '@0@.c'.format(func)
+
+ val = '@0@'.format(cdata.get(varname, 'false'))
+ if val == 'false' or val == '0'
+ pgport_sources += files(filename)
+ endif
+endforeach
+
+foreach f : replace_funcs_pos
+ func = f.get(0)
+ varname = f.get(1, 'HAVE_@0@'.format(func.to_upper()))
+ filename = '@0@.c'.format(func)
+
+ val = '@0@'.format(cdata.get(varname, 'false'))
+ if val == 'true' or val == '1'
+ src = files(filename)
+ if f.length() > 2
+ pgport_sources_cflags += {f[2]: pgport_sources_cflags[f[2]] + src}
+ else
+ pgport_sources += src
+ endif
+ endif
+endforeach
+
+
+if (host_system == 'win32' or host_system == 'cygwin') and \
+ (cc.get_id() != 'msvc' or cc.version().version_compare('<14.0'))
+
+ # Cygwin and (apparently, based on test results) Mingw both
+ # have a broken strtof(), so substitute its implementation.
+ # That's not a perfect fix, since it doesn't avoid double-rounding,
+ # but we have no better options.
+ pgport_sources += files('strtof.c')
+ message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format(
+ host_system, cc.get_id(), cc.version()))
+endif
+
+
+
+# Build pgport once for backend, once for use in frontend binaries, and once
+# for use in shared libraries
+pgport = {}
+pgport_variants = {
+ '_srv' : internal_lib_args + {
+ 'dependencies': [backend_port_code],
+ },
+ '' : default_lib_args + {
+ 'dependencies': [frontend_port_code],
+ },
+ '_shlib' : default_lib_args + {
+ 'pic': true,
+ 'dependencies': [frontend_port_code],
+ },
+}
+
+foreach name, opts : pgport_variants
+
+ # Build internal static libraries for sets of files that need to be built
+ # with different cflags
+ cflag_libs = []
+ foreach cflagname, sources: pgport_sources_cflags
+ if sources.length() == 0
+ continue
+ endif
+ c_args = opts.get('c_args', []) + pgport_cflags[cflagname]
+ cflag_libs += static_library('libpgport@0@_@1@'.format(name, cflagname),
+ sources,
+ c_pch: pch_c_h,
+ kwargs: opts + {
+ 'c_args': c_args,
+ 'build_by_default': false,
+ 'install': false,
+ },
+ )
+ endforeach
+
+ lib = static_library('libpgport@0@'.format(name),
+ pgport_sources,
+ link_with: cflag_libs,
+ c_pch: pch_c_h,
+ kwargs: opts + {
+ 'dependencies': opts['dependencies'] + [ssl],
+ }
+ )
+ pgport += {name: lib}
+endforeach
+
+pgport_srv = pgport['_srv']
+pgport_static = pgport['']
+pgport_shlib = pgport['_shlib']
diff --git a/src/port/win32ver.rc.in b/src/port/win32ver.rc.in
new file mode 100644
index 00000000000..eb0d45dccf1
--- /dev/null
+++ b/src/port/win32ver.rc.in
@@ -0,0 +1,41 @@
+#include <winver.h>
+#include "pg_config.h"
+
+// https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ PRODUCTVERSION PG_MAJORVERSION_NUM,0,PG_MINORVERSION_NUM,0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0x0L
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE @VFT_TYPE@
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0" // U.S. English, Unicode
+ BEGIN
+ VALUE "CompanyName", "PostgreSQL Global Development Group"
+ VALUE "FileDescription", "@FILEDESC@"
+ /*
+ * XXX: In the autoconf / src/tools/msvc build this was set differently than
+ * ProductVersion below, using the current date. But that doesn't seem like a
+ * good idea, because it makes the build not reproducible and causes
+ * unnecessary rebuilds?
+ */
+ VALUE "FileVersion", PG_VERSION
+ VALUE "InternalName", "@NAME@"
+ VALUE "LegalCopyright", "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California."
+ VALUE "OriginalFileName", "@NAME@.@FILEENDING@"
+ VALUE "ProductName", "PostgreSQL"
+ VALUE "ProductVersion", PG_VERSION
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1200 // U.S. English, Unicode
+ END
+END
+
+IDI_ICON ICON "@ICO@"
diff --git a/config/meson.build b/config/meson.build
new file mode 100644
index 00000000000..ab19c380bd2
--- /dev/null
+++ b/config/meson.build
@@ -0,0 +1,4 @@
+install_data(
+ 'install-sh', 'missing',
+ install_dir: dir_pgxs / 'config'
+)
diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build
new file mode 100644
index 00000000000..a54c7532927
--- /dev/null
+++ b/src/backend/access/brin/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'brin.c',
+ 'brin_bloom.c',
+ 'brin_inclusion.c',
+ 'brin_minmax.c',
+ 'brin_minmax_multi.c',
+ 'brin_pageops.c',
+ 'brin_revmap.c',
+ 'brin_tuple.c',
+ 'brin_validate.c',
+ 'brin_xlog.c',
+)
diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build
new file mode 100644
index 00000000000..857beaa32d3
--- /dev/null
+++ b/src/backend/access/common/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+ 'attmap.c',
+ 'bufmask.c',
+ 'detoast.c',
+ 'heaptuple.c',
+ 'indextuple.c',
+ 'printsimple.c',
+ 'printtup.c',
+ 'relation.c',
+ 'reloptions.c',
+ 'scankey.c',
+ 'session.c',
+ 'syncscan.c',
+ 'toast_compression.c',
+ 'toast_internals.c',
+ 'tupconvert.c',
+ 'tupdesc.c',
+)
diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build
new file mode 100644
index 00000000000..56d6f343d54
--- /dev/null
+++ b/src/backend/access/gin/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+ 'ginarrayproc.c',
+ 'ginbtree.c',
+ 'ginbulk.c',
+ 'gindatapage.c',
+ 'ginentrypage.c',
+ 'ginfast.c',
+ 'ginget.c',
+ 'gininsert.c',
+ 'ginlogic.c',
+ 'ginpostinglist.c',
+ 'ginscan.c',
+ 'ginutil.c',
+ 'ginvacuum.c',
+ 'ginvalidate.c',
+ 'ginxlog.c',
+)
diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build
new file mode 100644
index 00000000000..1a996b5e25d
--- /dev/null
+++ b/src/backend/access/gist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'gist.c',
+ 'gistbuild.c',
+ 'gistbuildbuffers.c',
+ 'gistget.c',
+ 'gistproc.c',
+ 'gistscan.c',
+ 'gistsplit.c',
+ 'gistutil.c',
+ 'gistvacuum.c',
+ 'gistvalidate.c',
+ 'gistxlog.c',
+)
diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build
new file mode 100644
index 00000000000..22f2c691c34
--- /dev/null
+++ b/src/backend/access/hash/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'hash.c',
+ 'hash_xlog.c',
+ 'hashfunc.c',
+ 'hashinsert.c',
+ 'hashovfl.c',
+ 'hashpage.c',
+ 'hashsearch.c',
+ 'hashsort.c',
+ 'hashutil.c',
+ 'hashvalidate.c',
+)
diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build
new file mode 100644
index 00000000000..f1dca73743c
--- /dev/null
+++ b/src/backend/access/heap/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+ 'heapam.c',
+ 'heapam_handler.c',
+ 'heapam_visibility.c',
+ 'heaptoast.c',
+ 'hio.c',
+ 'pruneheap.c',
+ 'rewriteheap.c',
+ 'vacuumlazy.c',
+ 'visibilitymap.c',
+)
diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build
new file mode 100644
index 00000000000..18af5533e65
--- /dev/null
+++ b/src/backend/access/index/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+ 'amapi.c',
+ 'amvalidate.c',
+ 'genam.c',
+ 'indexam.c',
+)
diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build
new file mode 100644
index 00000000000..9874291fc0a
--- /dev/null
+++ b/src/backend/access/meson.build
@@ -0,0 +1,13 @@
+subdir('brin')
+subdir('common')
+subdir('gin')
+subdir('gist')
+subdir('hash')
+subdir('heap')
+subdir('index')
+subdir('nbtree')
+subdir('rmgrdesc')
+subdir('spgist')
+subdir('table')
+subdir('tablesample')
+subdir('transam')
diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build
new file mode 100644
index 00000000000..07dc29e8190
--- /dev/null
+++ b/src/backend/access/nbtree/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'nbtcompare.c',
+ 'nbtdedup.c',
+ 'nbtinsert.c',
+ 'nbtpage.c',
+ 'nbtree.c',
+ 'nbtsearch.c',
+ 'nbtsort.c',
+ 'nbtsplitloc.c',
+ 'nbtutils.c',
+ 'nbtvalidate.c',
+ 'nbtxlog.c',
+)
diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build
new file mode 100644
index 00000000000..f3a6e0a571b
--- /dev/null
+++ b/src/backend/access/rmgrdesc/meson.build
@@ -0,0 +1,26 @@
+# used by frontend programs like pg_waldump
+rmgr_desc_sources = files(
+ 'brindesc.c',
+ 'clogdesc.c',
+ 'committsdesc.c',
+ 'dbasedesc.c',
+ 'genericdesc.c',
+ 'gindesc.c',
+ 'gistdesc.c',
+ 'hashdesc.c',
+ 'heapdesc.c',
+ 'logicalmsgdesc.c',
+ 'mxactdesc.c',
+ 'nbtdesc.c',
+ 'relmapdesc.c',
+ 'replorigindesc.c',
+ 'seqdesc.c',
+ 'smgrdesc.c',
+ 'spgdesc.c',
+ 'standbydesc.c',
+ 'tblspcdesc.c',
+ 'xactdesc.c',
+ 'xlogdesc.c',
+)
+
+backend_sources += rmgr_desc_sources
diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build
new file mode 100644
index 00000000000..f18d0d2e53f
--- /dev/null
+++ b/src/backend/access/spgist/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'spgdoinsert.c',
+ 'spginsert.c',
+ 'spgkdtreeproc.c',
+ 'spgproc.c',
+ 'spgquadtreeproc.c',
+ 'spgscan.c',
+ 'spgtextproc.c',
+ 'spgutils.c',
+ 'spgvacuum.c',
+ 'spgvalidate.c',
+ 'spgxlog.c',
+)
diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build
new file mode 100644
index 00000000000..66c706d640e
--- /dev/null
+++ b/src/backend/access/table/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+ 'table.c',
+ 'tableam.c',
+ 'tableamapi.c',
+ 'toast_helper.c',
+)
diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build
new file mode 100644
index 00000000000..63ee8203226
--- /dev/null
+++ b/src/backend/access/tablesample/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+ 'bernoulli.c',
+ 'system.c',
+ 'tablesample.c',
+)
diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build
new file mode 100644
index 00000000000..c32169bd2c6
--- /dev/null
+++ b/src/backend/access/transam/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+ 'clog.c',
+ 'commit_ts.c',
+ 'generic_xlog.c',
+ 'multixact.c',
+ 'parallel.c',
+ 'rmgr.c',
+ 'slru.c',
+ 'subtrans.c',
+ 'timeline.c',
+ 'transam.c',
+ 'twophase.c',
+ 'twophase_rmgr.c',
+ 'varsup.c',
+ 'xact.c',
+ 'xlog.c',
+ 'xlogarchive.c',
+ 'xlogfuncs.c',
+ 'xloginsert.c',
+ 'xlogprefetcher.c',
+ 'xlogrecovery.c',
+ 'xlogstats.c',
+ 'xlogutils.c',
+)
+
+# used by frontend programs to build a frontend xlogreader
+xlogreader_sources = files(
+ 'xlogreader.c',
+)
+
+backend_sources += xlogreader_sources
diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build
new file mode 100644
index 00000000000..a09305cadfa
--- /dev/null
+++ b/src/backend/backup/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'backup_manifest.c',
+ 'basebackup.c',
+ 'basebackup_copy.c',
+ 'basebackup_gzip.c',
+ 'basebackup_lz4.c',
+ 'basebackup_progress.c',
+ 'basebackup_server.c',
+ 'basebackup_sink.c',
+ 'basebackup_target.c',
+ 'basebackup_throttle.c',
+ 'basebackup_zstd.c',
+)
diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build
new file mode 100644
index 00000000000..c0bf0381d14
--- /dev/null
+++ b/src/backend/bootstrap/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'bootstrap.c')
+
+bootscanner = custom_target('bootscanner',
+ input: ['bootscanner.l'],
+ output: ['bootscanner.c'],
+ command: [flex_cmd, '@INPUT@'],)
+generated_sources += bootscanner
+
+generated_backend_sources += custom_target('bootparse',
+ input: ['bootparse.y', bootscanner[0]],
+ output: ['bootparse.c'],
+ command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build
new file mode 100644
index 00000000000..08747914516
--- /dev/null
+++ b/src/backend/catalog/meson.build
@@ -0,0 +1,44 @@
+backend_sources += files(
+ 'aclchk.c',
+ 'catalog.c',
+ 'dependency.c',
+ 'heap.c',
+ 'index.c',
+ 'indexing.c',
+ 'namespace.c',
+ 'objectaccess.c',
+ 'objectaddress.c',
+ 'partition.c',
+ 'pg_aggregate.c',
+ 'pg_attrdef.c',
+ 'pg_cast.c',
+ 'pg_class.c',
+ 'pg_collation.c',
+ 'pg_constraint.c',
+ 'pg_conversion.c',
+ 'pg_db_role_setting.c',
+ 'pg_depend.c',
+ 'pg_enum.c',
+ 'pg_inherits.c',
+ 'pg_largeobject.c',
+ 'pg_namespace.c',
+ 'pg_operator.c',
+ 'pg_parameter_acl.c',
+ 'pg_proc.c',
+ 'pg_publication.c',
+ 'pg_range.c',
+ 'pg_shdepend.c',
+ 'pg_subscription.c',
+ 'pg_type.c',
+ 'storage.c',
+ 'toasting.c',
+)
+
+
+install_data(
+ 'information_schema.sql',
+ 'sql_features.txt',
+ 'system_functions.sql',
+ 'system_views.sql',
+ install_dir: dir_data,
+)
diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build
new file mode 100644
index 00000000000..9b350d025ff
--- /dev/null
+++ b/src/backend/commands/meson.build
@@ -0,0 +1,51 @@
+backend_sources += files(
+ 'aggregatecmds.c',
+ 'alter.c',
+ 'amcmds.c',
+ 'analyze.c',
+ 'async.c',
+ 'cluster.c',
+ 'collationcmds.c',
+ 'comment.c',
+ 'constraint.c',
+ 'conversioncmds.c',
+ 'copy.c',
+ 'copyfrom.c',
+ 'copyfromparse.c',
+ 'copyto.c',
+ 'createas.c',
+ 'dbcommands.c',
+ 'define.c',
+ 'discard.c',
+ 'dropcmds.c',
+ 'event_trigger.c',
+ 'explain.c',
+ 'extension.c',
+ 'foreigncmds.c',
+ 'functioncmds.c',
+ 'indexcmds.c',
+ 'lockcmds.c',
+ 'matview.c',
+ 'opclasscmds.c',
+ 'operatorcmds.c',
+ 'policy.c',
+ 'portalcmds.c',
+ 'prepare.c',
+ 'proclang.c',
+ 'publicationcmds.c',
+ 'schemacmds.c',
+ 'seclabel.c',
+ 'sequence.c',
+ 'statscmds.c',
+ 'subscriptioncmds.c',
+ 'tablecmds.c',
+ 'tablespace.c',
+ 'trigger.c',
+ 'tsearchcmds.c',
+ 'typecmds.c',
+ 'user.c',
+ 'vacuum.c',
+ 'vacuumparallel.c',
+ 'variable.c',
+ 'view.c',
+)
diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build
new file mode 100644
index 00000000000..518674cfa28
--- /dev/null
+++ b/src/backend/executor/meson.build
@@ -0,0 +1,67 @@
+backend_sources += files(
+ 'execAmi.c',
+ 'execAsync.c',
+ 'execCurrent.c',
+ 'execExpr.c',
+ 'execExprInterp.c',
+ 'execGrouping.c',
+ 'execIndexing.c',
+ 'execJunk.c',
+ 'execMain.c',
+ 'execParallel.c',
+ 'execPartition.c',
+ 'execProcnode.c',
+ 'execReplication.c',
+ 'execSRF.c',
+ 'execScan.c',
+ 'execTuples.c',
+ 'execUtils.c',
+ 'functions.c',
+ 'instrument.c',
+ 'nodeAgg.c',
+ 'nodeAppend.c',
+ 'nodeBitmapAnd.c',
+ 'nodeBitmapHeapscan.c',
+ 'nodeBitmapIndexscan.c',
+ 'nodeBitmapOr.c',
+ 'nodeCtescan.c',
+ 'nodeCustom.c',
+ 'nodeForeignscan.c',
+ 'nodeFunctionscan.c',
+ 'nodeGather.c',
+ 'nodeGatherMerge.c',
+ 'nodeGroup.c',
+ 'nodeHash.c',
+ 'nodeHashjoin.c',
+ 'nodeIncrementalSort.c',
+ 'nodeIndexonlyscan.c',
+ 'nodeIndexscan.c',
+ 'nodeLimit.c',
+ 'nodeLockRows.c',
+ 'nodeMaterial.c',
+ 'nodeMemoize.c',
+ 'nodeMergeAppend.c',
+ 'nodeMergejoin.c',
+ 'nodeModifyTable.c',
+ 'nodeNamedtuplestorescan.c',
+ 'nodeNestloop.c',
+ 'nodeProjectSet.c',
+ 'nodeRecursiveunion.c',
+ 'nodeResult.c',
+ 'nodeSamplescan.c',
+ 'nodeSeqscan.c',
+ 'nodeSetOp.c',
+ 'nodeSort.c',
+ 'nodeSubplan.c',
+ 'nodeSubqueryscan.c',
+ 'nodeTableFuncscan.c',
+ 'nodeTidrangescan.c',
+ 'nodeTidscan.c',
+ 'nodeUnique.c',
+ 'nodeValuesscan.c',
+ 'nodeWindowAgg.c',
+ 'nodeWorktablescan.c',
+ 'spi.c',
+ 'tqueue.c',
+ 'tstoreReceiver.c',
+)
diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build
new file mode 100644
index 00000000000..57463db92c1
--- /dev/null
+++ b/src/backend/foreign/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+ 'foreign.c'
+)
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
new file mode 100644
index 00000000000..a867eb60c9f
--- /dev/null
+++ b/src/backend/jit/llvm/meson.build
@@ -0,0 +1,41 @@
+if llvm.found()
+
+ llvmjit_sources = []
+
+ # Infrastructure
+ llvmjit_sources += files(
+ 'llvmjit.c',
+ 'llvmjit_error.cpp',
+ 'llvmjit_inline.cpp',
+ 'llvmjit_wrap.cpp',
+ )
+
+ # Code generation
+ llvmjit_sources += files(
+ 'llvmjit_deform.c',
+ 'llvmjit_expr.c',
+ )
+
+ llvmjit = shared_module('llvmjit',
+ llvmjit_sources,
+ kwargs: pg_mod_args + {
+ 'dependencies': pg_mod_args['dependencies'] + [llvm],
+ }
+ )
+
+ backend_targets += llvmjit
+
+ # Note this is intentionally not installed to bitcodedir, as it's not for
+ # inlining
+ llvmjit_types = custom_target('llvmjit_types.bc',
+ kwargs: llvm_irgen_kw + {
+ 'input': 'llvmjit_types.c',
+ 'output': 'llvmjit_types.bc',
+ 'depends': [postgres],
+ 'install': true,
+ 'install_dir': dir_lib_pkg,
+ }
+ )
+ backend_targets += llvmjit_types
+
+endif
diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build
new file mode 100644
index 00000000000..63cd33a4bed
--- /dev/null
+++ b/src/backend/jit/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+ 'jit.c'
+)
diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build
new file mode 100644
index 00000000000..53292563d34
--- /dev/null
+++ b/src/backend/lib/meson.build
@@ -0,0 +1,12 @@
+backend_sources += files(
+ 'binaryheap.c',
+ 'bipartite_match.c',
+ 'bloomfilter.c',
+ 'dshash.c',
+ 'hyperloglog.c',
+ 'ilist.c',
+ 'integerset.c',
+ 'knapsack.c',
+ 'pairingheap.c',
+ 'rbtree.c'
+)
diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build
new file mode 100644
index 00000000000..6061269ef13
--- /dev/null
+++ b/src/backend/libpq/meson.build
@@ -0,0 +1,32 @@
+backend_sources += files(
+ 'auth-sasl.c',
+ 'auth-scram.c',
+ 'auth.c',
+ 'be-fsstubs.c',
+ 'be-secure-common.c',
+ 'be-secure.c',
+ 'crypt.c',
+ 'hba.c',
+ 'ifaddr.c',
+ 'pqcomm.c',
+ 'pqformat.c',
+ 'pqmq.c',
+ 'pqsignal.c',
+)
+
+if ssl.found()
+ backend_sources += files('be-secure-openssl.c')
+endif
+
+if gssapi.found()
+ backend_sources += files(
+ 'be-secure-gssapi.c',
+ 'be-gssapi-common.c'
+ )
+endif
+
+install_data(
+ 'pg_hba.conf.sample',
+ 'pg_ident.conf.sample',
+ install_dir: dir_data,
+)
diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build
new file mode 100644
index 00000000000..241e125f089
--- /dev/null
+++ b/src/backend/main/meson.build
@@ -0,0 +1,2 @@
+main_file = files('main.c')
+backend_sources += main_file
diff --git a/src/backend/meson.build b/src/backend/meson.build
new file mode 100644
index 00000000000..0e8a0b01f5a
--- /dev/null
+++ b/src/backend/meson.build
@@ -0,0 +1,322 @@
+backend_build_deps = [backend_code]
+backend_sources = []
+backend_link_with = [pgport_srv, common_srv]
+
+generated_backend_sources = []
+
+subdir('access')
+subdir('backup')
+subdir('bootstrap')
+subdir('catalog')
+subdir('commands')
+subdir('executor')
+subdir('foreign')
+subdir('jit')
+subdir('lib')
+subdir('libpq')
+subdir('main')
+subdir('nodes')
+subdir('optimizer')
+subdir('parser')
+subdir('partitioning')
+subdir('port')
+subdir('postmaster')
+subdir('regex')
+subdir('replication')
+subdir('rewrite')
+subdir('statistics')
+subdir('storage')
+subdir('tcop')
+subdir('tsearch')
+subdir('utils')
+
+subdir('po', if_found: libintl)
+
+
+backend_link_args = []
+backend_link_depends = []
+backend_c_args = []
+
+if host_system == 'win32'
+ if cc.get_id() == 'msvc'
+ backend_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+ else
+ backend_link_args += '-Wl,--stack,@0@'.format(cdata.get('WIN32_STACK_RLIMIT'))
+ endif
+endif
+
+
+# On windows when compiling with msvc we need to make postgres export all its
+# symbols so that extension libraries can use them. For that we need to scan
+# the constituting objects and generate a file specifying all the functions as
+# exported (variables need an "import" declaration in the header, hence
+# PGDLLEXPORT, but functions work without that, due to import libraries
+# basically being trampolines).
+#
+# For dtrace probes we need to invoke dtrace on all input files, before
+# linking the final executable (see more below).
+#
+#
+# On meson there's currently no easy way to do this that I found. So we build
+# a static library with all the input objects, run our script to generate
+# exports, and build the final executable using that static library
+#
+# We could do that only if either dtrace or msvc is in use, but it seems
+# easier to just always do so.
+
+postgres_lib = static_library('postgres',
+ backend_sources + timezone_sources + generated_backend_sources,
+ link_whole: backend_link_with,
+ c_pch: pch_postgres_h,
+ c_args: backend_c_args,
+ dependencies: backend_build_deps,
+ kwargs: internal_lib_args,
+)
+
+if cc.get_id() == 'msvc'
+ postgres_def = custom_target('postgres.def',
+ command: [perl, files('../tools/msvc/gendef.pl'),
+ '--arch', host_cpu,
+ '--tempdir', '@PRIVATE_DIR@',
+ '--deffile', '@OUTPUT@',
+ '@INPUT@'],
+ input: [postgres_lib, common_srv, pgport_srv],
+ output: 'postgres.def',
+ depends: [postgres_lib, common_srv, pgport_srv],
+ install: false,
+ build_by_default: false,
+ )
+
+ backend_link_args += '/DEF:@0@'.format(postgres_def.full_path())
+ backend_link_depends += postgres_def
+ # Due to the way msvc and meson's precompiled headers implementation
+ # interact, we need to have symbols from the full library available. Could
+ # be restricted to b_pch=true.
+ backend_link_with += postgres_lib
+endif
+
+backend_input = []
+backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
+
+# As of 1/2010:
+# The probes.o file is necessary for dtrace support on Solaris, and on recent
+# versions of systemtap. (Older systemtap releases just produce an empty
+# file, but that's okay.) However, macOS's dtrace doesn't use it and doesn't
+# even recognize the -G option. So, build probes.o except on macOS.
+# This might need adjustment as other platforms add dtrace support.
+#
+# On at least linux we don't actually need to pass in all the objects, but
+# at least on FreeBSD and Solaris we have to.
+#
+# XXX: The reason we don't use the objects for generated sources is that
+# hits a meson bug. Luckily we don't don't have probes in generated
+# sources...
+if dtrace.found() and host_system != 'darwin'
+ backend_input += custom_target(
+ 'probes.o',
+ input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
+ output : 'probes.o',
+ command : [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
+ install: false,
+ )
+endif
+
+postgres = executable('postgres',
+ backend_input,
+ objects: backend_objs,
+ link_args: backend_link_args,
+ link_with: backend_link_with,
+ link_depends: backend_link_depends,
+ export_dynamic: true,
+ implib: true,
+ dependencies: backend_build_deps,
+ kwargs: default_bin_args,
+)
+
+backend_targets += postgres
+
+
+pg_mod_args = default_mod_args + {
+ 'dependencies': [backend_mod_code],
+ 'c_args': [],
+ 'cpp_args': [],
+ 'link_args': [],
+ 'link_with': [],
+}
+
+# only newer versions of meson know not to apply gnu_symbol_visibility=
+# inlineshidden to C code as well...
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+ pg_mod_args = pg_mod_args + {
+ 'link_args': pg_mod_args['link_args'] + ['-fvisibility=hidden'],
+ 'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'],
+ 'cpp_args': pg_mod_args['cpp_args'] + ['-fvisibility=hidden', '-fvisibility-inlines-hidden'],
+ }
+endif
+
+
+# Windows / MacOS link shared modules against postgres. To avoid unnecessary
+# build-time dependencies on other operating systems, only add it when
+# necessary.
+if host_system == 'win32' or host_system == 'darwin'
+ pg_mod_args += {
+ 'link_with': pg_mod_args['link_with'] + [postgres],
+ }
+endif
+if host_system == 'darwin'
+ pg_mod_args += {
+ 'link_args': pg_mod_args['link_args'] + ['-bundle_loader', '@0@'.format(postgres.full_path())],
+ }
+endif
+
+
+# Shared modules that, on some OSs, link against the server binary. Only enter
+# these after we defined the server build.
+
+subdir('jit/llvm')
+subdir('replication/libpqwalreceiver')
+subdir('replication/pgoutput')
+subdir('snowball')
+subdir('utils/mb/conversion_procs')
+
+
+
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = []
+pg_ext_libs = [backend_mod_code, thread_dep, ldflags]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+ if incdir.startswith('src/include')
+ subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+ else
+ subincdir = ''
+ endif
+ pg_ext_subdirs += subincdir
+
+ # Add directories in source / build dir containing headers to cflags for the
+ # -uninstalled.pc
+ pg_ext_vars_uninst += ['build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+ 'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir)]
+ pg_ext_cflags += ['${build_inc@0@}'.format(i),
+ '${src_inc@0@}'.format(i)]
+
+ i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags += functional_cflags
+
+if cdata.has('HAVE_VISIBILITY_ATTRIBUTE')
+ pg_ext_cflags += ['-fvisibility=hidden']
+endif
+
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'dir_bin=${prefix}/@0@'.format(dir_bin)
+pg_ext_vars += 'dir_mod=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+
+
+# XXX: Define variables making it easy to define tests, too
+
+
+# Ensure that external libraries
+if host_system == 'win32'
+ if cc.get_id() == 'msvc'
+ name = 'postgres.exe.lib'
+ else
+ name = 'libpostgres.exe.a'
+ endif
+ pg_ext_libs += ['${mod_link_with}']
+ pg_ext_vars_inst += 'mod_link_with=@0@'.format('${prefix}' / dir_bin / name)
+ pg_ext_vars_uninst += 'mod_link_with=@0@'.format(meson.current_build_dir() / name)
+elif host_system == 'darwin'
+ pg_ext_libs += ['-bundle_loader', '${mod_link_with}']
+ pg_ext_vars_inst += 'mod_link_with=@0@'.format('${prefix}' / dir_bin / 'postgres')
+ pg_ext_vars_uninst += 'mod_link_with=@0@'.format(postgres.full_path())
+endif
+
+# main .pc to build extensions
+pg_ext = pkgconfig.generate(
+ name: 'postgresql-extension',
+ description: 'PostgreSQL Extension Support',
+ url: pg_url,
+
+ subdirs: pg_ext_subdirs,
+ libraries: pg_ext_libs,
+ extra_cflags: pg_ext_cflags,
+
+ variables: pg_ext_vars + pg_ext_vars_inst,
+ uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+ name: 'postgresql-extension-warnings',
+ description: 'PostgreSQL Extension Support - Compiler Warnings',
+ requires: 'postgresql-extension',
+ url: pg_url,
+ extra_cflags: warning_cflags,
+
+ variables: pg_ext_vars + pg_ext_vars_inst,
+ uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+###############################################################
+# emit LLVM bitcode of backend code for JIT inlining
+###############################################################
+
+if llvm.found()
+
+ # custom_target() insists on targetting files into the current
+ # directory. But we have files with the same name in different
+ # subdirectories. generators() don't have that problem, but their results
+ # are not installable. The irlink command copies the files for us.
+ #
+ # FIXME: this needs to be in a central place
+ #
+ # generators don't accept CustomTargetIndex as input or 'depends', nor do
+ # they like targets with more than one output. However, a custom target
+ # accepts them as input without a problem. So we have the below transitive
+ # target :(
+
+ transitive_depend_target = custom_target('stamp',
+ input: generated_headers + generated_backend_headers + generated_backend_sources,
+ output: 'stamp',
+ command: [touch, '@OUTPUT@'],
+ install: false)
+
+ llvm_gen = generator(llvm_irgen_command,
+ arguments: llvm_irgen_args,
+ depends: transitive_depend_target,
+ depfile: '@BASENAME@.c.bc.d',
+ output: '@PLAINNAME@.bc',
+ )
+
+ bc_backend_sources = llvm_gen.process(backend_sources,
+ preserve_path_from: meson.current_source_dir())
+
+ postgres_llvm = custom_target('bitcode',
+ output: ['bitcode'],
+ input: bc_backend_sources,
+ kwargs: llvm_irlink_kw,
+ )
+
+ backend_targets += postgres_llvm
+
+endif
diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build
new file mode 100644
index 00000000000..1f7aa8d4a7e
--- /dev/null
+++ b/src/backend/nodes/meson.build
@@ -0,0 +1,30 @@
+backend_sources += files(
+ 'bitmapset.c',
+ 'extensible.c',
+ 'list.c',
+ 'makefuncs.c',
+ 'nodeFuncs.c',
+ 'nodes.c',
+ 'params.c',
+ 'print.c',
+ 'read.c',
+ 'tidbitmap.c',
+ 'value.c',
+)
+
+# these include .c files generated in ../../include/nodes, seems nicer to not
+# add that as an include path for the whole backend
+nodefunc_sources = files(
+ 'copyfuncs.c',
+ 'equalfuncs.c',
+ 'outfuncs.c',
+ 'readfuncs.c',
+)
+nodefuncs = static_library('nodefuncs',
+ nodefunc_sources,
+ c_pch: pch_c_h,
+ dependencies: [backend_code],
+ include_directories: include_directories('../../include/nodes'),
+ kwargs: internal_lib_args,
+)
+backend_link_with += nodefuncs
diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build
new file mode 100644
index 00000000000..c04f1dc2dfd
--- /dev/null
+++ b/src/backend/optimizer/geqo/meson.build
@@ -0,0 +1,17 @@
+backend_sources += files(
+ 'geqo_copy.c',
+ 'geqo_cx.c',
+ 'geqo_erx.c',
+ 'geqo_eval.c',
+ 'geqo_main.c',
+ 'geqo_misc.c',
+ 'geqo_mutation.c',
+ 'geqo_ox1.c',
+ 'geqo_ox2.c',
+ 'geqo_pmx.c',
+ 'geqo_pool.c',
+ 'geqo_px.c',
+ 'geqo_random.c',
+ 'geqo_recombination.c',
+ 'geqo_selection.c',
+)
diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build
new file mode 100644
index 00000000000..1ab1d9934ae
--- /dev/null
+++ b/src/backend/optimizer/meson.build
@@ -0,0 +1,5 @@
+subdir('geqo')
+subdir('path')
+subdir('plan')
+subdir('prep')
+subdir('util')
diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build
new file mode 100644
index 00000000000..310042e7aee
--- /dev/null
+++ b/src/backend/optimizer/path/meson.build
@@ -0,0 +1,11 @@
+backend_sources += files(
+ 'allpaths.c',
+ 'clausesel.c',
+ 'costsize.c',
+ 'equivclass.c',
+ 'indxpath.c',
+ 'joinpath.c',
+ 'joinrels.c',
+ 'pathkeys.c',
+ 'tidpath.c',
+)
diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build
new file mode 100644
index 00000000000..22ec65a3845
--- /dev/null
+++ b/src/backend/optimizer/plan/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+ 'analyzejoins.c',
+ 'createplan.c',
+ 'initsplan.c',
+ 'planagg.c',
+ 'planmain.c',
+ 'planner.c',
+ 'setrefs.c',
+ 'subselect.c',
+)
diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build
new file mode 100644
index 00000000000..4549a5b0e79
--- /dev/null
+++ b/src/backend/optimizer/prep/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+ 'prepagg.c',
+ 'prepjointree.c',
+ 'prepqual.c',
+ 'preptlist.c',
+ 'prepunion.c',
+)
diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build
new file mode 100644
index 00000000000..e7ceaf566b5
--- /dev/null
+++ b/src/backend/optimizer/util/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+ 'appendinfo.c',
+ 'clauses.c',
+ 'inherit.c',
+ 'joininfo.c',
+ 'orclauses.c',
+ 'paramassign.c',
+ 'pathnode.c',
+ 'placeholder.c',
+ 'plancat.c',
+ 'predtest.c',
+ 'relnode.c',
+ 'restrictinfo.c',
+ 'tlist.c',
+ 'var.c',
+)
diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build
new file mode 100644
index 00000000000..b442f34b269
--- /dev/null
+++ b/src/backend/parser/meson.build
@@ -0,0 +1,49 @@
+backend_sources += files(
+ 'analyze.c',
+ 'parse_agg.c',
+ 'parse_clause.c',
+ 'parse_coerce.c',
+ 'parse_collate.c',
+ 'parse_cte.c',
+ 'parse_enr.c',
+ 'parse_expr.c',
+ 'parse_func.c',
+ 'parse_jsontable.c',
+ 'parse_merge.c',
+ 'parse_node.c',
+ 'parse_oper.c',
+ 'parse_param.c',
+ 'parse_relation.c',
+ 'parse_target.c',
+ 'parse_type.c',
+ 'parse_utilcmd.c',
+ 'scansup.c',
+)
+
+# Build a small utility static lib for the parser. This makes it easier to not
+# depend on gram.h already having been generated for most of the other code
+# (which depends on generated headers having been generated). The generation
+# of the parser is slow...
+
+parser_sources = [files('parser.c')]
+
+backend_scanner = custom_target('scan',
+ input: ['scan.l'],
+ output: ['scan.c'],
+ command: [flex_cmd, flex_backup, flex_fix_warning, '-CF', '-p', '-p', '@INPUT@'],)
+generated_sources += backend_scanner
+parser_sources += backend_scanner
+
+parser_sources += backend_parser_code
+parser_sources += backend_parser_header
+
+generated_sources += backend_parser_code
+generated_sources += backend_parser_header
+
+parser = static_library('parser',
+ parser_sources + generated_headers,
+ c_pch: pch_c_h,
+ dependencies: [backend_code],
+ kwargs: internal_lib_args,
+)
+backend_link_with += parser
diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build
new file mode 100644
index 00000000000..e5e3806a0cc
--- /dev/null
+++ b/src/backend/partitioning/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+ 'partbounds.c',
+ 'partdesc.c',
+ 'partprune.c',
+)
diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build
new file mode 100644
index 00000000000..4ace0554680
--- /dev/null
+++ b/src/backend/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('postgres-' + pg_version_major.to_string())
diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build
new file mode 100644
index 00000000000..b2c1c471544
--- /dev/null
+++ b/src/backend/port/meson.build
@@ -0,0 +1,31 @@
+backend_sources += files(
+ 'atomics.c',
+)
+
+
+if cdata.has('USE_UNNAMED_POSIX_SEMAPHORES') or cdata.has('USE_NAMED_POSIX_SEMAPHORES')
+ backend_sources += files('posix_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SEMAPHORES')
+ backend_sources += files('sysv_sema.c')
+endif
+
+if cdata.has('USE_WIN32_SEMAPHORES')
+ backend_sources += files('win32_sema.c')
+endif
+
+if cdata.has('USE_SYSV_SHARED_MEMORY')
+ backend_sources += files('sysv_shmem.c')
+endif
+
+if cdata.has('USE_WIN32_SHARED_MEMORY')
+ backend_sources += files('win32_shmem.c')
+endif
+
+if host_system == 'win32'
+ subdir('win32')
+endif
+
+# autoconf generates the file there, ensure we get a conflict
+generated_sources_ac += {'src/backend/port': ['pg_sema.c', 'pg_shmem.c', 'tas.s']}
diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build
new file mode 100644
index 00000000000..68fe4cc3cd0
--- /dev/null
+++ b/src/backend/port/win32/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+ 'crashdump.c',
+ 'signal.c',
+ 'socket.c',
+ 'timer.c',
+)
diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build
new file mode 100644
index 00000000000..293a44ca295
--- /dev/null
+++ b/src/backend/postmaster/meson.build
@@ -0,0 +1,15 @@
+backend_sources += files(
+ 'autovacuum.c',
+ 'auxprocess.c',
+ 'bgworker.c',
+ 'bgwriter.c',
+ 'checkpointer.c',
+ 'fork_process.c',
+ 'interrupt.c',
+ 'pgarch.c',
+ 'postmaster.c',
+ 'shell_archive.c',
+ 'startup.c',
+ 'syslogger.c',
+ 'walwriter.c',
+)
diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build
new file mode 100644
index 00000000000..c255f39a682
--- /dev/null
+++ b/src/backend/regex/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+ 'regcomp.c',
+ 'regerror.c',
+ 'regexec.c',
+ 'regexport.c',
+ 'regfree.c',
+ 'regprefix.c'
+)
diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build
new file mode 100644
index 00000000000..3fc786c80a0
--- /dev/null
+++ b/src/backend/replication/libpqwalreceiver/meson.build
@@ -0,0 +1,13 @@
+libpqwalreceiver_sources = files(
+ 'libpqwalreceiver.c',
+)
+
+libpqwalreceiver = shared_module('pqwalreceiver',
+ libpqwalreceiver_sources,
+ kwargs: pg_mod_args + {
+ 'name_prefix': 'lib',
+ 'dependencies': pg_mod_args['dependencies'] + [libpq],
+ }
+)
+
+backend_targets += libpqwalreceiver
diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build
new file mode 100644
index 00000000000..773583a12ba
--- /dev/null
+++ b/src/backend/replication/logical/meson.build
@@ -0,0 +1,14 @@
+backend_sources += files(
+ 'decode.c',
+ 'launcher.c',
+ 'logical.c',
+ 'logicalfuncs.c',
+ 'message.c',
+ 'origin.c',
+ 'proto.c',
+ 'relation.c',
+ 'reorderbuffer.c',
+ 'snapbuild.c',
+ 'tablesync.c',
+ 'worker.c',
+)
diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build
new file mode 100644
index 00000000000..31828346869
--- /dev/null
+++ b/src/backend/replication/meson.build
@@ -0,0 +1,42 @@
+backend_sources += files(
+ 'slot.c',
+ 'slotfuncs.c',
+ 'syncrep.c',
+ 'walreceiver.c',
+ 'walreceiverfuncs.c',
+ 'walsender.c',
+)
+
+# [sync]repl_scanner is compiled as part of [sync]repl_gram. The
+# ordering is enforced by making the generation of grammar depend on
+# the scanner generation. That's unnecessarily strict, but overall
+# harmless.
+
+repl_scanner = custom_target('repl_scanner',
+ input : files('repl_scanner.l'),
+ output : ['repl_scanner.c'],
+ command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += repl_scanner
+
+generated_backend_sources += custom_target('repl_gram',
+ input: 'repl_gram.y',
+ output: 'repl_gram.c',
+ depends: repl_scanner,
+ command: [bison_cmd, '@INPUT@'],)
+
+
+syncrep_scanner = custom_target('syncrep_scanner',
+ input: 'syncrep_scanner.l',
+ output: 'syncrep_scanner.c',
+ command: [flex_cmd, '@INPUT@'],)
+generated_sources += syncrep_scanner
+
+generated_backend_sources += custom_target('syncrep_gram',
+ input: 'syncrep_gram.y',
+ output: 'syncrep_gram.c',
+ depends: syncrep_scanner,
+ command: [bison_cmd, '@INPUT@'],)
+
+
+subdir('logical')
diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build
new file mode 100644
index 00000000000..8ff0a0c6133
--- /dev/null
+++ b/src/backend/replication/pgoutput/meson.build
@@ -0,0 +1,11 @@
+pgoutput_sources = files(
+ 'pgoutput.c',
+)
+
+pgoutput = shared_module('pgoutput',
+ pgoutput_sources,
+ kwargs: pg_mod_args + {
+ }
+)
+
+backend_targets += pgoutput
diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build
new file mode 100644
index 00000000000..032e2e409b5
--- /dev/null
+++ b/src/backend/rewrite/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+ 'rewriteDefine.c',
+ 'rewriteHandler.c',
+ 'rewriteManip.c',
+ 'rewriteRemove.c',
+ 'rewriteSearchCycle.c',
+ 'rewriteSupport.c',
+ 'rowsecurity.c'
+)
diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build
new file mode 100644
index 00000000000..2a59901293b
--- /dev/null
+++ b/src/backend/snowball/meson.build
@@ -0,0 +1,85 @@
+dict_snowball_sources = files(
+ 'dict_snowball.c',
+ 'libstemmer/api.c',
+ 'libstemmer/utilities.c',
+)
+
+dict_snowball_sources += files(
+ 'libstemmer/stem_ISO_8859_1_basque.c',
+ 'libstemmer/stem_ISO_8859_1_catalan.c',
+ 'libstemmer/stem_ISO_8859_1_danish.c',
+ 'libstemmer/stem_ISO_8859_1_dutch.c',
+ 'libstemmer/stem_ISO_8859_1_english.c',
+ 'libstemmer/stem_ISO_8859_1_finnish.c',
+ 'libstemmer/stem_ISO_8859_1_french.c',
+ 'libstemmer/stem_ISO_8859_1_german.c',
+ 'libstemmer/stem_ISO_8859_1_indonesian.c',
+ 'libstemmer/stem_ISO_8859_1_irish.c',
+ 'libstemmer/stem_ISO_8859_1_italian.c',
+ 'libstemmer/stem_ISO_8859_1_norwegian.c',
+ 'libstemmer/stem_ISO_8859_1_porter.c',
+ 'libstemmer/stem_ISO_8859_1_portuguese.c',
+ 'libstemmer/stem_ISO_8859_1_spanish.c',
+ 'libstemmer/stem_ISO_8859_1_swedish.c',
+ 'libstemmer/stem_ISO_8859_2_hungarian.c',
+ 'libstemmer/stem_ISO_8859_2_romanian.c',
+ 'libstemmer/stem_KOI8_R_russian.c',
+ 'libstemmer/stem_UTF_8_arabic.c',
+ 'libstemmer/stem_UTF_8_armenian.c',
+ 'libstemmer/stem_UTF_8_basque.c',
+ 'libstemmer/stem_UTF_8_catalan.c',
+ 'libstemmer/stem_UTF_8_danish.c',
+ 'libstemmer/stem_UTF_8_dutch.c',
+ 'libstemmer/stem_UTF_8_english.c',
+ 'libstemmer/stem_UTF_8_finnish.c',
+ 'libstemmer/stem_UTF_8_french.c',
+ 'libstemmer/stem_UTF_8_german.c',
+ 'libstemmer/stem_UTF_8_greek.c',
+ 'libstemmer/stem_UTF_8_hindi.c',
+ 'libstemmer/stem_UTF_8_hungarian.c',
+ 'libstemmer/stem_UTF_8_indonesian.c',
+ 'libstemmer/stem_UTF_8_irish.c',
+ 'libstemmer/stem_UTF_8_italian.c',
+ 'libstemmer/stem_UTF_8_lithuanian.c',
+ 'libstemmer/stem_UTF_8_nepali.c',
+ 'libstemmer/stem_UTF_8_norwegian.c',
+ 'libstemmer/stem_UTF_8_porter.c',
+ 'libstemmer/stem_UTF_8_portuguese.c',
+ 'libstemmer/stem_UTF_8_romanian.c',
+ 'libstemmer/stem_UTF_8_russian.c',
+ 'libstemmer/stem_UTF_8_serbian.c',
+ 'libstemmer/stem_UTF_8_spanish.c',
+ 'libstemmer/stem_UTF_8_swedish.c',
+ 'libstemmer/stem_UTF_8_tamil.c',
+ 'libstemmer/stem_UTF_8_turkish.c',
+ 'libstemmer/stem_UTF_8_yiddish.c',
+)
+
+# see comment in src/include/snowball/header.h
+stemmer_inc = include_directories('../../include/snowball')
+
+dict_snowball = shared_module('dict_snowball',
+ dict_snowball_sources,
+ c_pch: pch_postgres_h,
+ kwargs: pg_mod_args + {
+ 'include_directories': [stemmer_inc],
+ }
+)
+
+snowball_create = custom_target('snowball_create',
+ input: ['snowball_create.pl'],
+ output: ['snowball_create.sql'],
+ depfile: 'snowball_create.dep',
+ command: [perl, '@INPUT0@', '--depfile', '--input', '@CURRENT_SOURCE_DIR@', '--outdir', '@OUTDIR@'],
+ install: true,
+ install_dir: dir_data,
+)
+generated_sources += snowball_create
+
+install_subdir('stopwords',
+ install_dir: dir_data / 'tsearch_data',
+ strip_directory: true,
+)
+
+backend_targets += dict_snowball
+backend_targets += snowball_create
diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build
new file mode 100644
index 00000000000..8530c55f73c
--- /dev/null
+++ b/src/backend/statistics/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+ 'dependencies.c',
+ 'extended_stats.c',
+ 'mcv.c',
+ 'mvdistinct.c',
+)
diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build
new file mode 100644
index 00000000000..56a59b52484
--- /dev/null
+++ b/src/backend/storage/buffer/meson.build
@@ -0,0 +1,7 @@
+backend_sources += files(
+ 'buf_init.c',
+ 'buf_table.c',
+ 'bufmgr.c',
+ 'freelist.c',
+ 'localbuf.c',
+)
diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build
new file mode 100644
index 00000000000..e1d5047d4aa
--- /dev/null
+++ b/src/backend/storage/file/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+ 'buffile.c',
+ 'copydir.c',
+ 'fd.c',
+ 'fileset.c',
+ 'reinit.c',
+ 'sharedfileset.c',
+)
diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build
new file mode 100644
index 00000000000..e4200ea6527
--- /dev/null
+++ b/src/backend/storage/freespace/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+ 'freespace.c',
+ 'fsmpage.c',
+ 'indexfsm.c',
+)
diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build
new file mode 100644
index 00000000000..516bc1d0193
--- /dev/null
+++ b/src/backend/storage/ipc/meson.build
@@ -0,0 +1,20 @@
+backend_sources += files(
+ 'barrier.c',
+ 'dsm.c',
+ 'dsm_impl.c',
+ 'ipc.c',
+ 'ipci.c',
+ 'latch.c',
+ 'pmsignal.c',
+ 'procarray.c',
+ 'procsignal.c',
+ 'shm_mq.c',
+ 'shm_toc.c',
+ 'shmem.c',
+ 'shmqueue.c',
+ 'signalfuncs.c',
+ 'sinval.c',
+ 'sinvaladt.c',
+ 'standby.c',
+
+)
diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build
new file mode 100644
index 00000000000..8a181ab9b34
--- /dev/null
+++ b/src/backend/storage/large_object/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+ 'inv_api.c',
+)
diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
new file mode 100644
index 00000000000..68237c8a2e8
--- /dev/null
+++ b/src/backend/storage/lmgr/meson.build
@@ -0,0 +1,13 @@
+backend_sources += files(
+ 'condition_variable.c',
+ 'deadlock.c',
+ 'lmgr.c',
+ 'lock.c',
+ 'lwlock.c',
+ 'predicate.c',
+ 'proc.c',
+ 's_lock.c',
+ 'spin.c',
+)
+
+generated_backend_sources += lwlocknames[1]
diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build
new file mode 100644
index 00000000000..daad628d74c
--- /dev/null
+++ b/src/backend/storage/meson.build
@@ -0,0 +1,9 @@
+subdir('buffer')
+subdir('file')
+subdir('freespace')
+subdir('ipc')
+subdir('large_object')
+subdir('lmgr')
+subdir('page')
+subdir('smgr')
+subdir('sync')
diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build
new file mode 100644
index 00000000000..2ecd16c952c
--- /dev/null
+++ b/src/backend/storage/page/meson.build
@@ -0,0 +1,5 @@
+backend_sources += files(
+ 'bufpage.c',
+ 'checksum.c',
+ 'itemptr.c',
+)
diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build
new file mode 100644
index 00000000000..fdeb1223b32
--- /dev/null
+++ b/src/backend/storage/smgr/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+ 'md.c',
+ 'smgr.c',
+)
diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build
new file mode 100644
index 00000000000..05148b91a8e
--- /dev/null
+++ b/src/backend/storage/sync/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+ 'sync.c',
+
+)
diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build
new file mode 100644
index 00000000000..fb54aae8122
--- /dev/null
+++ b/src/backend/tcop/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+ 'cmdtag.c',
+ 'dest.c',
+ 'fastpath.c',
+ 'postgres.c',
+ 'pquery.c',
+ 'utility.c',
+)
diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build
new file mode 100644
index 00000000000..4144e9befc5
--- /dev/null
+++ b/src/backend/tsearch/meson.build
@@ -0,0 +1,21 @@
+backend_sources += files(
+ 'dict.c',
+ 'dict_ispell.c',
+ 'dict_simple.c',
+ 'dict_synonym.c',
+ 'dict_thesaurus.c',
+ 'regis.c',
+ 'spell.c',
+ 'to_tsany.c',
+ 'ts_locale.c',
+ 'ts_parse.c',
+ 'ts_selfuncs.c',
+ 'ts_typanalyze.c',
+ 'ts_utils.c',
+ 'wparser.c',
+ 'wparser_def.c',
+)
+
+install_subdir('dicts',
+ install_dir: dir_data / 'tsearch_data',
+ strip_directory: true)
diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build
new file mode 100644
index 00000000000..5b3b558a67d
--- /dev/null
+++ b/src/backend/utils/activity/meson.build
@@ -0,0 +1,18 @@
+backend_sources += files(
+ 'backend_progress.c',
+ 'backend_status.c',
+ 'pgstat.c',
+ 'pgstat_archiver.c',
+ 'pgstat_bgwriter.c',
+ 'pgstat_checkpointer.c',
+ 'pgstat_database.c',
+ 'pgstat_function.c',
+ 'pgstat_relation.c',
+ 'pgstat_replslot.c',
+ 'pgstat_shmem.c',
+ 'pgstat_slru.c',
+ 'pgstat_subscription.c',
+ 'pgstat_wal.c',
+ 'pgstat_xact.c',
+ 'wait_event.c',
+)
diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build
new file mode 100644
index 00000000000..e8727e71262
--- /dev/null
+++ b/src/backend/utils/adt/meson.build
@@ -0,0 +1,120 @@
+backend_sources += files(
+ 'acl.c',
+ 'amutils.c',
+ 'array_expanded.c',
+ 'array_selfuncs.c',
+ 'array_typanalyze.c',
+ 'array_userfuncs.c',
+ 'arrayfuncs.c',
+ 'arraysubs.c',
+ 'arrayutils.c',
+ 'ascii.c',
+ 'bool.c',
+ 'cash.c',
+ 'char.c',
+ 'cryptohashfuncs.c',
+ 'date.c',
+ 'datetime.c',
+ 'datum.c',
+ 'dbsize.c',
+ 'domains.c',
+ 'encode.c',
+ 'enum.c',
+ 'expandeddatum.c',
+ 'expandedrecord.c',
+ 'float.c',
+ 'format_type.c',
+ 'formatting.c',
+ 'genfile.c',
+ 'geo_ops.c',
+ 'geo_selfuncs.c',
+ 'geo_spgist.c',
+ 'hbafuncs.c',
+ 'inet_cidr_ntop.c',
+ 'inet_net_pton.c',
+ 'int.c',
+ 'int8.c',
+ 'json.c',
+ 'jsonb.c',
+ 'jsonb_gin.c',
+ 'jsonb_op.c',
+ 'jsonb_util.c',
+ 'jsonfuncs.c',
+ 'jsonbsubs.c',
+ 'jsonpath.c',
+ 'jsonpath_exec.c',
+ 'like.c',
+ 'like_support.c',
+ 'lockfuncs.c',
+ 'mac.c',
+ 'mac8.c',
+ 'mcxtfuncs.c',
+ 'misc.c',
+ 'multirangetypes.c',
+ 'multirangetypes_selfuncs.c',
+ 'name.c',
+ 'network.c',
+ 'network_gist.c',
+ 'network_selfuncs.c',
+ 'network_spgist.c',
+ 'numeric.c',
+ 'numutils.c',
+ 'oid.c',
+ 'oracle_compat.c',
+ 'orderedsetaggs.c',
+ 'partitionfuncs.c',
+ 'pg_locale.c',
+ 'pg_lsn.c',
+ 'pg_upgrade_support.c',
+ 'pgstatfuncs.c',
+ 'pseudotypes.c',
+ 'quote.c',
+ 'rangetypes.c',
+ 'rangetypes_gist.c',
+ 'rangetypes_selfuncs.c',
+ 'rangetypes_spgist.c',
+ 'rangetypes_typanalyze.c',
+ 'regexp.c',
+ 'regproc.c',
+ 'ri_triggers.c',
+ 'rowtypes.c',
+ 'ruleutils.c',
+ 'selfuncs.c',
+ 'tid.c',
+ 'timestamp.c',
+ 'trigfuncs.c',
+ 'tsginidx.c',
+ 'tsgistidx.c',
+ 'tsquery.c',
+ 'tsquery_cleanup.c',
+ 'tsquery_gist.c',
+ 'tsquery_op.c',
+ 'tsquery_rewrite.c',
+ 'tsquery_util.c',
+ 'tsrank.c',
+ 'tsvector.c',
+ 'tsvector_op.c',
+ 'tsvector_parser.c',
+ 'uuid.c',
+ 'varbit.c',
+ 'varchar.c',
+ 'varlena.c',
+ 'version.c',
+ 'windowfuncs.c',
+ 'xid.c',
+ 'xid8funcs.c',
+ 'xml.c',
+)
+
+
+jsonpath_scan = custom_target('jsonpath_scan',
+ input: ['jsonpath_scan.l'],
+ output: ['jsonpath_scan.c'],
+ command: [flex_cmd, flex_backup, '-CF', '-p', '-p', '@INPUT@'],)
+generated_sources += jsonpath_scan
+
+# jsonpath_scan is compiled as part of jsonpath_gram
+generated_backend_sources += custom_target('jsonpath_parse',
+ input: ['jsonpath_gram.y', jsonpath_scan[0]],
+ output: ['jsonpath_gram.c'],
+ command: [bison_cmd, '@INPUT0@'],)
diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build
new file mode 100644
index 00000000000..4fe6db6bda6
--- /dev/null
+++ b/src/backend/utils/cache/meson.build
@@ -0,0 +1,16 @@
+backend_sources += files(
+ 'attoptcache.c',
+ 'catcache.c',
+ 'evtcache.c',
+ 'inval.c',
+ 'lsyscache.c',
+ 'partcache.c',
+ 'plancache.c',
+ 'relcache.c',
+ 'relfilenumbermap.c',
+ 'relmapper.c',
+ 'spccache.c',
+ 'syscache.c',
+ 'ts_cache.c',
+ 'typcache.c',
+)
diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build
new file mode 100644
index 00000000000..325446c8f93
--- /dev/null
+++ b/src/backend/utils/error/meson.build
@@ -0,0 +1,6 @@
+backend_sources += files(
+ 'assert.c',
+ 'csvlog.c',
+ 'elog.c',
+ 'jsonlog.c',
+)
diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build
new file mode 100644
index 00000000000..e545b424fd2
--- /dev/null
+++ b/src/backend/utils/fmgr/meson.build
@@ -0,0 +1,8 @@
+backend_sources += files(
+ 'dfmgr.c',
+ 'fmgr.c',
+ 'funcapi.c',
+)
+
+# fmgrtab.c
+generated_backend_sources += fmgrtab_target[2]
diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build
new file mode 100644
index 00000000000..242e2f0ecdf
--- /dev/null
+++ b/src/backend/utils/hash/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+ 'dynahash.c',
+ 'pg_crc.c'
+)
diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build
new file mode 100644
index 00000000000..ec9d72c3df1
--- /dev/null
+++ b/src/backend/utils/init/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+ 'globals.c',
+ 'miscinit.c',
+ 'postinit.c')
diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build
new file mode 100644
index 00000000000..b84a78b6318
--- /dev/null
+++ b/src/backend/utils/mb/conversion_procs/meson.build
@@ -0,0 +1,38 @@
+encodings = {
+ 'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'],
+ 'euc2004_sjis2004': ['euc2004_sjis2004/euc2004_sjis2004.c'],
+ 'euc_cn_and_mic': ['euc_cn_and_mic/euc_cn_and_mic.c'],
+ 'euc_jp_and_sjis': ['euc_jp_and_sjis/euc_jp_and_sjis.c'],
+ 'euc_kr_and_mic': ['euc_kr_and_mic/euc_kr_and_mic.c'],
+ 'euc_tw_and_big5': [
+ 'euc_tw_and_big5/euc_tw_and_big5.c',
+ 'euc_tw_and_big5/big5.c',
+ ],
+ 'latin2_and_win1250': ['latin2_and_win1250/latin2_and_win1250.c'],
+ 'latin_and_mic': ['latin_and_mic/latin_and_mic.c'],
+ 'utf8_and_big5': ['utf8_and_big5/utf8_and_big5.c'],
+ 'utf8_and_cyrillic': ['utf8_and_cyrillic/utf8_and_cyrillic.c'],
+ 'utf8_and_euc2004': ['utf8_and_euc2004/utf8_and_euc2004.c'],
+ 'utf8_and_euc_cn': ['utf8_and_euc_cn/utf8_and_euc_cn.c'],
+ 'utf8_and_euc_jp': ['utf8_and_euc_jp/utf8_and_euc_jp.c'],
+ 'utf8_and_euc_kr': ['utf8_and_euc_kr/utf8_and_euc_kr.c'],
+ 'utf8_and_euc_tw': ['utf8_and_euc_tw/utf8_and_euc_tw.c'],
+ 'utf8_and_gb18030': ['utf8_and_gb18030/utf8_and_gb18030.c'],
+ 'utf8_and_gbk': ['utf8_and_gbk/utf8_and_gbk.c'],
+ 'utf8_and_iso8859': ['utf8_and_iso8859/utf8_and_iso8859.c'],
+ 'utf8_and_iso8859_1': ['utf8_and_iso8859_1/utf8_and_iso8859_1.c'],
+ 'utf8_and_johab': ['utf8_and_johab/utf8_and_johab.c'],
+ 'utf8_and_sjis': ['utf8_and_sjis/utf8_and_sjis.c'],
+ 'utf8_and_sjis2004': ['utf8_and_sjis2004/utf8_and_sjis2004.c'],
+ 'utf8_and_uhc': ['utf8_and_uhc/utf8_and_uhc.c'],
+ 'utf8_and_win': ['utf8_and_win/utf8_and_win.c'],
+}
+
+foreach encoding, sources : encodings
+ backend_targets += shared_module(encoding,
+ sources,
+ kwargs: pg_mod_args + {
+ }
+ )
+
+endforeach
diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build
new file mode 100644
index 00000000000..39e45638db0
--- /dev/null
+++ b/src/backend/utils/mb/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+ 'conv.c',
+ 'mbutils.c',
+ 'stringinfo_mb.c',
+ 'wstrcmp.c',
+ 'wstrncmp.c',
+)
+
+# Note we only enter conversion_procs once the backend build is defined
diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build
new file mode 100644
index 00000000000..3a916320bb3
--- /dev/null
+++ b/src/backend/utils/meson.build
@@ -0,0 +1,17 @@
+install_data('errcodes.txt',
+ install_dir: dir_data,
+)
+
+subdir('activity')
+subdir('adt')
+subdir('cache')
+subdir('error')
+subdir('fmgr')
+subdir('hash')
+subdir('init')
+subdir('mb')
+subdir('misc')
+subdir('mmgr')
+subdir('resowner')
+subdir('sort')
+subdir('time')
diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build
new file mode 100644
index 00000000000..8fbb128235b
--- /dev/null
+++ b/src/backend/utils/misc/meson.build
@@ -0,0 +1,33 @@
+backend_sources += files(
+ 'guc.c',
+ 'help_config.c',
+ 'pg_config.c',
+ 'pg_controldata.c',
+ 'pg_rusage.c',
+ 'ps_status.c',
+ 'queryenvironment.c',
+ 'queryjumble.c',
+ 'rls.c',
+ 'sampling.c',
+ 'superuser.c',
+ 'timeout.c',
+ 'tzparser.c',
+)
+
+# guc-file.c is compiled as part of guc.c, generate guc-file.c.h so it can be
+# added as a dependency for the executable. Not pretty, but there's no
+# obviously better solution right now
+guc_scan = custom_target('guc_scan',
+ input: ['guc-file.l'],
+ output: ['guc-file.c', 'guc-file.c.h'],
+ command: [flex_cmd, '@INPUT@', '--stamp_header', '@OUTPUT1@'])
+
+backend_build_deps += declare_dependency(
+ sources: guc_scan[1],
+ include_directories: include_directories('.'))
+generated_backend_headers += guc_scan[1]
+generated_sources += guc_scan[0]
+
+install_data('postgresql.conf.sample',
+ install_dir: dir_data,
+)
diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build
new file mode 100644
index 00000000000..641bb181ba1
--- /dev/null
+++ b/src/backend/utils/mmgr/meson.build
@@ -0,0 +1,10 @@
+backend_sources += files(
+ 'aset.c',
+ 'dsa.c',
+ 'freepage.c',
+ 'generation.c',
+ 'mcxt.c',
+ 'memdebug.c',
+ 'portalmem.c',
+ 'slab.c',
+)
diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build
new file mode 100644
index 00000000000..d30891ca027
--- /dev/null
+++ b/src/backend/utils/resowner/meson.build
@@ -0,0 +1,3 @@
+backend_sources += files(
+ 'resowner.c'
+)
diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build
new file mode 100644
index 00000000000..a475b183405
--- /dev/null
+++ b/src/backend/utils/sort/meson.build
@@ -0,0 +1,9 @@
+backend_sources += files(
+ 'logtape.c',
+ 'sharedtuplestore.c',
+ 'sortsupport.c',
+ 'tuplesort.c',
+ 'tuplesortvariants.c',
+ 'tuplestore.c',
+ 'qsort_interruptible.c',
+)
diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build
new file mode 100644
index 00000000000..6fff8792bb0
--- /dev/null
+++ b/src/backend/utils/time/meson.build
@@ -0,0 +1,4 @@
+backend_sources += files(
+ 'combocid.c',
+ 'snapmgr.c',
+)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
new file mode 100644
index 00000000000..bed3ed78b5f
--- /dev/null
+++ b/src/fe_utils/meson.build
@@ -0,0 +1,30 @@
+fe_utils_sources = files(
+ 'archive.c',
+ 'cancel.c',
+ 'conditional.c',
+ 'connect_utils.c',
+ 'mbprint.c',
+ 'option_utils.c',
+ 'parallel_slot.c',
+ 'print.c',
+ 'query_utils.c',
+ 'recovery_gen.c',
+ 'simple_list.c',
+ 'string_utils.c',
+)
+
+psqlscan = custom_target('psqlscan',
+ input: ['psqlscan.l'],
+ output: ['psqlscan.c'],
+ command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'],
+)
+generated_sources += psqlscan
+fe_utils_sources += psqlscan
+
+fe_utils = static_library('pgfeutils',
+ fe_utils_sources + generated_headers,
+ c_pch: pch_c_h,
+ include_directories : [postgres_inc, libpq_inc],
+ c_args: ['-DFRONTEND'],
+ kwargs: default_lib_args,
+)
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 00000000000..131c416064f
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,39 @@
+initdb_sources = files(
+ 'findtimezone.c',
+ 'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+if host_system == 'win32'
+ initdb_sources += windows.compile_resources(
+ custom_target('win32ver.rc', kwargs: rcgen_kw,
+ command: rcgen_bin_cmd + [
+ '--FILEDESC', 'initdb - initialize a new database cluster',
+ '--NAME', 'initdb',]),
+ kwargs: rccompile_kw,
+ )
+endif
+
+executable('initdb',
+ initdb_sources,
+ include_directories: [timezone_inc],
+ dependencies: [frontend_code, libpq, icu, icu_i18n],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'initdb',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_initdb.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 00000000000..8b8a9fd2ce1
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('initdb-' + pg_version_major.to_string())
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 00000000000..5fd5a9d2f98
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,20 @@
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 00000000000..3d130097615
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,26 @@
+pg_amcheck_sources = files(
+ 'pg_amcheck.c'
+)
+
+pg_amcheck = executable('pg_amcheck',
+ pg_amcheck_sources,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_amcheck',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_nonesuch.pl',
+ 't/003_check.pl',
+ 't/004_verify_heapam.pl',
+ 't/005_opclass_damage.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 00000000000..b255f552c94
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_amcheck-' + pg_version_major.to_string())
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 00000000000..b5d393b3b32
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,18 @@
+pg_archivecleanup = executable('pg_archivecleanup',
+ ['pg_archivecleanup.c'],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_archivecleanup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/010_pg_archivecleanup.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 00000000000..37935fcabc4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 00000000000..857e2b77d23
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,58 @@
+common_sources = files(
+ 'bbstreamer_file.c',
+ 'bbstreamer_gzip.c',
+ 'bbstreamer_inject.c',
+ 'bbstreamer_lz4.c',
+ 'bbstreamer_tar.c',
+ 'bbstreamer_zstd.c',
+ 'receivelog.c',
+ 'streamutil.c',
+ 'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+ common_sources,
+ dependencies: pg_basebackup_deps,
+ kwargs: internal_lib_args,
+)
+
+executable('pg_basebackup',
+ 'pg_basebackup.c',
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+
+executable('pg_receivewal',
+ 'pg_receivewal.c',
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+
+executable('pg_recvlogical',
+ 'pg_recvlogical.c',
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name' : 'pg_basebackup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'GZIP_PROGRAM': gzip.path(),
+ 'TAR': tar.path(),
+ 'LZ4': program_lz4.found() ? program_lz4.path() : '',
+ 'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+ 'tests': [
+ 't/010_pg_basebackup.pl',
+ 't/020_pg_receivewal.pl',
+ 't/030_pg_recvlogical.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 00000000000..cab021153fe
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_basebackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 00000000000..c58bcca2f97
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,20 @@
+executable('pg_checksums',
+ ['pg_checksums.c'],
+ include_directories: [timezone_inc],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_checksums',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_actions.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 00000000000..2c47c2338f6
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_checksums-' + pg_version_major.to_string())
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 00000000000..90664bb3bc3
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,18 @@
+executable('pg_config',
+ ['pg_config.c'],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_config',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_pg_config.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 00000000000..b6fb6db9213
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_config-' + pg_version_major.to_string())
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 00000000000..969eed2888e
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,18 @@
+executable('pg_controldata',
+ ['pg_controldata.c'],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_controldata',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_pg_controldata.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 00000000000..31b486d002c
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_controldata-' + pg_version_major.to_string())
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 00000000000..bbb30198d96
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,21 @@
+executable('pg_ctl',
+ ['pg_ctl.c'],
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_ctl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_start_stop.pl',
+ 't/002_status.pl',
+ 't/003_promote.pl',
+ 't/004_logrotate.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 00000000000..947b5108423
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_ctl-' + pg_version_major.to_string())
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 00000000000..9dab205cbe9
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,84 @@
+pg_dump_common_sources = files(
+ 'compress_io.c',
+ 'dumputils.c',
+ 'parallel.c',
+ 'pg_backup_archiver.c',
+ 'pg_backup_custom.c',
+ 'pg_backup_db.c',
+ 'pg_backup_directory.c',
+ 'pg_backup_null.c',
+ 'pg_backup_tar.c',
+ 'pg_backup_utils.c',
+)
+
+if host_system == 'win32'
+ pg_dump_common_sources += windows.compile_resources(
+ custom_target('win32ver.rc', kwargs: rcgen_kw,
+ command: rcgen_bin_cmd + [
+ '--FILEDESC', 'pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases',
+ '--NAME', 'pg_dump',]),
+ kwargs: rccompile_kw,
+ )
+endif
+
+pg_dump_common = static_library('libpgdump_common',
+ pg_dump_common_sources,
+ c_pch: pch_c_h,
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+ 'pg_dump.c',
+ 'common.c',
+ 'pg_dump_sort.c',
+)
+
+executable('pg_dump',
+ pg_dump_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+
+
+pg_dumpall_sources = files(
+ 'pg_dumpall.c',
+)
+
+executable('pg_dumpall',
+ pg_dumpall_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+
+
+pg_restore_sources = files(
+ 'pg_restore.c',
+)
+
+executable('pg_restore',
+ pg_restore_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+
+
+tests += {
+ 'name': 'pg_dump',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_pg_dump.pl',
+ 't/003_pg_dump_with_server.pl',
+ 't/010_dump_connstr.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 00000000000..82e5e537ff4
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_dump-' + pg_version_major.to_string())
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 00000000000..dd889188b6d
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,19 @@
+executable('pg_resetwal',
+ files('pg_resetwal.c'),
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_resetwal',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_corrupted.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 00000000000..d130d3b775f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_resetwal-' + pg_version_major.to_string())
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 00000000000..40ae593e7c8
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,39 @@
+pg_rewind_sources = files(
+ 'datapagemap.c',
+ 'file_ops.c',
+ 'filemap.c',
+ 'libpq_source.c',
+ 'local_source.c',
+ 'parsexlog.c',
+ 'pg_rewind.c',
+ 'timeline.c',
+ '../../backend/access/transam/xlogreader.c',
+)
+
+pg_rewind = executable('pg_rewind',
+ pg_rewind_sources,
+ dependencies: [frontend_code, libpq, lz4, zstd],
+ kwargs: default_bin_args,
+)
+
+
+tests += {
+ 'name': 'pg_rewind',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_databases.pl',
+ 't/003_extrafiles.pl',
+ 't/004_pg_xlog_symlink.pl',
+ 't/005_same_timeline.pl',
+ 't/006_options.pl',
+ 't/007_standby_source.pl',
+ 't/008_min_recovery_point.pl',
+ 't/009_growing_files.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 00000000000..a105600b348
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_rewind-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 00000000000..d51f99902cf
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,18 @@
+executable('pg_test_fsync',
+ ['pg_test_fsync.c'],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name' : 'pg_test_fsync',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests' :[
+ 't/001_basic.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 00000000000..2ee1125282d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 00000000000..409fe242353
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,18 @@
+pg_test_timing = executable('pg_test_timing',
+ ['pg_test_timing.c'],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_test_timing',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 00000000000..cda8615165b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_test_timing-' + pg_version_major.to_string())
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 00000000000..fb7eff3055b
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,40 @@
+pg_upgrade_sources = files(
+ 'check.c',
+ 'controldata.c',
+ 'dump.c',
+ 'exec.c',
+ 'file.c',
+ 'function.c',
+ 'info.c',
+ 'option.c',
+ 'parallel.c',
+ 'pg_upgrade.c',
+ 'relfilenumber.c',
+ 'server.c',
+ 'tablespace.c',
+ 'util.c',
+ 'version.c',
+)
+
+pg_upgrade = executable('pg_upgrade',
+ pg_upgrade_sources,
+ c_pch: pch_c_h,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+
+tests += {
+ 'name': 'pg_upgrade',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_pg_upgrade.pl',
+ ],
+ 'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 00000000000..39301cbede8
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_upgrade-' + pg_version_major.to_string())
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 00000000000..307ca23ee73
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,32 @@
+pg_verifybackup_sources = files(
+ 'parse_manifest.c',
+ 'pg_verifybackup.c'
+)
+
+pg_verifybackup = executable('pg_verifybackup',
+ pg_verifybackup_sources,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_verifybackup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_algorithm.pl',
+ 't/003_corruption.pl',
+ 't/004_options.pl',
+ 't/005_bad_manifest.pl',
+ 't/006_encoding.pl',
+ 't/007_wal.pl',
+ 't/008_untar.pl',
+ 't/009_extract.pl',
+ 't/010_client_untar.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 00000000000..b583f1958ba
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 00000000000..e4820062640
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,28 @@
+pg_waldump_sources = files(
+ 'compat.c',
+ 'pg_waldump.c',
+ 'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+pg_waldump = executable('pg_waldump',
+ pg_waldump_sources,
+ dependencies: [frontend_code, lz4, zstd],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name': 'pg_waldump',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 00000000000..f335aa4b360
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pg_waldump-' + pg_version_major.to_string())
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 00000000000..ddbaeb5380b
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,42 @@
+pgbench_sources = files(
+ 'pgbench.c',
+)
+
+# exprscan is compiled as part ofexprparse. The ordering is enforced by making
+# the generation of grammar depend on the scanner generation. That's
+# unnecessarily strict, but overall harmless.
+
+exprscan = custom_target('exprscan',
+ input : files('exprscan.l'),
+ output : ['exprscan.c'],
+ command : [flex_cmd, '@INPUT@']
+)
+generated_sources += exprscan
+
+exprparse = custom_target('exprparse',
+ input: 'exprparse.y',
+ output: 'exprparse.c',
+ depends: exprscan,
+ command: [bison_cmd, '@INPUT@'],)
+generated_sources += exprparse
+pgbench_sources += exprparse
+
+executable('pgbench',
+ pgbench_sources,
+ dependencies: [frontend_code, libpq, thread_dep],
+ include_directories: include_directories('.'),
+ kwargs: default_bin_args,
+)
+
+
+tests += {
+ 'name' : 'pgbench',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests' :[
+ 't/001_pgbench_with_server.pl',
+ 't/002_pgbench_no_server.pl',
+ ],
+ },
+}
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 00000000000..5bad0d261b8
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,38 @@
+if host_system != 'win32'
+ subdir_done()
+endif
+
+pgevent_sources = files(
+ 'pgevent.c',
+)
+
+# built as part of pgmsgevent.rc, via #include
+win32ver_rc = custom_target(
+ 'win32ver.rc',
+ kwargs: rcgen_kw,
+ command: rcgen_lib_cmd + [
+ '--FILEDESC', 'Eventlog message formatter',
+ '--NAME', 'pgevent',],
+)
+
+pgevent_sources += windows.compile_resources(
+ 'pgmsgevent.rc',
+ depends: win32ver_rc, # included in file
+ kwargs: rccompile_kw,
+)
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+ pgevent_link_args += '/ignore:4104'
+endif
+
+shared_library('pgevent',
+ pgevent_sources,
+ dependencies: [frontend_code],
+ link_args: pgevent_link_args,
+ vs_module_defs: 'pgevent.def',
+ kwargs: default_lib_args + {
+ 'name_prefix': '',
+ },
+)
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 00000000000..3e20e24a8c0
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,72 @@
+psql_sources = files(
+ 'command.c',
+ 'common.c',
+ 'copy.c',
+ 'crosstabview.c',
+ 'describe.c',
+ 'help.c',
+ 'input.c',
+ 'large_obj.c',
+ 'mainloop.c',
+ 'prompt.c',
+ 'startup.c',
+ 'stringutils.c',
+ 'tab-complete.c',
+ 'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+ input: ['psqlscanslash.l'],
+ output: ['psqlscanslash.c'],
+ command: [flex_cmd, flex_backup, flex_fix_warning, '-Cfe', '-p', '-p', '@INPUT@'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+
+sql_help = custom_target('psql_help',
+ output: ['sql_help.c', 'sql_help.h'],
+ depfile: 'sql_help.dep',
+ command: [perl, files('create_help.pl'),
+ '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+ '--depfile', '@DEPFILE@',
+ '--outdir', '@OUTDIR@',
+ '--basename', 'sql_help'])
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+
+if host_system == 'win32'
+ psql_sources += windows.compile_resources(
+ custom_target('win32ver.rc', kwargs: rcgen_kw,
+ command: rcgen_bin_cmd + [
+ '--FILEDESC', 'psql - the PostgreSQL interactive terminal',
+ '--NAME', 'psql',]),
+ kwargs: rccompile_kw,
+ )
+endif
+
+executable('psql',
+ psql_sources,
+ c_pch: pch_c_h,
+ include_directories: include_directories('.'),
+ dependencies : [frontend_code, libpq, readline],
+ kwargs: default_bin_args,
+)
+
+install_data('psqlrc.sample',
+ install_dir: dir_data,
+)
+
+tests += {
+ 'name': 'psql',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_basic.pl',
+ 't/010_tab_completion.pl',
+ 't/020_cancel.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 00000000000..45fe425298d
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('psql-' + pg_version_major.to_string())
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 00000000000..d6826817f3d
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,50 @@
+scripts_common = static_library('libscripts_common',
+ files('common.c'),
+ dependencies: [frontend_code, libpq],
+ kwargs: internal_lib_args,
+)
+
+binaries = [
+ 'createdb',
+ 'dropdb',
+ 'createuser',
+ 'dropuser',
+ 'clusterdb',
+ 'vacuumdb',
+ 'reindexdb',
+ 'pg_isready',
+]
+
+foreach binary : binaries
+ executable(binary,
+ files(binary + '.c'),
+ link_with: [scripts_common],
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+ )
+endforeach
+
+tests += {
+ 'name': 'scripts',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/010_clusterdb.pl',
+ 't/011_clusterdb_all.pl',
+ 't/020_createdb.pl',
+ 't/040_createuser.pl',
+ 't/050_dropdb.pl',
+ 't/070_dropuser.pl',
+ 't/080_pg_isready.pl',
+ 't/090_reindexdb.pl',
+ 't/091_reindexdb_all.pl',
+ 't/100_vacuumdb.pl',
+ 't/101_vacuumdb_all.pl',
+ 't/102_vacuumdb_stages.pl',
+ 't/200_connstr.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 00000000000..3c531459c2d
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pgscripts-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
new file mode 100644
index 00000000000..bb6a47c5a20
--- /dev/null
+++ b/src/interfaces/libpq/meson.build
@@ -0,0 +1,103 @@
+# test/ is entered via top-level meson.build, that way it can use the default
+# args for executables (which depend on libpq).
+
+libpq_sources = files(
+ 'fe-auth-scram.c',
+ 'fe-connect.c',
+ 'fe-exec.c',
+ 'fe-lobj.c',
+ 'fe-misc.c',
+ 'fe-print.c',
+ 'fe-protocol3.c',
+ 'fe-secure.c',
+ 'fe-trace.c',
+ 'legacy-pqsignal.c',
+ 'libpq-events.c',
+ 'pqexpbuffer.c',
+ 'fe-auth.c',
+)
+
+if host_system == 'win32'
+ libpq_sources += files('win32.c', 'pthread-win32.c')
+endif
+
+if ssl.found()
+ libpq_sources += files('fe-secure-common.c')
+ libpq_sources += files('fe-secure-openssl.c')
+endif
+
+if gssapi.found()
+ libpq_sources += files(
+ 'fe-secure-gssapi.c',
+ 'fe-gssapi-common.c'
+ )
+endif
+
+export_file = custom_target('libpq.exports',
+ kwargs: gen_export_kwargs,
+)
+
+# port needs to be in include path due to pthread-win32.h
+libpq_inc = include_directories('.', '../../port')
+libpq_link_depends = []
+
+if host_system == 'win32'
+ libpq_deps += cc.find_library('secur32', required: true)
+endif
+
+libpq_both = both_libraries('libpq',
+ libpq_sources,
+ include_directories : [libpq_inc, postgres_inc],
+ c_args: ['-DFRONTEND'],
+ dependencies: libpq_deps,
+ version: '5.'+pg_version_major.to_string(),
+ soversion: host_system != 'win32' ? '5' : '' ,
+ link_depends: export_file,
+ link_args: export_fmt.format(export_file.full_path()),
+ kwargs: default_lib_args,
+)
+
+libpq_so = libpq_both.get_shared_lib()
+
+libpq = declare_dependency(
+ link_with: [libpq_so],
+ include_directories: [include_directories('.')]
+)
+
+pkgconfig.generate(
+ libpq_so,
+ name: 'libpq',
+ description: 'PostgreSQL libpq library',
+ url: pg_url,
+)
+
+install_headers(
+ 'libpq-fe.h',
+ 'libpq-events.h',
+)
+
+install_headers(
+ 'libpq-int.h',
+ 'pqexpbuffer.h',
+ 'fe-auth-sasl.h',
+ install_dir: dir_include_internal,
+)
+install_data('pg_service.conf.sample',
+ install_dir: dir_data,
+)
+
+
+tests += {
+ 'name': 'libpq',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_uri.pl',
+ 't/002_api.pl',
+ ],
+ 'env' : {'with_ssl': get_option('ssl')},
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build
new file mode 100644
index 00000000000..eed91110fd6
--- /dev/null
+++ b/src/interfaces/libpq/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
new file mode 100644
index 00000000000..16f94c1ed8b
--- /dev/null
+++ b/src/interfaces/libpq/test/meson.build
@@ -0,0 +1,15 @@
+executable('libpq_uri_regress',
+ files('libpq_uri_regress.c'),
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args + {
+ 'install': false,
+ }
+)
+
+executable('libpq_testclient',
+ files('libpq_testclient.c'),
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args + {
+ 'install': false,
+ }
+)
diff --git a/src/pl/meson.build b/src/pl/meson.build
new file mode 100644
index 00000000000..d9a57465441
--- /dev/null
+++ b/src/pl/meson.build
@@ -0,0 +1,5 @@
+subdir('plpgsql')
+
+subdir('plperl')
+subdir('plpython')
+subdir('tcl')
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
new file mode 100644
index 00000000000..4b14c556c24
--- /dev/null
+++ b/src/pl/plperl/meson.build
@@ -0,0 +1,92 @@
+if not perl_dep.found()
+ subdir_done()
+endif
+
+plperl_sources = files(
+ 'plperl.c',
+)
+
+subppdir = run_command(perl, '-e', 'use List::Util qw(first); print first { -r "$_/ExtUtils/xsubpp" } @INC',
+ check: true).stdout()
+xsubpp = '@0@/ExtUtils/xsubpp'.format(subppdir)
+typemap = '@0@/ExtUtils/typemap'.format(privlibexp)
+
+plperl_sources += custom_target('perlchunks.h',
+ input: files('plc_perlboot.pl', 'plc_trusted.pl'),
+ output: 'perlchunks.h',
+ capture: true,
+ command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@']
+)
+
+plperl_sources += custom_target('plperl_opmask.h',
+ input: files('plperl_opmask.pl'),
+ output: 'plperl_opmask.h',
+ command: [perl, '@INPUT@', '@OUTPUT@']
+)
+
+foreach n : ['SPI', 'Util']
+ xs = files(n+'.xs')
+ xs_c_name = n+'.c'
+
+ # FIXME: -output option is only available in perl 5.9.3 - but that's
+ # probably a fine minimum requirement?
+ xs_c = custom_target(xs_c_name,
+ input: xs,
+ output: xs_c_name,
+ command: [perl, xsubpp, '-typemap', typemap, '-output', '@OUTPUT@', '@INPUT@']
+ )
+ plperl_sources += xs_c
+endforeach
+
+plperl_inc = include_directories('.')
+shared_module('plperl',
+ plperl_sources,
+ c_pch: pch_postgres_h,
+ include_directories: [plperl_inc, postgres_inc],
+ kwargs: pg_mod_args + {
+ 'dependencies': [perl_dep, pg_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'plperl.control',
+ 'plperl--1.0.sql',
+ install_dir: dir_data_extension,
+)
+
+install_data(
+ 'plperlu.control',
+ 'plperlu--1.0.sql',
+ install_dir: dir_data_extension,
+)
+
+install_headers(
+ 'plperl.h',
+ 'plperl_helpers.h',
+ 'ppport.h',
+ install_dir: dir_include_server,
+)
+
+tests += {
+ 'name': 'plperl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'plperl_setup',
+ 'plperl',
+ 'plperl_lc',
+ 'plperl_trigger',
+ 'plperl_shared',
+ 'plperl_elog',
+ 'plperl_util',
+ 'plperl_init',
+ 'plperlu',
+ 'plperl_array',
+ 'plperl_call',
+ 'plperl_transaction',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build
new file mode 100644
index 00000000000..fe0a715bdf0
--- /dev/null
+++ b/src/pl/plperl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plperl-' + pg_version_major.to_string())
diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build
new file mode 100644
index 00000000000..9537275d67c
--- /dev/null
+++ b/src/pl/plpgsql/meson.build
@@ -0,0 +1 @@
+subdir('src')
diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build
new file mode 100644
index 00000000000..e29dc3a4fcc
--- /dev/null
+++ b/src/pl/plpgsql/src/meson.build
@@ -0,0 +1,83 @@
+plpgsql_sources = files(
+ 'pl_comp.c',
+ 'pl_exec.c',
+ 'pl_funcs.c',
+ 'pl_handler.c',
+ 'pl_scanner.c',
+)
+
+pl_gram = custom_target('gram',
+ input: ['pl_gram.y'],
+ output: ['pl_gram.c', 'pl_gram.h'],
+ command: [bison_cmd, '-d', '@INPUT@'])
+generated_sources += pl_gram.to_list()
+plpgsql_sources += pl_gram
+
+gen_plerrcodes = files('generate-plerrcodes.pl')
+pl_errcodes = custom_target('plerrcodes',
+ input: ['../../../../src/backend/utils/errcodes.txt'],
+ output: ['plerrcodes.h'],
+ command: [perl, gen_plerrcodes, '@INPUT0@'],
+ capture: true)
+generated_sources += pl_errcodes
+plpgsql_sources += pl_errcodes
+
+gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl')
+pl_reserved = custom_target('pl_reserved_kwlist',
+ input: ['pl_reserved_kwlist.h'],
+ output: ['pl_reserved_kwlist_d.h'],
+ command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'ReservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_reserved
+plpgsql_sources += pl_reserved
+
+pl_unreserved = custom_target('pl_unreserved_kwlist',
+ input: ['pl_unreserved_kwlist.h'],
+ output: ['pl_unreserved_kwlist_d.h'],
+ command: [perl, '-I', '@SOURCE_ROOT@/src/tools', gen_keywordlist, '--output', '@OUTDIR@', '--varname', 'UnreservedPLKeywords', '@INPUT@']
+)
+generated_sources += pl_unreserved
+plpgsql_sources += pl_unreserved
+
+shared_module('plpgsql',
+ plpgsql_sources,
+ c_pch: pch_postgres_h,
+ include_directories: include_directories('.'),
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'plpgsql.control',
+ 'plpgsql--1.0.sql',
+ install_dir: dir_data_extension,
+)
+
+install_headers(
+ 'plpgsql.h',
+ install_dir: dir_include_server
+)
+
+
+tests += {
+ 'name': 'plpgsql',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'plpgsql_array',
+ 'plpgsql_call',
+ 'plpgsql_control',
+ 'plpgsql_copy',
+ 'plpgsql_domain',
+ 'plpgsql_record',
+ 'plpgsql_cache',
+ 'plpgsql_simple',
+ 'plpgsql_transaction',
+ 'plpgsql_trap',
+ 'plpgsql_trigger',
+ 'plpgsql_varprops',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build
new file mode 100644
index 00000000000..29e0b74488f
--- /dev/null
+++ b/src/pl/plpgsql/src/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpgsql-' + pg_version_major.to_string())
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
new file mode 100644
index 00000000000..449654914d0
--- /dev/null
+++ b/src/pl/plpython/meson.build
@@ -0,0 +1,99 @@
+if not python3_dep.found()
+ subdir_done()
+endif
+
+plpython_sources = files(
+ 'plpy_cursorobject.c',
+ 'plpy_elog.c',
+ 'plpy_exec.c',
+ 'plpy_main.c',
+ 'plpy_planobject.c',
+ 'plpy_plpymodule.c',
+ 'plpy_procedure.c',
+ 'plpy_resultobject.c',
+ 'plpy_spi.c',
+ 'plpy_subxactobject.c',
+ 'plpy_typeio.c',
+ 'plpy_util.c',
+)
+
+plpython_sources += custom_target('spiexceptions.h',
+ input: files('../../backend/utils/errcodes.txt'),
+ output: 'spiexceptions.h',
+ command: [perl, files('generate-spiexceptions.pl'), '@INPUT@'],
+ capture: true
+ )
+
+
+# FIXME: need to duplicate import library ugliness?
+plpython_inc = include_directories('.')
+
+shared_module('plpython3',
+ plpython_sources,
+ c_pch: pch_postgres_h,
+ include_directories: [plpython_inc, postgres_inc],
+ kwargs: pg_mod_args + {
+ 'dependencies': [python3_dep, pg_mod_args['dependencies']],
+ },
+)
+
+# FIXME: Only install the relevant versions
+install_data(
+ 'plpython3u.control',
+ 'plpython3u--1.0.sql',
+ install_dir: dir_data_extension,
+)
+
+install_headers(
+ 'plpy_cursorobject.h',
+ 'plpy_elog.h',
+ 'plpy_exec.h',
+ 'plpy_main.h',
+ 'plpy_planobject.h',
+ 'plpy_plpymodule.h',
+ 'plpy_procedure.h',
+ 'plpy_resultobject.h',
+ 'plpy_spi.h',
+ 'plpy_subxactobject.h',
+ 'plpy_typeio.h',
+ 'plpy_util.h',
+ 'plpython.h',
+ install_dir: dir_include_server,
+)
+
+plpython_regress = [
+ 'plpython_schema',
+ 'plpython_populate',
+ 'plpython_test',
+ 'plpython_do',
+ 'plpython_global',
+ 'plpython_import',
+ 'plpython_spi',
+ 'plpython_newline',
+ 'plpython_void',
+ 'plpython_call',
+ 'plpython_params',
+ 'plpython_setof',
+ 'plpython_record',
+ 'plpython_trigger',
+ 'plpython_types',
+ 'plpython_error',
+ 'plpython_ereport',
+ 'plpython_unicode',
+ 'plpython_quote',
+ 'plpython_composite',
+ 'plpython_subtransaction',
+ 'plpython_transaction',
+ 'plpython_drop',
+]
+
+tests += {
+ 'name': 'plpython',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': plpython_regress,
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build
new file mode 100644
index 00000000000..542e27fbe1f
--- /dev/null
+++ b/src/pl/plpython/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('plpython-' + pg_version_major.to_string())
diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build
new file mode 100644
index 00000000000..16bfd7806b4
--- /dev/null
+++ b/src/pl/tcl/meson.build
@@ -0,0 +1,55 @@
+if not tcl_dep.found()
+ subdir_done()
+endif
+
+pltcl_sources = files(
+ 'pltcl.c',
+)
+
+gen_pltclerrcodes = files('generate-pltclerrcodes.pl')
+pltcl_sources += custom_target('pltclerrcodes.h',
+ input: files('../../backend/utils/errcodes.txt'),
+ output: 'pltclerrcodes.h',
+ capture: true,
+ command: [perl, gen_pltclerrcodes, '@INPUT@']
+)
+
+shared_module('pltcl',
+ pltcl_sources,
+ c_pch: pch_postgres_h,
+ include_directories: [include_directories('.'), postgres_inc],
+ kwargs: pg_mod_args + {
+ 'dependencies': [tcl_dep, pg_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'pltcl.control',
+ 'pltcl--1.0.sql',
+ 'pltclu.control',
+ 'pltclu--1.0.sql',
+ install_dir: dir_data_extension,
+)
+
+pltcl_regress = [
+ 'pltcl_setup',
+ 'pltcl_queries',
+ 'pltcl_trigger',
+ 'pltcl_call',
+ 'pltcl_start_proc',
+ 'pltcl_subxact',
+ 'pltcl_unicode',
+ 'pltcl_transaction',
+]
+
+tests += {
+ 'name': 'pltcl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': pltcl_regress,
+ 'regress_args': ['--load-extension=pltcl'],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build
new file mode 100644
index 00000000000..cc23ef1eb3b
--- /dev/null
+++ b/src/pl/tcl/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('pltcl-' + pg_version_major.to_string())
diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build
new file mode 100644
index 00000000000..b69f34346ce
--- /dev/null
+++ b/contrib/adminpack/meson.build
@@ -0,0 +1,22 @@
+adminpack = shared_module('adminpack',
+ ['adminpack.c'],
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'adminpack.control',
+ 'adminpack--1.0.sql',
+ 'adminpack--1.0--1.1.sql',
+ 'adminpack--1.1--2.0.sql',
+ 'adminpack--2.0--2.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'adminpack',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': ['adminpack'],
+ },
+}
diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
new file mode 100644
index 00000000000..d75d8c91c4b
--- /dev/null
+++ b/contrib/amcheck/meson.build
@@ -0,0 +1,36 @@
+amcheck = shared_module('amcheck', [
+ 'verify_heapam.c',
+ 'verify_nbtree.c',
+ ],
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'amcheck.control',
+ 'amcheck--1.0.sql',
+ 'amcheck--1.0--1.1.sql',
+ 'amcheck--1.1--1.2.sql',
+ 'amcheck--1.2--1.3.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'amcheck',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'check',
+ 'check_btree',
+ 'check_heap',
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/001_verify_heapam.pl',
+ 't/002_cic.pl',
+ 't/003_cic_2pc.pl',
+ ],
+ },
+}
+
diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
new file mode 100644
index 00000000000..941bb6f39a4
--- /dev/null
+++ b/contrib/auth_delay/meson.build
@@ -0,0 +1,4 @@
+autoinc = shared_module('auth_delay',
+ ['auth_delay.c'],
+ kwargs: contrib_mod_args,
+)
diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build
new file mode 100644
index 00000000000..9456d569fc2
--- /dev/null
+++ b/contrib/auto_explain/meson.build
@@ -0,0 +1,15 @@
+auto_explain = shared_module('auto_explain',
+ files('auto_explain.c'),
+ kwargs: contrib_mod_args,
+)
+
+tests += {
+ 'name': 'auto_explain',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_auto_explain.pl',
+ ],
+ },
+}
diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build
new file mode 100644
index 00000000000..9d465cb50f3
--- /dev/null
+++ b/contrib/basebackup_to_shell/meson.build
@@ -0,0 +1,22 @@
+basebackup_to_shell_sources = files(
+ 'basebackup_to_shell.c',
+)
+
+basebackup_to_shell = shared_module('basebackup_to_shell',
+ basebackup_to_shell_sources,
+ kwargs: contrib_mod_args,
+)
+
+
+tests += {
+ 'name': 'basebackup_to_shell',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap' : {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ 'env': {'GZIP_PROGRAM': gzip.path(),
+ 'TAR': tar.path()},
+ },
+}
diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build
new file mode 100644
index 00000000000..b81582c7c0f
--- /dev/null
+++ b/contrib/basic_archive/meson.build
@@ -0,0 +1,23 @@
+basic_archive_sources = files(
+ 'basic_archive.c',
+)
+
+basic_archive = shared_module('basic_archive',
+ basic_archive_sources,
+ kwargs: contrib_mod_args,
+)
+
+
+tests += {
+ 'name': 'basic_archive',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'basic_archive',
+ ],
+ 'regress_args': [
+ '--temp-config', files('basic_archive.conf'),
+ ],
+ },
+}
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
new file mode 100644
index 00000000000..71a2263a773
--- /dev/null
+++ b/contrib/bloom/meson.build
@@ -0,0 +1,36 @@
+bloom_sources = files(
+ 'blcost.c',
+ 'blinsert.c',
+ 'blscan.c',
+ 'blutils.c',
+ 'blvacuum.c',
+ 'blvalidate.c',
+)
+
+bloom = shared_module('bloom',
+ bloom_sources,
+ c_pch: pch_c_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'bloom.control',
+ 'bloom--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'bloom',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'bloom',
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/001_wal.pl',
+ ],
+ },
+}
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
new file mode 100644
index 00000000000..c7e75278739
--- /dev/null
+++ b/contrib/bool_plperl/meson.build
@@ -0,0 +1,39 @@
+if not perl_dep.found()
+ subdir_done()
+endif
+
+bool_plperl_sources = files(
+ 'bool_plperl.c',
+)
+
+bool_plperl = shared_module('bool_plperl',
+ bool_plperl_sources,
+ include_directories: [plperl_inc, include_directories('.')],
+ kwargs: pg_mod_args + {
+ 'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'bool_plperl.control',
+ 'bool_plperl--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+install_data(
+ 'bool_plperlu.control',
+ 'bool_plperlu--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'bool_plperl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'bool_plperl',
+ 'bool_plperlu',
+ ],
+ },
+}
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
new file mode 100644
index 00000000000..356dbe84f10
--- /dev/null
+++ b/contrib/btree_gin/meson.build
@@ -0,0 +1,53 @@
+btree_gin = shared_module('btree_gin',
+ files('btree_gin.c'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'btree_gin.control',
+ 'btree_gin--1.0.sql',
+ 'btree_gin--1.0--1.1.sql',
+ 'btree_gin--1.1--1.2.sql',
+ 'btree_gin--1.2--1.3.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'btree_gin',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'install_btree_gin',
+ 'int2',
+ 'int4',
+ 'int8',
+ 'float4',
+ 'float8',
+ 'money',
+ 'oid',
+ 'timestamp',
+ 'timestamptz',
+ 'time',
+ 'timetz',
+ 'date',
+ 'interval',
+ 'macaddr',
+ 'macaddr8',
+ 'inet',
+ 'cidr',
+ 'text',
+ 'varchar',
+ 'char',
+ 'bytea',
+ 'bit',
+ 'varbit',
+ 'numeric',
+ 'enum',
+ 'uuid',
+ 'name',
+ 'bool',
+ 'bpchar',
+ ],
+ },
+}
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
new file mode 100644
index 00000000000..40b6ccc3b50
--- /dev/null
+++ b/contrib/btree_gist/meson.build
@@ -0,0 +1,84 @@
+btree_gist_sources = files(
+ 'btree_bit.c',
+ 'btree_bool.c',
+ 'btree_bytea.c',
+ 'btree_cash.c',
+ 'btree_date.c',
+ 'btree_enum.c',
+ 'btree_float4.c',
+ 'btree_float8.c',
+ 'btree_gist.c',
+ 'btree_inet.c',
+ 'btree_int2.c',
+ 'btree_int4.c',
+ 'btree_int8.c',
+ 'btree_interval.c',
+ 'btree_macaddr.c',
+ 'btree_macaddr8.c',
+ 'btree_numeric.c',
+ 'btree_oid.c',
+ 'btree_text.c',
+ 'btree_time.c',
+ 'btree_ts.c',
+ 'btree_utils_num.c',
+ 'btree_utils_var.c',
+ 'btree_uuid.c',
+)
+
+btree_gist = shared_module('btree_gist',
+ btree_gist_sources,
+ c_pch: pch_c_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'btree_gist.control',
+ 'btree_gist--1.0--1.1.sql',
+ 'btree_gist--1.1--1.2.sql',
+ 'btree_gist--1.2.sql',
+ 'btree_gist--1.2--1.3.sql',
+ 'btree_gist--1.3--1.4.sql',
+ 'btree_gist--1.4--1.5.sql',
+ 'btree_gist--1.5--1.6.sql',
+ 'btree_gist--1.6--1.7.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'btree_gist',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'init',
+ 'int2',
+ 'int4',
+ 'int8',
+ 'float4',
+ 'float8',
+ 'cash',
+ 'oid',
+ 'timestamp',
+ 'timestamptz',
+ 'time',
+ 'timetz',
+ 'date',
+ 'interval',
+ 'macaddr',
+ 'macaddr8',
+ 'inet',
+ 'cidr',
+ 'text',
+ 'varchar',
+ 'char',
+ 'bytea',
+ 'bit',
+ 'varbit',
+ 'numeric',
+ 'uuid',
+ 'not_equal',
+ 'enum',
+ 'bool',
+ ],
+ },
+}
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
new file mode 100644
index 00000000000..507745ba747
--- /dev/null
+++ b/contrib/citext/meson.build
@@ -0,0 +1,33 @@
+citext_sources = files(
+ 'citext.c',
+)
+
+citext = shared_module('citext',
+ citext_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'citext.control',
+ 'citext--1.0--1.1.sql',
+ 'citext--1.1--1.2.sql',
+ 'citext--1.2--1.3.sql',
+ 'citext--1.3--1.4.sql',
+ 'citext--1.4.sql',
+ 'citext--1.4--1.5.sql',
+ 'citext--1.5--1.6.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'citext',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'create_index_acl',
+ 'citext',
+ 'citext_utf8',
+ ],
+ },
+}
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
new file mode 100644
index 00000000000..425c258d124
--- /dev/null
+++ b/contrib/cube/meson.build
@@ -0,0 +1,52 @@
+cube_sources = files(
+ 'cube.c',
+)
+
+# cubescan is compiled as part of cubeparse
+cube_scan = custom_target('cubescan',
+ input: ['cubescan.l'],
+ output: ['cubescan.c'],
+ command: [flex_cmd, '@INPUT@'],)
+generated_sources += cube_scan
+
+cube_parse = custom_target('cubeparse',
+ input: 'cubeparse.y',
+ output: 'cubeparse.c',
+ depends: cube_scan,
+ command: [bison_cmd, '@INPUT@'],)
+generated_sources += cube_parse
+cube_sources += cube_parse
+
+cube = shared_module('cube',
+ cube_sources,
+ include_directories: include_directories('.'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'cube.control',
+ 'cube--1.0--1.1.sql',
+ 'cube--1.1--1.2.sql',
+ 'cube--1.2.sql',
+ 'cube--1.2--1.3.sql',
+ 'cube--1.3--1.4.sql',
+ 'cube--1.4--1.5.sql',
+ kwargs: contrib_data_args,
+)
+
+install_headers(
+ 'cubedata.h',
+ install_dir: dir_include_extension / 'cube',
+)
+
+tests += {
+ 'name': 'cube',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'cube',
+ 'cube_sci',
+ ],
+ },
+}
diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build
new file mode 100644
index 00000000000..9161f737726
--- /dev/null
+++ b/contrib/dblink/meson.build
@@ -0,0 +1,30 @@
+dblink_sources = files(
+ 'dblink.c',
+)
+
+dblink = shared_module('dblink',
+ dblink_sources,
+ kwargs: contrib_mod_args + {
+ 'dependencies': pg_mod_args['dependencies'] + [libpq],
+ },
+)
+
+install_data(
+ 'dblink.control',
+ 'dblink--1.0--1.1.sql',
+ 'dblink--1.1--1.2.sql',
+ 'dblink--1.2.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'dblink',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'dblink',
+ ],
+ 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+ },
+}
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
new file mode 100644
index 00000000000..2c937a3df5e
--- /dev/null
+++ b/contrib/dict_int/meson.build
@@ -0,0 +1,21 @@
+dict_int = shared_module('dict_int',
+ files('dict_int.c'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'dict_int.control',
+ 'dict_int--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'dict_int',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'dict_int',
+ ],
+ },
+}
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
new file mode 100644
index 00000000000..ec6e175733d
--- /dev/null
+++ b/contrib/dict_xsyn/meson.build
@@ -0,0 +1,28 @@
+dict_xsyn = shared_module('dict_xsyn',
+ files('dict_xsyn.c'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'dict_xsyn.control',
+ 'dict_xsyn--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+install_data(
+ 'xsyn_sample.rules',
+ kwargs: contrib_data_args + {
+ 'install_dir': dir_data / 'tsearch_data'
+ }
+)
+
+tests += {
+ 'name': 'dict_xsyn',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'dict_xsyn',
+ ],
+ },
+}
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
new file mode 100644
index 00000000000..35b448870b8
--- /dev/null
+++ b/contrib/earthdistance/meson.build
@@ -0,0 +1,22 @@
+earthdistance = shared_module('earthdistance',
+ files('earthdistance.c'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'earthdistance.control',
+ 'earthdistance--1.0--1.1.sql',
+ 'earthdistance--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'earthdistance',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'earthdistance',
+ ],
+ },
+}
diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build
new file mode 100644
index 00000000000..26d26d1e0c4
--- /dev/null
+++ b/contrib/file_fdw/meson.build
@@ -0,0 +1,21 @@
+file_fdw = shared_module('file_fdw',
+ files('file_fdw.c'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'file_fdw.control',
+ 'file_fdw--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'file_fdw',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'file_fdw',
+ ],
+ },
+}
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
new file mode 100644
index 00000000000..73d88e92cfe
--- /dev/null
+++ b/contrib/fuzzystrmatch/meson.build
@@ -0,0 +1,25 @@
+fuzzystrmatch = shared_module('fuzzystrmatch',
+ files(
+ 'fuzzystrmatch.c',
+ 'dmetaphone.c'
+ ),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'fuzzystrmatch.control',
+ 'fuzzystrmatch--1.0--1.1.sql',
+ 'fuzzystrmatch--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'fuzzystrmatch',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'fuzzystrmatch',
+ ],
+ },
+}
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
new file mode 100644
index 00000000000..3aed37ce8e1
--- /dev/null
+++ b/contrib/hstore/meson.build
@@ -0,0 +1,44 @@
+# .. so that includes of hstore/hstore.h work
+hstore_inc = include_directories('.', '../')
+
+hstore = shared_module('hstore',
+ files(
+ 'hstore_compat.c',
+ 'hstore_gin.c',
+ 'hstore_gist.c',
+ 'hstore_io.c',
+ 'hstore_op.c',
+ 'hstore_subs.c',
+ ),
+ c_pch: pch_c_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'hstore.control',
+ 'hstore--1.1--1.2.sql',
+ 'hstore--1.2--1.3.sql',
+ 'hstore--1.3--1.4.sql',
+ 'hstore--1.4.sql',
+ 'hstore--1.4--1.5.sql',
+ 'hstore--1.5--1.6.sql',
+ 'hstore--1.6--1.7.sql',
+ 'hstore--1.7--1.8.sql',
+ kwargs: contrib_data_args,
+)
+
+install_headers(
+ 'hstore.h',
+ install_dir: dir_include_extension / 'hstore',
+)
+
+tests += {
+ 'name': 'hstore',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'hstore',
+ ],
+ },
+}
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
new file mode 100644
index 00000000000..66eaf3f6cab
--- /dev/null
+++ b/contrib/hstore_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+ subdir_done()
+endif
+
+hstore_plperl_sources = files(
+ 'hstore_plperl.c',
+)
+
+hstore_plperl = shared_module('hstore_plperl',
+ hstore_plperl_sources,
+ include_directories: [plperl_inc, hstore_inc],
+ kwargs: pg_mod_args + {
+ 'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'hstore_plperl.control',
+ 'hstore_plperl--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+install_data(
+ 'hstore_plperlu.control',
+ 'hstore_plperlu--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'hstore_plperl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'hstore_plperl',
+ 'hstore_plperlu',
+ 'create_transform',
+ ],
+ },
+}
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
new file mode 100644
index 00000000000..ba53c888e13
--- /dev/null
+++ b/contrib/hstore_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+ subdir_done()
+endif
+
+hstore_plpython_sources = files(
+ 'hstore_plpython.c',
+)
+
+hstore_plpython = shared_module('hstore_plpython3',
+ hstore_plpython_sources,
+ include_directories: [plpython_inc, hstore_inc, ],
+ kwargs: pg_mod_args + {
+ 'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+ 'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'hstore_plpython3u--1.0.sql',
+ 'hstore_plpython3u.control',
+ kwargs: contrib_data_args,
+)
+
+hstore_plpython_regress = [
+ 'hstore_plpython'
+]
+
+tests += {
+ 'name': 'hstore_plpython',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': hstore_plpython_regress,
+ 'regress_args': ['--load-extension=hstore'],
+ },
+}
diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build
new file mode 100644
index 00000000000..a0f39366f47
--- /dev/null
+++ b/contrib/intagg/meson.build
@@ -0,0 +1,6 @@
+install_data(
+ 'intagg.control',
+ 'intagg--1.0--1.1.sql',
+ 'intagg--1.1.sql',
+ kwargs: contrib_data_args,
+)
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
new file mode 100644
index 00000000000..dfbfbc9fa6a
--- /dev/null
+++ b/contrib/intarray/meson.build
@@ -0,0 +1,36 @@
+intarray_sources = files(
+ '_int_bool.c',
+ '_int_gin.c',
+ '_int_gist.c',
+ '_int_op.c',
+ '_int_selfuncs.c',
+ '_int_tool.c',
+ '_intbig_gist.c',
+)
+
+intarray = shared_module('_int',
+ intarray_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'intarray.control',
+ 'intarray--1.0--1.1.sql',
+ 'intarray--1.1--1.2.sql',
+ 'intarray--1.2.sql',
+ 'intarray--1.2--1.3.sql',
+ 'intarray--1.3--1.4.sql',
+ 'intarray--1.4--1.5.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'intarray',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ '_int',
+ ],
+ },
+}
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
new file mode 100644
index 00000000000..508e2dfa080
--- /dev/null
+++ b/contrib/isn/meson.build
@@ -0,0 +1,32 @@
+isn_sources = files(
+ 'isn.c',
+)
+
+isn = shared_module('isn',
+ isn_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'isn.control',
+ 'isn--1.0--1.1.sql',
+ 'isn--1.1--1.2.sql',
+ 'isn--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+install_headers(
+ 'isn.h',
+ install_dir: dir_include_extension / 'isn',
+)
+
+tests += {
+ 'name': 'isn',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'isn',
+ ],
+ },
+}
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
new file mode 100644
index 00000000000..7fd4652fcfb
--- /dev/null
+++ b/contrib/jsonb_plperl/meson.build
@@ -0,0 +1,40 @@
+if not perl_dep.found()
+ subdir_done()
+endif
+
+jsonb_plperl_sources = files(
+ 'jsonb_plperl.c',
+)
+
+jsonb_plperl = shared_module('jsonb_plperl',
+ jsonb_plperl_sources,
+ include_directories: [plperl_inc],
+ kwargs: pg_mod_args + {
+ 'dependencies': [perl_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'jsonb_plperl.control',
+ 'jsonb_plperl--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+install_data(
+ 'jsonb_plperlu.control',
+ 'jsonb_plperlu--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'jsonb_plperl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'jsonb_plperl',
+ 'jsonb_plperlu',
+ ],
+ },
+}
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
new file mode 100644
index 00000000000..95b3b3aeef4
--- /dev/null
+++ b/contrib/jsonb_plpython/meson.build
@@ -0,0 +1,35 @@
+if not python3_dep.found()
+ subdir_done()
+endif
+
+jsonb_plpython_sources = files(
+ 'jsonb_plpython.c',
+)
+
+jsonb_plpython = shared_module('jsonb_plpython3',
+ jsonb_plpython_sources,
+ include_directories: [plpython_inc],
+ kwargs: pg_mod_args + {
+ 'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+ 'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'jsonb_plpython3u.control',
+ 'jsonb_plpython3u--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+jsonb_plpython_regress = [
+ 'jsonb_plpython'
+]
+
+tests += {
+ 'name': 'jsonb_plpython',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': jsonb_plpython_regress,
+ },
+}
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
new file mode 100644
index 00000000000..224a2562017
--- /dev/null
+++ b/contrib/lo/meson.build
@@ -0,0 +1,26 @@
+lo_sources = files(
+ 'lo.c',
+)
+
+lo = shared_module('lo',
+ lo_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'lo.control',
+ 'lo--1.0--1.1.sql',
+ 'lo--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'lo',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'lo',
+ ],
+ },
+}
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
new file mode 100644
index 00000000000..222c64bb35d
--- /dev/null
+++ b/contrib/ltree/meson.build
@@ -0,0 +1,43 @@
+ltree_sources = files(
+ '_ltree_gist.c',
+ '_ltree_op.c',
+ 'crc32.c',
+ 'lquery_op.c',
+ 'ltree_gist.c',
+ 'ltree_io.c',
+ 'ltree_op.c',
+ 'ltxtquery_io.c',
+ 'ltxtquery_op.c',
+)
+
+# .. so that includes of ltree/ltree.h work
+ltree_inc = include_directories('.', '../')
+
+ltree = shared_module('ltree',
+ ltree_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'ltree.control',
+ 'ltree--1.0--1.1.sql',
+ 'ltree--1.1--1.2.sql',
+ 'ltree--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+install_headers(
+ 'ltree.h',
+ install_dir: dir_include_extension / 'ltree',
+)
+
+tests += {
+ 'name': 'ltree',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'ltree',
+ ],
+ },
+}
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
new file mode 100644
index 00000000000..52ab66e46ca
--- /dev/null
+++ b/contrib/ltree_plpython/meson.build
@@ -0,0 +1,36 @@
+if not python3_dep.found()
+ subdir_done()
+endif
+
+ltree_plpython_sources = files(
+ 'ltree_plpython.c',
+)
+
+ltree_plpython = shared_module('ltree_plpython3',
+ ltree_plpython_sources,
+ include_directories: [plpython_inc, ltree_inc],
+ kwargs: pg_mod_args + {
+ 'c_args': ['-DPLPYTHON_LIBNAME="plpython3"'] + contrib_mod_args['c_args'],
+ 'dependencies': [python3_dep, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'ltree_plpython3u--1.0.sql',
+ 'ltree_plpython3u.control',
+ kwargs: contrib_data_args,
+)
+
+ltree_plpython_regress = [
+ 'ltree_plpython'
+]
+
+tests += {
+ 'name': 'ltree_plpython',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': ltree_plpython_regress,
+ 'regress_args': ['--load-extension=ltree'],
+ },
+}
diff --git a/contrib/meson.build b/contrib/meson.build
new file mode 100644
index 00000000000..84752d4bd0f
--- /dev/null
+++ b/contrib/meson.build
@@ -0,0 +1,66 @@
+contrib_mod_args = pg_mod_args
+
+contrib_data_dir = dir_data_extension
+contrib_data_args = {
+ 'install_dir': contrib_data_dir,
+}
+
+subdir('adminpack')
+subdir('amcheck')
+subdir('auth_delay')
+subdir('auto_explain')
+subdir('basic_archive')
+subdir('bloom')
+subdir('basebackup_to_shell')
+subdir('bool_plperl')
+subdir('btree_gin')
+subdir('btree_gist')
+subdir('citext')
+subdir('cube')
+subdir('dblink')
+subdir('dict_int')
+subdir('dict_xsyn')
+subdir('earthdistance')
+subdir('file_fdw')
+subdir('fuzzystrmatch')
+subdir('hstore')
+subdir('hstore_plperl')
+subdir('hstore_plpython')
+subdir('intagg')
+subdir('intarray')
+subdir('isn')
+subdir('jsonb_plperl')
+subdir('jsonb_plpython')
+subdir('lo')
+subdir('ltree')
+subdir('ltree_plpython')
+subdir('oid2name')
+subdir('old_snapshot')
+subdir('pageinspect')
+subdir('passwordcheck')
+subdir('pg_buffercache')
+subdir('pgcrypto')
+subdir('pg_freespacemap')
+subdir('pg_prewarm')
+subdir('pgrowlocks')
+subdir('pg_stat_statements')
+subdir('pgstattuple')
+subdir('pg_surgery')
+subdir('pg_trgm')
+subdir('pg_visibility')
+subdir('pg_walinspect')
+subdir('postgres_fdw')
+subdir('seg')
+subdir('sepgsql')
+subdir('spi')
+subdir('sslinfo')
+# start-scripts doesn't contain build products
+subdir('tablefunc')
+subdir('tcn')
+subdir('test_decoding')
+subdir('tsm_system_rows')
+subdir('tsm_system_time')
+subdir('unaccent')
+subdir('uuid-ossp')
+subdir('vacuumlo')
+subdir('xml2')
diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build
new file mode 100644
index 00000000000..b3139971140
--- /dev/null
+++ b/contrib/oid2name/meson.build
@@ -0,0 +1,16 @@
+executable('oid2name',
+ ['oid2name.c'],
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name' : 'oid2name',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests' :[
+ 't/001_basic.pl',
+ ],
+ },
+}
diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build
new file mode 100644
index 00000000000..5785c29e9f8
--- /dev/null
+++ b/contrib/old_snapshot/meson.build
@@ -0,0 +1,14 @@
+old_snapshot_sources = files(
+ 'time_mapping.c',
+)
+
+old_snapshot = shared_module('old_snapshot',
+ old_snapshot_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'old_snapshot.control',
+ 'old_snapshot--1.0.sql',
+ kwargs: contrib_data_args,
+)
diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build
new file mode 100644
index 00000000000..5cacb9b323b
--- /dev/null
+++ b/contrib/pageinspect/meson.build
@@ -0,0 +1,59 @@
+pageinspect_sources = files(
+ 'brinfuncs.c',
+ 'btreefuncs.c',
+ 'fsmfuncs.c',
+ 'ginfuncs.c',
+ 'gistfuncs.c',
+ 'hashfuncs.c',
+ 'heapfuncs.c',
+ 'rawpage.c',
+)
+
+if host_system == 'win32'
+ pageinspect_sources += windows.compile_resources(
+ custom_target('win32ver.rc', kwargs: rcgen_kw,
+ command: rcgen_lib_cmd + [
+ '--FILEDESC', 'pageinspect - functions to inspect contents of database pages',
+ '--NAME', 'pageinspect',]),
+ kwargs: rccompile_kw,
+ )
+endif
+
+pageinspect = shared_module('pageinspect',
+ pageinspect_sources,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pageinspect--1.0--1.1.sql',
+ 'pageinspect--1.1--1.2.sql',
+ 'pageinspect--1.2--1.3.sql',
+ 'pageinspect--1.3--1.4.sql',
+ 'pageinspect--1.4--1.5.sql',
+ 'pageinspect--1.5--1.6.sql',
+ 'pageinspect--1.5.sql',
+ 'pageinspect--1.6--1.7.sql',
+ 'pageinspect--1.7--1.8.sql',
+ 'pageinspect--1.8--1.9.sql',
+ 'pageinspect--1.9--1.10.sql',
+ 'pageinspect.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pageinspect',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'page',
+ 'btree',
+ 'brin',
+ 'gin',
+ 'gist',
+ 'hash',
+ 'checksum',
+ 'oldextversions',
+ ],
+ },
+}
diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build
new file mode 100644
index 00000000000..80667d8a9f0
--- /dev/null
+++ b/contrib/passwordcheck/meson.build
@@ -0,0 +1,29 @@
+passwordcheck_sources = files(
+ 'passwordcheck.c',
+)
+
+passwordcheck_c_args = []
+passwordcheck_deps = []
+
+# uncomment the following two lines to enable cracklib support
+# passwordcheck_c_args += ['-DUSE_CRACKLIB', '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"']
+# passwordcheck_deps += [cc.find_library('crack')]
+
+passwordcheck = shared_module('passwordcheck',
+ passwordcheck_sources,
+ kwargs: contrib_mod_args + {
+ 'c_args': contrib_mod_args.get('c_args') + passwordcheck_c_args,
+ 'dependencies': contrib_mod_args.get('dependencies') + passwordcheck_deps,
+ }
+)
+
+tests += {
+ 'name': 'passwordcheck',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'passwordcheck',
+ ],
+ },
+}
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
new file mode 100644
index 00000000000..38de7488df2
--- /dev/null
+++ b/contrib/pg_buffercache/meson.build
@@ -0,0 +1,27 @@
+pg_buffercache = shared_module('pg_buffercache',
+ files(
+ 'pg_buffercache_pages.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_buffercache--1.0--1.1.sql',
+ 'pg_buffercache--1.1--1.2.sql',
+ 'pg_buffercache--1.2--1.3.sql',
+ 'pg_buffercache--1.2.sql',
+ 'pg_buffercache.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_buffercache',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_buffercache',
+ ],
+ },
+}
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
new file mode 100644
index 00000000000..03e781b7bab
--- /dev/null
+++ b/contrib/pg_freespacemap/meson.build
@@ -0,0 +1,29 @@
+pg_freespacemap = shared_module('pg_freespacemap',
+ files(
+ 'pg_freespacemap.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_freespacemap--1.0--1.1.sql',
+ 'pg_freespacemap--1.1--1.2.sql',
+ 'pg_freespacemap--1.1.sql',
+ 'pg_freespacemap.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_freespacemap',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_freespacemap',
+ ],
+ 'regress_args': [
+ '--temp-config', files('pg_freespacemap.conf')
+ ],
+ },
+}
diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build
new file mode 100644
index 00000000000..20533fb3ec9
--- /dev/null
+++ b/contrib/pg_prewarm/meson.build
@@ -0,0 +1,27 @@
+pg_prewarm = shared_module('pg_prewarm',
+ files(
+ 'autoprewarm.c',
+ 'pg_prewarm.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_prewarm--1.0--1.1.sql',
+ 'pg_prewarm--1.1--1.2.sql',
+ 'pg_prewarm--1.1.sql',
+ 'pg_prewarm.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_prewarm',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ },
+}
diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build
new file mode 100644
index 00000000000..1c76bf9cfbc
--- /dev/null
+++ b/contrib/pg_stat_statements/meson.build
@@ -0,0 +1,34 @@
+pg_stat_statements = shared_module('pg_stat_statements',
+ files('pg_stat_statements.c'),
+ kwargs: contrib_mod_args + {
+ 'dependencies': contrib_mod_args['dependencies'],
+ },
+)
+
+install_data(
+ 'pg_stat_statements.control',
+ 'pg_stat_statements--1.4.sql',
+ 'pg_stat_statements--1.9--1.10.sql',
+ 'pg_stat_statements--1.8--1.9.sql',
+ 'pg_stat_statements--1.7--1.8.sql',
+ 'pg_stat_statements--1.6--1.7.sql',
+ 'pg_stat_statements--1.5--1.6.sql',
+ 'pg_stat_statements--1.4--1.5.sql',
+ 'pg_stat_statements--1.3--1.4.sql',
+ 'pg_stat_statements--1.2--1.3.sql',
+ 'pg_stat_statements--1.1--1.2.sql',
+ 'pg_stat_statements--1.0--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_stat_statements',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_stat_statements',
+ ],
+ 'regress_args': ['--temp-config', files('pg_stat_statements.conf')],
+ },
+}
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
new file mode 100644
index 00000000000..70ae62fccef
--- /dev/null
+++ b/contrib/pg_surgery/meson.build
@@ -0,0 +1,25 @@
+pg_surgery = shared_module('pg_surgery',
+ files(
+ 'heap_surgery.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_surgery--1.0.sql',
+ 'pg_surgery.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'pg_surgery',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'heap_surgery',
+ ],
+ },
+}
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
new file mode 100644
index 00000000000..6818cddc63f
--- /dev/null
+++ b/contrib/pg_trgm/meson.build
@@ -0,0 +1,35 @@
+pg_trgm = shared_module('pg_trgm',
+ files(
+ 'trgm_gin.c',
+ 'trgm_gist.c',
+ 'trgm_op.c',
+ 'trgm_regexp.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_trgm--1.0--1.1.sql',
+ 'pg_trgm--1.1--1.2.sql',
+ 'pg_trgm--1.2--1.3.sql',
+ 'pg_trgm--1.3--1.4.sql',
+ 'pg_trgm--1.3.sql',
+ 'pg_trgm--1.4--1.5.sql',
+ 'pg_trgm--1.5--1.6.sql',
+ 'pg_trgm.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_trgm',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_trgm',
+ 'pg_word_trgm',
+ 'pg_strict_word_trgm',
+ ],
+ },
+}
diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build
new file mode 100644
index 00000000000..7eacc25f968
--- /dev/null
+++ b/contrib/pg_visibility/meson.build
@@ -0,0 +1,27 @@
+pg_visibility = shared_module('pg_visibility',
+ files(
+ 'pg_visibility.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pg_visibility--1.0--1.1.sql',
+ 'pg_visibility--1.1--1.2.sql',
+ 'pg_visibility--1.1.sql',
+ 'pg_visibility.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'pg_visibility',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_visibility',
+ ],
+ },
+}
diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build
new file mode 100644
index 00000000000..bdd817bba10
--- /dev/null
+++ b/contrib/pg_walinspect/meson.build
@@ -0,0 +1,37 @@
+pg_walinspect_sources = files('pg_walinspect.c')
+
+if host_system == 'win32'
+ pg_walinspect_sources += windows.compile_resources(
+ custom_target('win32ver.rc', kwargs: rcgen_kw,
+ command: rcgen_bin_cmd + [
+ '--FILEDESC', 'pg_walinspect - functions to inspect contents of PostgreSQL Write-Ahead Log',
+ '--NAME', 'pg_walinspect',
+ ]),
+ kwargs: rccompile_kw,
+ )
+endif
+
+pg_walinspect = shared_module('pg_walinspect',
+ pg_walinspect_sources,
+ kwargs: contrib_mod_args + {
+ 'dependencies': contrib_mod_args['dependencies'],
+ },
+)
+
+install_data(
+ 'pg_walinspect.control',
+ 'pg_walinspect--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'pg_walinspect',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pg_walinspect',
+ ],
+ 'regress_args': ['--temp-config', files('walinspect.conf')],
+ },
+}
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
new file mode 100644
index 00000000000..54ba2e7f13b
--- /dev/null
+++ b/contrib/pgcrypto/meson.build
@@ -0,0 +1,100 @@
+if not ssl.found()
+ subdir_done()
+endif
+
+pgcrypto_sources = files(
+ 'crypt-blowfish.c',
+ 'crypt-des.c',
+ 'crypt-gensalt.c',
+ 'crypt-md5.c',
+ 'mbuf.c',
+ 'pgcrypto.c',
+ 'pgp-armor.c',
+ 'pgp-cfb.c',
+ 'pgp-compress.c',
+ 'pgp-decrypt.c',
+ 'pgp-encrypt.c',
+ 'pgp-info.c',
+ 'pgp-mpi.c',
+ 'pgp-pgsql.c',
+ 'pgp-pubdec.c',
+ 'pgp-pubenc.c',
+ 'pgp-pubkey.c',
+ 'pgp-s2k.c',
+ 'pgp.c',
+ 'px-crypt.c',
+ 'px-hmac.c',
+ 'px.c',
+)
+
+pgcrypto_regress = [
+ 'init',
+ 'md5',
+ 'sha1',
+ 'hmac-md5',
+ 'hmac-sha1',
+ 'blowfish',
+ 'rijndael',
+ 'sha2',
+ 'des',
+ '3des',
+ 'cast5',
+ 'crypt-des',
+ 'crypt-md5',
+ 'crypt-blowfish',
+ 'crypt-xdes',
+ 'pgp-armor',
+ 'pgp-decrypt',
+ 'pgp-encrypt',
+ 'pgp-pubkey-decrypt',
+ 'pgp-pubkey-encrypt',
+ 'pgp-info',
+]
+
+pgcrypto_openssl_sources = files(
+ 'openssl.c',
+ 'pgp-mpi-openssl.c',
+)
+
+pgcrypto_deps = []
+pgcrypto_link_with = []
+
+pgcrypto_deps += ssl
+pgcrypto_sources += pgcrypto_openssl_sources
+
+if zlib.found()
+ pgcrypto_deps += zlib
+ pgcrypto_regress += 'pgp-compression'
+else
+ pgcrypto_regress += 'pgp-zlib-DISABLED'
+endif
+
+pgcrypto = shared_module('pgcrypto',
+ pgcrypto_sources,
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args + {
+ 'link_with': [pgcrypto_link_with, contrib_mod_args.get('link_with', [])],
+ 'dependencies': [pgcrypto_deps, contrib_mod_args['dependencies']]
+ },
+)
+
+install_data(
+ 'pgcrypto--1.0--1.1.sql',
+ 'pgcrypto--1.1--1.2.sql',
+ 'pgcrypto--1.2--1.3.sql',
+ 'pgcrypto--1.3.sql',
+ 'pgcrypto.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'pgcrypto',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ pgcrypto_regress,
+ ],
+ },
+}
diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build
new file mode 100644
index 00000000000..358d23cf2ee
--- /dev/null
+++ b/contrib/pgrowlocks/meson.build
@@ -0,0 +1,15 @@
+pgrowlocks = shared_module('pgrowlocks',
+ files(
+ 'pgrowlocks.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pgrowlocks--1.0--1.1.sql',
+ 'pgrowlocks--1.1--1.2.sql',
+ 'pgrowlocks--1.2.sql',
+ 'pgrowlocks.control',
+ kwargs: contrib_data_args,
+)
diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build
new file mode 100644
index 00000000000..8e765fc997a
--- /dev/null
+++ b/contrib/pgstattuple/meson.build
@@ -0,0 +1,32 @@
+pgstattuple = shared_module('pgstattuple',
+ files(
+ 'pgstatapprox.c',
+ 'pgstatindex.c',
+ 'pgstattuple.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'pgstattuple--1.0--1.1.sql',
+ 'pgstattuple--1.1--1.2.sql',
+ 'pgstattuple--1.2--1.3.sql',
+ 'pgstattuple--1.3--1.4.sql',
+ 'pgstattuple--1.4--1.5.sql',
+ 'pgstattuple--1.4.sql',
+ 'pgstattuple.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'pgstattuple',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'pgstattuple',
+ ],
+ },
+}
diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
new file mode 100644
index 00000000000..9be84a6b67f
--- /dev/null
+++ b/contrib/postgres_fdw/meson.build
@@ -0,0 +1,33 @@
+postgres_fdw_sources = files(
+ 'connection.c',
+ 'deparse.c',
+ 'option.c',
+ 'postgres_fdw.c',
+ 'shippable.c',
+)
+
+postgres_fdw = shared_module('postgres_fdw',
+ postgres_fdw_sources,
+ kwargs: contrib_mod_args + {
+ 'dependencies': pg_mod_args['dependencies'] + [libpq],
+ },
+)
+
+install_data(
+ 'postgres_fdw.control',
+ 'postgres_fdw--1.0.sql',
+ 'postgres_fdw--1.0--1.1.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'postgres_fdw',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'postgres_fdw',
+ ],
+ 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'],
+ },
+}
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
new file mode 100644
index 00000000000..b1f9db50e42
--- /dev/null
+++ b/contrib/seg/meson.build
@@ -0,0 +1,50 @@
+seg_sources = files(
+ 'seg.c',
+)
+
+# segscan is compiled as part of segparse
+seg_scan = custom_target('segscan',
+ input: ['segscan.l'],
+ output: ['segscan.c'],
+ command: [flex_cmd, '@INPUT@'],)
+generated_sources += seg_scan
+
+seg_parse = custom_target('segparse',
+ input: 'segparse.y',
+ output: 'segparse.c',
+ depends: seg_scan,
+ command: [bison_cmd, '@INPUT@'],)
+generated_sources += seg_parse
+seg_sources += seg_parse
+
+seg = shared_module('seg',
+ seg_sources,
+ include_directories: include_directories('.'),
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'seg.control',
+ 'seg--1.0--1.1.sql',
+ 'seg--1.1--1.2.sql',
+ 'seg--1.1.sql',
+ 'seg--1.2--1.3.sql',
+ 'seg--1.3--1.4.sql',
+ kwargs: contrib_data_args,
+)
+
+install_headers(
+ 'segdata.h',
+ install_dir: dir_include_extension / 'seg',
+)
+
+tests += {
+ 'name': 'seg',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'seg',
+ ],
+ },
+}
diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build
new file mode 100644
index 00000000000..9fa6013c91f
--- /dev/null
+++ b/contrib/sepgsql/meson.build
@@ -0,0 +1,34 @@
+if not selinux.found()
+ subdir_done()
+endif
+
+sepgsql_sources = files(
+ 'database.c',
+ 'dml.c',
+ 'hooks.c',
+ 'label.c',
+ 'proc.c',
+ 'relation.c',
+ 'schema.c',
+ 'selinux.c',
+ 'uavc.c',
+)
+
+sepgsql = shared_module('sepgsql',
+ sepgsql_sources,
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args + {
+ 'dependencies': [selinux, pg_mod_args['dependencies']],
+ }
+)
+
+custom_target('sepgsql.sql',
+ input: 'sepgsql.sql.in',
+ output: 'sepgsql.sql',
+ command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'],
+ capture: true,
+ install: true,
+ install_dir: contrib_data_args['install_dir'],
+)
+
+# TODO: implement sepgsql tests
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
new file mode 100644
index 00000000000..4c26242595a
--- /dev/null
+++ b/contrib/spi/meson.build
@@ -0,0 +1,47 @@
+autoinc = shared_module('autoinc',
+ ['autoinc.c'],
+ kwargs: contrib_mod_args,
+)
+
+install_data('autoinc.control', 'autoinc--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+
+insert_username = shared_module('insert_username',
+ ['insert_username.c'],
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'insert_username.control',
+ 'insert_username--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+
+moddatetime = shared_module('moddatetime',
+ ['moddatetime.c'],
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'moddatetime.control',
+ 'moddatetime--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+# this is needed for the regression tests;
+# comment out if you want a quieter refint package for other uses
+refint_cflags = ['-DREFINT_VERBOSE']
+
+refint = shared_module('refint',
+ ['refint.c'],
+ kwargs: contrib_mod_args + {
+ 'c_args': refint_cflags + contrib_mod_args['c_args'],
+ },
+)
+
+install_data('refint.control', 'refint--1.0.sql',
+ kwargs: contrib_data_args,
+)
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
new file mode 100644
index 00000000000..dfa51a0934c
--- /dev/null
+++ b/contrib/sslinfo/meson.build
@@ -0,0 +1,21 @@
+if not ssl.found()
+ subdir_done()
+endif
+
+sslinfo = shared_module('sslinfo',
+ files(
+ 'sslinfo.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args + {
+ 'dependencies': [ssl, pg_mod_args['dependencies']],
+ }
+)
+
+install_data(
+ 'sslinfo--1.0--1.1.sql',
+ 'sslinfo--1.1--1.2.sql',
+ 'sslinfo--1.2.sql',
+ 'sslinfo.control',
+ kwargs: contrib_data_args,
+)
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
new file mode 100644
index 00000000000..e94d9d7de44
--- /dev/null
+++ b/contrib/tablefunc/meson.build
@@ -0,0 +1,25 @@
+tablefunc = shared_module('tablefunc',
+ files(
+ 'tablefunc.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'tablefunc--1.0.sql',
+ 'tablefunc.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'tablefunc',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'tablefunc',
+ ],
+ },
+}
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
new file mode 100644
index 00000000000..c1005774087
--- /dev/null
+++ b/contrib/tcn/meson.build
@@ -0,0 +1,24 @@
+tcn = shared_module('tcn',
+ files(
+ 'tcn.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'tcn--1.0.sql',
+ 'tcn.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'tcn',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'specs': [
+ 'tcn',
+ ],
+ },
+}
diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build
new file mode 100644
index 00000000000..0719350a0dd
--- /dev/null
+++ b/contrib/test_decoding/meson.build
@@ -0,0 +1,62 @@
+test_decoding_sources = files(
+ 'test_decoding.c',
+)
+
+test_decoding = shared_module('test_decoding',
+ test_decoding_sources,
+ kwargs: contrib_mod_args,
+)
+
+tests += {
+ 'name': 'test_decoding',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'ddl',
+ 'xact',
+ 'rewrite',
+ 'toast',
+ 'permissions',
+ 'decoding_in_xact',
+ 'decoding_into_rel',
+ 'binary',
+ 'prepared',
+ 'replorigin',
+ 'time',
+ 'messages',
+ 'spill',
+ 'slot',
+ 'truncate',
+ 'stream',
+ 'stats',
+ 'twophase',
+ 'twophase_stream',
+ ],
+ 'regress_args': [
+ '--temp-config', files('logical.conf'),
+ ],
+ },
+ 'isolation': {
+ 'specs': [
+ 'mxact',
+ 'delayed_startup',
+ 'ondisk_startup',
+ 'concurrent_ddl_dml',
+ 'oldest_xmin',
+ 'snapshot_transfer',
+ 'subxact_without_top',
+ 'concurrent_stream',
+ 'twophase_snapshot',
+ 'slot_creation_error',
+ ],
+ 'regress_args': [
+ '--temp-config', files('logical.conf'),
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/001_repl_stats.pl',
+ ],
+ },
+}
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
new file mode 100644
index 00000000000..577482d18f2
--- /dev/null
+++ b/contrib/tsm_system_rows/meson.build
@@ -0,0 +1,24 @@
+tsm_system_rows = shared_module('tsm_system_rows',
+ files(
+ 'tsm_system_rows.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'tsm_system_rows--1.0.sql',
+ 'tsm_system_rows.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'tsm_system_rows',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'tsm_system_rows',
+ ],
+ },
+}
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
new file mode 100644
index 00000000000..ce5fd138501
--- /dev/null
+++ b/contrib/tsm_system_time/meson.build
@@ -0,0 +1,24 @@
+tsm_system_time = shared_module('tsm_system_time',
+ files(
+ 'tsm_system_time.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'tsm_system_time--1.0.sql',
+ 'tsm_system_time.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'tsm_system_time',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'tsm_system_time',
+ ],
+ },
+}
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
new file mode 100644
index 00000000000..e99bbe5bdf9
--- /dev/null
+++ b/contrib/unaccent/meson.build
@@ -0,0 +1,32 @@
+unaccent = shared_module('unaccent',
+ files(
+ 'unaccent.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args,
+)
+
+install_data(
+ 'unaccent--1.0--1.1.sql',
+ 'unaccent--1.1.sql',
+ 'unaccent.control',
+ kwargs: contrib_data_args,
+)
+
+install_data(
+ 'unaccent.rules',
+ install_dir: dir_data / 'tsearch_data'
+)
+
+# XXX: Implement downlo
+tests += {
+ 'name': 'unaccent',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'unaccent',
+ ],
+ 'regress_args': ['--encoding=UTF8'],
+ },
+}
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
new file mode 100644
index 00000000000..dac73feae4e
--- /dev/null
+++ b/contrib/uuid-ossp/meson.build
@@ -0,0 +1,33 @@
+if not uuid.found()
+ subdir_done()
+endif
+
+uuid_ossp = shared_module('uuid-ossp',
+ files(
+ 'uuid-ossp.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args + {
+ 'dependencies': [uuid, pg_mod_args['dependencies']],
+ },
+
+)
+
+install_data(
+ 'uuid-ossp--1.0--1.1.sql',
+ 'uuid-ossp--1.1.sql',
+ 'uuid-ossp.control',
+ kwargs: contrib_data_args,
+)
+
+
+tests += {
+ 'name': 'uuid-ossp',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'uuid_ossp',
+ ],
+ },
+}
diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build
new file mode 100644
index 00000000000..ed0740212f6
--- /dev/null
+++ b/contrib/vacuumlo/meson.build
@@ -0,0 +1,16 @@
+executable('vacuumlo',
+ ['vacuumlo.c'],
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+
+tests += {
+ 'name' : 'vacuumlo',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests' :[
+ 't/001_basic.pl',
+ ],
+ },
+}
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
new file mode 100644
index 00000000000..d25549a1fb3
--- /dev/null
+++ b/contrib/xml2/meson.build
@@ -0,0 +1,32 @@
+if not libxml.found()
+ subdir_done()
+endif
+
+xml2 = shared_module('pgxml',
+ files(
+ 'xpath.c',
+ 'xslt_proc.c',
+ ),
+ c_pch: pch_postgres_h,
+ kwargs: contrib_mod_args + {
+ 'dependencies': [libxml, libxslt, contrib_mod_args['dependencies']],
+ },
+)
+
+install_data(
+ 'xml2--1.0--1.1.sql',
+ 'xml2--1.1.sql',
+ 'xml2.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'xml2',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'xml2',
+ ],
+ },
+}
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
new file mode 100644
index 00000000000..328f33e5de3
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -0,0 +1,19 @@
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_compat = both_libraries('libecpg_compat',
+ 'informix.c',
+ include_directories : ['.', ecpg_inc, postgres_inc, libpq_inc],
+ dependencies: [frontend_shlib_code, thread_dep],
+ link_with: [ecpglib, ecpg_pgtypes],
+ soversion: host_system != 'win32' ? '3' : '',
+ version: '3.'+pg_version_major.to_string(),
+ link_args: export_fmt.format(export_file.full_path()),
+ link_depends: export_file,
+ kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+ ecpg_compat.get_shared_lib(),
+ description: 'PostgreSQL libecpg_compat library',
+ url: pg_url,
+)
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
new file mode 100644
index 00000000000..9914aa936db
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -0,0 +1,34 @@
+ecpglib_sources = files(
+ 'connect.c',
+ 'data.c',
+ 'descriptor.c',
+ 'error.c',
+ 'execute.c',
+ 'memory.c',
+ 'misc.c',
+ 'prepare.c',
+ 'sqlda.c',
+ 'typename.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpglib = both_libraries('libecpg',
+ ecpglib_sources,
+ include_directories : ['.', ecpg_inc, postgres_inc],
+ dependencies: [frontend_shlib_code, libpq, thread_dep],
+ link_with: [ecpg_pgtypes],
+ soversion: host_system != 'win32' ? '6' : '',
+ version: '6.'+pg_version_major.to_string(),
+ link_args: export_fmt.format(export_file.full_path()),
+ link_depends: export_file,
+ kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+ ecpglib.get_shared_lib(),
+ description: 'PostgreSQL libecpg library',
+ url: pg_url,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build
new file mode 100644
index 00000000000..246e399ebd3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build
new file mode 100644
index 00000000000..c95d0455b9a
--- /dev/null
+++ b/src/interfaces/ecpg/include/meson.build
@@ -0,0 +1,51 @@
+ecpg_inc = include_directories('.')
+
+ecpg_conf_keys = [
+ 'ENABLE_THREAD_SAFETY',
+ 'HAVE_INT64',
+ 'HAVE_LONG_INT_64',
+ 'HAVE_LONG_LONG_INT_64',
+ 'PG_USE_STDBOOL',
+]
+
+ecpg_conf_data = configuration_data()
+
+foreach key : ecpg_conf_keys
+ if cdata.has(key)
+ ecpg_conf_data.set(key, cdata.get(key))
+ endif
+endforeach
+
+ecpg_config_h = configure_file(
+ output: 'ecpg_config.h',
+ configuration: ecpg_conf_data,
+ install_dir: dir_include,
+)
+configure_files += ecpg_config_h
+
+generated_sources_ac += {'src/interfaces/ecpg/include': ['stamp-h']}
+
+install_headers(
+ 'ecpg_informix.h',
+ 'ecpgerrno.h',
+ 'ecpglib.h',
+ 'ecpgtype.h',
+ 'pgtypes.h',
+ 'pgtypes_date.h',
+ 'pgtypes_error.h',
+ 'pgtypes_interval.h',
+ 'pgtypes_numeric.h',
+ 'pgtypes_timestamp.h',
+ 'sql3types.h',
+ 'sqlca.h',
+ 'sqlda.h',
+ 'sqlda-compat.h',
+ 'sqlda-native.h',
+)
+
+install_headers(
+ 'datetime.h',
+ 'decimal.h',
+ 'sqltypes.h',
+ install_dir: dir_include_pkg / 'informix' / 'esql',
+)
diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build
new file mode 100644
index 00000000000..ffbe84c0e88
--- /dev/null
+++ b/src/interfaces/ecpg/meson.build
@@ -0,0 +1,5 @@
+subdir('include')
+subdir('pgtypeslib')
+subdir('ecpglib')
+subdir('compatlib')
+subdir('preproc')
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
new file mode 100644
index 00000000000..28c4e7314be
--- /dev/null
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -0,0 +1,27 @@
+ecpg_pgtypes_sources = files(
+ 'common.c',
+ 'datetime.c',
+ 'dt_common.c',
+ 'interval.c',
+ 'numeric.c',
+ 'timestamp.c',
+)
+
+export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
+
+ecpg_pgtypes = both_libraries('libpgtypes',
+ ecpg_pgtypes_sources,
+ include_directories : ['.', ecpg_inc, postgres_inc],
+ dependencies: [frontend_shlib_code],
+ version: '3.'+pg_version_major.to_string(),
+ soversion: host_system != 'win32' ? '3' : '',
+ link_args: export_fmt.format(export_file.full_path()),
+ link_depends: export_file,
+ kwargs: default_lib_args,
+)
+
+pkgconfig.generate(
+ ecpg_pgtypes.get_shared_lib(),
+ description: 'PostgreSQL libpgtypes library',
+ url: pg_url,
+)
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
new file mode 100644
index 00000000000..fafeef01919
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -0,0 +1,104 @@
+ecpg_sources = files(
+ 'c_keywords.c',
+ 'descriptor.c',
+ 'ecpg.c',
+ 'ecpg_keywords.c',
+ 'keywords.c',
+ 'output.c',
+ 'parser.c',
+ 'type.c',
+ '../ecpglib/typename.c',
+ 'variable.c',
+)
+
+pgc = custom_target('pgc.c',
+ input: ['pgc.l'],
+ output: ['pgc.c'],
+ command: [flex_cmd, '@INPUT@'],
+)
+generated_sources += pgc
+ecpg_sources += pgc
+
+ecpg_files = [
+ 'ecpg.addons',
+ 'ecpg.header',
+ 'ecpg.tokens',
+ 'ecpg.trailer',
+ 'ecpg.type',
+]
+
+preproc_y = custom_target('preproc.y',
+ input: [
+ '../../../backend/parser/gram.y',
+ ecpg_files,
+ ],
+ output: ['preproc.y'],
+ command: [
+ perl, files('parse.pl'),
+ '--srcdir', '@CURRENT_SOURCE_DIR@',
+ '--parser', '@INPUT0@',
+ '--output', '@OUTPUT0@',
+ ],
+)
+generated_sources += preproc_y
+
+check_rules = custom_target('preproc.y.check_rules',
+ input: [
+ '../../../backend/parser/gram.y',
+ ecpg_files,
+ ],
+ output: 'preproc.y.check_rules',
+ command: [
+ perl, files('check_rules.pl'),
+ '--srcdir', '@CURRENT_SOURCE_DIR@',
+ '--parser', '@INPUT0@',
+ '--stamp', '@OUTPUT0@',
+ ],
+)
+
+preproc = custom_target('preproc.c',
+ input: [preproc_y],
+ output: ['preproc.c', 'preproc.h'],
+ depends: check_rules,
+ command: [bison_cmd, '-d', '@INPUT@'],
+)
+generated_sources += preproc.to_list()
+ecpg_sources += preproc
+
+c_kwlist = custom_target('c_kwlist_d.h',
+ input: ['c_kwlist.h'],
+ output: ['c_kwlist_d.h'],
+ command: [
+ perl,
+ '-I', '@SOURCE_ROOT@/src/tools',
+ '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+ '--output', '@OUTDIR@',
+ '--varname', 'ScanCKeywords',
+ '--no-case-fold', '@INPUT0@'
+ ],
+)
+generated_sources += c_kwlist
+ecpg_sources += c_kwlist
+
+ecpg_kwlist = custom_target('ecpg_kwlist_d.h',
+ input: ['ecpg_kwlist.h'],
+ output: ['ecpg_kwlist_d.h'],
+ command: [
+ perl, '-I',
+ '@SOURCE_ROOT@/src/tools',
+ '@SOURCE_ROOT@/src/tools/gen_keywordlist.pl',
+ '--output', '@OUTDIR@',
+ '--varname', 'ScanECPGKeywords', '@INPUT0@',
+ ]
+)
+generated_sources += ecpg_kwlist
+ecpg_sources += ecpg_kwlist
+
+ecpg_exe = executable('ecpg',
+ ecpg_sources,
+ include_directories : ['.', ecpg_inc, postgres_inc],
+ dependencies: [frontend_shlib_code, libpq],
+ kwargs: default_bin_args,
+)
+
+subdir('po', if_found: libintl)
diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build
new file mode 100644
index 00000000000..d73b05afd5e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext('ecpg-' + pg_version_major.to_string())
diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build
new file mode 100644
index 00000000000..c45dbe1582c
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_informix/meson.build
@@ -0,0 +1,31 @@
+pgc_files = [
+ 'charfuncs',
+ 'dec_test',
+ 'describe',
+ 'rfmtdate',
+ 'rfmtlong',
+ 'rnull',
+ 'sqlda',
+ 'test_informix',
+ 'test_informix2',
+]
+
+pgc_extra_flags = {
+ 'rnull': ['-r', 'no_indicator',],
+}
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ ['-C', 'INFORMIX',] +
+ pgc_extra_flags.get(pgc_file, []) +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build
new file mode 100644
index 00000000000..ad99457865f
--- /dev/null
+++ b/src/interfaces/ecpg/test/compat_oracle/meson.build
@@ -0,0 +1,20 @@
+pgc_files = [
+ 'char_array',
+]
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ output: '@BASENAME@.c',
+ command: ecpg_preproc_test_command_start +
+ ['-C', 'ORACLE',] +
+ ecpg_preproc_test_command_end,
+ install: false,
+ build_by_default: false,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build
new file mode 100644
index 00000000000..7e7918148f7
--- /dev/null
+++ b/src/interfaces/ecpg/test/connect/meson.build
@@ -0,0 +1,22 @@
+
+pgc_files = [
+ 'test1',
+ 'test2',
+ 'test3',
+ 'test4',
+ 'test5',
+]
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
new file mode 100644
index 00000000000..3d040933faf
--- /dev/null
+++ b/src/interfaces/ecpg/test/meson.build
@@ -0,0 +1,77 @@
+pg_regress_ecpg_sources = pg_regress_c + files(
+ 'pg_regress_ecpg.c',
+)
+
+pg_regress_ecpg = executable('pg_regress_ecpg',
+ pg_regress_ecpg_sources,
+ c_args: pg_regress_cflags,
+ include_directories: [pg_regress_inc, include_directories('.')],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args + {
+ 'install': false
+ },
+)
+
+# create .c files and executables from .pgc files
+ecpg_test_exec_kw = {
+ 'dependencies': [frontend_code, libpq],
+ 'include_directories': [ecpg_inc],
+ 'link_with': [ecpglib, ecpg_compat, ecpg_pgtypes],
+ 'build_by_default': false,
+ 'install': false,
+}
+
+ecpg_preproc_kw = {
+ 'output': '@BASENAME@.c',
+ 'install': false,
+ 'build_by_default': false,
+}
+
+ecpg_preproc_test_command_start = [
+ ecpg_exe,
+ '--regression',
+ '-I@CURRENT_SOURCE_DIR@',
+ '-I@SOURCE_ROOT@' + '/src/interfaces/ecpg/include/',
+]
+ecpg_preproc_test_command_end = [
+ '-o', '@OUTPUT@', '@INPUT@'
+]
+
+ecpg_test_dependencies = []
+
+subdir('connect')
+subdir('sql')
+subdir('pgtypeslib')
+subdir('preproc')
+subdir('compat_informix')
+subdir('compat_oracle')
+subdir('thread')
+
+ecpg_test_files = files(
+ 'ecpg_schedule',
+)
+
+ecpg_regress_args = [
+ '--dbname=ecpg1_regression,ecpg2_regression',
+ '--create-role=regress_ecpg_user1,regress_ecpg_user2',
+ '--encoding=SQL_ASCII',
+]
+
+tests += {
+ 'name': 'ecpg',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'test_runner': pg_regress_ecpg,
+ 'expecteddir': meson.current_source_dir(),
+ 'inputdir': meson.current_build_dir(),
+ 'schedule': ecpg_test_files,
+ 'sql': [
+ 'sql/twophase',
+ ],
+ 'test_kwargs': {
+ 'depends': meson.is_cross_build() ? [] : ecpg_test_dependencies,
+ },
+ 'regress_args': ecpg_regress_args,
+ },
+}
diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build
new file mode 100644
index 00000000000..08e6f675bdf
--- /dev/null
+++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+ 'dt_test',
+ 'dt_test2',
+ 'num_test',
+ 'num_test2',
+ 'nan_test',
+]
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build
new file mode 100644
index 00000000000..27c4f45caba
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/meson.build
@@ -0,0 +1,38 @@
+
+pgc_files = [
+ 'array_of_struct',
+ 'autoprep',
+ 'comment',
+ 'cursor',
+ 'define',
+ 'init',
+ 'outofscope',
+ 'pointer_to_struct',
+ 'strings',
+ 'type',
+ 'variable',
+ 'whenever',
+ 'whenever_do_continue',
+]
+
+pgc_extra_flags = {
+ 'array_of_struct': ['-c'],
+ 'pointer_to_struct' : ['-c'],
+ 'autoprep': ['-r', 'prepare'],
+ 'strings': ['-i'],
+}
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ pgc_extra_flags.get(pgc_file, []) +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build
new file mode 100644
index 00000000000..f7a7eb0ff72
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/meson.build
@@ -0,0 +1,46 @@
+pgc_files = [
+ 'array',
+ 'binary',
+ 'bytea',
+ 'code100',
+ 'copystdout',
+ 'createtableas',
+ 'declare',
+ 'define',
+ 'desc',
+ 'describe',
+ 'dynalloc',
+ 'dynalloc2',
+ 'dyntest',
+ 'execute',
+ 'fetch',
+ 'func',
+ 'indicators',
+ 'insupd',
+ 'oldexec',
+ 'parser',
+ 'prepareas',
+ 'quote',
+ 'show',
+ 'sqlda',
+ 'twophase',
+]
+
+pgc_extra_flags = {
+ 'oldexec': ['-r', 'questionmarks'],
+}
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ pgc_extra_flags.get(pgc_file, []) +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw,
+ )
+endforeach
diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build
new file mode 100644
index 00000000000..98efbcd57d3
--- /dev/null
+++ b/src/interfaces/ecpg/test/thread/meson.build
@@ -0,0 +1,21 @@
+pgc_files = [
+ 'thread_implicit',
+ 'thread',
+ 'prep',
+ 'descriptor',
+ 'alloc',
+]
+
+foreach pgc_file: pgc_files
+ exe_input = custom_target(pgc_file,
+ input: '@0@.pgc'.format(pgc_file),
+ command: ecpg_preproc_test_command_start +
+ ecpg_preproc_test_command_end,
+ kwargs: ecpg_preproc_kw,
+ )
+
+ ecpg_test_dependencies += executable(pgc_file,
+ exe_input,
+ kwargs: ecpg_test_exec_kw + {'dependencies': [frontend_code, libpq, thread_dep,]},
+ )
+endforeach
diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build
new file mode 100644
index 00000000000..73fffbee394
--- /dev/null
+++ b/src/interfaces/meson.build
@@ -0,0 +1,2 @@
+# NB: libpq is entered directly from the toplevel meson file
+subdir('ecpg')
diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build
new file mode 100644
index 00000000000..2092976d62e
--- /dev/null
+++ b/doc/src/sgml/meson.build
@@ -0,0 +1,258 @@
+docs = []
+alldocs = []
+doc_generated = []
+
+xmllint = find_program('xmllint', native: true, required: false)
+pandoc = find_program('pandoc', native: true, required: false)
+xsltproc = find_program('xsltproc', native: true, required: false)
+fop = find_program('fop', native: true, required: false)
+
+
+version_sgml = configure_file(
+ input: 'version.sgml.in',
+ output: 'version.sgml',
+ configuration: cdata,
+)
+configure_files += version_sgml
+
+doc_generated += custom_target('features-supported.sgml',
+ input: files(
+ '../../../src/backend/catalog/sql_feature_packages.txt',
+ '../../../src/backend/catalog/sql_features.txt'),
+ output: 'features-supported.sgml',
+ command: [perl, files('mk_feature_tables.pl'), 'YES', '@INPUT@'],
+ build_by_default: false,
+ install: false,
+ capture: true)
+
+doc_generated += custom_target('features-unsupported.sgml',
+ input: files(
+ '../../../src/backend/catalog/sql_feature_packages.txt',
+ '../../../src/backend/catalog/sql_features.txt'),
+ output: 'features-unsupported.sgml',
+ command: [perl, files('mk_feature_tables.pl'), 'NO', '@INPUT@'],
+ build_by_default: false,
+ install: false,
+ capture: true)
+
+doc_generated += custom_target('errcodes-table.sgml',
+ input: files(
+ '../../../src/backend/utils/errcodes.txt'),
+ output: 'errcodes-table.sgml',
+ command: [perl, files('generate-errcodes-table.pl'), '@INPUT@'],
+ build_by_default: false,
+ install: false,
+ capture: true)
+
+# FIXME: this actually has further inputs, adding depfile support to
+# generate-keywords-table.pl is probably the best way to address that
+# robustly.
+doc_generated += custom_target('keywords-table.sgml',
+ input: files(
+ '../../../src/include/parser/kwlist.h'),
+ output: 'keywords-table.sgml',
+ command: [perl, files('generate-keywords-table.pl'), '@CURRENT_SOURCE_DIR@'],
+ build_by_default: false,
+ install: false,
+ capture: true)
+
+# For everything else we need at least xmllint
+if not xmllint.found()
+ subdir_done()
+endif
+
+# Compute validity just once
+postgres_sgml_valid = custom_target('postgres.sgml.valid',
+ input: 'postgres.sgml',
+ output: 'postgres.sgml.valid',
+ command: [xmllint, '--noout', '--valid', '--path', '@OUTDIR@', '@INPUT@'],
+ depends: doc_generated,
+ build_by_default: true,
+ capture: true,
+)
+
+#
+# Full documentation as html, text
+#
+if xsltproc.found()
+ xsltproc_flags = [
+ '--stringparam', 'pg.version', pg_version,
+ '--param', 'website.stylesheet', '1'
+ ]
+
+
+ # FIXME: Should use a wrapper around xsltproc --load-trace to compute a
+ # depfile
+ html = custom_target('html',
+ input: ['stylesheet.xsl', 'postgres.sgml'],
+ output: 'html',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += html
+
+ # build multi-page html docs as part of docs target
+ docs += html
+
+ html_help = custom_target('html_help',
+ input: ['stylesheet-hh.xsl', 'postgres.sgml'],
+ output: 'htmlhelp',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += html_help
+
+
+ # single-page HTML
+ postgres_html = custom_target('postgres.html',
+ input: ['stylesheet-html-nochunk.xsl', 'postgres.sgml'],
+ output: 'postgres.html',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += postgres_html
+
+ # single-page text
+ if pandoc.found()
+ postgres_txt = custom_target('postgres.txt',
+ input: [postgres_html],
+ output: 'postgres.txt',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += postgres_txt
+ endif
+endif
+
+
+#
+# INSTALL in html, text
+#
+if xsltproc.found()
+ install_xml = custom_target('INSTALL.xml',
+ input: ['standalone-profile.xsl', 'standalone-install.xml'],
+ output: 'INSTALL.xml',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'],
+ build_by_default: false,
+ )
+ install_html = custom_target('INSTALL.html',
+ input: ['stylesheet-text.xsl', install_xml],
+ output: 'INSTALL.html',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTPUT@', xsltproc_flags, '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += install_html
+
+ if pandoc.found()
+ # XXX: Makefile does an iconv translit here, but unclear why?
+ install = custom_target('INSTALL',
+ input: [install_html],
+ output: 'INSTALL',
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += postgres_txt
+ endif
+
+endif
+
+
+#
+# Man pages
+#
+if xsltproc.found()
+ # FIXME: implement / consider sqlmansectnum logic
+ man = custom_target('man',
+ input: ['stylesheet-man.xsl', 'postgres.sgml'],
+ output: ['man1', 'man3', 'man7'],
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@', '-o', '@OUTDIR@/', xsltproc_flags, '@INPUT@'],
+ build_by_default: false,
+ )
+
+ # build by default as part of docs target
+ docs += man
+endif
+
+
+#
+# Full documentation as PDF
+#
+if fop.found() and xsltproc.found()
+ xsltproc_fo_flags = xsltproc_flags + ['--stringparam', 'img.src.path', meson.current_source_dir() + '/']
+
+ foreach format, detail: {'A4': 'A4', 'US': 'USletter'}
+ postgres_x_fo_f = 'postgres-@0@.fo'.format(format)
+ postgres_x_pdf_f = 'postgres-@0@.pdf'.format(format)
+
+ postgres_x_fo = custom_target(postgres_x_fo_f,
+ input: ['stylesheet-fo.xsl', 'postgres.sgml'],
+ output: [postgres_x_fo_f],
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_fo_flags,
+ '--stringparam', 'paper.type', detail,
+ '-o', '@OUTPUT@', '@INPUT@'],
+ build_by_default: false,
+ )
+
+ postgres_x_pdf = custom_target(postgres_x_pdf_f,
+ input: [postgres_x_fo],
+ output: [postgres_x_pdf_f],
+ command: [fop, '-fo', '@INPUT@', '-pdf', '@OUTPUT@'],
+ build_by_default: false,
+ )
+ alldocs += postgres_x_pdf
+ endforeach
+endif
+
+
+#
+# epub
+#
+
+# This was previously implemented using dbtoepub - but that doesn't seem to
+# support running in build != source directory (i.e. VPATH builds already
+# weren't supported).
+if pandoc.found() and xsltproc.found()
+ # XXX: Wasn't able to make pandoc successfully resolve entities
+ # XXX: Perhaps we should just make all targets use this, to avoid repeatedly
+ # building whole thing? It's comparatively fast though.
+ postgres_full_xml = custom_target('postgres-full.xml',
+ input: ['resolv.xsl', 'postgres.sgml'],
+ output: ['postgres-full.xml'],
+ depends: doc_generated + [postgres_sgml_valid],
+ command: [xsltproc, '--path', '@OUTDIR@/', xsltproc_flags,
+ '-o', '@OUTPUT@', '@INPUT@'],
+ build_by_default: false,
+ )
+
+ postgres_epub = custom_target('postgres.epub',
+ input: [postgres_full_xml],
+ output: 'postgres.epub',
+ command: [pandoc, '-f', 'docbook', '-t', 'epub', '-o', '@OUTPUT@', '--resource-path=@CURRENT_SOURCE_DIR@',
+ '@INPUT@'],
+ build_by_default: false,
+ )
+ alldocs += postgres_epub
+endif
+
+docs = []
+if docs.length() == 0
+ run_target('docs', command: [missing, 'xsltproc'])
+else
+ alias_target('docs', docs)
+endif
+
+alldocs = []
+if alldocs.length() == 0
+ run_target('alldocs', command: [missing, 'xsltproc'])
+else
+ alias_target('alldocs', alldocs)
+endif
diff --git a/doc/src/sgml/resolv.xsl b/doc/src/sgml/resolv.xsl
new file mode 100644
index 00000000000..c69ba714dab
--- /dev/null
+++ b/doc/src/sgml/resolv.xsl
@@ -0,0 +1,7 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/doc/src/sgml/version.sgml.in b/doc/src/sgml/version.sgml.in
new file mode 100644
index 00000000000..fa5ff343f40
--- /dev/null
+++ b/doc/src/sgml/version.sgml.in
@@ -0,0 +1,2 @@
+<!ENTITY version @PG_VERSION@>
+<!ENTITY majorversion @PG_MAJORVERSION@>
diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build
new file mode 100644
index 00000000000..2374028cbda
--- /dev/null
+++ b/src/test/authentication/meson.build
@@ -0,0 +1,11 @@
+tests += {
+ 'name': 'authentication',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_password.pl',
+ 't/002_saslprep.pl',
+ ],
+ },
+}
diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build
new file mode 100644
index 00000000000..c78e71801fe
--- /dev/null
+++ b/src/test/icu/meson.build
@@ -0,0 +1,11 @@
+tests += {
+ 'name': 'icu',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/010_database.pl',
+ ],
+ 'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+ },
+}
diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build
new file mode 100644
index 00000000000..bda9b9878a9
--- /dev/null
+++ b/src/test/isolation/meson.build
@@ -0,0 +1,54 @@
+# pg_regress_c helpfully provided by regress/meson.build
+
+isolation_sources = pg_regress_c + files(
+ 'isolation_main.c',
+)
+
+# see src/backend/replication/meson.build for depend logic
+spec_scanner = custom_target('specscanner',
+ input : files('specscanner.l'),
+ output : ['specscanner.c'],
+ command : [flex_cmd, '@INPUT@'],
+)
+generated_sources += spec_scanner
+
+isolationtester_sources = files('isolationtester.c')
+spec_parser = custom_target('specparse',
+ input: 'specparse.y',
+ output: 'specparse.c',
+ depends: spec_scanner,
+ command: [bison_cmd, '@INPUT@'],)
+isolationtester_sources += spec_parser
+generated_sources += spec_parser
+
+pg_isolation_regress = executable('pg_isolation_regress',
+ isolation_sources,
+ c_args: pg_regress_cflags,
+ include_directories: [pg_regress_inc],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args + {
+ 'install_dir': dir_pgxs / 'src/test/isolation',
+ },
+)
+
+isolationtester = executable('isolationtester',
+ isolationtester_sources,
+ include_directories: include_directories('.'),
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args + {
+ 'install_dir': dir_pgxs / 'src/test/isolation',
+ },
+)
+
+tests += {
+ 'name': 'main',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'schedule': files('isolation_schedule'),
+ 'test_kwargs': {
+ 'priority': 40,
+ 'timeout': 1000,
+ },
+ },
+}
diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build
new file mode 100644
index 00000000000..572e387a0be
--- /dev/null
+++ b/src/test/kerberos/meson.build
@@ -0,0 +1,15 @@
+tests += {
+ 'name': 'kerberos',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'test_kwargs': {'priority': 40}, # kerberos tests are slow, start early
+ 'tests': [
+ 't/001_auth.pl',
+ ],
+ 'env' : {
+ 'with_gssapi': gssapi.found() ? 'yes' : 'no',
+ 'with_krb_srvnam': 'postgres',
+ },
+ },
+}
diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build
new file mode 100644
index 00000000000..8a05b48147b
--- /dev/null
+++ b/src/test/ldap/meson.build
@@ -0,0 +1,11 @@
+tests += {
+ 'name': 'ldap',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_auth.pl',
+ ],
+ 'env' : {'with_ldap': ldap.found() ? 'yes' : 'no'},
+ },
+}
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644
index 00000000000..c620df338e0
--- /dev/null
+++ b/src/test/meson.build
@@ -0,0 +1,23 @@
+subdir('regress')
+subdir('isolation')
+
+subdir('authentication')
+subdir('recovery')
+subdir('subscription')
+subdir('modules')
+
+if ssl.found()
+ subdir('ssl')
+endif
+
+if ldap.found()
+ subdir('ldap')
+endif
+
+if gssapi.found()
+ subdir('kerberos')
+endif
+
+if icu.found()
+ subdir('icu')
+endif
diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build
new file mode 100644
index 00000000000..58254d093a4
--- /dev/null
+++ b/src/test/modules/brin/meson.build
@@ -0,0 +1,16 @@
+tests += {
+ 'name': 'brin',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'specs': [
+ 'summarization-and-inprogress-insertion',
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/01_workitems.pl',
+ 't/02_wal_consistency.pl',
+ ],
+ },
+}
diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build
new file mode 100644
index 00000000000..60cb12164d2
--- /dev/null
+++ b/src/test/modules/commit_ts/meson.build
@@ -0,0 +1,18 @@
+tests += {
+ 'name': 'commit_ts',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'commit_timestamp',
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/001_base.pl',
+ 't/002_standby.pl',
+ 't/003_standby_2.pl',
+ 't/004_restart.pl',
+ ],
+ },
+}
diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build
new file mode 100644
index 00000000000..3ce0ee2e2f6
--- /dev/null
+++ b/src/test/modules/delay_execution/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+delay_execution = shared_module('delay_execution',
+ ['delay_execution.c'],
+ kwargs: pg_mod_args,
+)
+
+tests += {
+ 'name': 'delay_execution',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'specs': [
+ 'partition-addition',
+ 'partition-removal-1',
+ ],
+ },
+}
diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build
new file mode 100644
index 00000000000..77a4377dc21
--- /dev/null
+++ b/src/test/modules/dummy_index_am/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_index_am = shared_module('dummy_index_am',
+ ['dummy_index_am.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'dummy_index_am.control',
+ 'dummy_index_am--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'dummy_index_am',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'reloptions',
+ ],
+ },
+}
diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build
new file mode 100644
index 00000000000..7d320eb7935
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+dummy_seclabel = shared_module('dummy_seclabel',
+ ['dummy_seclabel.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'dummy_seclabel.control',
+ 'dummy_seclabel--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'dummy_seclabel',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'dummy_seclabel',
+ ],
+ },
+}
diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
new file mode 100644
index 00000000000..fc07f77faf2
--- /dev/null
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -0,0 +1,20 @@
+libpq_pipeline = executable('libpq_pipeline',
+ files(
+ 'libpq_pipeline.c',
+ ),
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args + {
+ 'install': false,
+ },
+)
+
+tests += {
+ 'name': 'libpq_pipeline',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_libpq_pipeline.pl',
+ ],
+ },
+}
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
new file mode 100644
index 00000000000..a80e6e2ce29
--- /dev/null
+++ b/src/test/modules/meson.build
@@ -0,0 +1,27 @@
+subdir('brin')
+subdir('commit_ts')
+subdir('delay_execution')
+subdir('dummy_index_am')
+subdir('dummy_seclabel')
+subdir('libpq_pipeline')
+subdir('plsample')
+subdir('snapshot_too_old')
+subdir('spgist_name_ops')
+subdir('ssl_passphrase_callback')
+subdir('test_bloomfilter')
+subdir('test_ddl_deparse')
+subdir('test_extensions')
+subdir('test_ginpostinglist')
+subdir('test_integerset')
+subdir('test_lfind')
+subdir('test_misc')
+subdir('test_oat_hooks')
+subdir('test_parser')
+subdir('test_pg_dump')
+subdir('test_predtest')
+subdir('test_rbtree')
+subdir('test_regex')
+subdir('test_rls_hooks')
+subdir('test_shm_mq')
+subdir('unsafe_tests')
+subdir('worker_spi')
diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build
new file mode 100644
index 00000000000..323427858f0
--- /dev/null
+++ b/src/test/modules/plsample/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+plsample = shared_module('plsample',
+ ['plsample.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'plsample.control',
+ 'plsample--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'plsample',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'plsample',
+ ],
+ },
+}
diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build
new file mode 100644
index 00000000000..efd3f1f113b
--- /dev/null
+++ b/src/test/modules/snapshot_too_old/meson.build
@@ -0,0 +1,14 @@
+tests += {
+ 'name': 'snapshot_too_old',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'test_kwargs': {'priority': 40}, # sto tests are slow, start early
+ 'specs': [
+ 'sto_using_cursor',
+ 'sto_using_select',
+ 'sto_using_hash_index',
+ ],
+ 'regress_args': ['--temp-config', files('sto.conf')],
+ },
+}
diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build
new file mode 100644
index 00000000000..676f2a258cb
--- /dev/null
+++ b/src/test/modules/spgist_name_ops/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+spgist_name_ops = shared_module('spgist_name_ops',
+ ['spgist_name_ops.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'spgist_name_ops.control',
+ 'spgist_name_ops--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'spgist_name_ops',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'spgist_name_ops',
+ ],
+ },
+}
diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build
new file mode 100644
index 00000000000..f5eba869980
--- /dev/null
+++ b/src/test/modules/ssl_passphrase_callback/meson.build
@@ -0,0 +1,47 @@
+if not ssl.found()
+ subdir_done()
+endif
+
+# FIXME: prevent install during main install, but not during test :/
+ssl_passphrase_callback = shared_module('ssl_passphrase_func',
+ ['ssl_passphrase_func.c'],
+ kwargs: pg_mod_args + {
+ 'dependencies': [ssl, pg_mod_args['dependencies']],
+ }
+)
+
+# Targets to generate or remove the ssl certificate and key. Need to be copied
+# to the source afterwards. Normally not needed.
+
+openssl = find_program('openssl', native: true, required: false)
+
+if openssl.found()
+ cert = custom_target('server.crt',
+ output: ['server.crt', 'server.ckey'],
+ command: [openssl, 'req', '-new', '-x509', '-days', '10000', '-nodes', '-out', '@OUTPUT0@',
+ '-keyout', '@OUTPUT1@', '-subj', '/CN=localhost'],
+ build_by_default: false,
+ install: false,
+ )
+
+ # needs to agree with what's in the test script
+ pass = 'FooBaR1'
+
+ enccert = custom_target('server.key',
+ input: [cert[1]],
+ output: ['server.key'],
+ command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)]
+ )
+endif
+
+tests += {
+ 'name': 'ssl_passphrase_callback',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_testfunc.pl',
+ ],
+ 'env': {'with_ssl': 'openssl'},
+ },
+}
diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build
new file mode 100644
index 00000000000..6861ae38116
--- /dev/null
+++ b/src/test/modules/test_bloomfilter/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_bloomfilter = shared_module('test_bloomfilter',
+ ['test_bloomfilter.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_bloomfilter.control',
+ 'test_bloomfilter--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_bloomfilter',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_bloomfilter',
+ ],
+ },
+}
diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build
new file mode 100644
index 00000000000..367730e95db
--- /dev/null
+++ b/src/test/modules/test_ddl_deparse/meson.build
@@ -0,0 +1,42 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ddl_deparse = shared_module('test_ddl_deparse',
+ ['test_ddl_deparse.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_ddl_deparse.control',
+ 'test_ddl_deparse--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_ddl_deparse',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_ddl_deparse',
+ 'create_extension',
+ 'create_schema',
+ 'create_type',
+ 'create_conversion',
+ 'create_domain',
+ 'create_sequence_1',
+ 'create_table',
+ 'create_transform',
+ 'alter_table',
+ 'create_view',
+ 'create_trigger',
+ 'create_rule',
+ 'comment_on',
+ 'alter_function',
+ 'alter_sequence',
+ 'alter_ts_config',
+ 'alter_type_enum',
+ 'opfamily',
+ 'defprivs',
+ 'matviews',
+ ],
+ },
+}
diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build
new file mode 100644
index 00000000000..e95a9f2e7eb
--- /dev/null
+++ b/src/test/modules/test_extensions/meson.build
@@ -0,0 +1,45 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+ 'test_ext1--1.0.sql',
+ 'test_ext1.control',
+ 'test_ext2--1.0.sql',
+ 'test_ext2.control',
+ 'test_ext3--1.0.sql',
+ 'test_ext3.control',
+ 'test_ext4--1.0.sql',
+ 'test_ext4.control',
+ 'test_ext5--1.0.sql',
+ 'test_ext5.control',
+ 'test_ext6--1.0.sql',
+ 'test_ext6.control',
+ 'test_ext7--1.0--2.0.sql',
+ 'test_ext7--1.0.sql',
+ 'test_ext7.control',
+ 'test_ext8--1.0.sql',
+ 'test_ext8.control',
+ 'test_ext_cine--1.0.sql',
+ 'test_ext_cine--1.0--1.1.sql',
+ 'test_ext_cine.control',
+ 'test_ext_cor--1.0.sql',
+ 'test_ext_cor.control',
+ 'test_ext_cyclic1--1.0.sql',
+ 'test_ext_cyclic1.control',
+ 'test_ext_cyclic2--1.0.sql',
+ 'test_ext_cyclic2.control',
+ 'test_ext_evttrig--1.0--2.0.sql',
+ 'test_ext_evttrig--1.0.sql',
+ 'test_ext_evttrig.control',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_extensions',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_extensions',
+ 'test_extdepend',
+ ],
+ },
+}
diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build
new file mode 100644
index 00000000000..193c28a3da9
--- /dev/null
+++ b/src/test/modules/test_ginpostinglist/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_ginpostinglist = shared_module('test_ginpostinglist',
+ ['test_ginpostinglist.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_ginpostinglist.control',
+ 'test_ginpostinglist--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_ginpostinglist',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_ginpostinglist',
+ ],
+ },
+}
diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build
new file mode 100644
index 00000000000..b599dfc09e2
--- /dev/null
+++ b/src/test/modules/test_integerset/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_integerset = shared_module('test_integerset',
+ ['test_integerset.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_integerset.control',
+ 'test_integerset--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_integerset',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_integerset',
+ ],
+ },
+}
diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build
new file mode 100644
index 00000000000..9ccedc0aae3
--- /dev/null
+++ b/src/test/modules/test_lfind/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_lfind = shared_module('test_lfind',
+ ['test_lfind.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_lfind.control',
+ 'test_lfind--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_lfind',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_lfind',
+ ],
+ },
+}
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build
new file mode 100644
index 00000000000..cfc830ff399
--- /dev/null
+++ b/src/test/modules/test_misc/meson.build
@@ -0,0 +1,12 @@
+tests += {
+ 'name': 'test_misc',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_constraint_validation.pl',
+ 't/002_tablespace.pl',
+ 't/003_check_guc.pl',
+ ],
+ },
+}
diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build
new file mode 100644
index 00000000000..9b20e7c56d4
--- /dev/null
+++ b/src/test/modules/test_oat_hooks/meson.build
@@ -0,0 +1,17 @@
+# FIXME: prevent install during main install, but not during test :/
+test_oat_hooks = shared_module('test_oat_hooks',
+ ['test_oat_hooks.c'],
+ kwargs: pg_mod_args,
+)
+
+tests += {
+ 'name': 'test_oat_hooks',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_oat_hooks',
+ ],
+ 'regress_args': ['--no-locale', '--encoding=UTF8'],
+ },
+}
diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build
new file mode 100644
index 00000000000..35ee6ce324b
--- /dev/null
+++ b/src/test/modules/test_parser/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_parser = shared_module('test_parser',
+ ['test_parser.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_parser.control',
+ 'test_parser--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_parser',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_parser',
+ ],
+ },
+}
diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build
new file mode 100644
index 00000000000..41021829f3a
--- /dev/null
+++ b/src/test/modules/test_pg_dump/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+install_data(
+ 'test_pg_dump.control',
+ 'test_pg_dump--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_pg_dump',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_pg_dump',
+ ],
+ },
+ 'tap': {
+ 'tests': [
+ 't/001_base.pl',
+ ],
+ },
+}
diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build
new file mode 100644
index 00000000000..001c2d848bb
--- /dev/null
+++ b/src/test/modules/test_predtest/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_predtest = shared_module('test_predtest',
+ ['test_predtest.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_predtest.control',
+ 'test_predtest--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_predtest',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_predtest',
+ ],
+ },
+}
diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build
new file mode 100644
index 00000000000..963a6220a2a
--- /dev/null
+++ b/src/test/modules/test_rbtree/meson.build
@@ -0,0 +1,22 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rbtree = shared_module('test_rbtree',
+ ['test_rbtree.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_rbtree.control',
+ 'test_rbtree--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_rbtree',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_rbtree',
+ ],
+ },
+}
diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build
new file mode 100644
index 00000000000..61217dd2ca4
--- /dev/null
+++ b/src/test/modules/test_regex/meson.build
@@ -0,0 +1,23 @@
+# FIXME: prevent install during main install, but not during test :/
+test_regex = shared_module('test_regex',
+ ['test_regex.c'],
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_regex.control',
+ 'test_regex--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_regex',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_regex',
+ 'test_regex_utf8',
+ ],
+ },
+}
diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build
new file mode 100644
index 00000000000..3f49b8ff540
--- /dev/null
+++ b/src/test/modules/test_rls_hooks/meson.build
@@ -0,0 +1,16 @@
+# FIXME: prevent install during main install, but not during test :/
+test_rls_hooks = shared_module('test_rls_hooks',
+ ['test_rls_hooks.c'],
+ kwargs: pg_mod_args,
+)
+
+tests += {
+ 'name': 'test_rls_hooks',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_rls_hooks',
+ ],
+ },
+}
diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build
new file mode 100644
index 00000000000..9a0f83917a5
--- /dev/null
+++ b/src/test/modules/test_shm_mq/meson.build
@@ -0,0 +1,26 @@
+# FIXME: prevent install during main install, but not during test :/
+test_shm_mq = shared_module('test_shm_mq',
+ files(
+ 'setup.c',
+ 'test.c',
+ 'worker.c',
+ ),
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'test_shm_mq.control',
+ 'test_shm_mq--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'test_shm_mq',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'test_shm_mq',
+ ],
+ },
+}
diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build
new file mode 100644
index 00000000000..d69b0e7ce44
--- /dev/null
+++ b/src/test/modules/unsafe_tests/meson.build
@@ -0,0 +1,11 @@
+tests += {
+ 'name': 'unsafe_tests',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'rolenames',
+ 'alter_system_table',
+ ],
+ },
+}
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
new file mode 100644
index 00000000000..b729c354827
--- /dev/null
+++ b/src/test/modules/worker_spi/meson.build
@@ -0,0 +1,25 @@
+# FIXME: prevent install during main install, but not during test :/
+test_worker_spi = shared_module('worker_spi',
+ files(
+ 'worker_spi.c',
+ ),
+ kwargs: pg_mod_args,
+)
+
+install_data(
+ 'worker_spi.control',
+ 'worker_spi--1.0.sql',
+ kwargs: contrib_data_args,
+)
+
+tests += {
+ 'name': 'worker_spi',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'sql': [
+ 'worker_spi',
+ ],
+ 'regress_args': ['--temp-config', files('dynamic.conf'), '--dbname=contrib_regression'],
+ },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
new file mode 100644
index 00000000000..86c034d4242
--- /dev/null
+++ b/src/test/recovery/meson.build
@@ -0,0 +1,43 @@
+tests += {
+ 'name': 'recovery',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'test_kwargs': {'priority': 40}, # recovery tests are slow, start early
+ 'tests' : [
+ 't/001_stream_rep.pl',
+ 't/002_archiving.pl',
+ 't/003_recovery_targets.pl',
+ 't/004_timeline_switch.pl',
+ 't/005_replay_delay.pl',
+ 't/006_logical_decoding.pl',
+ 't/007_sync_rep.pl',
+ 't/008_fsm_truncation.pl',
+ 't/009_twophase.pl',
+ 't/010_logical_decoding_timelines.pl',
+ 't/011_crash_recovery.pl',
+ 't/012_subtransactions.pl',
+ 't/013_crash_restart.pl',
+ 't/014_unlogged_reinit.pl',
+ 't/015_promotion_pages.pl',
+ 't/016_min_consistency.pl',
+ 't/017_shm.pl',
+ 't/018_wal_optimize.pl',
+ 't/019_replslot_limit.pl',
+ 't/020_archive_status.pl',
+ 't/021_row_visibility.pl',
+ 't/022_crash_temp_files.pl',
+ 't/023_pitr_prepared_xact.pl',
+ 't/024_archive_recovery.pl',
+ 't/025_stuck_on_old_timeline.pl',
+ 't/026_overwrite_contrecord.pl',
+ 't/027_stream_regress.pl',
+ 't/028_pitr_timelines.pl',
+ 't/029_stats_restart.pl',
+ 't/030_stats_cleanup_replica.pl',
+ 't/031_recovery_conflict.pl',
+ 't/032_relfilenode_reuse.pl',
+ 't/033_replay_tsp_drops.pl',
+ ],
+ },
+}
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
new file mode 100644
index 00000000000..e2ee50504a9
--- /dev/null
+++ b/src/test/regress/meson.build
@@ -0,0 +1,58 @@
+# also used by isolationtester and ecpg tests
+pg_regress_c = files('pg_regress.c')
+pg_regress_inc = include_directories('.')
+
+regress_sources = pg_regress_c + files(
+ 'pg_regress_main.c'
+)
+
+pg_regress_cflags = ['-DHOST_TUPLE="frak"', '-DSHELLPROG="/bin/sh"']
+
+pg_regress = executable('pg_regress',
+ regress_sources,
+ c_args: pg_regress_cflags,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args + {
+ 'install_dir': dir_pgxs / 'src/test/regress',
+ },
+)
+
+regress_module = shared_module('regress',
+ ['regress.c'],
+ kwargs: pg_mod_args + {
+ 'install': false,
+ },
+)
+
+# Get some extra C modules from contrib/spi but mark them as not to be
+# installed.
+# FIXME: avoid the duplication.
+
+shared_module('autoinc',
+ ['../../../contrib/spi/autoinc.c'],
+ kwargs: pg_mod_args + {
+ 'install': false,
+ },
+)
+
+shared_module('refint',
+ ['../../../contrib/spi/refint.c'],
+ kwargs: pg_mod_args + {
+ 'c_args': refint_cflags + contrib_mod_args['c_args'],
+ 'install': false,
+ },
+)
+
+
+tests += {
+ 'name': 'main',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'regress': {
+ 'schedule': files('parallel_schedule'),
+ 'test_kwargs': {
+ 'priority': 50,
+ 'timeout': 1000,
+ },
+ },
+}
diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build
new file mode 100644
index 00000000000..7930170f013
--- /dev/null
+++ b/src/test/ssl/meson.build
@@ -0,0 +1,13 @@
+tests += {
+ 'name': 'ssl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env' : {'with_ssl': get_option('ssl')},
+ 'tests': [
+ 't/001_ssltests.pl',
+ 't/002_scram.pl',
+ 't/003_sslinfo.pl',
+ ],
+ },
+}
diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build
new file mode 100644
index 00000000000..fd4e183352e
--- /dev/null
+++ b/src/test/subscription/meson.build
@@ -0,0 +1,42 @@
+tests += {
+ 'name': 'subscription',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env' : {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_rep_changes.pl',
+ 't/002_types.pl',
+ 't/003_constraints.pl',
+ 't/004_sync.pl',
+ 't/005_encoding.pl',
+ 't/006_rewrite.pl',
+ 't/007_ddl.pl',
+ 't/008_diff_schema.pl',
+ 't/009_matviews.pl',
+ 't/010_truncate.pl',
+ 't/011_generated.pl',
+ 't/012_collation.pl',
+ 't/013_partition.pl',
+ 't/014_binary.pl',
+ 't/015_stream.pl',
+ 't/016_stream_subxact.pl',
+ 't/017_stream_ddl.pl',
+ 't/018_stream_subxact_abort.pl',
+ 't/019_stream_subxact_ddl_abort.pl',
+ 't/020_messages.pl',
+ 't/021_twophase.pl',
+ 't/022_twophase_cascade.pl',
+ 't/023_twophase_stream.pl',
+ 't/024_add_drop_pub.pl',
+ 't/025_rep_changes_for_schema.pl',
+ 't/026_stats.pl',
+ 't/027_nosuperuser.pl',
+ 't/028_row_filter.pl',
+ 't/029_on_error.pl',
+ 't/030_origin.pl',
+ 't/031_column_list.pl',
+ 't/100_bugs.pl',
+ ],
+ },
+}
diff --git a/configure b/configure
index e527363a9c6..61dcfa51c5f 100755
--- a/configure
+++ b/configure
@@ -21010,3 +21010,9 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+ touch meson.build
+fi
diff --git a/configure.ac b/configure.ac
index 1c392684bb8..d219227bec9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2495,3 +2495,9 @@ AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
[echo >src/interfaces/ecpg/include/stamp-h])
AC_OUTPUT
+
+# Ensure that any meson build directories would reconfigure and see that
+# there's a conflicting in-tree build and can error out.
+if test "$vpath_build"="no"; then
+ touch meson.build
+fi
diff --git a/conversion_helpers.txt b/conversion_helpers.txt
new file mode 100644
index 00000000000..b94ade57309
--- /dev/null
+++ b/conversion_helpers.txt
@@ -0,0 +1,9 @@
+convert list of files to quoted-one-per-line:
+
+ ?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\
+\)? → '\1.c',
+
+
+# check if all tap tests are known to meson
+m test --list > /tmp/tests.txt
+for f in $(git ls-files|grep 't/.*.pl$'|sort);do t=$(echo $f|sed -E -e 's/^.*\/(.*\/(t|test)\/.*)$/\1/');grep -q -L $t /tmp/tests.txt || echo $f;done
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..5cc4df4b946
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3020 @@
+project('postgresql',
+ ['c'],
+ version: '16devel',
+ license: 'PostgreSQL',
+
+ # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for
+ # RHEL 7 has 0.55. < 0.54 would require replacing some uses of the fs
+ # module, < 0.53 all uses of fs. So far there's no need to go to >=0.56.
+ meson_version: '>=0.54',
+ default_options: [
+ 'warning_level=2',
+ 'b_pch=false',
+ 'buildtype=release',
+ ]
+)
+
+
+
+###############################################################
+# Basic prep
+###############################################################
+
+host_system = host_machine.system() == 'windows' ? 'win32' : host_machine.system()
+build_system = build_machine.system() == 'windows' ? 'win32' : build_machine.system()
+
+host_cpu = host_machine.cpu_family()
+build_cpu = build_machine.cpu_family()
+
+fs = import('fs')
+pkgconfig = import('pkgconfig')
+if host_system == 'win32'
+ windows = import('windows')
+endif
+
+thread_dep = dependency('threads')
+
+
+# It's very easy to get into confusing states when the source directory
+# contains an in-place build. E.g. the wrong pg_config.h will be used. So just
+# refuse to build in that case.
+#
+# There's a more elaborate check later, that checks for conflicts around all
+# generated files. But we can only do that much further down the line, so this
+# quick check seems worth it. Adhering to this advice should clean up the
+# conflict, but won't protect against somebody doing make distclean or just
+# removing pg_config.h
+errmsg_nonclean_base ='''
+****
+Non-clean source code directory detected.
+
+To build with meson the source tree may not have an in-place, ./configure
+style, build configured. You can have both meson and ./configure style builds
+for the same source tree by building out-of-source / VPATH with
+configure. Alternatively use a separate check out for meson based builds.
+
+@0@
+****'''
+if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h')
+ errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.'
+ error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+
+###############################################################
+# Version and other metadata
+###############################################################
+
+pg_version = meson.project_version()
+
+if pg_version.endswith('devel')
+ pg_version_arr = [pg_version.split('devel')[0], '0']
+elif pg_version.contains('beta')
+ pg_version_arr = [pg_version.split('beta')[0], '0']
+elif pg_version.contains('rc')
+ pg_version_arr = [pg_version.split('rc')[0], '0']
+else
+ pg_version_arr = pg_version.split('.')
+endif
+
+pg_version_major = pg_version_arr[0].to_int()
+pg_version_minor = pg_version_arr[1].to_int()
+pg_version_num = (pg_version_major*10000)+pg_version_minor
+
+cc = meson.get_compiler('c')
+
+cdata = configuration_data()
+
+pg_url = 'https://www.postgresql.org/'
+
+cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org')
+cdata.set_quoted('PACKAGE_URL', pg_url)
+cdata.set_quoted('PACKAGE_VERSION', pg_version)
+cdata.set_quoted('PACKAGE_STRING', 'PostgreSQL @0@'.format(pg_version))
+cdata.set_quoted('PACKAGE_TARNAME', 'postgresql')
+
+pg_version += get_option('extra_version')
+cdata.set_quoted('PG_VERSION', pg_version)
+cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format(
+ pg_version, build_cpu, cc.get_id(), cc.version()))
+cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
+cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
+cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
+cdata.set('PG_VERSION_NUM', pg_version_num)
+cdata.set_quoted('CONFIGURE_ARGS', '')
+
+
+
+###############################################################
+# Search paths
+#
+# NB: Arguments added globally (via the below, or CFLAGS etc) are not taken
+# into account for configuration-time checks (so they are more
+# isolated). Flags that have to be taken into account for configure checks
+# have to be explicitly specified in configure tests.
+###############################################################
+
+g_c_args = []
+g_c_inc = []
+g_l_args = []
+
+if host_system == 'darwin'
+ # XXX, should this be required?
+ xcrun = find_program('xcrun', native: true, required: true)
+
+ sysroot = run_command(xcrun, '--show-sdk-path', check: true).stdout().strip()
+ message('sysroot is >@0@<'.format(sysroot))
+
+ g_c_args += ['-isysroot', sysroot]
+ g_l_args += ['-isysroot', sysroot]
+endif
+
+if host_system == 'linux' or host_system == 'cygwin'
+ g_c_args += '-D_GNU_SOURCE'
+endif
+
+
+g_c_inc += include_directories(get_option('extra_include_dirs'))
+g_c_lib = get_option('extra_lib_dirs')
+
+functional_cflags = g_c_args
+functional_cxxflags = g_c_args
+warning_cflags = []
+warning_cxxflags = []
+
+ldflags = g_l_args
+
+postgres_inc_d = ['src/include']
+
+# Windows replacement headers - need them to be usable during the feature
+# tests below.
+if host_system == 'win32'
+ postgres_inc_d += 'src/include/port/win32'
+ if cc.get_id() == 'msvc'
+ postgres_inc_d += 'src/include/port/win32_msvc'
+ endif
+endif
+
+postgres_inc = include_directories(postgres_inc_d)
+g_c_inc += postgres_inc
+
+
+
+###############################################################
+# Program paths
+###############################################################
+
+# External programs
+perl = find_program(get_option('PERL'), required: true, native: true)
+python = find_program(get_option('PYTHON'), required: true, native: true)
+flex = find_program(get_option('FLEX'), native: true)
+bison = find_program(get_option('BISON'), native: true, version: '>= 1.875')
+sed = find_program(get_option('SED'), 'sed', native: true)
+prove = find_program(get_option('PROVE'), native: true)
+tar = find_program(get_option('TAR'), native: true)
+gzip = find_program(get_option('GZIP'), native: true)
+program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
+touch = find_program('touch', native: true)
+program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
+dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+missing = find_program('config/missing', native: true)
+
+# Internal programs
+testwrap = find_program('src/tools/testwrap', native: true)
+
+# used by PGXS
+install_sh = find_program('config/install-sh', native: true)
+
+bison_flags = []
+if bison.found()
+ bison_version_c = run_command(bison, '--version', check: true)
+ # bison version string helpfully is something like
+ # >>bison (GNU bison) 3.8.1<<
+ bison_version = bison_version_c.stdout().split(' ')[3].split('\n')[0]
+ if bison_version.version_compare('>=3.0')
+ bison_flags += ['-Wno-deprecated']
+ endif
+endif
+bison_cmd = [bison, bison_flags, '-o', '@OUTPUT0@']
+
+flex_flags = []
+flex_wrapper = files('src/tools/pgflex')
+flex_cmd = [python, flex_wrapper, '--builddir', meson.build_root(),
+ '--privatedir', '@PRIVATE_DIR@', '--flex', flex, '-o', '@OUTPUT0@']
+
+flex_backup = ['-b']
+flex_fix_warning_script = files('src/tools/fix-old-flex-code.pl')
+flex_fix_warning = ['--perl', perl, '--fix_warning_script', flex_fix_warning_script]
+
+wget = find_program('wget', required: false, native: true)
+wget_flags = ['-O', '@OUTPUT0@', '--no-use-server-timestamps']
+
+
+
+###############################################################
+# Path to meson (for tests etc)
+###############################################################
+
+# NB: this should really be part of meson, see
+# https://github.com/mesonbuild/meson/issues/8511
+meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
+
+if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+ error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
+ meson_binpath_r.returncode(),
+ meson_binpath_r.stdout(),
+ meson_binpath_r.stderr()))
+endif
+
+meson_binpath_s = meson_binpath_r.stdout().split('\n')
+meson_binpath_len = meson_binpath_s.length()
+
+if meson_binpath_len < 1
+ error('unexpected introspect line @0@'.format(meson_binpath_r.stdout()))
+endif
+
+i = 0
+meson_impl = ''
+meson_binpath = ''
+meson_args = []
+foreach e : meson_binpath_s
+ if i == 0
+ meson_impl = e
+ elif i == 1
+ meson_binpath = e
+ else
+ meson_args += e
+ endif
+ i += 1
+endforeach
+
+if meson_impl not in ['muon', 'meson']
+ error('unknown meson implementation "@0@"'.format(meson_impl))
+endif
+
+meson_bin = find_program(meson_binpath, native: true)
+
+
+
+###############################################################
+# Option Handling
+###############################################################
+
+cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false)
+
+cdata.set('BLCKSZ', 8192, description:
+'''Size of a disk block --- this also limits the size of a tuple. You can set
+ it bigger if you need bigger tuples (although TOAST should reduce the need
+ to have large tuples, since fields can be spread across multiple tuples).
+ BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is
+ currently 2^15 (32768). This is determined by the 15-bit widths of the
+ lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).
+ Changing BLCKSZ requires an initdb.''')
+
+cdata.set('XLOG_BLCKSZ', get_option('wal-blocksize') * 1024)
+cdata.set('RELSEG_SIZE', get_option('segsize') * 131072)
+cdata.set('DEF_PGPORT', get_option('pgport'))
+cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport'))
+cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb-srvnam'))
+if get_option('system-tzdata') != ''
+ cdata.set_quoted('SYSTEMTZDIR', get_option('system-tzdata'))
+endif
+
+
+
+###############################################################
+# Directories
+###############################################################
+
+# These are set by the equivalent --xxxdir configure options. We
+# append "postgresql" to some of them, if the string does not already
+# contain "pgsql" or "postgres", in order to avoid directory clutter.
+
+pkg = 'postgresql'
+
+dir_prefix = get_option('prefix')
+
+dir_bin = get_option('bindir')
+
+dir_data = get_option('datadir')
+if not (dir_data.contains('pgsql') or dir_data.contains('postgres'))
+ dir_data = dir_data / pkg
+endif
+
+dir_sysconf = get_option('sysconfdir')
+if not (dir_sysconf.contains('pgsql') or dir_sysconf.contains('postgres'))
+ dir_sysconf = dir_sysconf / pkg
+endif
+
+dir_lib = get_option('libdir')
+
+dir_lib_pkg = dir_lib
+if not (dir_lib_pkg.contains('pgsql') or dir_lib_pkg.contains('postgres'))
+ dir_lib_pkg = dir_lib_pkg / pkg
+endif
+
+dir_pgxs = dir_lib_pkg / 'pgxs'
+
+dir_include = get_option('includedir')
+
+dir_include_pkg = dir_include
+dir_include_pkg_rel = ''
+if not (dir_include_pkg.contains('pgsql') or dir_include_pkg.contains('postgres'))
+ dir_include_pkg = dir_include_pkg / pkg
+ dir_include_pkg_rel = pkg
+endif
+
+dir_man = get_option('mandir')
+
+# FIXME: These used to be separately configurable - worth adding?
+dir_doc = get_option('datadir') / 'doc' / 'postgresql'
+dir_doc_html = dir_doc
+
+dir_locale = get_option('localedir')
+
+
+# Derived values
+dir_bitcode = dir_lib_pkg / 'bitcode'
+dir_include_internal = dir_include_pkg / 'internal'
+dir_include_server = dir_include_pkg / 'server'
+dir_include_extension = dir_include_server / 'extension'
+dir_data_extension = dir_data / 'extension'
+
+
+
+###############################################################
+# Library: bsd-auth
+###############################################################
+
+bsd_authopt = get_option('bsd-auth')
+bsd_auth = dependency('', required: false)
+if cc.check_header('bsd_auth.h', args: g_c_args, required: bsd_authopt)
+ cdata.set('USE_BSD_AUTH', 1)
+ bsd_auth = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: bonjour
+#
+# For now don't search for DNSServiceRegister in a library - only Apple's
+# Bonjour implementation, which is always linked, works.
+###############################################################
+
+bonjouropt = get_option('bonjour')
+bonjour = dependency('', required : false)
+if cc.check_header('dns_sd.h', args: g_c_args, required: bonjouropt) \
+ and cc.has_function('DNSServiceRegister', args: g_c_args)
+ cdata.set('USE_BONJOUR', 1)
+ bonjour = declare_dependency()
+endif
+
+
+
+###############################################################
+# Library: GSSAPI
+###############################################################
+
+gssapiopt = get_option('gssapi')
+krb_srvtab = ''
+have_gssapi = false
+if not gssapiopt.disabled()
+ gssapi = dependency('krb5-gssapi', required: gssapiopt)
+ have_gssapi = gssapi.found()
+
+ if not have_gssapi
+ elif cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: false)
+ cdata.set('HAVE_GSSAPI_GSSAPI_H', 1)
+ elif cc.check_header('gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt)
+ cdata.set('HAVE_GSSAPI_H', 1)
+ else
+ have_gssapi = false
+ endif
+
+ if not have_gssapi
+ elif cc.has_function('gss_init_sec_context',
+ include_directories: g_c_inc, args: g_c_args, dependencies: gssapi)
+ cdata.set('ENABLE_GSS', 1)
+
+ krb_srvtab = 'FILE:/@0@/krb5.keytab)'.format(get_option('sysconfdir'))
+ cdata.set_quoted('PG_KRB_SRVTAB', krb_srvtab)
+ elif gssapiopt.enabled()
+ error('''could not find function 'gss_init_sec_context' required for GSSAPI''')
+ else
+ have_gssapi = false
+ endif
+endif
+if not have_gssapi
+ gssapi = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: ldap
+###############################################################
+
+ldapopt = get_option('ldap')
+if not ldapopt.disabled()
+
+ if host_system == 'win32'
+ ldap = cc.find_library('wldap32')
+ ldap_r = ldap
+ else
+ # macos framework dependency is buggy for ldap (one can argue
+ # whether it's Apple's or meson's fault), leading to an endless
+ # recursion with ldap.h including itself. See
+ # https://github.com/mesonbuild/meson/issues/10002
+ # Luckily we only need pkg-config support, so the workaround isn't
+ # too complicated
+ ldap = dependency('ldap', method: 'pkg-config', required: false)
+
+ # Before 2.5 openldap didn't have a pkg-config file..
+ if ldap.found()
+ ldap_r = ldap
+ else
+ ldap = cc.find_library('ldap', required: ldapopt, dirs: g_c_lib)
+ ldap_r = cc.find_library('ldap_r', required: ldapopt, dirs: g_c_lib)
+
+ # Use ldap_r for FE if available, else assume ldap is thread-safe.
+ # On some platforms ldap_r fails to link without PTHREAD_LIBS.
+ if ldap.found() and not ldap_r.found()
+ ldap_r = ldap
+ endif
+ endif
+
+ if ldap.found() and cc.has_function('ldap_initialize', args: g_c_args, dependencies: [ldap, thread_dep])
+ cdata.set('HAVE_LDAP_INITIALIZE', 1)
+ endif
+
+ # If found via cc.find_library() ensure headers are found when using the
+ # dependency. On meson < 0.57 one cannot do compiler checks using the
+ # dependency returned by declare_dependency(), so we can't do this above.
+ if ldap.found() and ldap.type_name() == 'library'
+ # declare dependency so that the additional include dir it might reside in
+ # is added automatically where necessary
+ ldap = declare_dependency(dependencies: ldap,
+ include_directories: g_c_inc)
+ ldap_r = declare_dependency(dependencies: ldap_r,
+ include_directories: g_c_inc)
+ endif
+ endif
+
+ # FIXME: port autoconf openldap 2.5+ changes, as well as PGAC_LDAP_SAFE
+
+ if ldap.found()
+ cdata.set('USE_LDAP', 1)
+ endif
+
+else
+ ldap = dependency('', required : false)
+ ldap_r = ldap
+endif
+
+
+
+###############################################################
+# Library: LLVM
+###############################################################
+
+llvmopt = get_option('llvm')
+if not llvmopt.disabled()
+ add_languages('cpp', required : true, native: false)
+ llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt)
+
+ if llvm.found()
+
+ cdata.set('USE_LLVM', 1)
+
+ cpp = meson.get_compiler('cpp')
+
+ llvm_binpath = llvm.get_variable(configtool: 'bindir')
+
+ ccache = find_program('ccache', native: true, required: false)
+ clang = find_program(llvm_binpath / 'clang', required: true)
+ llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+
+ # FIXME: the includes hardcoded here suck
+ llvm_irgen_args = [
+ '-c', '-o', '@OUTPUT@', '@INPUT@',
+ '-flto=thin', '-emit-llvm',
+ '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+ '-I@SOURCE_ROOT@/src/include',
+ '-I@BUILD_ROOT@/src/include',
+ '-I@BUILD_ROOT@/src/backend/utils/misc',
+ '-I@CURRENT_SOURCE_DIR@',
+ '-O2',
+ '-Wno-ignored-attributes',
+ '-Wno-empty-body',
+ g_c_args
+ ]
+
+ if ccache.found()
+ llvm_irgen_command = ccache
+ llvm_irgen_args = [clang.path()] + llvm_irgen_args
+ else
+ llvm_irgen_command = clang
+ endif
+
+ llvm_irgen_kw = {
+ 'command': [llvm_irgen_command] + llvm_irgen_args,
+ 'depfile': '@BASENAME@.c.bc.d',
+ }
+
+ irlink = find_program('src/tools/irlink', native: true)
+
+ llvm_irlink_kw = {
+ 'command':[
+ irlink,
+ '--name', 'postgres',
+ '--lto', llvm_lto,
+ '--outdir', '@OUTPUT0@',
+ '--privdir', '@PRIVATE_DIR@',
+ '@INPUT@',
+ ],
+ 'install': true,
+ 'install_dir': dir_lib_pkg,
+ }
+
+ endif
+else
+ llvm = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: icu
+###############################################################
+
+if not get_option('icu').disabled()
+ icu = dependency('icu-uc', required: get_option('icu').enabled())
+ icu_i18n = dependency('icu-i18n', required: get_option('icu').enabled())
+
+ if icu.found()
+ cdata.set('USE_ICU', 1)
+ endif
+
+else
+ icu = dependency('', required : false)
+ icu_i18n = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxml
+###############################################################
+
+libxmlopt = get_option('libxml')
+if not libxmlopt.disabled()
+ libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23')
+
+ if libxml.found()
+ cdata.set('USE_LIBXML', 1)
+ endif
+else
+ libxml = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: libxslt
+###############################################################
+
+libxsltopt = get_option('libxslt')
+if not libxsltopt.disabled()
+ libxslt = dependency('libxslt', required: libxsltopt)
+
+ if libxslt.found()
+ cdata.set('USE_LIBXSLT', 1)
+ endif
+else
+ libxslt = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: lz4
+###############################################################
+
+lz4opt = get_option('lz4')
+if not lz4opt.disabled()
+ lz4 = dependency('liblz4', required: lz4opt)
+
+ if lz4.found()
+ cdata.set('USE_LZ4', 1)
+ cdata.set('HAVE_LIBLZ4', 1)
+ endif
+
+else
+ lz4 = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Tcl (for pltcl)
+# tclConfig.sh
+#
+# NB: tclConfig.sh is used in autoconf build for getting
+# TCL_SHARED_BUILD, TCL_INCLUDE_SPEC, TCL_LIBS and TCL_LIB_SPEC
+# variables. For now we have not seen a need to copy
+# that behaviour to the meson build.
+###############################################################
+
+tcl_dep = dependency('', required : false)
+tclopt = get_option('pltcl')
+tcl_version = get_option('tcl_version')
+if not tclopt.disabled()
+
+ # via pkg-config
+ tcl_dep = dependency(tcl_version, required: false)
+
+ if not tcl_dep.found()
+ tcl_dep = cc.find_library(tcl_version,
+ required: tclopt,
+ dirs: g_c_lib)
+ endif
+
+ if not cc.has_header('tcl.h', dependencies: tcl_dep, required: tclopt)
+ tcl_dep = dependency('', required: false)
+ endif
+endif
+
+
+
+###############################################################
+# Library: pam
+###############################################################
+
+pamopt = get_option('pam')
+if not pamopt.disabled()
+ pam = dependency('pam', required: false)
+
+ if not pam.found()
+ pam = cc.find_library('pam', required: pamopt, dirs: g_c_lib)
+ endif
+
+ if pam.found()
+ pam_header_found = false
+
+ # header file <security/pam_appl.h> or <pam/pam_appl.h> is required for PAM.
+ if cc.check_header('security/pam_appl.h', args: g_c_args, dependencies: pam, required: false)
+ cdata.set('HAVE_SECURITY_PAM_APPL_H', 1)
+ pam_header_found = true
+ elif cc.check_header('pam/pam_appl.h', args: g_c_args, dependencies: pam, required: pamopt)
+ cdata.set('HAVE_PAM_PAM_APPL_H', 1)
+ pam_header_found = true
+ endif
+
+ if pam_header_found
+ cdata.set('USE_PAM', 1)
+ else
+ pam = dependency('', required : false)
+ endif
+ endif
+else
+ pam = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: Perl (for plperl)
+###############################################################
+
+perlopt = get_option('plperl')
+perl_dep = dependency('', required: false)
+
+if perlopt.disabled()
+ perl_may_work = false
+else
+ perl_may_work = true
+
+ # First verify that perl has the necessary dependencies installed
+ perl_mods = run_command(
+ [perl,
+ '-MConfig', '-MOpcode', '-MExtUtils::Embed', '-MExtUtils::ParseXS',
+ '-e', ''],
+ check: false)
+ if perl_mods.returncode() != 0
+ perl_may_work = false
+ perl_msg = 'perl installation does not have the required modules'
+ endif
+
+ # Then inquire perl about its configuration
+ if perl_may_work
+ # FIXME: include copy-edited comments from perl.m4
+ perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}']
+ perlversion = run_command(perl_conf_cmd, 'api_versionstring', check: true).stdout()
+ archlibexp = run_command(perl_conf_cmd, 'archlibexp', check: true).stdout()
+ privlibexp = run_command(perl_conf_cmd, 'privlibexp', check: true).stdout()
+ useshrplib = run_command(perl_conf_cmd, 'useshrplib', check: true).stdout()
+ libperl = run_command(perl_conf_cmd, 'libperl', check: true).stdout()
+
+ perl_inc_dir = '@0@/CORE'.format(archlibexp)
+
+ if useshrplib != 'true'
+ perl_may_work = false
+ perl_msg = 'need a shared perl'
+ endif
+ endif
+
+ # XXX: should we only add directories that exist? Seems a bit annoying with
+ # macos' sysroot stuff...
+ #
+ # NB: For unknown reasons msys' python doesn't see these paths, despite gcc
+ # et al seeing them. So we can't use include_directories(), as that checks
+ # file existence.
+ if perl_may_work
+ # On most platforms, archlibexp is also where the Perl include files live ...
+ perl_ccflags = ['-I@0@'.format(perl_inc_dir)]
+ # ... but on newer macOS versions, we must use -iwithsysroot to look
+ # under sysroot
+ if not fs.is_file('@0@/perl.h'.format(perl_inc_dir)) and \
+ fs.is_file('@0@@1@/perl.h'.format(sysroot, perl_inc_dir))
+ perl_ccflags = ['-iwithsysroot', perl_inc_dir]
+ endif
+ endif
+
+ # check required headers are present
+ if perl_may_work and not \
+ cc.has_header('perl.h', args: g_c_args + perl_ccflags, required: false)
+ perl_may_work = false
+ perl_msg = 'missing perl.h'
+ endif
+
+ # Find perl library. This is made more complicated by the fact that the name
+ # Config.pm returns isn't directly usable (sometimes lib needs to be chopped
+ # off)
+ if perl_may_work
+ foreach p : ['perl', 'libperl', libperl, libperl.strip('lib'), fs.stem(libperl), fs.stem(libperl).strip('lib')]
+ perl_dep_int = cc.find_library(p,
+ dirs: ['@0@/CORE'.format(archlibexp)],
+ required: false)
+ if perl_dep_int.found()
+ break
+ endif
+ endforeach
+
+ if not perl_dep_int.found()
+ perl_may_work = false
+ perl_msg = 'missing libperl'
+ endif
+ endif
+
+ if perl_may_work
+ perl_ccflags_r = run_command(perl_conf_cmd, 'ccflags', check: true).stdout()
+ message('CCFLAGS recommended by Perl: @0@'.format(perl_ccflags_r))
+
+ foreach flag : perl_ccflags_r.split(' ')
+ if flag.startswith('-D') and \
+ (not flag.startswith('-D_') or flag == '_USE_32BIT_TIME_T')
+ perl_ccflags += flag
+ endif
+ endforeach
+
+ if host_system == 'win32'
+ perl_ccflags += ['-DPLPERL_HAVE_UID_GID']
+ endif
+
+ message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags)))
+
+ ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip()
+
+ perl_ldopts = []
+ foreach ldopt : ldopts.split(' ')
+ if ldopt == ''
+ continue
+ # strawberry perl unhelpfully has that in ldopts
+ elif ldopt == '-s'
+ continue
+ # AIX perl has export file in ldopts
+ elif ldopt.startswith('-bE')
+ continue
+ endif
+
+ perl_ldopts += ldopt.strip('"')
+ endforeach
+
+ # FIXME: check if windows handling is necessary
+
+ message('LDFLAGS for embedding perl: "@0@" (ldopts: "@1@")'.format(
+ ' '.join(perl_ldopts), ldopts))
+
+ if perl_dep_int.found()
+ perl_dep = declare_dependency(
+ compile_args: perl_ccflags,
+ link_args: perl_ldopts,
+ version: perlversion,
+ )
+ endif
+ endif # perl_may_work
+
+ if not perl_may_work
+ if perlopt.enabled()
+ error('dependency perl failed: @0@'.format(perl_msg))
+ else
+ message('disabling optional dependency perl: @0@'.format(perl_msg))
+ endif
+ endif
+endif
+
+
+
+###############################################################
+# Library: Python (for plpython)
+###############################################################
+
+pyopt = get_option('plpython')
+if not pyopt.disabled()
+ pm = import('python')
+ python3_inst = pm.find_installation(required: pyopt.enabled())
+ python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
+ if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
+ python3_dep = dependency('', required: false)
+ endif
+else
+ python3_dep = dependency('', required: false)
+endif
+
+
+
+###############################################################
+# Library: Readline
+###############################################################
+
+if not get_option('readline').disabled()
+ libedit_preferred = get_option('libedit_preferred')
+ # Set the order of readline dependencies
+ check_readline_deps = libedit_preferred ? \
+ ['libedit', 'readline'] : ['readline', 'libedit']
+
+ foreach readline_dep : check_readline_deps
+ readline = dependency(readline_dep, required: false)
+ if not readline.found()
+ readline = cc.find_library(readline_dep,
+ required: get_option('readline').enabled(),
+ dirs: g_c_lib)
+ endif
+ if readline.found()
+ break
+ endif
+ endforeach
+
+ if readline.found()
+ cdata.set('HAVE_LIBREADLINE', 1)
+
+ editline_prefix = {
+ 'header_prefix': 'editline/',
+ 'flag_prefix': 'EDITLINE_',
+ }
+ readline_prefix = {
+ 'header_prefix': 'readline/',
+ 'flag_prefix': 'READLINE_',
+ }
+ default_prefix = {
+ 'header_prefix': '',
+ 'flag_prefix': '',
+ }
+
+ # Set the order of prefixes
+ prefixes = libedit_preferred ? \
+ [editline_prefix, default_prefix, readline_prefix] : \
+ [readline_prefix, default_prefix, editline_prefix]
+
+ at_least_one_header_found = false
+ foreach header: ['history', 'readline']
+ is_found = false
+ foreach prefix : prefixes
+ header_file = '@0@@1@.h'.format(prefix['header_prefix'], header)
+ # Check history.h and readline.h
+ if not is_found and cc.has_header(header_file,
+ args: g_c_args, include_directories: g_c_inc,
+ dependencies: [readline], required: false)
+ if header == 'history'
+ history_h = header_file
+ else
+ readline_h = header_file
+ endif
+ cdata.set('HAVE_@0@@1@_H'.format(prefix['flag_prefix'], header).to_upper(), 1)
+ is_found = true
+ at_least_one_header_found = true
+ endif
+ endforeach
+ endforeach
+
+ if not at_least_one_header_found
+ error('''readline header not found
+If you have @0@ already installed, see see meson-log/meson-log.txt for details on the
+failure. It is possible the compiler isn't looking in the proper directory.
+Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+ endif
+
+ check_funcs = [
+ 'append_history',
+ 'history_truncate_file',
+ 'rl_completion_matches',
+ 'rl_filename_completion_function',
+ 'rl_reset_screen_size',
+ 'rl_variable_bind',
+ ]
+
+ foreach func : check_funcs
+ cdata.set('HAVE_'+func.to_upper(),
+ cc.has_function(func, args: g_c_args, dependencies: [readline]) ? 1 : false)
+ endforeach
+
+ check_vars = [
+ 'rl_completion_suppress_quote',
+ 'rl_filename_quote_characters',
+ 'rl_filename_quoting_function',
+ ]
+
+ foreach var : check_vars
+ cdata.set('HAVE_'+var.to_upper(),
+ cc.has_header_symbol(readline_h, var,
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '#include <stdio.h>',
+ dependencies: [readline]) ? 1 : false)
+ endforeach
+
+ # If found via cc.find_library() ensure headers are found when using the
+ # dependency. On meson < 0.57 one cannot do compiler checks using the
+ # dependency returned by declare_dependency(), so we can't do this above.
+ if readline.type_name() == 'library'
+ readline = declare_dependency(dependencies: readline,
+ include_directories: g_c_inc)
+ endif
+ endif
+
+ # XXX: Figure out whether to implement mingw warning equivalent
+else
+ readline = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: selinux
+###############################################################
+
+selinux = dependency('', required : false)
+selinuxopt = get_option('selinux')
+if meson.version().version_compare('>=0.59')
+ selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+endif
+selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
+cdata.set('HAVE_LIBSELINUX',
+ selinux.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: systemd
+###############################################################
+
+systemd = dependency('', required : false)
+systemdopt = get_option('systemd')
+if meson.version().version_compare('>=0.59')
+ systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+endif
+systemd = dependency('libsystemd', required: systemdopt)
+cdata.set('USE_SYSTEMD',
+ systemd.found() ? 1 : false)
+
+
+
+###############################################################
+# Library: SSL
+###############################################################
+
+if get_option('ssl') == 'openssl'
+
+ # Try to find openssl via pkg-config et al, if that doesn't work
+ # (e.g. because it's provided as part of the OS, like on FreeBSD), look for
+ # the library names that we know about.
+
+ # via pkg-config et al
+ ssl = dependency('openssl', required: false)
+
+ # via library + headers
+ if not ssl.found()
+ ssl_lib = cc.find_library('ssl',
+ dirs: g_c_lib,
+ header_include_directories: g_c_inc,
+ has_headers: ['openssl/ssl.h', 'openssl/err.h'])
+ crypto_lib = cc.find_library('crypto',
+ dirs: g_c_lib,
+ header_include_directories: g_c_inc)
+ ssl_int = [ssl_lib, crypto_lib]
+
+ ssl = declare_dependency(dependencies: ssl_int,
+ include_directories: g_c_inc)
+ else
+ cc.has_header('openssl/ssl.h', args: g_c_args, dependencies: ssl, required: true)
+ cc.has_header('openssl/err.h', args: g_c_args, dependencies: ssl, required: true)
+
+ ssl_int = [ssl]
+ endif
+
+ check_funcs = [
+ ['CRYPTO_new_ex_data', {'required': true}],
+ ['SSL_new', {'required': true}],
+
+ # Function introduced in OpenSSL 1.0.2.
+ ['X509_get_signature_nid'],
+
+ # Functions introduced in OpenSSL 1.1.0. We used to check for
+ # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL
+ # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it
+ # doesn't have these OpenSSL 1.1.0 functions. So check for individual
+ # functions.
+ ['OPENSSL_init_ssl'],
+ ['BIO_get_data'],
+ ['BIO_meth_new'],
+ ['ASN1_STRING_get0_data'],
+ ['HMAC_CTX_new'],
+ ['HMAC_CTX_free'],
+
+ # OpenSSL versions before 1.1.0 required setting callback functions, for
+ # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock()
+ # function was removed.
+ ['CRYPTO_lock'],
+ ]
+
+ foreach c : check_funcs
+ func = c.get(0)
+ val = cc.has_function(func, args: g_c_args, dependencies: ssl_int)
+ required = c.get(1, {}).get('required', false)
+ if required and not val
+ error('openssl function @0@ is required'.format(func))
+ elif not required
+ cdata.set('HAVE_'+func.to_upper(), val ? 1 : false)
+ endif
+ endforeach
+
+ cdata.set('USE_OPENSSL', 1,
+ description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
+
+ cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
+ description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings
+ from newer OpenSSL versions.''')
+else
+ ssl = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: uuid
+###############################################################
+
+uuidopt = get_option('uuid')
+if uuidopt != 'none'
+ uuidname = uuidopt.to_upper()
+ if uuidopt == 'e2fs'
+ uuid = dependency('uuid', required: true)
+ uuidfunc = 'uuid_generate'
+ uuidheader = 'uuid/uuid.h'
+ elif uuidopt == 'bsd'
+ # libc should have uuid function
+ uuid = declare_dependency()
+ uuidfunc = 'uuid_to_string'
+ uuidheader = 'uuid.h'
+ elif uuidopt == 'ossp'
+ uuid = dependency('ossp-uuid', required: true)
+ uuidfunc = 'uuid_export'
+ uuidheader = 'ossp/uuid.h'
+ else
+ error('huh')
+ endif
+
+ if not cc.has_header_symbol(uuidheader, uuidfunc, args: g_c_args, dependencies: uuid)
+ error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc))
+ endif
+ cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1)
+
+ cdata.set('HAVE_UUID_@0@'.format(uuidname), 1,
+ description: 'Define to 1 if you have @0@ UUID support.'.format(uuidname))
+else
+ uuid = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Library: zlib
+###############################################################
+
+zlibopt = get_option('zlib')
+zlib = dependency('', required : false)
+if not zlibopt.disabled()
+ zlib_t = dependency('zlib', required: zlibopt)
+
+ if zlib_t.type_name() == 'internal'
+ # if fallback was used, we don't need to test if headers are present (they
+ # aren't built yet, so we can't test)
+ zlib = zlib_t
+ elif not zlib_t.found()
+ warning('did not find zlib')
+ elif not cc.has_header('zlib.h',
+ args: g_c_args, include_directories: g_c_inc,
+ dependencies: [zlib_t], required: zlibopt.enabled())
+ warning('zlib header not found')
+ elif not cc.has_type('z_streamp', args: g_c_args, dependencies: [zlib_t], prefix: '#include <zlib.h>')
+ if zlibopt.enabled()
+ error('zlib version is too old')
+ else
+ warning('zlib version is too old')
+ endif
+ else
+ zlib = zlib_t
+ endif
+
+ if zlib.found()
+ cdata.set('HAVE_LIBZ', 1)
+ endif
+endif
+
+
+
+###############################################################
+# Library: zstd
+###############################################################
+
+zstdopt = get_option('zstd')
+if not zstdopt.disabled()
+ zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0')
+
+ if zstd.found()
+ cdata.set('USE_ZSTD', 1)
+ cdata.set('HAVE_LIBZSTD', 1)
+ endif
+
+else
+ zstd = dependency('', required : false)
+endif
+
+
+
+###############################################################
+# Compiler tests
+###############################################################
+
+# Do we need -std=c99 to compile C99 code?
+c99_test = '''
+#include <stdbool.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <inttypes.h>
+
+struct named_init_test {
+ int a;
+ int b;
+};
+
+extern void structfunc(struct named_init_test);
+
+int main(int argc, char **argv)
+{
+ struct named_init_test nit = {
+ .a = 3,
+ .b = 5,
+ };
+
+ for (int loop_var = 0; loop_var < 3; loop_var++)
+ {
+ nit.a += nit.b;
+ }
+
+ structfunc((struct named_init_test){1, 0});
+
+ return nit.a != 0;
+}
+'''
+
+if not cc.compiles(c99_test, name: 'c99', args: g_c_args)
+ if cc.compiles(c99_test, name: 'c99 with -std=c99', args: g_c_args + ['-std=c99'])
+ g_c_args += '-std=c99'
+ functional_cflags += '-std=c99'
+ else
+ error('C compiler does not support C99')
+ endif
+endif
+
+sizeof_long = cc.sizeof('long', args: g_c_args)
+cdata.set('SIZEOF_LONG', sizeof_long)
+if sizeof_long == 8
+ cdata.set('HAVE_LONG_INT_64', 1)
+ cdata.set('PG_INT64_TYPE', 'long int')
+ cdata.set_quoted('INT64_MODIFIER', 'l')
+elif sizeof_long == 4 and cc.sizeof('long long', args: g_c_args) == 8
+ cdata.set('HAVE_LONG_LONG_INT_64', 1)
+ cdata.set('PG_INT64_TYPE', 'long long int')
+ cdata.set_quoted('INT64_MODIFIER', 'll')
+else
+ error('do not know how to get a 64bit int')
+endif
+
+if host_machine.endian() == 'big'
+ cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+alignof_types = ['short', 'int', 'long', 'double']
+maxalign = 0
+foreach t: alignof_types
+ align = cc.alignment(t, args: g_c_args)
+ if maxalign < align
+ maxalign = align
+ endif
+ cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align)
+endforeach
+cdata.set('MAXIMUM_ALIGNOF', maxalign)
+
+cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args))
+cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: g_c_args))
+
+
+# Check if __int128 is a working 128 bit integer type, and if so
+# define PG_INT128_TYPE to that typename.
+#
+# This currently only detects a GCC/clang extension, but support for other
+# environments may be added in the future.
+#
+# For the moment we only test for support for 128bit math; support for
+# 128bit literals and snprintf is not required.
+if cc.links('''
+ /*
+ * We don't actually run this test, just link it to verify that any support
+ * functions needed for __int128 are present.
+ *
+ * These are globals to discourage the compiler from folding all the
+ * arithmetic tests down to compile-time constants. We do not have
+ * convenient support for 128bit literals at this point...
+ */
+ __int128 a = 48828125;
+ __int128 b = 97656250;
+
+ int main(void)
+ {
+ __int128 c,d;
+ a = (a << 12) + 1; /* 200000000001 */
+ b = (b << 12) + 5; /* 400000000005 */
+ /* try the most relevant arithmetic ops */
+ c = a * b;
+ d = (c + b) / b;
+ /* must use the results, else compiler may optimize arithmetic away */
+ return d != a+1;
+ }''',
+ name: '__int128',
+ args: g_c_args)
+
+ buggy_int128 = false
+
+ # Use of non-default alignment with __int128 tickles bugs in some compilers.
+ # If not cross-compiling, we can test for bugs and disable use of __int128
+ # with buggy compilers. If cross-compiling, hope for the best.
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83925
+ if not meson.is_cross_build()
+ r = cc.run('''
+ /* This must match the corresponding code in c.h: */
+ #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+ #define pg_attribute_aligned(a) __attribute__((aligned(a)))
+ #endif
+ typedef __int128 int128a
+ #if defined(pg_attribute_aligned)
+ pg_attribute_aligned(8)
+ #endif
+ ;
+
+ int128a holder;
+ void pass_by_val(void *buffer, int128a par) { holder = par; }
+
+ int main(void)
+ {
+ long int i64 = 97656225L << 12;
+ int128a q;
+ pass_by_val(main, (int128a) i64);
+ q = (int128a) i64;
+ return q != holder;
+ }''',
+ name: '__int128 alignment bug',
+ args: g_c_args)
+ assert(r.compiled())
+ if r.returncode() != 0
+ buggy_int128 = true
+ endif
+ endif
+
+ if not buggy_int128
+ cdata.set('PG_INT128_TYPE', '__int128')
+ cdata.set('ALIGNOF_PG_INT128_TYPE', cc.alignment('__int128', args: g_c_args))
+ endif
+endif
+
+
+# Check if the C compiler knows computed gotos (gcc extension, also
+# available in at least clang). If so, define HAVE_COMPUTED_GOTO.
+#
+# Checking whether computed gotos are supported syntax-wise ought to
+# be enough, as the syntax is otherwise illegal.
+if cc.compiles('''
+ static inline int foo(void)
+ {
+ void *labeladdrs[] = {&&my_label};
+ goto *labeladdrs[0];
+ my_label:
+ return 1;
+ }''',
+ args: g_c_args)
+ cdata.set('HAVE_COMPUTED_GOTO', 1)
+endif
+
+
+# Check if the C compiler understands _Static_assert(),
+# and define HAVE__STATIC_ASSERT if so.
+#
+# We actually check the syntax ({ _Static_assert(...) }), because we need
+# gcc-style compound expressions to be able to wrap the thing into macros.
+if cc.compiles('''
+ int main(int arg, char **argv)
+ {
+ ({ _Static_assert(1, "foo"); });
+ }
+ ''',
+ args: g_c_args)
+ cdata.set('HAVE__STATIC_ASSERT', 1)
+endif
+
+# We use <stdbool.h> if we have it and it declares type bool as having
+# size 1. Otherwise, c.h will fall back to declaring bool as unsigned char.
+if cc.has_type('_Bool', args: g_c_args) \
+ and cc.has_type('bool', prefix: '#include <stdbool.h>', args: g_c_args) \
+ and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: g_c_args) == 1
+ cdata.set('HAVE__BOOL', 1)
+ cdata.set('PG_USE_STDBOOL', 1)
+endif
+
+
+# Need to check a call with %m because netbsd supports gnu_printf but emits a
+# warning for each use of %m.
+printf_attributes = ['gnu_printf', '__syslog__', 'printf']
+testsrc = '''
+extern void emit_log(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));
+static void call_log(void)
+{
+ emit_log(0, "error: %s: %m", "foo");
+}
+'''
+attrib_error_args = cc.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
+foreach a : printf_attributes
+ if cc.compiles(testsrc.format(a), args: g_c_args + attrib_error_args, name: 'format ' + a)
+ cdata.set('PG_PRINTF_ATTRIBUTE', a)
+ break
+ endif
+endforeach
+
+if cc.has_function_attribute('visibility:default') and \
+ cc.has_function_attribute('visibility:hidden')
+ cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
+endif
+
+# Check if various builtins exist. Some builtins are tested separately,
+# because we want to test something more complicated than the generic case.
+builtins = [
+ 'bswap16',
+ 'bswap32',
+ 'bswap64',
+ 'clz',
+ 'ctz',
+ 'constant_p',
+ 'frame_address',
+ 'popcount',
+ 'unreachable',
+]
+
+foreach builtin : builtins
+ fname = '__builtin_@0@'.format(builtin)
+ if cc.has_function(fname, args: g_c_args)
+ cdata.set('HAVE@0@'.format(fname.to_upper()), 1)
+ endif
+endforeach
+
+# Check if the C compiler understands __builtin_types_compatible_p,
+# and define HAVE__BUILTIN_TYPES_COMPATIBLE_P if so.
+#
+# We check usage with __typeof__, though it's unlikely any compiler would
+# have the former and not the latter.
+if cc.compiles('''
+ static int x;
+ static int y[__builtin_types_compatible_p(__typeof__(x), int)];
+ ''',
+ name: '__builtin_types_compatible_p',
+ args: g_c_args)
+ cdata.set('HAVE__BUILTIN_TYPES_COMPATIBLE_P', 1)
+endif
+
+# Check if the C compiler understands __builtin_$op_overflow(),
+# and define HAVE__BUILTIN_OP_OVERFLOW if so.
+#
+# Check for the most complicated case, 64 bit multiplication, as a
+# proxy for all of the operations. To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
+if cc.links('''
+ INT64 a = 1;
+ INT64 b = 1;
+ INT64 result;
+
+ int main(void)
+ {
+ return __builtin_mul_overflow(a, b, &result);
+ }''',
+ name: '__builtin_mul_overflow',
+ args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))],
+ )
+ cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1)
+endif
+
+# XXX: The configure.ac check for __cpuid() is broken, we don't copy that
+# here. To prevent problems due to two detection methods working, stop
+# checking after one.
+if cc.links('''
+ #include <cpuid.h>
+ int main(int arg, char **argv)
+ {
+ unsigned int exx[4] = {0, 0, 0, 0};
+ __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
+ }
+ ''', name: '__get_cpuid',
+ args: g_c_args)
+ cdata.set('HAVE__GET_CPUID', 1)
+elif cc.links('''
+ #include <intrin.h>
+ int main(int arg, char **argv)
+ {
+ unsigned int exx[4] = {0, 0, 0, 0};
+ __cpuid(exx, 1);
+ }
+ ''', name: '__cpuid',
+ args: g_c_args)
+ cdata.set('HAVE__CPUID', 1)
+endif
+
+
+
+###############################################################
+# Compiler flags
+###############################################################
+
+common_functional_flags = [
+ # Disable strict-aliasing rules; needed for gcc 3.3+
+ '-fno-strict-aliasing',
+ # Disable optimizations that assume no overflow; needed for gcc 4.3+
+ '-fwrapv',
+ '-fexcess-precision=standard'
+]
+
+functional_cflags += cc.get_supported_arguments(common_functional_flags)
+if llvm.found()
+ functional_cxxflags += cpp.get_supported_arguments(common_functional_flags)
+endif
+
+vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize'])
+unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops'])
+
+common_warning_flags = [
+ '-Wmissing-prototypes',
+ '-Wpointer-arith',
+ # Really don't want VLAs to be used in our dialect of C
+ '-Werror=vla',
+ # On macOS, complain about usage of symbols newer than the deployment target
+ '-Werror=unguarded-availability-new',
+ '-Wendif-labels',
+ '-Wmissing-format-attribute',
+ '-Wimplicit-fallthrough=3',
+ '-Wcast-function-type',
+ # This was included in -Wall/-Wformat in older GCC versions
+ '-Wformat-security',
+]
+
+warning_cflags += cc.get_supported_arguments(common_warning_flags)
+if llvm.found()
+ warning_cxxflags += cpp.get_supported_arguments(common_warning_flags)
+endif
+
+# A few places with imported code get a pass on -Wdeclaration-after-statement, remember
+# the result for them
+if cc.has_argument('-Wdeclaration-after-statement')
+ warning_cflags += '-Wdeclaration-after-statement'
+ using_declaration_after_statement_warning = true
+else
+ using_declaration_after_statement_warning = false
+endif
+
+
+# The following tests want to suppress various unhelpful warnings by adding
+# -Wno-foo switches. But gcc won't complain about unrecognized -Wno-foo
+# switches, so we have to test for the positive form and if that works,
+# add the negative form.
+
+negative_warning_flags = [
+ # Suppress clang's unhelpful unused-command-line-argument warnings.
+ 'unused-command-line-argument',
+
+ # Remove clang 12+'s compound-token-split-by-macro, as this causes a lot
+ # of warnings when building plperl because of usages in the Perl headers.
+ 'compound-token-split-by-macro',
+
+ # Similarly disable useless truncation warnings from gcc 8+
+ 'format-truncation',
+ 'stringop-truncation',
+
+ # FIXME: from andres's local config
+ 'clobbered',
+ 'missing-field-initializers',
+ 'sign-compare',
+ 'unused-parameter',
+]
+
+foreach w : negative_warning_flags
+ if cc.has_argument('-W'+w)
+ warning_cflags += '-Wno-'+w
+ endif
+ if llvm.found() and cpp.has_argument('-W'+w)
+ warning_cxxflags += '-Wno-'+w
+ endif
+endforeach
+
+# FIXME: copy "Defend against clang being used on x86-32 without SSE2 enabled"
+
+# From Project.pm
+if cc.get_id() == 'msvc'
+ warning_cflags += [
+ '/wd4018', '/wd4244', '/wd4273', '/wd4101', '/wd4102', '/wd4090',
+ '/wd4267',
+ ]
+
+ # Dirty hack to disable warnings due to some files defining
+ # UMDF_USING_NTSTATUS before including postgres.h. We need a better fix, but
+ # for now this allows us to see "real" warnings.
+ if get_option('b_pch')
+ warning_cflags += '/wd4005'
+ endif
+
+ functional_cflags += [
+ '/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__',
+ '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE',
+ '/D_CRT_NONSTDC_NO_DEPRECATE',
+ ]
+endif
+
+
+###############################################################
+# Atomics
+###############################################################
+
+if not get_option('spinlocks')
+ warning('Not using spinlocks will cause poor performance')
+else
+ cdata.set('HAVE_SPINLOCKS', 1)
+endif
+
+if not get_option('atomics')
+ warning('Not using atomics will cause poor performance')
+else
+ # XXX: perhaps we should require some atomics support in this case these
+ # days?
+ cdata.set('HAVE_ATOMICS', 1)
+
+ atomic_checks = [
+ {'name': 'HAVE_GCC__SYNC_CHAR_TAS',
+ 'desc': '__sync_lock_test_and_set(char)',
+ 'test': '''
+char lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+ {'name': 'HAVE_GCC__SYNC_INT32_TAS',
+ 'desc': '__sync_lock_test_and_set(int32)',
+ 'test': '''
+int lock = 0;
+__sync_lock_test_and_set(&lock, 1);
+__sync_lock_release(&lock);'''},
+
+ {'name': 'HAVE_GCC__SYNC_INT32_CAS',
+ 'desc': '__sync_val_compare_and_swap(int32)',
+ 'test': '''
+int val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+ {'name': 'HAVE_GCC__SYNC_INT64_CAS',
+ 'desc': '__sync_val_compare_and_swap(int64)',
+ 'test': '''
+INT64 val = 0;
+__sync_val_compare_and_swap(&val, 0, 37);'''},
+
+ {'name': 'HAVE_GCC__ATOMIC_INT32_CAS',
+ 'desc': ' __atomic_compare_exchange_n(int32)',
+ 'test': '''
+int val = 0;
+int expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+
+ {'name': 'HAVE_GCC__ATOMIC_INT64_CAS',
+ 'desc': ' __atomic_compare_exchange_n(int64)',
+ 'test': '''
+INT64 val = 0;
+INT64 expect = 0;
+__atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);'''},
+ ]
+
+ foreach check : atomic_checks
+ test = '''
+int main(void)
+{
+@0@
+}'''.format(check['test'])
+
+ cdata.set(check['name'],
+ cc.links(test,
+ name: check['desc'],
+ args: g_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false
+ )
+ endforeach
+
+endif
+
+
+
+###############################################################
+# Select CRC-32C implementation.
+#
+# If we are targeting a processor that has Intel SSE 4.2 instructions, we can
+# use the special CRC instructions for calculating CRC-32C. If we're not
+# targeting such a processor, but we can nevertheless produce code that uses
+# the SSE intrinsics, perhaps with some extra CFLAGS, compile both
+# implementations and select which one to use at runtime, depending on whether
+# SSE 4.2 is supported by the processor we're running on.
+#
+# Similarly, if we are targeting an ARM processor that has the CRC
+# instructions that are part of the ARMv8 CRC Extension, use them. And if
+# we're not targeting such a processor, but can nevertheless produce code that
+# uses the CRC instructions, compile both, and select at runtime.
+###############################################################
+
+have_optimized_crc = false
+cflags_crc = []
+if host_cpu == 'x86' or host_cpu == 'x86_64'
+
+ if cc.get_id() == 'msvc'
+ cdata.set('USE_SSE42_CRC32C', false)
+ cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+ have_optimized_crc = true
+ else
+
+ prog = '''
+#include <nmmintrin.h>
+
+int main(void)
+{
+ unsigned int crc = 0;
+ crc = _mm_crc32_u8(crc, 0);
+ crc = _mm_crc32_u32(crc, 0);
+ /* return computed value, to prevent the above being optimized away */
+ return crc == 0;
+}
+'''
+
+ if cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 without -msse4.2', args: g_c_args)
+ # Use Intel SSE 4.2 unconditionally.
+ cdata.set('USE_SSE42_CRC32C', 1)
+ have_optimized_crc = true
+ elif cc.links(prog, name: '_mm_crc32_u8 and _mm_crc32_u32 with -msse4.2', args: g_c_args + ['-msse4.2'])
+ # Use Intel SSE 4.2, with runtime check. The CPUID instruction is needed for
+ # the runtime check.
+ cflags_crc += '-msse4.2'
+ cdata.set('USE_SSE42_CRC32C', false)
+ cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1)
+ have_optimized_crc = true
+ endif
+
+ endif
+
+elif host_cpu == 'arm' or host_cpu == 'aarch64'
+
+ prog = '''
+#include <arm_acle.h>
+
+int main(void)
+{
+ unsigned int crc = 0;
+ crc = __crc32cb(crc, 0);
+ crc = __crc32ch(crc, 0);
+ crc = __crc32cw(crc, 0);
+ crc = __crc32cd(crc, 0);
+
+ /* return computed value, to prevent the above being optimized away */
+ return crc == 0;
+}
+'''
+
+ if cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd without -march=armv8-a+crc',
+ args: g_c_args)
+ # Use ARM CRC Extension unconditionally
+ cdata.set('USE_ARMV8_CRC32C', true)
+ have_optimized_crc = true
+ elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc',
+ args: g_c_args + ['-march=armv8-a+crc'])
+ # Use ARM CRC Extension, with runtime check
+ cflags_crc += '-march=armv8-a+crc'
+ cdata.set('USE_ARMV8_CRC32C', false)
+ cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1)
+ have_optimized_crc = true
+ endif
+endif
+
+if not have_optimized_crc
+ # fall back to slicing-by-8 algorithm, which doesn't require any special CPU
+ # support.
+ cdata.set('USE_SLICING_BY_8_CRC32C', 1)
+endif
+
+
+
+###############################################################
+# Other CPU specific stuff
+###############################################################
+
+if host_cpu == 'x86_64'
+
+ if cc.compiles('''
+ void main(void)
+ {
+ long long x = 1; long long r;
+ __asm__ __volatile__ (" popcntq %1,%0\n" : "=q"(r) : "rm"(x));
+ }''',
+ name: '@0@: popcntq instruction'.format(host_cpu),
+ args: g_c_args)
+ cdata.set('HAVE_X86_64_POPCNTQ', 1)
+ endif
+
+elif host_cpu == 'ppc' or host_cpu == 'ppc64'
+
+ if cc.compiles('''
+ void main(void)
+ {
+ int a = 0; int *p = &a; int r;
+ __asm__ __volatile__ (" lwarx %0,0,%1,1\n" : "=&r"(r) : "r"(p));
+ }''',
+ name: '@0@: whether assembler supports lwarx hint bit'.format(host_cpu),
+ args: g_c_args)
+ cdata.set('HAVE_PPC_LWARX_MUTEX_HINT', 1)
+ endif
+
+ # Check if compiler accepts "i"(x) when __builtin_constant_p(x).
+ if cdata.has('HAVE__BUILTIN_CONSTANT_P')
+ if cc.compiles('''
+ static inline int
+ addi(int ra, int si)
+ {
+ int res = 0;
+ if (__builtin_constant_p(si))
+ __asm__ __volatile__(
+ " addi %0,%1,%2\n" : "=r"(res) : "b"(ra), "i"(si));
+ return res;
+ }
+ int test_adds(int x) { return addi(3, x) + addi(x, 5); }
+ ''',
+ args: g_c_args)
+ cdata.set('HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P', 1)
+ endif
+ endif
+endif
+
+
+
+###############################################################
+# Library / OS tests
+###############################################################
+
+header_checks = [
+ ['atomic.h'],
+ ['stdbool.h'],
+ ['copyfile.h'],
+ ['execinfo.h'],
+ ['getopt.h'],
+ ['ifaddrs.h'],
+ ['langinfo.h'],
+ ['mbarrier.h'],
+ ['strings.h'],
+ ['sys/epoll.h'],
+ ['sys/event.h'],
+ ['sys/ipc.h'],
+ ['sys/personality.h'],
+ ['sys/prctl.h'],
+ ['sys/procctl.h'],
+ ['sys/resource.h'],
+ ['sys/select.h'],
+ ['sys/sem.h'],
+ ['sys/shm.h'],
+ ['sys/signalfd.h'],
+ ['sys/sockio.h'],
+ ['sys/uio.h'],
+ ['sys/un.h'],
+ ['termios.h'],
+ ['ucred.h'],
+ # Historically we've included sys/param.h first, due to sys/ucred.h not
+ # being standalone on OpenBSD (in 2013). But that doesn't look to be the case
+ # anymore in 2022.
+ ['sys/ucred.h'],
+ # At least on IRIX, test for netinet/tcp.h will fail unless netinet/in.h is
+ # included first (in 2000). But that doesn't look to be the case anymore in
+ # 2022.
+ ['netinet/tcp.h'],
+ # Historically we've included sys/socket.h first due to net/if.h not being
+ # standalone on some BSDs (in 2009). But that doesn't look to be the case
+ # anymore in 2022.
+ ['net/if.h'],
+ ['crtdefs.h'],
+]
+
+foreach c : header_checks
+ header = c.get(0)
+ varname = 'HAVE_'+header.underscorify().to_upper()
+
+ # Emulate autoconf behaviour of not-found->undef, found->1
+ found = cc.has_header(header, include_directories: g_c_inc, args: g_c_args)
+ cdata.set(varname, found ? 1 : false,
+ description: 'Define to 1 if you have the <@0@> header file.'.format(header))
+endforeach
+
+
+
+decl_checks = [
+ ['F_FULLFSYNC', 'fcntl.h'],
+ ['fdatasync', 'unistd.h'],
+ ['posix_fadvise', 'fcntl.h'],
+ ['strlcat', 'string.h'],
+ ['strlcpy', 'string.h'],
+ ['strnlen', 'string.h'],
+]
+
+# Need to check for function declarations for these functions, because
+# checking for library symbols wouldn't handle deployment target
+# restrictions on macOS
+decl_checks += [
+ ['preadv', 'sys/uio.h'],
+ ['pwritev', 'sys/uio.h'],
+]
+
+foreach c : decl_checks
+ func = c.get(0)
+ header = c.get(1)
+ args = c.get(2, {})
+ varname = 'HAVE_DECL_'+func.underscorify().to_upper()
+
+ found = cc.has_header_symbol(header, func,
+ args: g_c_args, include_directories: g_c_inc,
+ kwargs: args)
+ cdata.set10(varname, found, description:
+'''Define to 1 if you have the declaration of `@0@', and to 0 if you
+ don't.'''.format(func))
+endforeach
+
+
+
+if cc.has_type('struct cmsgcred',
+ args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '' : '-DHAVE_SYS_UCRED_H'],
+ include_directories: g_c_inc,
+ prefix: '''
+#include <sys/socket.h>
+#include <sys/param.h>
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif''')
+ cdata.set('HAVE_STRUCT_CMSGCRED', 1)
+else
+ cdata.set('HAVE_STRUCT_CMSGCRED', false)
+endif
+
+if cc.has_type('struct option',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '@0@'.format(cdata.get('HAVE_GETOPT_H')) == '1' ? '#include <getopt.h>' : '')
+ cdata.set('HAVE_STRUCT_OPTION', 1)
+endif
+
+
+foreach c : ['opterr', 'optreset']
+ varname = 'HAVE_INT_'+c.underscorify().to_upper()
+
+ if cc.links('''
+#include <unistd.h>
+int main(void)
+{
+ extern int @0@;
+ @0@ = 1;
+}
+'''.format(c), name: c, args: g_c_args)
+ cdata.set(varname, 1)
+ else
+ cdata.set(varname, false)
+ endif
+endforeach
+
+if cc.has_type('socklen_t',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <sys/socket.h>''')
+ cdata.set('HAVE_SOCKLEN_T', 1)
+endif
+
+if cc.has_type('struct sockaddr_storage',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+ cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1)
+endif
+
+# Check the members of `struct sockaddr_storage'. We need to know about
+# ss_family and ss_len. (Some platforms follow RFC 2553 and call them
+# __ss_family and __ss_len.) We also check struct sockaddr's sa_len;
+# if we have to define our own `struct sockaddr_storage', this tells us
+# whether we need to provide an ss_len field.
+foreach member : ['ss_family', '__ss_family', 'ss_len', '__ss_len']
+ if cc.has_member('struct sockaddr_storage', member,
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+ #include <sys/types.h>
+ #include <sys/socket.h>''')
+ cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_'+member.to_upper(), 1)
+ endif
+endforeach
+if cc.has_member('struct sockaddr', 'sa_len',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>''')
+ cdata.set('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
+endif
+
+# FIXME: HAVE_SYS_UN_H
+if cc.has_type('struct sockaddr_un',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#include <sys/un.h>''')
+ cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1)
+endif
+
+if cc.has_type('struct addrinfo', args: g_c_args,
+ include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+''')
+ cdata.set('HAVE_STRUCT_ADDRINFO', 1)
+endif
+
+if cc.has_type('struct sockaddr_in6',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <netinet/in.h>''')
+ cdata.set('HAVE_IPV6', 1)
+endif
+
+
+if cc.has_member('struct tm', 'tm_zone',
+ args: g_c_args, include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#include <time.h>
+''')
+ cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1)
+endif
+
+if cc.compiles('''
+#include <time.h>
+extern int foo(void);
+int foo(void)
+{
+ return timezone / 60;
+}
+''',
+ name: 'Check if the global variable `timezone\' exists',
+ args: g_c_args, include_directories: g_c_inc)
+ cdata.set('HAVE_INT_TIMEZONE', 1)
+else
+ cdata.set('HAVE_INT_TIMEZONE', false)
+endif
+
+if cc.has_type('union semun',
+ args: g_c_args +
+ ['@0@'.format(cdata.get('HAVE_SYS_IPC_H')) == 'false' ? '' : '-DHAVE_SYS_IPC_H'] +
+ ['@0@'.format(cdata.get('HAVE_SYS_SEM_H')) == 'false' ? '' : '-DHAVE_SYS_SEM_H'],
+ include_directories: g_c_inc,
+ prefix: '''
+#include <sys/types.h>
+#ifdef HAVE_SYS_IPC_H
+#include <sys/ipc.h>
+#endif
+#ifdef HAVE_SYS_SEM_H
+#include <sys/sem.h>
+#endif
+''')
+ cdata.set('HAVE_UNION_SEMUN', 1)
+endif
+
+if cc.compiles('''
+#include <string.h>
+int main(void)
+{
+ char buf[100];
+ switch (strerror_r(1, buf, sizeof(buf)))
+ { case 0: break; default: break; }
+}''',
+ name: 'strerror_r',
+ args: g_c_args, include_directories: g_c_inc)
+ cdata.set('STRERROR_R_INT', 1)
+else
+ cdata.set('STRERROR_R_INT', false)
+endif
+
+# Check for the locale_t type and find the right header file. macOS
+# needs xlocale.h; standard is locale.h, but glibc also has an
+# xlocale.h file that we should not use.
+if cc.has_type('locale_t', prefix: '#include <locale.h>')
+ cdata.set('HAVE_LOCALE_T', 1)
+elif cc.has_type('locale_t', prefix: '#include <xlocale.h>')
+ cdata.set('HAVE_LOCALE_T', 1)
+ cdata.set('LOCALE_T_IN_XLOCALE', 1)
+endif
+
+# Check if the C compiler understands typeof or a variant. Define
+# HAVE_TYPEOF if so, and define 'typeof' to the actual key word.
+foreach kw : ['typeof', '__typeof__', 'decltype']
+ if cc.compiles('''
+int main(void)
+{
+ int x = 0;
+ @0@(x) y;
+ y = x;
+ return y;
+}
+'''.format(kw),
+ name: 'typeof()',
+ args: g_c_args, include_directories: g_c_inc)
+
+ cdata.set('HAVE_TYPEOF', 1)
+ if kw != 'typeof'
+ cdata.set('typeof', kw)
+ endif
+
+ break
+ endif
+endforeach
+
+
+# MSVC doesn't cope well with defining restrict to __restrict, the
+# spelling it understands, because it conflicts with
+# __declspec(restrict). Therefore we define pg_restrict to the
+# appropriate definition, which presumably won't conflict.
+#
+# FIXME: We used to check if restrict is available, but it really should these
+# days?
+#
+# FIXME: Historically we allowed platforms to disable restrict in template
+# files. Is that really still necessary?
+cdata.set('pg_restrict', '__restrict')
+
+
+cdata.set('MEMSET_LOOP_LIMIT', 1024)
+
+
+if cc.links('''
+#include <machine/vmparam.h>
+#include <sys/exec.h>
+
+int main(void)
+{
+ PS_STRINGS->ps_nargvstr = 1;
+ PS_STRINGS->ps_argvstr = "foo";
+}
+''',
+ name: 'PS_STRINGS', args: g_c_args)
+ cdata.set('HAVE_PS_STRINGS', 1)
+else
+ cdata.set('HAVE_PS_STRINGS', false)
+endif
+
+
+m_dep = cc.find_library('m', required : false)
+
+# Most libraries are included only if they demonstrably provide a function we
+# need, but libm is an exception: always include it, because there are too
+# many compilers that play cute optimization games that will break probes for
+# standard functions such as pow().
+os_deps = [m_dep]
+
+rt_dep = cc.find_library('rt', required : false)
+
+dl_dep = cc.find_library('dl', required : false)
+
+util_dep = cc.find_library('util', required : false)
+posix4_dep = cc.find_library('posix4', required : false)
+
+getopt_dep = cc.find_library('getopt', required : false)
+gnugetopt_dep = cc.find_library('gnugetopt', required : false)
+
+execinfo_dep = cc.find_library('execinfo', required : false)
+
+cygipc_dep = cc.find_library('cygipc', required : false)
+
+func_checks = [
+ ['_configthreadlocale'],
+ ['backtrace_symbols', {'dependencies': [execinfo_dep]}],
+ ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}],
+ ['copyfile'],
+ ['dlsym', {'dependencies': [dl_dep], 'define': false}],
+ ['explicit_bzero'],
+ ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris
+ ['getaddrinfo'],
+ ['gethostbyname_r', {'dependencies': [thread_dep]}],
+ ['getifaddrs'],
+ ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}],
+ ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}],
+ ['getpeereid'],
+ ['getpeerucred'],
+ ['inet_aton'],
+ ['inet_pton'],
+ ['kqueue'],
+ ['mbstowcs_l'],
+ ['memset_s'],
+ ['mkdtemp'],
+ ['posix_fadvise'],
+ ['posix_fallocate'],
+ ['ppoll'],
+ ['pstat'],
+ ['pthread_is_threaded_np', {'dependencies': [thread_dep]}],
+ ['pthread_barrier_wait', {'dependencies': [thread_dep]}],
+ ['setproctitle', {'dependencies': [util_dep]}],
+ ['setproctitle_fast'],
+ ['shm_open', {'dependencies': [rt_dep], 'define': false}],
+ ['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
+ ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+ ['strchrnul'],
+ ['strerror_r', {'dependencies': [thread_dep]}],
+ ['strlcat'],
+ ['strlcpy'],
+ ['strnlen'],
+ ['strsignal'],
+ ['sync_file_range'],
+ ['syncfs'],
+ ['uselocale'],
+ ['wcstombs_l'],
+]
+
+foreach c : func_checks
+ func = c.get(0)
+ kwargs = c.get(1, {})
+ deps = kwargs.get('dependencies', [])
+
+ varname = 'HAVE_'+func.underscorify().to_upper()
+
+ found = cc.has_function(func, args: g_c_args)
+
+ if not found
+ foreach dep : deps
+ if not dep.found()
+ continue
+ endif
+ found = cc.has_function(func, args: g_c_args,
+ dependencies: [dep])
+ if found
+ os_deps += dep
+ break
+ endif
+ endforeach
+ endif
+
+ if kwargs.get('define', true)
+ # Emulate autoconf behaviour of not-found->undef, found->1
+ cdata.set(varname, found ? 1 : false,
+ description: 'Define to 1 if you have the `@0@\' function.'.format(func))
+ endif
+endforeach
+
+
+if cc.has_function('syslog', args: g_c_args) and cc.check_header('syslog.h', args: g_c_args)
+ cdata.set('HAVE_SYSLOG', 1)
+endif
+
+
+exesuffix = ''
+export_file_suffix = 'list'
+if host_system == 'aix'
+ dlsuffix = '.so'
+ export_file_format = 'aix'
+ export_fmt = '-Wl,-bE:@0@'
+elif host_system == 'darwin'
+ dlsuffix = '.dylib'
+ export_file_format = 'darwin'
+ export_fmt = '-exported_symbols_list=@0@'
+elif host_system == 'win32'
+ exesuffix = '.exe'
+ dlsuffix = '.dll'
+ export_file_format = 'win'
+ export_file_suffix = 'def'
+ if cc.get_id() == 'msvc'
+ export_fmt = '/DEF:@0@'
+ else
+ export_fmt = '@0@'
+ endif
+else
+ dlsuffix = '.so'
+ export_file_format = 'gnu'
+ export_fmt = '-Wl,--version-script=@0@'
+endif
+
+gen_export_kwargs = {
+ 'input': 'exports.txt',
+ 'output': '@BASENAME@.'+export_file_suffix,
+ 'command': [perl, files('src/tools/gen_export.pl'),
+ '--format', export_file_format,
+ '--input', '@INPUT0@', '--output', '@OUTPUT0@'],
+ 'build_by_default': false,
+ 'install': false,
+}
+
+cdata.set_quoted('DLSUFFIX', dlsuffix)
+
+# FIXME: needs some autoconfiguration
+if host_system == 'darwin'
+ cdata.set('USE_SYSV_SEMAPHORES', 1)
+ cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'openbsd' or host_system == 'netbsd'
+ cdata.set('USE_SYSV_SEMAPHORES', 1)
+ cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+elif host_system == 'win32'
+ cdata.set('USE_WIN32_SEMAPHORES', 1)
+ cdata.set('USE_WIN32_SHARED_MEMORY', 1)
+else
+ cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1)
+ cdata.set('USE_SYSV_SHARED_MEMORY', 1)
+endif
+
+
+if host_system == 'win32'
+ cdata.set('HAVE_IPV6', 1)
+ cdata.set('WIN32_STACK_RLIMIT', 4194304)
+ cdata.set('HAVE__CONFIGTHREADLOCALE', 1)
+endif
+
+if cc.get_id() == 'msvc'
+ ldflags += ['/fixed:no','/dynamicbase', '/nxcompat']
+endif
+
+if host_system == 'win32'
+ os_deps += cc.find_library('ws2_32', required: true)
+endif
+
+add_project_arguments(functional_cflags, language: ['c'])
+add_project_arguments(warning_cflags, language: ['c'])
+add_project_arguments(functional_cxxflags, language: ['cpp'])
+add_project_arguments(warning_cxxflags, language: ['cpp'])
+add_project_link_arguments(ldflags, language: ['c', 'cpp'])
+
+
+###############################################################
+# Threading
+###############################################################
+
+# XXX: About to rely on thread safety in the autoconf build, so not worth
+# implementing a fallback.
+cdata.set('ENABLE_THREAD_SAFETY', 1)
+
+
+
+###############################################################
+# NLS / Gettext
+###############################################################
+
+i18n = import('i18n')
+nlsopt = get_option('nls')
+libintl = dependency('', required: false)
+
+if not nlsopt.disabled()
+ # meson 0.59 has this wrapped in dependency('int')
+ if cc.check_header('libintl.h', args: g_c_args, required: nlsopt)
+ # in libc
+ if cc.has_function('ngettext')
+ libintl = declare_dependency()
+ else
+ libintl = cc.find_library('intl', has_headers: ['libintl.h'], required: nlsopt)
+ endif
+ endif
+
+ if libintl.found()
+ cdata.set('ENABLE_NLS', 1)
+ endif
+endif
+
+
+
+###############################################################
+# Build
+###############################################################
+
+# Collect a number of lists of things while recursing through the source
+# tree. Later steps then can use those.
+
+test_deps = []
+backend_targets = []
+
+
+# Define the tests to distribute them to the correct test styles later
+tests = []
+
+
+# Default options for targets
+
+# First identify rpaths
+bin_install_rpaths = []
+lib_install_rpaths = []
+mod_install_rpaths = []
+
+# If the host can form relative rpaths, use that to make the installation
+# properly relocatable
+test_library_path_var = ''
+if host_system == 'win32'
+ # nothing to do
+elif host_system == 'openbsd' or host_system == 'netbsd'
+ # openbsd's $ORIGIN doesn't use an absolute path to the binary, but argv[0]
+ # (i.e. absolute when invoked with an absolute name, but e.g. not absolute
+ # when invoked via PATH search).
+ #
+ # netbsd patched their meson in a broken way:
+ # https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=56959
+ # until there's a way out of that, just use LD_LIBRARY_PATH.
+ test_library_path_var = 'LD_LIBRARY_PATH'
+else
+ if host_system == 'darwin'
+ rpath_var = '@loader_path'
+ else
+ rpath_var = '$ORIGIN'
+ endif
+
+ # PG binaries might need to link to libpq, use relative path to reference
+ bin_to_lib = run_command(python, files('src/tools/relpath.py'),
+ dir_bin, dir_lib, check: true).stdout().strip()
+ bin_install_rpaths += rpath_var / bin_to_lib
+
+ # PG extensions might need to link to libpq, use relative path to reference
+ # (often just .)
+ mod_to_lib = run_command(python, files('src/tools/relpath.py'),
+ dir_lib_pkg, dir_lib, check: true).stdout().strip()
+ mod_install_rpaths += rpath_var / mod_to_lib
+endif
+
+# add extra_lib_dirs to rpath
+bin_install_rpaths += g_c_lib
+lib_install_rpaths += g_c_lib
+mod_install_rpaths += g_c_lib
+
+
+# Define arguments for default targets
+
+default_target_args = {
+ 'implicit_include_directories': false,
+ 'install': true,
+}
+
+default_lib_args = default_target_args + {
+ 'name_prefix': '',
+ 'install_rpath': ':'.join(lib_install_rpaths),
+}
+
+internal_lib_args = default_lib_args + {
+ 'build_by_default': false,
+ 'install': false,
+}
+
+default_mod_args = default_lib_args + {
+ 'name_prefix': '',
+ 'install_dir': dir_lib_pkg,
+ 'install_rpath': ':'.join(mod_install_rpaths),
+}
+
+default_bin_args = default_target_args + {
+ 'install_dir': dir_bin,
+ 'install_rpath': ':'.join(bin_install_rpaths),
+}
+
+
+
+###
+### windows resources related stuff
+###
+
+pg_ico = meson.source_root() / 'src' / 'port' / 'win32.ico'
+win32ver_rc_in = files('src/port/win32ver.rc.in')
+rcgen = find_program('src/tools/rcgen', native: true)
+
+rcgen_cmd = [rcgen, '@INPUT@', '-o', '@OUTPUT@', '--depfile', '@DEPFILE@']
+rcgen_bin_cmd = rcgen_cmd + [
+ '--VFT_TYPE', 'VFT_APP',
+ '--FILEENDING', 'exe',
+ '--ICO', pg_ico,
+]
+
+rcgen_lib_cmd = rcgen_cmd + [
+ '--VFT_TYPE', 'VFT_DLL',
+ '--FILEENDING', 'dll',
+]
+
+rcgen_inc = [postgres_inc]
+
+rcgen_kw = {
+ 'input': win32ver_rc_in,
+ 'output': 'win32ver.rc',
+ 'depfile': '@PLAINNAME@.d',
+}
+
+rccompile_kw = {
+ 'include_directories': rcgen_inc,
+}
+
+
+# First visit src/include - all targets creating headers are defined
+# within. That makes it easy to add the necessary dependencies for the
+# subsequent build steps.
+
+# headers that the whole build tree depends on
+generated_headers = []
+# headers that the backend build depends on
+generated_backend_headers = []
+# configure_files() output, needs a way of converting to file names
+configure_files = []
+
+# generated files that might conflict with a partial in-tree autoconf build
+generated_sources = []
+# same, for paths that differ between autoconf / meson builds
+# elements are [dir, [files]]
+generated_sources_ac = {}
+
+
+subdir('src/include')
+
+subdir('config')
+
+# Then through src/port and src/common, as most other things depend on them
+
+frontend_port_code = declare_dependency(
+ compile_args: ['-DFRONTEND'],
+ include_directories: [postgres_inc],
+ sources: [errcodes],
+ dependencies: os_deps,
+)
+
+backend_port_code = declare_dependency(
+ compile_args: ['-DBUILDING_DLL'],
+ include_directories: [postgres_inc],
+ sources: [errcodes],
+ dependencies: os_deps,
+)
+
+subdir('src/port')
+
+frontend_common_code = declare_dependency(
+ compile_args: ['-DFRONTEND'],
+ include_directories: [postgres_inc],
+ sources: generated_headers,
+ dependencies: os_deps,
+)
+
+backend_common_code = declare_dependency(
+ compile_args: ['-DBUILDING_DLL'],
+ include_directories: [postgres_inc],
+ sources: generated_headers,
+)
+
+subdir('src/common')
+
+frontend_shlib_code = declare_dependency(
+ compile_args: ['-DFRONTEND'],
+ include_directories: [postgres_inc],
+ link_with: [pgport_shlib, common_shlib],
+ sources: generated_headers,
+ dependencies: [os_deps, libintl],
+)
+
+libpq_deps = [
+ frontend_shlib_code,
+ thread_dep,
+
+ gssapi,
+ ldap,
+ libintl,
+ ssl,
+]
+
+subdir('src/interfaces/libpq')
+# fe_utils depends on libpq
+subdir('src/fe_utils')
+
+frontend_code = declare_dependency(
+ compile_args: ['-DFRONTEND'],
+ include_directories: [postgres_inc],
+ link_with: [pgport_static, common_static, fe_utils],
+ sources: generated_headers,
+ dependencies: [os_deps, libintl],
+)
+
+backend_both_deps = [
+ thread_dep,
+ os_deps,
+
+ bsd_auth,
+ gssapi,
+ icu,
+ icu_i18n,
+ ldap,
+ libintl,
+ libxml,
+ lz4,
+ pam,
+ ssl,
+ systemd,
+ zlib,
+ zstd,
+]
+
+backend_deps = backend_both_deps
+
+if host_system == 'win32'
+ backend_deps += cc.find_library('secur32', required: true)
+endif
+
+backend_mod_deps = backend_both_deps
+
+backend_code = declare_dependency(
+ compile_args: ['-DBUILDING_DLL'],
+ include_directories: [postgres_inc],
+ link_with: [],
+ sources: generated_headers + generated_backend_headers,
+ dependencies: backend_deps,
+)
+
+# Note there's intentionally no dependency on pgport/common here - we want the
+# symbols from the main binary for extension modules, rather than the
+# extension linking separately to pgport/common.
+backend_mod_code = declare_dependency(
+ compile_args: [],
+ include_directories: [postgres_inc],
+ link_with: [],
+ sources: generated_headers + generated_backend_headers,
+ dependencies: backend_mod_deps,
+)
+
+# Then through the main sources. That way contrib can have dependencies on
+# main sources. Note that this explicitly doesn't enter src/test, right now a
+# few regression tests depend on contrib files.
+
+subdir('src')
+
+subdir('contrib')
+
+subdir('src/test')
+subdir('src/interfaces/libpq/test')
+subdir('src/interfaces/ecpg/test')
+
+subdir('doc/src/sgml')
+
+generated_sources_ac += {'': ['GNUmakefile']}
+
+
+# If there are any files in the source directory that we also generate in the
+# build directory, they might get preferred over the newly generated files,
+# e.g. because of a #include "file", which always will search in the current
+# directory first.
+message('checking for file conflicts between source and build directory')
+conflicting_files = []
+potentially_conflicting_files_t = []
+potentially_conflicting_files_t += generated_headers
+potentially_conflicting_files_t += generated_backend_headers
+potentially_conflicting_files_t += generated_backend_sources
+potentially_conflicting_files_t += generated_sources
+
+potentially_conflicting_files = []
+
+# convert all sources of potentially conflicting files into uniform shape
+foreach t : potentially_conflicting_files_t
+ potentially_conflicting_files += t.full_path()
+endforeach
+foreach t : configure_files
+ potentially_conflicting_files += '@0@/@1@'.format(meson.current_build_dir(), t)
+endforeach
+foreach sub, fnames : generated_sources_ac
+ sub = meson.build_root() / sub
+ foreach fname: fnames
+ potentially_conflicting_files += sub/fname
+ endforeach
+endforeach
+
+# find and report conflicting files
+foreach build_path : potentially_conflicting_files
+ build_path = host_system == 'win32' ? fs.as_posix(build_path) : build_path
+ # str.replace is in 0.56
+ src_path = meson.current_source_dir() / build_path.split(meson.current_build_dir() / '')[1]
+ if fs.exists(src_path) or fs.is_symlink(src_path)
+ conflicting_files += src_path
+ have_conflicts = true
+ endif
+endforeach
+# XXX: Perhaps we should generate a file that would clean these up? The list
+# can be long.
+if conflicting_files.length() > 0
+ errmsg_cleanup = '''
+Conflicting files in source directory:
+ @0@
+
+The conflicting files need to be removed, either by removing the files listed
+above, or by running configure and then make maintainer clean.
+'''
+ errmsg_cleanup = errmsg_cleanup.format(' '.join(conflicting_files))
+ error(errmsg_nonclean_base.format(errmsg_cleanup))
+endif
+
+
+# To make MacOS installation work without a prior make install, even with SIP
+# enabled, make rpaths relative after installation. This also makes the
+# installation relocatable.
+if host_system == 'darwin'
+ meson.add_install_script('src/tools/relativize_shared_library_references')
+endif
+
+
+
+###############################################################
+# Test prep
+###############################################################
+
+# The determination of where a DESTDIR install points to is ugly, it's somewhat hard
+# to combine two absolute paths portably...
+
+prefix = get_option('prefix')
+
+test_prefix = prefix
+
+if fs.is_absolute(get_option('prefix'))
+ if host_system == 'win32'
+ if prefix.split(':\\').length() == 1
+ # just a drive
+ test_prefix = ''
+ else
+ test_prefix = prefix.split(':\\')[1]
+ endif
+ else
+ test_prefix = prefix.substring(1)
+ endif
+endif
+
+# DESTDIR for the installation used to run tests in
+test_install_destdir = meson.build_root() / 'tmp_install/'
+# DESTDIR + prefix appropriately munged
+test_install_location = test_install_destdir / test_prefix
+
+
+meson_install_args = meson_args + ['install'] + {
+ 'meson': ['--quiet', '--only-changed', '--no-rebuild'],
+ 'muon': []
+}[meson_impl]
+
+test('tmp_install',
+ meson_bin, args: meson_install_args ,
+ env: {'DESTDIR':test_install_destdir},
+ priority: 100,
+ is_parallel: false,
+ suite: ['setup'])
+
+test_result_dir = meson.build_root() / 'testrun'
+
+
+# XXX: pg_regress doesn't assign unique ports on windows. To avoid the
+# inevitable conflicts from running tests in parallel, hackishly assign
+# different ports for different tests.
+
+testport=40000
+
+test_env = environment()
+
+temp_install_bindir = test_install_location / get_option('bindir')
+test_env.set('PG_REGRESS', pg_regress.full_path())
+test_env.set('REGRESS_SHLIB', regress_module.full_path())
+
+# Test suites that are not safe by default but can be run if selected
+# by the user via the whitespace-separated list in variable PG_TEST_EXTRA.
+# Export PG_TEST_EXTRA so it can be checked in individual tap tests.
+test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA'))
+
+# On platforms without $ORIGIN support we need to add the temporary
+# installation to the library search path.
+if test_library_path_var != ''
+ test_env.prepend(test_library_path_var, test_install_location / get_option('libdir'))
+endif
+
+
+###############################################################
+# Test Generation
+###############################################################
+
+# Check whether tap tests are enabled or not
+are_tap_tests_enabled = false
+if get_option('enable-tap-tests')
+ # Checking for perl modules for tap tests
+ perl_ipc_run_check = run_command(prove, 'config/check_modules.pl', check: false)
+ if perl_ipc_run_check.returncode() != 0
+ message(perl_ipc_run_check.stderr().strip())
+ error('Additional Perl modules are required to run TAP tests.')
+ endif
+ are_tap_tests_enabled = true
+endif
+
+foreach test: tests
+ test_default = {
+ 'name': test['name'],
+ 'sd': test['sd'],
+ 'bd': test['bd'],
+ }
+ # Define all 'pg_regress' style tests
+ if 'regress' in test
+ t = test_default + test['regress']
+ test_command = [
+ t.get('test_runner', pg_regress).full_path(),
+ '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check',
+ '--inputdir', t.get('inputdir', t['sd']),
+ '--expecteddir', t.get('expecteddir', t['sd']),
+ '--outputdir', test_result_dir / t['name'] / 'pg_regress',
+ '--bindir', '',
+ '--dlpath', t['bd'],
+ '--max-concurrent-tests=20',
+ '--port=@0@'.format(testport),
+ ]
+
+ if t.has_key('regress_args')
+ test_command += t['regress_args']
+ endif
+
+ if t.has_key('schedule')
+ test_command += ['--schedule', t['schedule'],]
+ endif
+ if t.has_key('sql')
+ test_command += t['sql']
+ endif
+
+ env = test_env
+ env.prepend('PATH', temp_install_bindir, t['bd'])
+
+ test_kwargs = {
+ 'suite': ['pg_regress', t['name']],
+ 'priority': 10,
+ 'timeout': 1000,
+ 'depends': test_deps + t.get('deps', []),
+ 'env': env,
+ 'args': [
+ testwrap.path(),
+ '--srcdir', t['sd'],
+ '--basedir', meson.build_root(),
+ '--builddir', t['bd'],
+ '--testgroup', t['name'],
+ '--testname', 'pg_regress',
+ test_command,
+ ]
+ }
+
+ if t.has_key('test_kwargs')
+ test_kwargs += t['test_kwargs']
+ endif
+
+ test(t['name'] / 'pg_regress',
+ python,
+ kwargs: test_kwargs,
+ )
+
+ testport = testport + 1
+ endif
+
+ # Define all 'isolationtester' style tests
+ if 'isolation' in test
+ t = test_default + test['isolation']
+ test_command = [
+ pg_isolation_regress.full_path(),
+ '--temp-instance', test_result_dir / t['name'] / 'isolation' / 'tmp_check',
+ '--inputdir', t['sd'],
+ '--outputdir', test_result_dir / t['name'] / 'isolation',
+ '--bindir', '',
+ '--dlpath', t['bd'],
+ '--max-concurrent-tests=20',
+ '--port=@0@'.format(testport),
+ ]
+
+ if t.has_key('regress_args')
+ test_command += t['regress_args']
+ endif
+
+ if t.has_key('schedule')
+ test_command += ['--schedule', t['schedule'],]
+ else
+ test_command += t['specs']
+ endif
+
+ env = test_env
+ env.prepend('PATH', temp_install_bindir, t['bd'])
+
+ test_kwargs = {
+ 'suite': ['isolation', t['name']],
+ 'priority': 20,
+ 'timeout': 1000,
+ 'depends': test_deps + t.get('deps', []),
+ 'env': env,
+ 'args': [
+ testwrap.path(),
+ '--srcdir', t['sd'],
+ '--basedir', meson.build_root(),
+ '--builddir', t['bd'],
+ '--testgroup', t['name'],
+ '--testname', 'isolation',
+ test_command,
+ ]
+ }
+
+ if t.has_key('test_kwargs')
+ test_kwargs += t['test_kwargs']
+ endif
+
+ test(t['name'] / 'isolation',
+ python,
+ kwargs: test_kwargs,
+ )
+
+ testport = testport + 1
+ endif
+
+ # Define all 'tap' style tests
+ # FIXME: dependencies for each test
+ if are_tap_tests_enabled and 'tap' in test
+ t = test_default + test['tap']
+ test_command = [
+ perl.path(),
+ '-I', meson.source_root() / 'src/test/perl',
+ '-I', t['sd'],
+ ]
+
+ env = test_env
+
+ # Add temporary install, the build directory for non-installed binaries and
+ # also test/ for non-installed test binaries built separately.
+ env.prepend('PATH', temp_install_bindir, t['bd'], t['bd'] / 'test')
+
+ foreach name, value : t.get('env', {})
+ env.set(name, value)
+ endforeach
+
+ test_kwargs = {
+ 'protocol': 'tap',
+ 'suite': ['tap', t['name']],
+ 'timeout': 1000,
+ 'depends': test_deps + t.get('deps', []),
+ 'env': env,
+ }
+
+ if t.has_key('test_kwargs')
+ test_kwargs += t['test_kwargs']
+ endif
+
+ foreach onetap : t['tests']
+ test(t['name'] / onetap,
+ python,
+ kwargs: test_kwargs,
+ args: [
+ testwrap.path(),
+ '--srcdir', t['sd'],
+ '--basedir', meson.build_root(),
+ '--builddir', t['bd'],
+ '--testgroup', t['name'],
+ '--testname', onetap,
+ test_command,
+ t['sd'] / onetap,
+ ]
+ )
+ endforeach
+ endif
+endforeach
+
+
+###############################################################
+# Pseudo targets
+###############################################################
+
+alias_target('backend', backend_targets)
+
+
+
+###############################################################
+# The End, The End, My Friend
+###############################################################
+
+if meson.version().version_compare('>=0.57')
+
+ summary({
+ 'data block size' : cdata.get('BLCKSZ'),
+ 'WAL block size' : cdata.get('XLOG_BLCKSZ'),
+ 'segment size' : cdata.get('RELSEG_SIZE')
+ }, section: 'Data layout'
+ )
+
+ summary(
+ {
+ 'host system' : '@0@ @1@'.format(host_system, host_cpu),
+ 'build system' : '@0@ @1@'.format(build_system, build_cpu),
+ },
+ section: 'System'
+ )
+
+ summary(
+ {
+ 'linker': '@0@'.format(cc.get_linker_id()),
+ 'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()),
+ },
+ section: 'Compiler'
+ )
+
+ summary(
+ {
+ 'C FLAGS, functional': ' '.join(functional_cflags),
+ 'C FLAGS, warnings': ' '.join(warning_cflags),
+ },
+ section: 'Compiler Flags'
+ )
+
+ if llvm.found()
+ summary(
+ {
+ 'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version())
+ },
+ section: 'Compiler')
+
+ summary(
+ {
+ 'C++ FLAGS, functional': ' '.join(functional_cxxflags),
+ 'C++ FLAGS, warnings': ' '.join(warning_cxxflags),
+ },
+ section: 'Compiler Flags')
+ endif
+
+ summary(
+ {
+ 'bison' : '@0@ @1@'.format(bison.full_path(), bison_version),
+ 'dtrace' : dtrace,
+ },
+ section: 'Programs'
+ )
+
+ summary(
+ {
+ 'bonjour': bonjour,
+ 'bsd_auth': bsd_auth,
+ 'gss': gssapi,
+ 'icu': icu,
+ 'ldap': ldap,
+ 'libxml': libxml,
+ 'libxslt': libxslt,
+ 'llvm': llvm,
+ 'lz4': lz4,
+ 'nls' : libintl,
+ 'pam' : pam,
+ 'perl': perl_dep,
+ 'python3': python3_dep,
+ 'readline': readline,
+ 'selinux': selinux,
+ 'ssl': ssl,
+ 'systemd': systemd,
+ 'tcl': tcl_dep,
+ 'uuid': uuid,
+ 'zlib': zlib,
+ 'zstd': zstd,
+ },
+ section: 'External libraries'
+ )
+
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000000..3be176ca16b
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,175 @@
+# Data layout influencing options
+
+option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8',
+ description: 'set table block size in kB')
+
+option('wal-blocksize', type : 'integer', value : 8,
+ description : '''WAL block size, in kilobytes.
+This is the unit of storage and I/O within the WAL log. The default, 8 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). Note that changing this value requires an initdb.'''
+ )
+
+option('segsize', type : 'integer', value : 1,
+ description : '''Segment size, in gigabytes.
+Large tables are divided into multiple operating-system files, each of size equal to the segment size. This avoids problems with file size limits that exist on many platforms. The default segment size, 1 gigabyte, is safe on all supported platforms. If your operating system has "largefile" support (which most do, nowadays), you can use a larger segment size. This can be helpful to reduce the number of file descriptors consumed when working with very large tables. But be careful not to select a value larger than is supported by your platform and the file systems you intend to use. Other tools you might wish to use, such as tar, could also set limits on the usable file size. It is recommended, though not absolutely required, that this value be a power of 2. Note that changing this value requires an initdb.'''
+ )
+
+
+# Miscellaneous options
+
+option('krb-srvnam', type : 'string', value : 'postgres',
+ description : '''The default name of the Kerberos service principal used by GSSAPI.
+postgres is the default. There's usually no reason to change this unless you are building for a Windows environment, in which case it must be set to upper case POSTGRES''')
+
+
+# Defaults
+
+option('pgport', type : 'string', value : '5432',
+ description : '''Default port number for server and clients.
+The default is 5432. The port can always be changed later on, but if you specify it here then both server and clients will have the same default compiled in, which can be very convenient. Usually the only good reason to select a non-default value is if you intend to run multiple PostgreSQL servers on the same machine.''')
+
+option('system-tzdata', type: 'string', value: '',
+ description: 'use system time zone data in specified directory')
+
+
+# Developer options
+
+option('cassert', type : 'boolean', value: false,
+ description: 'enable assertion checks (for debugging)')
+
+option('enable-tap-tests', type : 'boolean', value : true,
+ description : 'Whether to enable tap tests')
+
+option('PG_TEST_EXTRA', type : 'string', value: 'kerberos ldap ssl',
+ description: 'Enable selected extra tests')
+
+option('atomics', type : 'boolean', value: true,
+ description: 'whether to use atomic operations')
+
+option('spinlocks', type : 'boolean', value: true,
+ description: 'whether to use spinlocks')
+
+
+# Compilation options
+
+option('extra_include_dirs', type : 'array', value: [],
+ description: 'non-default directories to be searched for headers')
+
+option('extra_lib_dirs', type : 'array', value: [],
+ description: 'non-default directories to be searched for libs')
+
+option('extra_version', type : 'string', value: '',
+ description: 'append STRING to the PostgreSQL version number')
+
+
+# External dependencies
+
+option('bonjour', type : 'feature', value: 'auto',
+ description: 'build with Bonjour support')
+
+option('bsd-auth', type : 'feature', value: 'auto',
+ description: 'build with BSD Authentication support')
+
+option('dtrace', type : 'feature', value: 'disabled',
+ description: 'DTrace support')
+
+option('gssapi', type : 'feature', value: 'auto',
+ description: 'GSSAPI support')
+
+option('icu', type : 'feature', value: 'auto',
+ description: 'ICU support')
+
+option('ldap', type : 'feature', value: 'auto',
+ description: 'LDAP support')
+
+option('libedit_preferred', type : 'boolean', value: false,
+ description: 'Prefer BSD Libedit over GNU Readline')
+
+option('libxml', type : 'feature', value: 'auto',
+ description: 'XML support')
+
+option('libxslt', type : 'feature', value: 'auto',
+ description: 'XSLT support in contrib/xml2')
+
+option('llvm', type : 'feature', value: 'disabled',
+ description: 'whether to use llvm')
+
+option('lz4', type : 'feature', value: 'auto',
+ description: 'LZ4 support')
+
+option('nls', type: 'feature', value: 'auto',
+ description: 'native language support')
+
+option('pam', type : 'feature', value: 'auto',
+ description: 'build with PAM support')
+
+option('plperl', type : 'feature', value: 'auto',
+ description: 'build Perl modules (PL/Perl)')
+
+option('plpython', type : 'feature', value: 'auto',
+ description: 'build Python modules (PL/Python)')
+
+option('pltcl', type : 'feature', value: 'auto',
+ description: 'build with TCL support')
+
+option('tcl_version', type : 'string', value : 'tcl',
+ description: 'specify TCL version')
+
+option('readline', type : 'feature', value : 'auto',
+ description: 'use GNU Readline or BSD Libedit for editing')
+
+option('selinux', type : 'feature', value : 'disabled',
+ description: 'build with SELinux support')
+
+option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none',
+ description: 'use LIB for SSL/TLS support (openssl)')
+
+option('systemd', type : 'feature', value: 'auto',
+ description: 'build with systemd support')
+
+option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'], value : 'none',
+ description: 'build contrib/uuid-ossp using LIB')
+
+option('zlib', type : 'feature', value: 'auto',
+ description: 'whether to use zlib')
+
+option('zstd', type : 'feature', value: 'auto',
+ description: 'whether to use zstd')
+
+
+# Programs
+
+option('BISON', type : 'string', value: 'bison',
+ description: 'path to bison binary')
+
+option('DTRACE', type : 'string', value: 'dtrace',
+ description: 'path to dtrace binary')
+
+option('FLEX', type : 'string', value: 'flex',
+ description: 'path to flex binary')
+
+option('GZIP', type : 'string', value: 'gzip',
+ description: 'path to gzip binary')
+
+option('LZ4', type : 'string', value: 'lz4',
+ description: 'path to lz4 binary')
+
+option('PERL', type : 'string', value: 'perl',
+ description: 'path to perl binary')
+
+option('PROVE', type : 'string', value: 'prove',
+ description: 'path to prove binary')
+
+option('PYTHON', type : 'array', value: ['python3', 'python'],
+ description: 'path to python binary')
+
+option('SED', type : 'string', value: 'gsed',
+ description: 'path to sed binary')
+
+option('TAR', type : 'string', value: 'tar',
+ description: 'path to tar binary')
+
+option('ZSTD', type : 'string', value: 'zstd',
+ description: 'path to zstd binary')
+
+option('ZIC', type : 'string', value: 'zic',
+ description: 'path to zic binary, when cross-compiling')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 00000000000..0dc93e4338b
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,271 @@
+# libraries that other subsystems might depend uppon first, in their
+# respective dependency order
+
+subdir('timezone')
+
+subdir('backend')
+
+subdir('bin')
+
+subdir('pl')
+
+subdir('interfaces')
+
+
+### Generate a Makefile.global that's complete enough for PGXS to work.
+#
+# This is somewhat ugly, but allows extensions to only use a single
+# buildsystem across all the supported postgres versions. Once all supported
+# PG versions support meson, we can remove all of this.
+#
+# XXX: Should we make this optional?
+
+pgxs_kv = {
+ 'PACKAGE_URL': pg_url,
+ 'PACKAGE_VERSION': pg_version,
+ 'PG_MAJORVERSION': pg_version_major,
+ 'PG_VERSION_NUM': pg_version_num,
+ 'configure_input': 'meson',
+
+ 'vpath_build': 'yes',
+ 'autodepend': 'no', # XXX: Should we just set this to true when possible?
+
+ 'host_cpu': host_cpu,
+ 'host': '@0@-@1@'.format(host_cpu, host_system),
+ 'host_os': host_system,
+ 'build_os': build_system,
+ 'PORTNAME': host_system,
+
+ 'abs_top_builddir': meson.build_root(),
+ 'abs_top_srcdir': meson.source_root(),
+
+ 'enable_thread_safety': 'yes',
+ 'enable_rpath': 'yes',
+ 'enable_nls': libintl.found() ? 'yes' : 'no',
+ 'enable_tap_tests': get_option('enable-tap-tests') ? 'yes' : 'no',
+ 'enable_debug': get_option('debug') ? 'yes' : 'no',
+ 'enable_coverage': get_option('b_coverage') ? 'yes' : 'no',
+ 'enable_dtrace': dtrace.found() ? 'yes' : 'no',
+
+ 'DLSUFFIX': dlsuffix,
+ 'EXEEXT': exesuffix,
+
+ 'SUN_STUDIO_CC': 'no', # not supported so far
+
+ 'default_port': get_option('pgport'),
+ 'with_system_tzdata': get_option('system-tzdata'),
+
+ 'with_krb_srvnam': get_option('krb-srvnam'),
+ 'krb_srvtab': krb_srvtab,
+
+ # FIXME: implement programs.m4 logic in PGAC_CHECK_STRIP
+ 'STRIP': 'strip',
+ 'STRIP_STATIC_LIB': 'strip -x',
+ 'STRIP_SHARED_LIB': 'strip --strip-unneeded',
+
+ # Just always use the install_sh fallback that autoconf uses. Unlikely to
+ # matter performance-wise for extensions. If it turns out to do, we can
+ # improve that later.
+ 'MKDIR_P': ' '.join([install_sh.path(), '-d']),
+
+ 'CC': var_cc,
+ 'CPP': var_cpp,
+ 'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
+ 'with_gnu_ld': (cc.get_linker_id() in ['ld.bfd', 'ld.gold', 'ld.lld'] ? 'yes' : 'no'),
+
+ 'CFLAGS': var_cflags,
+ 'CPPFLAGS': var_cppflags,
+ 'CXXFLAGS': var_cxxflags,
+ 'CFLAGS_SL': var_cflags_sl,
+ 'CFLAGS_SL_MODULE': cdata.has('HAVE_VISIBILITY_ATTRIBUTE') ? '-fvisibility=hidden' : '',
+ 'CXXFLAGS_SL_MODULE': cdata.has('HAVE_VISIBILITY_ATTRIBUTE') ? '-fvisibility=hidden -fvisibility-inlines-hidden' : '',
+ 'CFLAGS_SSE42': ' '.join(cflags_crc),
+ 'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
+ 'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
+
+ # FIXME:
+ 'CFLAGS_ARMV8_CRC32C': '',
+ 'BITCODE_CFLAGS': '',
+ 'BITCODE_CXXFLAGS': '',
+
+ 'LDFLAGS': var_ldflags,
+ 'LDFLAGS_EX': var_ldflags_ex,
+ 'LDFLAGS_SL': var_ldflags_sl,
+
+ 'BISONFLAGS': ' '.join(bison_flags),
+ 'FLEXFLAGS': ' '.join(flex_flags),
+
+ 'LIBS': var_libs,
+}
+
+if llvm.found()
+ pgxs_kv += {
+ 'CLANG': clang.path(),
+ 'CXX': ' '.join(cpp.cmd_array()),
+ 'LLVM_BINPATH': llvm_binpath,
+ }
+else
+ pgxs_kv += {
+ 'CLANG': '',
+ 'CXX': '',
+ 'LLVM_BINPATH': '',
+ }
+endif
+
+pgxs_cdata = configuration_data(pgxs_kv)
+
+# FIXME: figure out which platforms we still need the linker "directly" -
+# can't be many?
+
+ld_program = find_program(cc.get_linker_id(), native: true, required: false)
+
+pgxs_bins = {
+ 'BISON': bison,
+ 'FLEX': flex,
+ 'GZIP': gzip,
+ 'LZ4': program_lz4,
+ 'PERL': perl,
+ 'PROVE': prove,
+ 'PYTHON': python,
+ 'TAR': tar,
+ 'ZSTD': program_zstd,
+ 'DTRACE': dtrace,
+ 'LD': ld_program,
+ 'install_bin': install_sh,
+}
+foreach b, p : pgxs_bins
+ pgxs_cdata.set(b, p.found() ? p.path() : '')
+endforeach
+
+pgxs_empty = [
+ 'PERMIT_DECLARATION_AFTER_STATEMENT',
+ 'PG_SYSROOT', #?
+ 'ICU_CFLAGS', # needs to be added, included by public server headers
+
+ # probably need most of these?
+ 'RANLIB',
+ 'WINDRES',
+ 'DLLTOOL',
+ 'DLLWRAP',
+ 'LN_S',
+ 'AR',
+ 'AWK',
+
+ # hard to see why we'd need either?
+ 'ZIC',
+ 'TCLSH',
+
+ # docs don't seem to be supported by pgxs
+ 'XMLLINT',
+ 'XSLTPROC',
+ 'DBTOEPUB',
+ 'FOP',
+
+ # supporting coverage for pgxs-in-meson build doesn't seem worth it
+ 'GENHTML',
+ 'LCOV',
+ 'GCOV',
+ 'MSGFMT_FLAGS',
+
+ # translation doesn't appear to be supported by pgxs
+ 'MSGFMT',
+ 'XGETTEXT',
+ 'MSGMERGE',
+ 'WANTED_LANGUAGES',
+
+ # Not needed because we don't build the server / PLs with the generated makefile
+ 'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS',
+ 'DTRACEFLAGS', # only server has dtrace probes
+
+ 'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
+ 'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
+
+ # possible that some of these are referenced explicitly in pgxs makefiles?
+ # For now not worth it.
+ 'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD', 'TCL_SHLIB_LD_LIBS',
+
+ 'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
+
+ 'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
+
+ 'UUID_LIBS',
+
+ 'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
+
+ 'ICU_LIBS',
+]
+
+foreach pe : pgxs_empty
+ pgxs_cdata.set(pe, '')
+endforeach
+
+pgxs_dirs = {
+ 'prefix': get_option('prefix'),
+
+ 'bindir': '${exec_prefix}' / get_option('bindir'),
+ 'datarootdir': '${prefix}' / get_option('datadir'),
+ 'datadir': '${datarootdir}',
+ 'docdir': '${prefix}' / dir_doc,
+ 'exec_prefix': '${prefix}',
+ 'htmldir': '${prefix}' / dir_doc_html, #?
+ 'includedir': '${prefix}' / get_option('includedir'),
+ 'libdir': '${exec_prefix}' / get_option('libdir'),
+ 'localedir': '${prefix}' / get_option('localedir'),
+ 'mandir': '${prefix}' / get_option('mandir'),
+ 'sysconfdir': '${prefix}' / get_option('sysconfdir'),
+}
+
+foreach d, p : pgxs_dirs
+ pgxs_cdata.set(d, p)
+endforeach
+
+pgxs_deps = {
+ 'bonjour': bonjour,
+ 'bsd_auth': bsd_auth,
+ 'gssapi': gssapi,
+ 'icu': icu,
+ 'ldap': ldap,
+ 'libxml': libxml,
+ 'libxslt': libxslt,
+ 'llvm': llvm,
+ 'lz4': lz4,
+ 'nls' : libintl,
+ 'pam' : pam,
+ 'perl': perl_dep,
+ 'python': python3_dep,
+ 'readline': readline,
+ 'selinux': selinux,
+ 'systemd': systemd,
+ 'tcl': tcl_dep,
+ 'zlib': zlib,
+ 'zstd': zstd,
+}
+foreach d, v : pgxs_deps
+ pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
+endforeach
+
+pgxs_cdata.set('with_ssl', get_option('ssl'))
+pgxs_cdata.set('with_uuid', uuidopt)
+
+makefile_global = configure_file(input: 'Makefile.global.in',
+ output : 'Makefile.global',
+ configuration : pgxs_cdata,
+ install: true,
+ install_dir: dir_pgxs / 'src')
+configure_files += makefile_global
+
+# FIXME: check if exists
+makefile_port = configure_file(
+ input: 'makefiles' / 'Makefile.@0@'.format(host_system),
+ output: 'Makefile.port',
+ copy: true,
+ install_dir: dir_pgxs / 'src')
+configure_files += makefile_port
+
+install_data(
+ 'Makefile.shlib', 'nls-global.mk',
+ install_dir: dir_pgxs / 'src')
+
+install_data(
+ 'makefiles/pgxs.mk',
+ install_dir: dir_pgxs / 'src' / 'makefiles')
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
new file mode 100644
index 00000000000..5832950553a
--- /dev/null
+++ b/src/timezone/meson.build
@@ -0,0 +1,53 @@
+# files to build into backend
+timezone_sources = files(
+ 'localtime.c',
+ 'pgtz.c',
+ 'strftime.c',
+)
+
+
+timezone_inc = include_directories('.')
+
+timezone_localtime_source = files('localtime.c')
+
+# files needed to build zic utility program
+zic_sources = files(
+ 'zic.c'
+)
+
+# we now distribute the timezone data as a single file
+tzdata = files(
+ 'data/tzdata.zi'
+)
+
+
+if get_option('system-tzdata') == ''
+ # FIXME: For cross builds, it would need a native built libpgport/pgcommon to
+ # build our zic. But for that we'd need to run a good chunk of the configure
+ # tests both natively and cross. Unclear if it's worth it.
+ if meson.is_cross_build()
+ zic = find_program(get_option('ZIC'), native: true, required: true)
+ else
+ zic = executable('zic', zic_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args + {'install': false}
+ )
+ endif
+
+ tzdata = custom_target('tzdata',
+ input: tzdata,
+ output: ['timezone'],
+ command: [zic, '-d', '@OUTPUT@', '@INPUT@'],
+ install: true,
+ install_dir: dir_data,
+ )
+
+# FIXME: make sorts this - but the file isn't actually used, so ...
+abbrevs_txt = custom_target('abbrevs.txt',
+ input: tzdata,
+ output: ['abbrevs.txt'],
+ command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'],
+ capture: true)
+endif
+
+subdir('tznames')
diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build
new file mode 100644
index 00000000000..7e0a682bd9e
--- /dev/null
+++ b/src/timezone/tznames/meson.build
@@ -0,0 +1,21 @@
+tznames = files(
+ 'Africa.txt',
+ 'America.txt',
+ 'Antarctica.txt',
+ 'Asia.txt',
+ 'Atlantic.txt',
+ 'Australia.txt',
+ 'Etc.txt',
+ 'Europe.txt',
+ 'Indian.txt',
+ 'Pacific.txt',
+)
+
+tznames_sets = files(
+ 'Default',
+ 'Australia',
+ 'India')
+
+install_data(tznames, tznames_sets,
+ install_dir: dir_data / 'timezonesets',
+)
diff --git a/src/tools/find_meson b/src/tools/find_meson
new file mode 100755
index 00000000000..583ec7e6f68
--- /dev/null
+++ b/src/tools/find_meson
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+import os
+import shlex
+import sys
+
+to_print = []
+
+if 'MUON_PATH' in os.environ:
+ to_print += ['muon', os.environ['MUON_PATH']]
+else:
+ mesonintrospect = os.environ['MESONINTROSPECT']
+ components = shlex.split(mesonintrospect)
+
+ if len(components) < 2:
+ print('expected more than two components, got: %s' % components)
+ sys.exit(1)
+
+ if components[-1] != 'introspect':
+ print('expected introspection at the end')
+ sys.exit(1)
+
+ to_print += ['meson'] + components[:-1]
+
+print('\n'.join(to_print), end='')
+
+sys.exit(0)
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..7d3f49da427
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import subprocess
+import sys
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--name', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--privdir', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+outdir = os.path.realpath(args.outdir)
+privdir = os.path.realpath(args.privdir)
+
+#index = os.path.realpath(args.index)
+index = '{0}/{1}.index.bc'.format(outdir, args.name)
+destdir = '{0}/{1}'.format(outdir, args.name)
+
+# Remove old contents if exist
+if os.path.exists(destdir):
+ shutil.rmtree(destdir)
+
+shutil.copytree(privdir, destdir)
+
+# Change working directory for irlink to link correctly
+os.chdir(args.outdir)
+
+file_names = [args.name + input.replace(args.privdir, '') for input in args.INPUT]
+command = [args.lto, '-thinlto', '-thinlto-action=thinlink', '-o', index] + file_names
+res = subprocess.run(command)
+
+exit(res.returncode)
diff --git a/src/tools/pgflex b/src/tools/pgflex
new file mode 100755
index 00000000000..13d73d50cb4
--- /dev/null
+++ b/src/tools/pgflex
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--flex', dest='flex_command', help='flex executable to run', type=str)
+parser.add_argument('--perl', dest='perl_command', help='perl executable to run', type=str)
+parser.add_argument('--builddir', dest='builddir', help='build directory of meson build', type=str)
+parser.add_argument('--privatedir', dest='privatedir', help='temporary directory to avoid conflicts', type=str)
+parser.add_argument('--fix_warning_script', dest='fix_warning_script', help='script for fixing warnings', default='')
+parser.add_argument('-b', dest='no_backup', action='store_true', help='whether no_backup is enabled or not')
+parser.add_argument('-o', dest='output_file', help='output file')
+parser.add_argument('--stamp_header', dest='stamp_header', help='', default=None)
+
+args, rest = parser.parse_known_args()
+rest, input_file = rest[:-1], rest[-1]
+
+# since 'lex.backup' is always named that,
+# change working directory to temporary directory
+# to avoid conflicts
+os.chdir(os.path.dirname(args.privatedir))
+
+# make paths absolute if it is not absolute,
+# msbuild uses absolute paths as default
+args.output_file = args.output_file if os.path.isabs(args.output_file) else os.path.join(args.builddir, args.output_file)
+input_file = input_file if os.path.isabs(input_file) else os.path.join(args.builddir, input_file)
+
+# set flex flags
+if args.no_backup:
+ flex_flags = ['-o', args.output_file, '-b'] + rest + [input_file]
+else:
+ flex_flags = ['-o', args.output_file] + rest + [input_file]
+
+# create .c file from .l file
+command = [args.flex_command] + flex_flags
+subprocess.run(command, check=True)
+
+ # check lex.backup
+if args.no_backup:
+ with open('lex.backup') as lex:
+ if sum(1 for _ in lex) != 1:
+ sys.exit('Scanner requires backup; see lex.backup.')
+ os.remove('lex.backup')
+
+# fix warnings
+if args.fix_warning_script:
+ # make paths absolute if it is not absolute
+ args.fix_warning_script = args.fix_warning_script if os.path.isabs(args.fix_warning_script) else os.path.join(args.builddir, args.fix_warning_script)
+
+ command = [args.perl_command, args.fix_warning_script, args.output_file]
+ subprocess.run(command, check=True)
+
+#
+stamp_header = args.stamp_header
+if stamp_header != None:
+ if not os.path.isabs(stamp_header):
+ stamp_header = os.path.join(args.builddir, stamp_header)
+ with open(stamp_header, mode='w') as fh:
+ pass
diff --git a/src/tools/rcgen b/src/tools/rcgen
new file mode 100755
index 00000000000..ab35e952959
--- /dev/null
+++ b/src/tools/rcgen
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import argparse
+
+parser = argparse.ArgumentParser(description='generate PostgreSQL rc file')
+
+parser.add_argument('INPUT', type=argparse.FileType('r'))
+parser.add_argument('-o', '--output', type=argparse.FileType('w'), required=True)
+parser.add_argument('--depfile', type=argparse.FileType('w'), required=False)
+
+parser.add_argument('--FILEDESC', type=str, required=True)
+parser.add_argument('--NAME', type=str, required=True)
+parser.add_argument('--VFT_TYPE', type=str, required=True)
+parser.add_argument('--FILEENDING', type=str, required=True)
+parser.add_argument('--ICO', type=str)
+
+
+args = parser.parse_args()
+
+data = args.INPUT.read()
+
+data = data.replace('@FILEDESC@', args.FILEDESC)
+data = data.replace('@NAME@', args.NAME)
+data = data.replace('@VFT_TYPE@', args.VFT_TYPE)
+data = data.replace('@FILEENDING@', args.FILEENDING)
+
+if args.ICO:
+ data = data.replace('@ICO@', args.ICO)
+ if args.depfile:
+ args.depfile.write("{0} : {1}\n".format(args.INPUT.name, args.ICO))
+else:
+ data = data.replace("IDI_ICON ICON \"@ICO@\"\n", '')
+
+args.output.write(data)
diff --git a/src/tools/relativize_shared_library_references b/src/tools/relativize_shared_library_references
new file mode 100755
index 00000000000..db6431639f1
--- /dev/null
+++ b/src/tools/relativize_shared_library_references
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*-python-*-
+
+# This script updates a macos postgres installation to reference all internal
+# shared libraries using rpaths, leaving absolute install_names in the
+# libraries themselves intact.
+
+import os
+import shlex
+import sys
+import json
+import subprocess
+import shutil
+
+
+def installed_path(destdir, path):
+ if destdir is not None:
+ return f'{destdir}{path}'
+ else:
+ return path
+
+
+def collect_information():
+ shared_libraries = []
+ executables = []
+ shared_modules = []
+
+ targets = json.load(open(os.path.join(build_root, 'meson-info', 'intro-targets.json')))
+ installed = json.load(open(os.path.join(build_root, 'meson-info', 'intro-installed.json')))
+
+ for target in targets:
+ if not target['installed']:
+ continue
+
+ filenames = target['filename']
+
+ if target['type'] == 'shared library':
+ assert(len(filenames) == 1)
+ filename = filenames[0]
+
+ shared_libraries.append(installed[filename])
+
+ if target['type'] == 'executable':
+ assert(len(filenames) == 1)
+ filename = filenames[0]
+ executables.append(installed[filename])
+
+ if target['type'] == 'shared module':
+ assert(len(filenames) == 1)
+ filename = filenames[0]
+ shared_modules.append(installed[filename])
+
+ return shared_libraries, executables, shared_modules
+
+
+def patch_references(destdir, shared_libraries, executables, shared_modules):
+ install_name_tool = [shutil.which('install_name_tool')]
+
+ for lib in shared_libraries:
+ libname = os.path.basename(lib)
+ libpath = installed_path(destdir, lib)
+ newref = f'@rpath/{libname}'
+
+ for patch in shared_modules + executables:
+ patchpath = installed_path(destdir, patch)
+
+ #print(f'in {patchpath} replace reference to {libpath} with {newref}')
+ if not os.path.exists(patchpath):
+ print(f"path {patchpath} doesn't exist", file=sys.stderr)
+ sys.exit(1)
+
+ subprocess.check_call(install_name_tool + ['-change', lib, newref, patchpath])
+
+
+if __name__ == '__main__':
+ build_root = os.environ['MESON_BUILD_ROOT']
+ destdir = os.environ.get('DESTDIR', None)
+
+ print(f'making references to shared libraries relative, destdir is {destdir}', file=sys.stderr)
+
+ shared_libraries, executables, shared_modules = collect_information()
+ patch_references(destdir, shared_libraries, executables, shared_modules)
+
+ sys.exit(0)
diff --git a/src/tools/relpath.py b/src/tools/relpath.py
new file mode 100755
index 00000000000..87bcb496ab5
--- /dev/null
+++ b/src/tools/relpath.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+print(os.path.relpath(sys.argv[2], start=sys.argv[1]))
diff --git a/src/tools/testwrap b/src/tools/testwrap
new file mode 100755
index 00000000000..03fe135f4a8
--- /dev/null
+++ b/src/tools/testwrap
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+
+import argparse
+import shutil
+import subprocess
+import os
+import sys
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--srcdir', help='source directory of test', type=str)
+parser.add_argument('--basedir', help='base directory of test', type=str)
+parser.add_argument('--builddir', help='build directory of meson build', type=str)
+parser.add_argument('--testgroup', help='test group', type=str)
+parser.add_argument('--testname', help='test name', type=str)
+
+args, test_command = parser.parse_known_args()
+
+if args.testname.endswith('.pl'):
+ args.testname = args.testname[:-3]
+
+testdir = '{}/testrun/{}/{}'.format(args.basedir, args.testgroup, args.testname)
+
+print('# executing test in {} group {} test {}, builddir {}'
+ .format(testdir, args.testgroup, args.testname, args.builddir))
+sys.stdout.flush()
+
+if os.path.exists(testdir) and os.path.isdir(testdir):
+ shutil.rmtree(testdir)
+os.makedirs(testdir)
+
+os.chdir(args.srcdir)
+
+# mark test as having started
+open(os.path.join(testdir, 'test.start'), 'x')
+
+env_dict = {**os.environ, 'TESTOUTDIR': testdir, 'TESTDIR': args.builddir}
+sp = subprocess.run(test_command, env=env_dict)
+
+if (sp.returncode == 0):
+ print('# test succeeded')
+ open(os.path.join(testdir, 'test.success'), 'x')
+else:
+ print('# test failed')
+ open(os.path.join(testdir, 'test.fail'), 'x')
+sys.exit(sp.returncode)
--
2.37.0.3.g30cc8d0f14
v11-0009-meson-ci-Build-both-with-meson-and-as-before.patch (text/x-diff, 31.1K) download
From 80f87362dc69c5bff3fc1de659894860723c5030 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 20 Apr 2022 12:08:09 -0700
Subject: [PATCH v11 9/9] meson: ci: Build both with meson and as before
Author: Andres Freund <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Author: Justin Pryzby <pryzby@telsasoft.com>
---
.cirrus.yml | 839 +++++++++++++++++-
src/tools/ci/docker/linux_centos7 | 57 ++
src/tools/ci/docker/linux_centos8 | 54 ++
src/tools/ci/docker/linux_fedora_rawhide | 49 +
src/tools/ci/docker/linux_opensuse_tumbleweed | 56 ++
5 files changed, 1009 insertions(+), 46 deletions(-)
create mode 100644 src/tools/ci/docker/linux_centos7
create mode 100644 src/tools/ci/docker/linux_centos8
create mode 100644 src/tools/ci/docker/linux_fedora_rawhide
create mode 100644 src/tools/ci/docker/linux_opensuse_tumbleweed
diff --git a/.cirrus.yml b/.cirrus.yml
index 81eb8a9996d..9ea4365f94a 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,13 +22,14 @@ env:
CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS
CHECKFLAGS: -Otarget
PROVE_FLAGS: --timer
+ MTEST_ARGS: --print-errorlogs --no-rebuild -C build
PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests
TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf
PG_TEST_EXTRA: kerberos ldap ssl
# What files to preserve in case tests fail
-on_failure: &on_failure
+on_failure_ac: &on_failure_ac
log_artifacts:
paths:
- "**/*.log"
@@ -36,9 +37,41 @@ on_failure: &on_failure
- "**/regress_log_*"
type: text/plain
-task:
- name: FreeBSD - 13
+on_failure_meson: &on_failure_meson
+ testrun_artifacts:
+ paths:
+ - "build/testrun/**/*.log"
+ - "build/testrun/**/*.diffs"
+ - "build/testrun/**/regress_log_*"
+ type: text/plain
+ # In theory it'd be nice to upload the junit files meson generates, so that
+ # cirrus will nicely annotate the commit. Unfortunately the files don't
+ # contain identifyable file + line numbers right now, so the annotations
+ # don't end up useful. We could probably improve on that with a some custom
+ # conversion script, but ...
+ meson_log_artifacts:
+ path: "build/meson-logs/*.txt"
+ type: text/plain
+
+
+# configure feature flags, shared between the task running the BSD tests
+# these feature flags don't include --with-gssapi and --with-uuid=bsd
+# since these are not working on openBSD and netBSD
+BSD_CONFIGURE_FEATURES: &BSD_CONFIGURE_FEATURES >-
+ --with-icu
+ --with-ldap
+ --with-libxml
+ --with-libxslt
+ --with-lz4
+ --with-pam
+ --with-perl
+ --with-python
+ --with-ssl=openssl
+ --with-tcl --with-tclconfig=${TCL_CONFIG_PATH}
+
+
+freebsd_template: &freebsd_template
env:
# FreeBSD on GCP is slow when running with larger number of CPUS /
# jobs. Using one more job than cpus seems to work best.
@@ -48,6 +81,12 @@ task:
CCACHE_DIR: /tmp/ccache_dir
+ TCL_CONFIG_PATH: /usr/local/lib/tcl8.6/
+
+ CFLAGS: "-Og -ggdb"
+
+ BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*'
compute_engine_instance:
@@ -80,6 +119,13 @@ task:
setup_additional_packages_script: |
#pkg install -y ...
+
+task:
+ <<: *freebsd_template
+
+ name: FreeBSD - 13 - Autoconf
+ trigger_type: manual
+
# NB: Intentionally build without --with-llvm. The freebsd image size is
# already large enough to make VM startup slow, and even without llvm
# freebsd already takes longer than other platforms except for windows.
@@ -90,16 +136,7 @@ task:
--enable-nls \
\
--with-gssapi \
- --with-icu \
- --with-ldap \
- --with-libxml \
- --with-libxslt \
- --with-lz4 \
- --with-pam \
- --with-perl \
- --with-python \
- --with-ssl=openssl \
- --with-tcl --with-tclconfig=/usr/local/lib/tcl8.6/ \
+ ${BSD_CONFIGURE_FEATURES} \
--with-uuid=bsd \
--with-zstd \
\
@@ -107,8 +144,7 @@ task:
--with-libs=/usr/local/lib \
\
CC="ccache cc" \
- CXX="ccache c++" \
- CFLAGS="-Og -ggdb"
+ CXX="ccache c++"
EOF
build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
upload_caches: ccache
@@ -117,14 +153,274 @@ task:
# platforms without support for locking pipes. See also
# https://savannah.gnu.org/bugs/?60774
# script uses pseudo-ttys, which do support locking.
- test_world_script:
- - su postgres -c "time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}"
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ time script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
+ EOF
on_failure:
- <<: *on_failure
+ <<: *on_failure_ac
cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+task:
+ <<: *freebsd_template
+
+ name: FreeBSD - 13 - Meson
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+ cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores
+
+
+netbsd_template: &netbsd_template
+ env:
+ CPUS: 2
+ BUILD_JOBS: 3
+ TEST_JOBS: 3
+
+ CIRRUS_WORKING_DIR: /home/postgres/postgres
+ CCACHE_DIR: /tmp/ccache_dir
+
+ PATH: /usr/sbin:$PATH
+ TCL_CONFIG_PATH: /usr/pkg/lib
+
+ # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+ # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+ # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+ LANG: "C"
+ LC_ALL: "C"
+
+ CFLAGS: "-Og -ggdb"
+
+ BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+ only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*netbsd.*'
+
+ compute_engine_instance:
+ image_project: $IMAGE_PROJECT
+ image: family/pg-ci-netbsd-9-postgres
+ platform: netbsd
+ cpu: $CPUS
+ memory: 4G
+ disk: 25
+
+ sysinfo_script: |
+ locale
+ id
+ uname -a
+ ulimit -a -H && ulimit -a -S
+ export
+
+ ccache_cache:
+ folder: $CCACHE_DIR
+
+ create_user_script: |
+ useradd postgres
+ chown -R postgres:users /home/postgres
+ mkdir -p ${CCACHE_DIR}
+ chown -R postgres:users ${CCACHE_DIR}
+
+
+task:
+ <<: *netbsd_template
+
+ name: NetBSD - 9 - Autoconf
+ trigger_type: manual
+
+ # --with-uuid=bsd is not set since 'bsd' uuid option
+ # is not working on netBSD. See
+ # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+ # And other uuid options are not available on netBSD
+ configure_script: |
+ su postgres <<-EOF
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ ${BSD_CONFIGURE_FEATURES} \
+ \
+ --with-includes=/usr/pkg/include --with-libs=/usr/pgk/lib \
+ CC="ccache cc" \
+ CXX="ccache c++" \
+ LDFLAGS="-Wl,-R/usr/pkg/lib" \
+ \
+ PYTHON=python3.9
+ EOF
+ build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ <<: *netbsd_template
+
+ name: NetBSD - 9 - Meson
+
+ # -Duuid=bsd is not set since 'bsd' uuid option
+ # is not working on netBSD. See
+ # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+ # And other uuid options are not available on netBSD
+ configure_script: |
+ su postgres <<-EOF
+ meson setup \
+ --buildtype debug \
+ -Dcassert=true -Dssl=openssl \
+ -Dextra_lib_dirs=/usr/pkg/lib -Dextra_include_dirs=/usr/pkg/include \
+ build
+ EOF
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
+openbsd_template: &openbsd_template
+ env:
+ CPUS: 2
+ BUILD_JOBS: 3
+ TEST_JOBS: 3
+
+ CIRRUS_WORKING_DIR: /home/postgres/postgres
+ CCACHE_DIR: /tmp/ccache_dir
+
+ PATH: /usr/sbin:$PATH
+ TCL_CONFIG_PATH: /usr/local/lib/tcl/tcl8.6/
+
+ # Postgres interprets LANG as a 'en_US.UTF-8' but it is 'C', then
+ # Postgres tries to set 'LC_COLLATE' to 'en_US.UTF-8' but it is not
+ # changeable. Initdb fails because of that. So, LANG is forced to be 'C'.
+ LANG: "C"
+ LC_ALL: "C"
+
+ CFLAGS: "-Og -ggdb"
+
+ BSD_CONFIGURE_FEATURES: *BSD_CONFIGURE_FEATURES
+
+ only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*openbsd.*'
+
+ compute_engine_instance:
+ image_project: $IMAGE_PROJECT
+ image: family/pg-ci-openbsd-7-postgres
+ platform: openbsd
+ cpu: $CPUS
+ memory: 4G
+ disk: 25
+
+ sysinfo_script: |
+ locale
+ id
+ uname -a
+ ulimit -a -H && ulimit -a -S
+ export
+
+ ccache_cache:
+ folder: $CCACHE_DIR
+
+ create_user_script: |
+ useradd postgres
+ chown -R postgres:postgres /home/postgres
+ mkdir -p ${CCACHE_DIR}
+ chown -R postgres:postgres ${CCACHE_DIR}
+
+
+task:
+ <<: *openbsd_template
+
+ name: OpenBSD - 7 - Autoconf
+ trigger_type: manual
+
+ # --with-uuid option is set to 'e2fs' since 'bsd' uuid option
+ # is not working on openBSD. See
+ # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+ # (same error applies for openBSD)
+ configure_script: |
+ su postgres <<-EOF
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ ${BSD_CONFIGURE_FEATURES} \
+ --with-uuid=e2fs \
+ \
+ --with-includes=/usr/local/include --with-libs=/usr/local/lib \
+ CC="ccache cc" \
+ CXX="ccache c++" \
+ LDFLAGS="-Wl,-R/usr/local/lib"
+ EOF
+ build_script: su postgres -c "gmake -s -j${BUILD_JOBS} world-bin"
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ gmake -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ <<: *openbsd_template
+
+ name: OpenBSD - 7 - Meson
+
+ # -Duuid option is set to 'e2fs' since 'bsd' uuid option
+ # is not working on openBSD. See
+ # https://www.postgresql.org/message-id/17358-89806e7420797025@postgresql.org
+ # (same error applies for openBSD)
+ configure_script: |
+ su postgres <<-EOF
+ meson setup \
+ --buildtype debug \
+ -Dcassert=true -Dssl=openssl -Duuid=e2fs \
+ -Dextra_include_dirs=/usr/local/include -Dextra_lib_dirs=/usr/local/lib \
+ build
+ EOF
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
# configure feature flags, shared between the task running the linux tests and
# the CompilerWarnings task
LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
@@ -141,14 +437,28 @@ LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >-
--with-selinux
--with-ssl=openssl
--with-systemd
- --with-tcl --with-tclconfig=/usr/lib/tcl8.6/
- --with-uuid=ossp
+ --with-tcl --with-tclconfig=${TCL_DIR:/usr/lib/tcl8.6/}
+ --with-uuid=${UUID:ossp}
--with-zstd
-task:
- name: Linux - Debian Bullseye
+# configure preparation scripts, shared between tasks running the linux tests
+linux_preparation_scripts_template: &linux_preparation_scripts_template
+ sysinfo_script: |
+ id
+ uname -a
+ cat /proc/cmdline
+ ulimit -a -H && ulimit -a -S
+ export
+ create_user_script: |
+ useradd -m -U postgres
+ chown -R postgres:postgres .
+ mkdir -p ${CCACHE_DIR}
+ chown -R postgres:postgres ${CCACHE_DIR}
+ su postgres -c "ulimit -l -H && ulimit -l -S"
+
+linux_debian_template: &linux_debian_template
env:
CPUS: 4
BUILD_JOBS: 4
@@ -157,6 +467,9 @@ task:
CCACHE_DIR: /tmp/ccache_dir
DEBUGINFOD_URLS: "https://debuginfod.debian.net"
+ CFLAGS: "-Og -ggdb"
+ CXXFLAGS: "-Og -ggdb"
+
LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
@@ -171,19 +484,9 @@ task:
ccache_cache:
folder: ${CCACHE_DIR}
- sysinfo_script: |
- id
- uname -a
- cat /proc/cmdline
- ulimit -a -H && ulimit -a -S
- export
- create_user_script: |
- useradd -m postgres
- chown -R postgres:postgres .
- mkdir -p ${CCACHE_DIR}
- chown -R postgres:postgres ${CCACHE_DIR}
+ set_limits_script: |
echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf
- su postgres -c "ulimit -l -H && ulimit -l -S"
+ <<: *linux_preparation_scripts_template
setup_core_files_script: |
mkdir -m 770 /tmp/cores
chown root:postgres /tmp/cores
@@ -192,6 +495,12 @@ task:
#apt-get update
#DEBIAN_FRONTEND=noninteractive apt-get -y install ...
+
+task:
+ <<: *linux_debian_template
+
+ name: Linux - Debian Bullseye - Autoconf
+
configure_script: |
su postgres <<-EOF
./configure \
@@ -202,9 +511,7 @@ task:
\
CC="ccache gcc" \
CXX="ccache g++" \
- CLANG="ccache clang" \
- CFLAGS="-Og -ggdb" \
- CXXFLAGS="-Og -ggdb"
+ CLANG="ccache clang"
EOF
build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin"
upload_caches: ccache
@@ -216,13 +523,353 @@ task:
EOF
on_failure:
- <<: *on_failure
+ <<: *on_failure_ac
+ cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
+
+
+task: &linux_debian_bullseye_meson
+ <<: *linux_debian_template
+
+ name: Linux - Debian Bullseye - Meson
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=enabled build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores
task:
- name: macOS - Monterey
+ <<: *linux_debian_bullseye_meson
+ name: Linux - Debian Sid - Meson
+ trigger_type: manual
+
+ compute_engine_instance:
+ image: family/pg-ci-sid
+
+
+linux_opensuse_template: &linux_opensuse_template
+ env:
+ CPUS: 4
+ BUILD_JOBS: 4
+ TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+ CCACHE_DIR: /tmp/ccache_dir
+ DEBUGINFOD_URLS: "https://debuginfod.opensuse.org/"
+
+ TCL_DIR: /usr/lib64/
+ UUID: e2fs
+
+ CFLAGS: "-Og -ggdb"
+ CXXFLAGS: "-Og -ggdb"
+
+ LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+ only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+ container:
+ dockerfile: src/tools/ci/docker/linux_opensuse_tumbleweed
+ cpu: $CPUS
+ memory: 4G
+
+ ccache_cache:
+ folder: ${CCACHE_DIR}
+
+ <<: *linux_preparation_scripts_template
+
+
+task:
+ <<: *linux_opensuse_template
+
+ name: Linux - OpenSuse Tumbleweed - Autoconf
+ trigger_type: manual
+
+ configure_script: |
+ su postgres <<-EOF
+ export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" && \
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ ${LINUX_CONFIGURE_FEATURES}
+ \
+ CC="ccache gcc" \
+ CXX="ccache g++" \
+ CLANG="ccache clang"
+ EOF
+ build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ <<: *linux_opensuse_template
+
+ name: Linux - OpenSuse Tumbleweed (LLVM) - Meson
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Dllvm=enabled build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
+linux_rhel_template: &linux_rhel_template
+ env:
+ CPUS: 4
+ BUILD_JOBS: 4
+ TEST_JOBS: 8 # experimentally derived to be a decent choice
+
+ CCACHE_DIR: /tmp/ccache_dir
+ DEBUGINFOD_URLS: ${DEBUGINFO}
+
+ TCL_DIR: /usr/lib64/
+ UUID: e2fs
+
+ CFLAGS: "-Og -ggdb"
+ CXXFLAGS: "-Og -ggdb"
+
+ LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES
+
+ only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*'
+
+ container:
+ dockerfile: ${DOCKERFILE_PATH}
+ cpu: $CPUS
+ memory: 4G
+
+ ccache_cache:
+ folder: ${CCACHE_DIR}
+
+ <<: *linux_preparation_scripts_template
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+ DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Fedora Rawhide - Autoconf
+ trigger_type: manual
+
+ configure_script: |
+ su postgres <<-EOF
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ ${LINUX_CONFIGURE_FEATURES}
+ \
+ CC="ccache gcc" \
+ CXX="ccache g++" \
+ CLANG="ccache clang"
+ EOF
+ build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_fedora_rawhide
+ DEBUGINFO: "https://debuginfod.fedoraproject.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Fedora Rawhide - Meson
+ trigger_type: manual
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+ DEBUGINFO: "http://debuginfo.centos.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Centos 8 - Autoconf
+ trigger_type: manual
+
+ configure_script: |
+ su postgres <<-EOF
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ ${LINUX_CONFIGURE_FEATURES}
+ \
+ CC="ccache gcc" \
+ CXX="ccache g++" \
+ CLANG="ccache clang"
+ EOF
+ build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_centos8
+ DEBUGINFO: "http://debuginfo.centos.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Centos 8 - Meson
+ trigger_type: manual
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+ DEBUGINFO: "http://debuginfo.centos.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Centos 7 - Autoconf
+ trigger_type: manual
+
+ configure_script: |
+ su postgres <<-EOF
+ PYTHON=python3 \
+ ./configure \
+ --enable-cassert --enable-debug --enable-tap-tests \
+ --enable-nls \
+ \
+ --with-gssapi \
+ --with-icu \
+ --with-ldap \
+ --with-libxml \
+ --with-libxslt \
+ --with-lz4 \
+ --with-pam \
+ --with-perl \
+ --with-python \
+ --with-selinux \
+ --with-ssl=openssl \
+ --with-systemd \
+ --with-tcl --with-tclconfig=/usr/lib64/ \
+ --with-uuid=e2fs \
+ \
+ CC="ccache gcc" \
+ CXX="ccache g++" \
+ CLANG="ccache clang"
+ EOF
+ build_script: su postgres -c 'make -s -j${BUILD_JOBS} world-bin'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_ac
+
+
+task:
+ env:
+ DOCKERFILE_PATH: src/tools/ci/docker/linux_centos7
+ DEBUGINFO: "http://debuginfo.centos.org/"
+
+ <<: *linux_rhel_template
+
+ name: Linux - Centos 7 - Meson
+ trigger_type: manual
+
+ configure_script:
+ - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs build'
+
+ build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}'
+ upload_caches: ccache
+
+ test_world_script: |
+ su postgres <<-EOF
+ ulimit -c unlimited
+ meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+ EOF
+
+ on_failure:
+ <<: *on_failure_meson
+
+
+macos_template: &macos_template
env:
CPUS: 12 # always get that much for cirrusci macOS instances
BUILD_JOBS: $CPUS
@@ -233,6 +880,9 @@ task:
HOMEBREW_CACHE: ${HOME}/homebrew-cache
PERL5LIB: ${HOME}/perl5/lib/perl5
+ CFLAGS: "-Og -ggdb"
+ CXXFLAGS: "-Og -ggdb"
+
only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*'
osx_instance:
@@ -269,6 +919,7 @@ task:
llvm \
lz4 \
make \
+ meson \
openldap \
openssl \
python \
@@ -280,6 +931,14 @@ task:
ccache_cache:
folder: $CCACHE_DIR
+
+
+task:
+ <<: *macos_template
+
+ name: macOS - Monterey - Autoconf
+ trigger_type: manual
+
configure_script: |
brewpath="/usr/local"
INCLUDES="${brewpath}/include:${INCLUDES}"
@@ -319,8 +978,6 @@ task:
CC="ccache cc" \
CXX="ccache c++" \
CLANG="ccache ${brewpath}/llvm/bin/ccache" \
- CFLAGS="-Og -ggdb" \
- CXXFLAGS="-Og -ggdb" \
\
LLVM_CONFIG=${brewpath}/llvm/bin/llvm-config \
PYTHON=python3
@@ -334,13 +991,42 @@ task:
script test.log gmake -s -j${TEST_JOBS} ${CHECK} ${CHECKFLAGS}
on_failure:
- <<: *on_failure
+ <<: *on_failure_ac
cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
task:
- name: Windows - Server 2019, VS 2019
+ <<: *macos_template
+ name: macOS - Monterey - Meson
+
+ configure_script: |
+ brewpath="/usr/local"
+ PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+ for pkg in icu4c krb5 openldap openssl ; do
+ pkgpath="${brewpath}/opt/${pkg}"
+ PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+ done
+
+ export PKG_CONFIG_PATH
+
+ meson setup --buildtype debug -Dcassert=true -Dssl=openssl -Duuid=e2fs -Ddtrace=auto build
+
+ build_script: ninja -C build -j${BUILD_JOBS}
+ upload_caches: ccache
+
+ tests_world_script:
+ - ulimit -c unlimited
+ - ulimit -n 1024
+ - meson test $MTEST_ARGS --num-processes ${TEST_JOBS}
+
+ on_failure:
+ <<: *on_failure_meson
+ cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores"
+
+
+windows_template: &windows_template
env:
# Half the allowed per-user CPU cores
CPUS: 4
@@ -402,6 +1088,11 @@ task:
setup_additional_packages_script: |
REM choco install -y --no-progress ...
+
+task:
+ <<: *windows_template
+ name: Windows - Server 2019, VS 2019 - Homegrown
+
configure_script:
# copy errors out when using forward slashes
- copy src\tools\ci\windows_build_config.pl src\tools\msvc\config.pl
@@ -451,10 +1142,65 @@ task:
%T_C% perl vcregress.pl ecpgcheck
on_failure:
- <<: *on_failure
+ <<: *on_failure_ac
+ crashlog_artifacts:
+ path: "crashlog-*.txt"
+
+
+task:
+ <<: *windows_template
+ name: Windows - Server 2019, VS 2019 - Meson & ninja
+
+ meson_install_script:
+ - pip install meson ninja
+
+ configure_script:
+ - vcvarsall x64
+ - mkdir subprojects
+ - meson wrap install lz4
+ - meson wrap install zlib
+ - meson setup --buildtype debug --backend ninja -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+ build_script:
+ - vcvarsall x64
+ - ninja -C build
+
+ check_world_script:
+ - vcvarsall x64
+ - meson test %MTEST_ARGS% --num-processes 10
+
+ on_failure:
+ <<: *on_failure_meson
+ crashlog_artifacts:
+ path: "crashlog-*.txt"
+
+
+task:
+ <<: *windows_template
+ name: Windows - Server 2019, VS 2019 - Meson & msbuild
+
+ meson_install_script:
+ - pip install meson
+
+ configure_script:
+ - vcvarsall x64
+ - mkdir subprojects
+ - meson wrap install lz4
+ - meson wrap install zlib
+ - meson setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=c:/windows/system32/tar.exe build
+
+ build_script:
+ - vcvarsall x64
+ - msbuild /p:UseMultiToolTask=true %MSBFLAGS% build\postgresql.sln
+
+ check_world_script:
+ - vcvarsall x64
+ - meson test %MTEST_ARGS% --num-processes 10
+
+ on_failure:
+ <<: *on_failure_meson
crashlog_artifacts:
path: "crashlog-*.txt"
- type: text/plain
task:
@@ -462,7 +1208,8 @@ task:
# To limit unnecessary work only run this once the normal linux test succeeds
depends_on:
- - Linux - Debian Bullseye
+ - Linux - Debian Bullseye - Meson
+ trigger_type: manual
env:
CPUS: 4
diff --git a/src/tools/ci/docker/linux_centos7 b/src/tools/ci/docker/linux_centos7
new file mode 100644
index 00000000000..3742890d961
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos7
@@ -0,0 +1,57 @@
+FROM centos:centos7
+# Enable powertools, EPEL and devtoolset repository
+RUN \
+ yum -y install dnf-plugins-core \
+ epel-release \
+ centos-release-scl-rh && \
+ \
+ yum -y update && \
+ yum -y install \
+ \
+ git \
+ perl \
+ perl-ExtUtils-Embed \
+ perl-IPC-Run \
+ perl-Test-Harness \
+ perl-Test-Simple \
+ \
+ bison \
+ ccache \
+ clang \
+ devtoolset-7-make \
+ flex \
+ gcc \
+ gettext \
+ \
+ krb5-devel \
+ libicu-devel \
+ libuuid-devel \
+ libxml2-devel \
+ libxslt-devel \
+ libzstd-devel \
+ lz4-devel \
+ openldap-devel \
+ openssl-devel \
+ pam-devel \
+ python3-devel \
+ readline-devel \
+ systemd-devel \
+ tcl-devel \
+ \
+ krb5-server \
+ krb5-server-ldap \
+ krb5-workstation \
+ lz4 \
+ openldap-clients \
+ openldap-servers \
+ openssl \
+ zstd \
+ \
+ && \
+ pip3 install meson && \
+ pip3 install ninja && \
+ yum clean all
+
+# Make version is 3.82 but required is > 4, adding devtoolset-7-make to the PATH
+ENV PATH="/opt/rh/devtoolset-7/root/usr/bin/:${PATH}"
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_centos8 b/src/tools/ci/docker/linux_centos8
new file mode 100644
index 00000000000..58f95847ef1
--- /dev/null
+++ b/src/tools/ci/docker/linux_centos8
@@ -0,0 +1,54 @@
+FROM quay.io/centos/centos:stream8
+# Enable powertools and EPEL repository
+RUN \
+ dnf -y install dnf-plugins-core && \
+ dnf config-manager --set-enabled powertools && \
+ dnf -y install epel-release && \
+ dnf -y update && \
+ dnf -y install \
+ \
+ git \
+ meson \
+ perl \
+ perl-IPC-Run \
+ \
+ bison \
+ ccache \
+ clang \
+ diffutils \
+ flex \
+ gcc \
+ gettext \
+ \
+ krb5-devel \
+ libicu-devel \
+ libuuid-devel \
+ libxml2-devel \
+ libxslt-devel \
+ libzstd-devel \
+ llvm-devel \
+ lz4-devel \
+ openldap-devel \
+ openssl-devel \
+ pam-devel \
+ python3-devel \
+ readline-devel \
+ systemd-devel \
+ tcl-devel \
+ \
+ krb5-server \
+ krb5-server-ldap \
+ krb5-workstation \
+ lz4 \
+ openldap-clients \
+ openldap-servers \
+ openssl \
+ zstd \
+ \
+ glibc-langpack-en \
+ \
+ && \
+ pip3 install ninja && \
+ yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_fedora_rawhide b/src/tools/ci/docker/linux_fedora_rawhide
new file mode 100644
index 00000000000..c95027cd6a7
--- /dev/null
+++ b/src/tools/ci/docker/linux_fedora_rawhide
@@ -0,0 +1,49 @@
+FROM fedora:rawhide
+RUN \
+ dnf -y update && \
+ dnf -y install \
+ git \
+ meson \
+ perl \
+ perl-IPC-Run \
+ \
+ bison \
+ ccache \
+ clang \
+ flex \
+ gcc \
+ gettext \
+ ninja-build \
+ \
+ krb5-devel \
+ libicu-devel \
+ libuuid-devel \
+ libxml2-devel \
+ libxslt-devel \
+ libzstd-devel \
+ llvm-devel \
+ lz4-devel \
+ openldap-devel \
+ openssl-devel \
+ pam-devel \
+ python3-devel \
+ readline-devel \
+ systemd-devel \
+ tcl-devel \
+ \
+ krb5-server \
+ krb5-server-ldap \
+ krb5-workstation \
+ lz4 \
+ openldap-clients \
+ openldap-servers \
+ openssl \
+ zstd \
+ \
+ langpacks-en \
+ glibc-langpack-en \
+ \
+ && \
+ yum clean all
+
+ENV LANG=en_US.UTF-8
diff --git a/src/tools/ci/docker/linux_opensuse_tumbleweed b/src/tools/ci/docker/linux_opensuse_tumbleweed
new file mode 100644
index 00000000000..07364ee85ff
--- /dev/null
+++ b/src/tools/ci/docker/linux_opensuse_tumbleweed
@@ -0,0 +1,56 @@
+FROM opensuse/tumbleweed
+RUN \
+ zypper -n clean -a && \
+ zypper -n ref && \
+ zypper -n dup && \
+ zypper -n update && \
+ zypper -n install \
+ diffutils \
+ git \
+ icu \
+ make \
+ meson \
+ perl-IPC-Run \
+ shadow \
+ systemd-devel \
+ util-linux \
+ \
+ bison \
+ ccache \
+ clang \
+ flex \
+ gcc \
+ gcc-c++ \
+ gettext-runtime \
+ ninja \
+ \
+ krb5-devel \
+ libicu-devel \
+ libldapcpp-devel \
+ liblz4-devel \
+ libopenssl-devel \
+ libselinux-devel \
+ libuuid-devel \
+ libxml2-devel \
+ libxslt-devel \
+ libzstd-devel \
+ llvm-devel \
+ pam-devel \
+ python38-devel \
+ readline-devel \
+ tcl-devel \
+ \
+ openldap2 \
+ openldap2-client \
+ \
+ krb5-client \
+ krb5-plugin-kdb-ldap \
+ krb5-server \
+ lz4 \
+ zstd \
+ \
+ && \
+ zypper -n clean -a
+
+# Fixing ICU errors caused by locale being set to 'POSIX'
+ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
--
2.37.0.3.g30cc8d0f14
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-17 13:50 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-08-17 13:50 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Andrew Dunstan <andrew@dunslane.net>
On 11.08.22 02:20, Andres Freund wrote:
> Attached is a new version of the meson patchset. Plenty changes:
I have various bits of comments on this.
- There are various references to "pch" (pre-compiled headers). Is
there more discussion anywhere about this? I don't know what this
would entail or whether there are any drawbacks to be aware of. The
new *_pch.h files don't have any comments. Maybe this should be a
separate patch later.
- About relativize_shared_library_references: We have had several
patches over the years for working around SIP stuff, and some of
them did essentially this, but we decided not to go ahead with them.
We could revisit that, but it should be a separate patch, not mixed
in with this.
- postgresql-extension.pc: Similarly, this ought to be a separate
patch. If we want people to use this, we'll need it in the makefile
build system anyway.
- -DFRONTEND is used somewhat differently from the makefiles. For
example, meson sets -DFRONTEND for pg_controldata, but the
makefiles don't. Conversely, the makefiles set -DFRONTEND for
ecpglib, but meson does not. This should be checked again to make
sure it all matches up.
- Option name spelling should be make consistent about underscores
versus hyphens. Built-in meson options use underscores, so we
should make the user-defined ones like that as well (some already
do). (wal-blocksize krb-srvnam system-tzdata tap-tests bsd-auth)
- I have found the variable name "cdata" for configuration_data() to
be less than clear. I see some GNOME projects to it that way, is
that where it's from? systemd uses "conf", maybe that's better.
- In the top-level meson.build, the "renaming" of the Windows system
name
host_system = host_machine.system() == 'windows' ? 'win32' :
host_machine.system()
build_system = build_machine.system() == 'windows' ? 'win32' :
build_machine.system()
seems unnecessary to me. Why not stick with the provided names?
- The c99_test ought to be not needed if the c_std project option is
used. Was there a problem with that?
- Is there a way to split up the top-level meson.build somehow? Maybe
just throw some stuff into included files? This might get out of
hand at some point.
- The PG_SYSROOT detection gives different results. On my system,
configure produces
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk,
meson produces
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk.
src/template/darwin goes out of its way to get a version-specific
result, so we need to carry that over somehow. (The difference does
result in differences in the built binaries.)
Then, some patches from me:
0001-Change-shared-library-installation-naming-on-macOS.patch
This changes the makefiles to make the shared library file naming on
macOS match what meson produces. I don't know what the situation is
on other platforms.
0002-meson-Fix-installation-name-of-libpgfeutils.patch
This was presumably an accidental mistake.
0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patch
This is needed to make NLS work for the libraries.
0004-meson-Add-darwin_versions-argument-for-libraries.patch
This is to make the output match what Makefile.shlib produces.
0005-meson-Fix-link-order-of-support-libraries.patch
0006-meson-Make-link-order-of-external-libraries-match-ma.patch
0007-WIP-meson-Make-link-order-of-object-files-match-make.patch
I have analyzed the produced binaries between both build systems to
make sure they match. If we link the files and libraries in different
orders, that becomes difficult. So this fixes this up a bit. 0005 is
needed for correctness in general, I think. 0006 is mostly cosmetic.
You probably wanted to make the library order alphabetical in the
meson files, which I'd support, but then we should change the
makefiles to match. Similarly, 0007, which is clearly a bit messy at
the moment, but we should try to sort that out either in the old or
the new build files.
And finally some comments on your patches:
meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H to pg_config.h.
This can go ahead.
meson: prereq: fix warning compat_informix/rnull.pgc with msvc
- $float f = 3.71;
+ $float f = (float) 3.71;
This could use float literals like
+ $float f = 3.71f;
Attachments: download all (7 files, .tar.gz)
0001-Change-shared-library-installation-naming-on-macOS.patch (text/plain, 1.3K) download
From 054b24e9ae5fc859f13c05d8150ef1168a477ce4 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:18:52 +0200
Subject: [PATCH 1/7] Change shared library installation naming on macOS
It is not customary to install a shared library with a minor version
number (libpq.5.16.dylib) on macOS. We just need the file with the
major version number (libpq.5.dylib) and the one without version
number (libpq.dylib). This also matches the installation layout used
by Meson.
---
src/Makefile.shlib | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 2af6192f0f..e4658320f8 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -122,7 +122,7 @@ ifeq ($(PORTNAME), darwin)
version_link = -compatibility_version $(SO_MAJOR_VERSION) -current_version $(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
endif
LINK.shared = $(COMPILER) -dynamiclib -install_name '$(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)' $(version_link) $(exported_symbols_list) -multiply_defined suppress
- shlib = lib$(NAME).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)$(DLSUFFIX)
+ shlib = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
shlib_major = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
else
# loadable module
--
2.37.1
0002-meson-Fix-installation-name-of-libpgfeutils.patch (text/plain, 796B) download
From 4344679b986d991527c59003d34528377ece8813 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:20:24 +0200
Subject: [PATCH 2/7] meson: Fix installation name of libpgfeutils
---
src/fe_utils/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index bed3ed78b5..aaf48d2e05 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -21,7 +21,7 @@ psqlscan = custom_target('psqlscan',
generated_sources += psqlscan
fe_utils_sources += psqlscan
-fe_utils = static_library('pgfeutils',
+fe_utils = static_library('libpgfeutils',
fe_utils_sources + generated_headers,
c_pch: pch_c_h,
include_directories : [postgres_inc, libpq_inc],
--
2.37.1
0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patch (text/plain, 2.9K) download
From e4d1c1dda523ac52cefaff53b8a968b508dbfa9e Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:21:41 +0200
Subject: [PATCH 3/7] meson: Libraries need to be built with
-DSO_MAJOR_VERSION=N
This is used by NLS to locate the right catalog file.
---
src/interfaces/ecpg/compatlib/meson.build | 1 +
src/interfaces/ecpg/ecpglib/meson.build | 1 +
src/interfaces/ecpg/pgtypeslib/meson.build | 1 +
src/interfaces/libpq/meson.build | 2 +-
4 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 328f33e5de..2022dec571 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -3,6 +3,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
ecpg_compat = both_libraries('libecpg_compat',
'informix.c',
include_directories : ['.', ecpg_inc, postgres_inc, libpq_inc],
+ c_args: ['-DSO_MAJOR_VERSION=3'],
dependencies: [frontend_shlib_code, thread_dep],
link_with: [ecpglib, ecpg_pgtypes],
soversion: host_system != 'win32' ? '3' : '',
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 9914aa936d..18300f3ef0 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -16,6 +16,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
ecpglib = both_libraries('libecpg',
ecpglib_sources,
include_directories : ['.', ecpg_inc, postgres_inc],
+ c_args: ['-DSO_MAJOR_VERSION=6'],
dependencies: [frontend_shlib_code, libpq, thread_dep],
link_with: [ecpg_pgtypes],
soversion: host_system != 'win32' ? '6' : '',
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 28c4e7314b..a33db144e6 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -12,6 +12,7 @@ export_file = custom_target('libpq.exports', kwargs: gen_export_kwargs)
ecpg_pgtypes = both_libraries('libpgtypes',
ecpg_pgtypes_sources,
include_directories : ['.', ecpg_inc, postgres_inc],
+ c_args: ['-DSO_MAJOR_VERSION=3'],
dependencies: [frontend_shlib_code],
version: '3.'+pg_version_major.to_string(),
soversion: host_system != 'win32' ? '3' : '',
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index bb6a47c5a2..9f29136034 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -48,7 +48,7 @@ endif
libpq_both = both_libraries('libpq',
libpq_sources,
include_directories : [libpq_inc, postgres_inc],
- c_args: ['-DFRONTEND'],
+ c_args: ['-DFRONTEND', '-DSO_MAJOR_VERSION=5'],
dependencies: libpq_deps,
version: '5.'+pg_version_major.to_string(),
soversion: host_system != 'win32' ? '5' : '' ,
--
2.37.1
0004-meson-Add-darwin_versions-argument-for-libraries.patch (text/plain, 2.8K) download
From e2e7794707aa017193ba66dc6615c98848b6e06c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:22:24 +0200
Subject: [PATCH 4/7] meson: Add darwin_versions argument for libraries
---
src/interfaces/ecpg/compatlib/meson.build | 1 +
src/interfaces/ecpg/ecpglib/meson.build | 1 +
src/interfaces/ecpg/pgtypeslib/meson.build | 1 +
src/interfaces/libpq/meson.build | 1 +
4 files changed, 4 insertions(+)
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 2022dec571..b249459e1f 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -7,6 +7,7 @@ ecpg_compat = both_libraries('libecpg_compat',
dependencies: [frontend_shlib_code, thread_dep],
link_with: [ecpglib, ecpg_pgtypes],
soversion: host_system != 'win32' ? '3' : '',
+ darwin_versions: ['3', '3.'+pg_version_major.to_string()],
version: '3.'+pg_version_major.to_string(),
link_args: export_fmt.format(export_file.full_path()),
link_depends: export_file,
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 18300f3ef0..b9f036a826 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -20,6 +20,7 @@ ecpglib = both_libraries('libecpg',
dependencies: [frontend_shlib_code, libpq, thread_dep],
link_with: [ecpg_pgtypes],
soversion: host_system != 'win32' ? '6' : '',
+ darwin_versions: ['6', '6.'+pg_version_major.to_string()],
version: '6.'+pg_version_major.to_string(),
link_args: export_fmt.format(export_file.full_path()),
link_depends: export_file,
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index a33db144e6..02ae2bcaf9 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -16,6 +16,7 @@ ecpg_pgtypes = both_libraries('libpgtypes',
dependencies: [frontend_shlib_code],
version: '3.'+pg_version_major.to_string(),
soversion: host_system != 'win32' ? '3' : '',
+ darwin_versions: ['3', '3.'+pg_version_major.to_string()],
link_args: export_fmt.format(export_file.full_path()),
link_depends: export_file,
kwargs: default_lib_args,
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 9f29136034..2cc4f5f8c8 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -52,6 +52,7 @@ libpq_both = both_libraries('libpq',
dependencies: libpq_deps,
version: '5.'+pg_version_major.to_string(),
soversion: host_system != 'win32' ? '5' : '' ,
+ darwin_versions: ['5', '5.'+pg_version_major.to_string()],
link_depends: export_file,
link_args: export_fmt.format(export_file.full_path()),
kwargs: default_lib_args,
--
2.37.1
0005-meson-Fix-link-order-of-support-libraries.patch (text/plain, 1.3K) download
From 3f43b456985a59f17053fd33675ab51b66ae6d36 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:27:42 +0200
Subject: [PATCH 5/7] meson: Fix link order of support libraries
---
meson.build | 2 +-
src/common/unicode/meson.build | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/meson.build b/meson.build
index 2e78583c6c..8833a16a3b 100644
--- a/meson.build
+++ b/meson.build
@@ -2505,7 +2505,7 @@ subdir('src/fe_utils')
frontend_code = declare_dependency(
compile_args: ['-DFRONTEND'],
include_directories: [postgres_inc],
- link_with: [pgport_static, common_static, fe_utils],
+ link_with: [fe_utils, common_static, pgport_static],
sources: generated_headers,
dependencies: [os_deps, libintl],
)
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
index f37f9077d0..44a6cf77c3 100644
--- a/src/common/unicode/meson.build
+++ b/src/common/unicode/meson.build
@@ -73,7 +73,7 @@ norm_test = executable('norm_test',
['norm_test.c', norm_test_table],
dependencies: [frontend_port_code],
include_directories: inc,
- link_with: [pgport_static, common_static],
+ link_with: [common_static, pgport_static],
build_by_default: false,
kwargs: default_bin_args + {
'install': false,
--
2.37.1
0006-meson-Make-link-order-of-external-libraries-match-ma.patch (text/plain, 2.1K) download
From 3fb7b198bc32f372e0288c89a015de4f3587db7c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:29:01 +0200
Subject: [PATCH 6/7] meson: Make link order of external libraries match
makefile order
---
meson.build | 2 +-
src/bin/pg_basebackup/meson.build | 2 +-
src/bin/pg_rewind/meson.build | 2 +-
src/bin/pg_waldump/meson.build | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/meson.build b/meson.build
index 8833a16a3b..938c87d485 100644
--- a/meson.build
+++ b/meson.build
@@ -2492,10 +2492,10 @@ libpq_deps = [
frontend_shlib_code,
thread_dep,
+ ssl,
gssapi,
ldap,
libintl,
- ssl,
]
subdir('src/interfaces/libpq')
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index 857e2b77d2..dcaae84b9a 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -10,7 +10,7 @@ common_sources = files(
'walmethods.c',
)
-pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_deps = [frontend_code, libpq, zstd, lz4, zlib]
pg_basebackup_common = static_library('libpg_basebackup_common',
common_sources,
dependencies: pg_basebackup_deps,
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index 40ae593e7c..bef4bafb4f 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -12,7 +12,7 @@ pg_rewind_sources = files(
pg_rewind = executable('pg_rewind',
pg_rewind_sources,
- dependencies: [frontend_code, libpq, lz4, zstd],
+ dependencies: [frontend_code, libpq, zstd, lz4],
kwargs: default_bin_args,
)
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index e482006264..afa1a269c3 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -10,7 +10,7 @@ pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
pg_waldump = executable('pg_waldump',
pg_waldump_sources,
- dependencies: [frontend_code, lz4, zstd],
+ dependencies: [frontend_code, zstd, lz4],
kwargs: default_bin_args,
)
--
2.37.1
0007-WIP-meson-Make-link-order-of-object-files-match-make.patch (text/plain, 4.3K) download
From 2e35b207d2accd69baa2557dd908066cb436bebf Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 17 Aug 2022 14:31:09 +0200
Subject: [PATCH 7/7] WIP: meson: Make link order of object files match
makefile order
---
src/bin/pg_basebackup/meson.build | 2 +-
src/bin/pg_waldump/Makefile | 2 +-
src/common/Makefile | 17 ++++++++++-------
src/fe_utils/Makefile | 2 +-
src/interfaces/libpq/meson.build | 4 ++--
src/port/Makefile | 6 +++---
6 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index dcaae84b9a..dd388d8a1e 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -3,8 +3,8 @@ common_sources = files(
'bbstreamer_gzip.c',
'bbstreamer_inject.c',
'bbstreamer_lz4.c',
- 'bbstreamer_tar.c',
'bbstreamer_zstd.c',
+ 'bbstreamer_tar.c',
'receivelog.c',
'streamutil.c',
'walmethods.c',
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
index d6459e17c7..53c602c3ca 100644
--- a/src/bin/pg_waldump/Makefile
+++ b/src/bin/pg_waldump/Makefile
@@ -8,11 +8,11 @@ top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
OBJS = \
- $(RMGRDESCOBJS) \
$(WIN32RES) \
compat.o \
pg_waldump.o \
rmgrdesc.o \
+ $(RMGRDESCOBJS) \
xlogreader.o \
xlogstats.o
diff --git a/src/common/Makefile b/src/common/Makefile
index e9af7346c9..05ea957861 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -50,12 +50,9 @@ OBJS_COMMON = \
base64.o \
checksum_helper.o \
compression.o \
- config_info.o \
controldata_utils.o \
- d2s.o \
encnames.o \
exec.o \
- f2s.o \
file_perm.o \
file_utils.o \
hashfn.o \
@@ -83,9 +80,9 @@ OBJS_COMMON = \
ifeq ($(with_ssl),openssl)
OBJS_COMMON += \
- protocol_openssl.o \
cryptohash_openssl.o \
- hmac_openssl.o
+ hmac_openssl.o \
+ protocol_openssl.o
else
OBJS_COMMON += \
cryptohash.o \
@@ -95,6 +92,11 @@ OBJS_COMMON += \
sha2.o
endif
+OBJS_EXTRA = \
+ d2s.o \
+ f2s.o \
+ config_info.o
+
# A few files are currently only built for frontend, not server
# (Mkvcbuild.pm has a copy of this list, too). logging.c is excluded
# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy,
@@ -104,14 +106,15 @@ OBJS_FRONTEND_SHLIB = \
$(OBJS_COMMON) \
fe_memutils.o \
restricted_token.o \
- sprompt.o
+ sprompt.o \
+ $(OBJS_EXTRA)
OBJS_FRONTEND = \
$(OBJS_FRONTEND_SHLIB) \
logging.o
# foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c
OBJS_SHLIB = $(OBJS_FRONTEND_SHLIB:%.o=%_shlib.o)
-OBJS_SRV = $(OBJS_COMMON:%.o=%_srv.o)
+OBJS_SRV = $(OBJS_COMMON:%.o=%_srv.o) $(OBJS_EXTRA:%.o=%_srv.o)
# where to find gen_keywordlist.pl and subsidiary files
TOOLSDIR = $(top_srcdir)/src/tools
diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile
index 44bc7a1215..ab750d336a 100644
--- a/src/fe_utils/Makefile
+++ b/src/fe_utils/Makefile
@@ -20,6 +20,7 @@ include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS)
OBJS = \
+ psqlscan.o \
archive.o \
cancel.o \
conditional.o \
@@ -28,7 +29,6 @@ OBJS = \
option_utils.o \
parallel_slot.o \
print.o \
- psqlscan.o \
query_utils.o \
recovery_gen.o \
simple_list.o \
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 2cc4f5f8c8..0a78a498c7 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -28,8 +28,8 @@ endif
if gssapi.found()
libpq_sources += files(
- 'fe-secure-gssapi.c',
- 'fe-gssapi-common.c'
+ 'fe-gssapi-common.c',
+ 'fe-secure-gssapi.c'
)
endif
diff --git a/src/port/Makefile b/src/port/Makefile
index b3754d8940..d8da9d77b6 100644
--- a/src/port/Makefile
+++ b/src/port/Makefile
@@ -38,8 +38,6 @@ LIBS += $(PTHREAD_LIBS)
# If you add objects here, see also src/tools/msvc/Mkvcbuild.pm
OBJS = \
- $(LIBOBJS) \
- $(PG_CRC32C_OBJS) \
bsearch_arg.o \
chklocale.o \
inet_net_ntop.o \
@@ -59,7 +57,9 @@ OBJS = \
snprintf.o \
strerror.o \
tar.o \
- thread.o
+ thread.o \
+ $(LIBOBJS) \
+ $(PG_CRC32C_OBJS)
# libpgport.a, libpgport_shlib.a, and libpgport_srv.a contain the same files
# foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c
--
2.37.1
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-17 21:53 Andres Freund <andres@anarazel.de>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 2 replies; 17+ messages in thread
From: Andres Freund @ 2022-08-17 21:53 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Andrew Dunstan <andrew@dunslane.net>
Hi,
On 2022-08-17 15:50:23 +0200, Peter Eisentraut wrote:
> - There are various references to "pch" (pre-compiled headers). Is
> there more discussion anywhere about this? I don't know what this
> would entail or whether there are any drawbacks to be aware of. The
> new *_pch.h files don't have any comments. Maybe this should be a
> separate patch later.
It's mainly to make windows builds a bit slower. I've no objection to
separating this out.
> - About relativize_shared_library_references: We have had several
> patches over the years for working around SIP stuff, and some of
> them did essentially this, but we decided not to go ahead with them.
> We could revisit that, but it should be a separate patch, not mixed
> in with this.
The prior approaches all had issues because they didn't support relative
references IIRC (and thus broke being able to relocate the installation),
which this does.
I just found it very annoying to work on macs without this. And there were at
least two "bug" reports of testers of the meson branch that were just due to
SIP.
I'm ok with splitting it out, but I also think it's a lower risk opportunity
to test that this works.
> - postgresql-extension.pc: Similarly, this ought to be a separate
> patch. If we want people to use this, we'll need it in the makefile
> build system anyway.
Makes sense. I'd like to keep it in the same patch for a short while longer,
to deduplicate some of the code, but then will split it out.
> - -DFRONTEND is used somewhat differently from the makefiles. For
> example, meson sets -DFRONTEND for pg_controldata, but the
> makefiles don't. Conversely, the makefiles set -DFRONTEND for
> ecpglib, but meson does not. This should be checked again to make
> sure it all matches up.
Yes, should sync that up.
FWIW, meson does add -DFRONTEND for ecpglib. There were a few places that did
add it twice, I'll push a cleanup of that in a bit.
> - Option name spelling should be make consistent about underscores
> versus hyphens. Built-in meson options use underscores, so we
> should make the user-defined ones like that as well (some already
> do). (wal-blocksize krb-srvnam system-tzdata tap-tests bsd-auth)
No objection.
> - I have found the variable name "cdata" for configuration_data() to
> be less than clear. I see some GNOME projects to it that way, is
> that where it's from? systemd uses "conf", maybe that's better.
I don't know where it's from - I don't think I ever looked at gnome
buildsystem stuff. It seems to be the obvious abbreviation for
configuration_data()... I don't object to conf, but it's not a clear
improvement to me.
> - In the top-level meson.build, the "renaming" of the Windows system
> name
>
> host_system = host_machine.system() == 'windows' ? 'win32' :
> host_machine.system()
> build_system = build_machine.system() == 'windows' ? 'win32' :
> build_machine.system()
>
> seems unnecessary to me. Why not stick with the provided names?
Because right now we also use it for things like choosing the "source" for
pg_config_os.h (i.e. include/port/{darwin,linux,win32,..}.h). And it seemed
easier to just have one variable name for all of it.
> - The c99_test ought to be not needed if the c_std project option is
> used. Was there a problem with that?
We don't want to force -std=c99 when not necessary, I think. We sometimes use
features from newer (and from gnu) language versions after testing
availability, and if we hardcode the version those will either fail or elicit
warnings.
> - Is there a way to split up the top-level meson.build somehow? Maybe
> just throw some stuff into included files? This might get out of
> hand at some point.
We can put stuff into config/meson.build or such. But I don't think it's
clearly warranted at this point.
> - The PG_SYSROOT detection gives different results. On my system,
> configure produces
>
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk,
> meson produces
>
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk.
> src/template/darwin goes out of its way to get a version-specific
> result, so we need to carry that over somehow. (The difference does
> result in differences in the built binaries.)
TBH, I don't really understand the SYSROOT stuff all that well, never having
used a mac in anger (well, only in anger, but ...).
What do you think about extracting the relevant portion of src/template/darwin
into a dedicated shell script that gets called by both?
> Then, some patches from me:
>
> 0001-Change-shared-library-installation-naming-on-macOS.patch
>
> This changes the makefiles to make the shared library file naming on
> macOS match what meson produces. I don't know what the situation is
> on other platforms.
No opinion on the matter. Seems best to apply separately if we want to?
> 0002-meson-Fix-installation-name-of-libpgfeutils.patch
>
> This was presumably an accidental mistake.
Yes, merged.
> 0003-meson-Libraries-need-to-be-built-with-DSO_MAJOR_VERS.patch
>
> This is needed to make NLS work for the libraries.
Oh, huh. Yes, merged.
> 0004-meson-Add-darwin_versions-argument-for-libraries.patch
>
> This is to make the output match what Makefile.shlib produces.
:/, merged. Would be good to clean up at some point.
> 0005-meson-Fix-link-order-of-support-libraries.patch
> 0006-meson-Make-link-order-of-external-libraries-match-ma.patch
> 0007-WIP-meson-Make-link-order-of-object-files-match-make.patch
>
> I have analyzed the produced binaries between both build systems to
> make sure they match. If we link the files and libraries in different
> orders, that becomes difficult. So this fixes this up a bit. 0005 is
> needed for correctness in general, I think.
Makes sense.
> 0006 is mostly cosmetic. You probably wanted to make the library order
> alphabetical in the meson files, which I'd support, but then we should
> change the makefiles to match.
Trying to match makefile order doesn't seem like a good plan, given that it's
effectively random, and might change depending on dependencies of linked to
libraries etc.
Isn't the use of AC_CHECK_LIB for at least lz4, zstd completely bogus? We get
whether they're available via pkg-config, but then completely ignore the
linker flag for the library name. The comment says:
# We only care about -I, -D, and -L switches;
# note that -llz4 will be added by AC_CHECK_LIB below.
but without any further explanation. This seems to be from 4d399a6fbeb.
The repetition of lz4, zstd in pg_rewind, pg_waldump and backend makes me
wonder if we should put them in a xlogreader_deps or such. It's otherwise not
obvious why pg_rewind, pg_waldump need lz4/zstd.
> Similarly, 0007, which is clearly a bit
> messy at the moment, but we should try to sort that out either in the old or
> the new build files.
I am against trying to maintain bug-for-bug compatibility on filename
ordering. But obviously ok with fixing the ordering to make sense on both
sides.
What was your decision point about when to adjust makefile ordering and when
meson ordering?
> And finally some comments on your patches:
Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
way, and it seems considerably cleaner than the hackery we do right now to
make VPATH builds work.
> meson: prereq: Don't add HAVE_LDAP_H HAVE_WINLDAP_H to pg_config.h.
>
> This can go ahead.
>
> meson: prereq: fix warning compat_informix/rnull.pgc with msvc
>
> - $float f = 3.71;
> + $float f = (float) 3.71;
>
> This could use float literals like
>
> + $float f = 3.71f;
I tried that first, but it fails:
../src/interfaces/ecpg/test/compat_informix/rnull.pgc:19: ERROR: trailing junk after numeric literal
Should have noted that. I don't feel like fixing ecpg's parser etc...
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-20 07:38 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: Andres Freund <andres@anarazel.de>
1 sibling, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-08-20 07:38 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Andrew Dunstan <andrew@dunslane.net>
On 17.08.22 23:53, Andres Freund wrote:
> Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
> way, and it seems considerably cleaner than the hackery we do right now to
> make VPATH builds work.
That one looks like a very good improvement.
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-20 18:01 Andres Freund <andres@anarazel.de>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 1 reply; 17+ messages in thread
From: Andres Freund @ 2022-08-20 18:01 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>
Hi,
On 2022-08-20 09:38:48 +0200, Peter Eisentraut wrote:
> On 17.08.22 23:53, Andres Freund wrote:
> > Any comment on the pg_regress_ecpg commit? I'd like to get that out of the
> > way, and it seems considerably cleaner than the hackery we do right now to
> > make VPATH builds work.
>
> That one looks like a very good improvement.
Thanks for checking! Pushed.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-24 09:39 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-08-24 09:39 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>
I have looked at your branch at 0545eec895:
258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR
I think these patches are split up a bit incorrectly. If you apply
the first patch by itself, then the output appears in tab_comp_dir/
directly under the source directory. And then the second patch moves
it to tmp_check/tap_comp_dir/. If there is an intent to apply these
patches separately somehow, this should be cleaned up.
I haven't checked the second patch in detail yet, but it looks like
the thought was that the first patch is about ready to go.
834a40e609 meson: prereq: Extend gendef.pl in preparation for meson
I'm not qualified to check that in detail, but it looks reasonable
enough to me.
See attached patch (0001) for a perlcritic fix.
97a0b096e8 meson: prereq: Add src/tools/gen_export.pl
This produces leading whitespace in the output files that at least on
darwin wasn't there before. See attached patch (0002). This should
be checked again on other platforms as well.
Other than that this looks good. Attached is a small cosmetic patch (0003).
40e363b263 meson: prereq: Refactor PG_TEST_EXTRA logic in autoconf build
Since I last looked, this has been turned into a meson option. Which
is probably the best solution. But then we should probably make this
a configure option as well. Otherwise, it could get a bit confusing.
For example, I just unset PG_TEST_EXTRA in my environment to test
something with the meson build, but I was unaware that meson captures
the value at setup time, so my unsetting had no effect.
In any case, maybe adjust the regular expressions to check for word
boundaries, to maintain the original "whitespace-separated"
specification. For example,
elsif ($ENV{PG_TEST_EXTRA} !~ /\bssl\b/)
e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic
This looks like a good idea. The documentation clearly states that
-Bsymbolic shouldn't be used, at least not in the way we have been
doing. Might as well go ahead with this and give it a whirl on the
build farm.
0545eec895 meson: Add docs
We should think more about how to arrange the documentation. We
probably don't want to copy-and-paste all the introductory and
requirements information. I think we can make this initially much
briefer, like the Windows installation chapter. For example, instead
of documenting each setup option again, just mention which ones exist
and then point (link) to the configure chapter for details.
I spent a bit of time with the test suites. I think there is a
problem in that selecting a test suite directly, like
meson test -C _build --suite recovery
doesn't update the tmp_install. So if this is the first thing you run
after a build, everything will fail. Also, if you run this later, the
tmp_install doesn't get updated, so you're not testing up-to-date
code.
Attachments: download all (3 files, .tar.gz)
0001-Fix-for-perlcritic.patch (text/plain, 585B) download
From 2f25b48271bceb7aa1551e015b03fc20b9aff162 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:23:52 +0200
Subject: [PATCH 1/3] Fix for perlcritic
---
src/tools/msvc/gendef.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index f08268e781..cfbdef9007 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -174,7 +174,7 @@ sub usage
{
if (-d $in)
{
- push @files, <$in/*.obj>;
+ push @files, glob "$in/*.obj";
}
else
{
--
2.37.1
0002-Fix-whitespace-in-output-of-gen_export.pl.patch (text/plain, 643B) download
From a64c90e756d6996b7d8d9d63d42e30c72d4ce098 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:24:22 +0200
Subject: [PATCH 2/3] Fix whitespace in output of gen_export.pl
---
src/tools/gen_export.pl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
index 6a8b196ad8..1265564473 100644
--- a/src/tools/gen_export.pl
+++ b/src/tools/gen_export.pl
@@ -56,7 +56,7 @@
}
elsif ($format eq 'darwin')
{
- print $output_handle " _$1\n";
+ print $output_handle "_$1\n";
}
elsif ($format eq 'gnu')
{
--
2.37.1
0003-Some-Perl-code-simplification-in-gen_export.pl.patch (text/plain, 681B) download
From 5b79baf6bbf4fa62f153a5e96e97f8d5a6345821 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 24 Aug 2022 11:24:36 +0200
Subject: [PATCH 3/3] Some Perl code simplification in gen_export.pl
---
src/tools/gen_export.pl | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl
index 1265564473..727105ba08 100644
--- a/src/tools/gen_export.pl
+++ b/src/tools/gen_export.pl
@@ -48,7 +48,7 @@
{
# don't do anything with a comment
}
- elsif (/^([^\s]+)\s+([^\s]+)/)
+ elsif (/^(\S+)\s+(\S+)/)
{
if ($format eq 'aix')
{
@@ -79,5 +79,3 @@
};
";
}
-
-exit(0);
--
2.37.1
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-24 15:30 Andres Freund <andres@anarazel.de>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 3 replies; 17+ messages in thread
From: Andres Freund @ 2022-08-24 15:30 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>
Hi,
On 2022-08-24 11:39:06 +0200, Peter Eisentraut wrote:
> I have looked at your branch at 0545eec895:
>
> 258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
> 8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR
>
> I think these patches are split up a bit incorrectly. If you apply
> the first patch by itself, then the output appears in tab_comp_dir/
> directly under the source directory. And then the second patch moves
> it to tmp_check/tap_comp_dir/. If there is an intent to apply these
> patches separately somehow, this should be cleaned up.
How is that happening with that version of the patch? The test puts
tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was an
earlier version of the patch that was split one more time that did have that
problem, but I don't quite see how that version has it?
> I haven't checked the second patch in detail yet, but it looks like
> the thought was that the first patch is about ready to go.
>
> 834a40e609 meson: prereq: Extend gendef.pl in preparation for meson
>
> I'm not qualified to check that in detail, but it looks reasonable
> enough to me.
>
> See attached patch (0001) for a perlcritic fix.
Thanks.
> 97a0b096e8 meson: prereq: Add src/tools/gen_export.pl
>
> This produces leading whitespace in the output files that at least on
> darwin wasn't there before. See attached patch (0002). This should
> be checked again on other platforms as well.
Hm, to me the indentation as is makes more sense, but ...
> Other than that this looks good. Attached is a small cosmetic patch (0003).
I wonder if we should rewrite this in python - I chose perl because I thought
we could share it, but as you pointed out, that's not possible, because we
don't want to depend on perl during the autoconf build from a tarball.
> e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic
>
> This looks like a good idea. The documentation clearly states that
> -Bsymbolic shouldn't be used, at least not in the way we have been
> doing. Might as well go ahead with this and give it a whirl on the
> build farm.
Cool. I looked at this because I was confused about getting warnings with
autoconf that I wasn't getting with meson.
> 0545eec895 meson: Add docs
>
> We should think more about how to arrange the documentation. We
> probably don't want to copy-and-paste all the introductory and
> requirements information. I think we can make this initially much
> briefer, like the Windows installation chapter. For example, instead
> of documenting each setup option again, just mention which ones exist
> and then point (link) to the configure chapter for details.
The current docs, including the windows ones, are already hard to follow. I
think we should take some care to not make the meson bits even more
confusing. Cross referencing left and right seems problematic from that angle.
> I spent a bit of time with the test suites. I think there is a
> problem in that selecting a test suite directly, like
>
> meson test -C _build --suite recovery
>
> doesn't update the tmp_install. So if this is the first thing you run
> after a build, everything will fail. Also, if you run this later, the
> tmp_install doesn't get updated, so you're not testing up-to-date
> code.
At the moment creation of the tmp_install is its own test suite. I don't know
if that's the best way, or what the best way is, but that explains that
fact. You can do the above without the issue by specifying
--suite setup --suite recovery.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-24 17:42 Andres Freund <andres@anarazel.de>
parent: Andres Freund <andres@anarazel.de>
1 sibling, 0 replies; 17+ messages in thread
From: Andres Freund @ 2022-08-24 17:42 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Andrew Dunstan <andrew@dunslane.net>
Hi,
On 2022-08-17 14:53:17 -0700, Andres Freund wrote:
> > - In the top-level meson.build, the "renaming" of the Windows system
> > name
> >
> > host_system = host_machine.system() == 'windows' ? 'win32' :
> > host_machine.system()
> > build_system = build_machine.system() == 'windows' ? 'win32' :
> > build_machine.system()
> >
> > seems unnecessary to me. Why not stick with the provided names?
>
> Because right now we also use it for things like choosing the "source" for
> pg_config_os.h (i.e. include/port/{darwin,linux,win32,..}.h). And it seemed
> easier to just have one variable name for all of it.
I am now changing this so that there's an additional 'portname' variable for
this purpose. Otherwise the meson names are used.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-24 18:21 samay sharma <smilingsamay@gmail.com>
parent: Andres Freund <andres@anarazel.de>
2 siblings, 0 replies; 17+ messages in thread
From: samay sharma @ 2022-08-24 18:21 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
Hi,
On Wed, Aug 24, 2022 at 8:30 AM Andres Freund <andres@anarazel.de> wrote:
> Hi,
>
> On 2022-08-24 11:39:06 +0200, Peter Eisentraut wrote:
> > I have looked at your branch at 0545eec895:
> >
> > 258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
> > 8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR
> >
> > I think these patches are split up a bit incorrectly. If you apply
> > the first patch by itself, then the output appears in tab_comp_dir/
> > directly under the source directory. And then the second patch moves
> > it to tmp_check/tap_comp_dir/. If there is an intent to apply these
> > patches separately somehow, this should be cleaned up.
>
> How is that happening with that version of the patch? The test puts
> tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was
> an
> earlier version of the patch that was split one more time that did have
> that
> problem, but I don't quite see how that version has it?
>
>
> > I haven't checked the second patch in detail yet, but it looks like
> > the thought was that the first patch is about ready to go.
> >
> > 834a40e609 meson: prereq: Extend gendef.pl in preparation for meson
> >
> > I'm not qualified to check that in detail, but it looks reasonable
> > enough to me.
> >
> > See attached patch (0001) for a perlcritic fix.
>
> Thanks.
>
>
> > 97a0b096e8 meson: prereq: Add src/tools/gen_export.pl
> >
> > This produces leading whitespace in the output files that at least on
> > darwin wasn't there before. See attached patch (0002). This should
> > be checked again on other platforms as well.
>
> Hm, to me the indentation as is makes more sense, but ...
>
> > Other than that this looks good. Attached is a small cosmetic patch
> (0003).
>
> I wonder if we should rewrite this in python - I chose perl because I
> thought
> we could share it, but as you pointed out, that's not possible, because we
> don't want to depend on perl during the autoconf build from a tarball.
>
>
> > e0a8387660 solaris: Use versioning scripts instead of -Bsymbolic
> >
> > This looks like a good idea. The documentation clearly states that
> > -Bsymbolic shouldn't be used, at least not in the way we have been
> > doing. Might as well go ahead with this and give it a whirl on the
> > build farm.
>
> Cool. I looked at this because I was confused about getting warnings with
> autoconf that I wasn't getting with meson.
>
>
> > 0545eec895 meson: Add docs
> >
> > We should think more about how to arrange the documentation. We
> > probably don't want to copy-and-paste all the introductory and
> > requirements information. I think we can make this initially much
> > briefer, like the Windows installation chapter. For example, instead
> > of documenting each setup option again, just mention which ones exist
> > and then point (link) to the configure chapter for details.
>
> The current docs, including the windows ones, are already hard to follow. I
> think we should take some care to not make the meson bits even more
> confusing. Cross referencing left and right seems problematic from that
> angle.
>
On Configure options:
To add to the above, very few sections are an exact copy paste. The
arguments and default behaviors of quite a few configure options are
different. The change in default behavior and arguments is primarily due to
"auto" features which get enabled if the dependencies are found. Whereas
with make, we have explicit --enable or --disable options which don't take
any arguments.
Also, a few instructions / commands which worked with make will need to be
done a bit differently due to environment variables etc. which also had to
be communicated.
Communicating these differences and nuances with cross referencing would
make it confusing as most of this information is in the explanation
paragraph.
On requirements:
They are also a bit different eg. readline is not a "required" thing
anymore, perl, flex, bison are required etc. Also, these are bullet points
with information inlined and not separate sections, so cross-referencing
here also would be hard.
Regards,
Samay
> > I spent a bit of time with the test suites. I think there is a
> > problem in that selecting a test suite directly, like
> >
> > meson test -C _build --suite recovery
> >
> > doesn't update the tmp_install. So if this is the first thing you run
> > after a build, everything will fail. Also, if you run this later, the
> > tmp_install doesn't get updated, so you're not testing up-to-date
> > code.
>
> At the moment creation of the tmp_install is its own test suite. I don't
> know
> if that's the best way, or what the best way is, but that explains that
> fact. You can do the above without the issue by specifying
> --suite setup --suite recovery.
>
>
> Greetings,
>
> Andres Freund
>
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-25 13:29 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: Andres Freund <andres@anarazel.de>
2 siblings, 0 replies; 17+ messages in thread
From: Peter Eisentraut @ 2022-08-25 13:29 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>
On 24.08.22 17:30, Andres Freund wrote:
>> 258f6dc0a7 Don't hardcode tmp_check/ as test directory for tap tests
>> 8ecc33cf04 Split TESTDIR into TESTLOGDIR and TESTDATADIR
>>
>> I think these patches are split up a bit incorrectly. If you apply
>> the first patch by itself, then the output appears in tab_comp_dir/
>> directly under the source directory. And then the second patch moves
>> it to tmp_check/tap_comp_dir/. If there is an intent to apply these
>> patches separately somehow, this should be cleaned up.
>
> How is that happening with that version of the patch? The test puts
> tap_comp_dir under TESTDIR, and TESTDIR is $(CURDIR)/tmp_check. There was an
> earlier version of the patch that was split one more time that did have that
> problem, but I don't quite see how that version has it?
Ok, I see now how this works. It's a bit weird since the meaning of
TESTDIR is changed. I'm not sure if this could create cross-branch
confusion.
>> 97a0b096e8 meson: prereq: Add src/tools/gen_export.pl
>>
>> This produces leading whitespace in the output files that at least on
>> darwin wasn't there before. See attached patch (0002). This should
>> be checked again on other platforms as well.
>
> Hm, to me the indentation as is makes more sense, but ...
Maybe for the 'gnu' format, but on darwin (and others) it's just a flat
list, so indenting it is pointless.
> I wonder if we should rewrite this in python - I chose perl because I thought
> we could share it, but as you pointed out, that's not possible, because we
> don't want to depend on perl during the autoconf build from a tarball.
Given that the code is already written, I wouldn't do it. Introducing
Python into the toolchain would require considerations of minimum
versions, finding the right binaries, formatting, style checking, etc.,
which would probably be a distraction right now. I also think that this
script, whose purpose is to read an input file line by line and print it
back out slightly differently, is not going to be done better in Python.
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-08-31 08:42 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: Andres Freund <andres@anarazel.de>
2 siblings, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-08-31 08:42 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: pgsql-hackers@postgresql.org, samay sharma <smilingsamay@gmail.com>; Nazir Bilal Yavuz <byavuz81@gmail.com>
On 24.08.22 17:30, Andres Freund wrote:
>> 0545eec895 meson: Add docs
>>
>> We should think more about how to arrange the documentation. We
>> probably don't want to copy-and-paste all the introductory and
>> requirements information. I think we can make this initially much
>> briefer, like the Windows installation chapter. For example, instead
>> of documenting each setup option again, just mention which ones exist
>> and then point (link) to the configure chapter for details.
> The current docs, including the windows ones, are already hard to follow. I
> think we should take some care to not make the meson bits even more
> confusing. Cross referencing left and right seems problematic from that angle.
If you look at the current structure of the installation chapter
17.1. Short Version
17.2. Requirements
17.3. Getting the Source
17.4. Installation Procedure
17.5. Post-Installation Setup
17.6. Supported Platforms
17.7. Platform-Specific Notes
only 17.1, small parts of 12.2, and 17.4 should differ between make and
meson. There is no conceivable reason why the meson installation
chapter should have a different "Getting the Source" section. And some
of the post-installation and platform-specific information doesn't
appear at all on the meson chapter.
I think we can try to be a bit more ingenious in how we weave this
together in the best way. What I really wouldn't want is two separate
chapters that duplicate the entire process. I think we could do one
chapter, like
- Short Version
- Requirements
- Getting the Source
- Installation Procedure
- Installation Procedure using Meson
- Post-Installation Setup
- Supported Platforms
- Platform-Specific Notes
Alternatively, if people prefer two separate chapters, let's think about
some source-code level techniques to share the common contents.
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-01 23:12 samay sharma <smilingsamay@gmail.com>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 2 replies; 17+ messages in thread
From: samay sharma @ 2022-09-01 23:12 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
Hi,
On Wed, Aug 31, 2022 at 1:42 AM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:
> On 24.08.22 17:30, Andres Freund wrote:
> >> 0545eec895 meson: Add docs
> >>
> >> We should think more about how to arrange the documentation. We
> >> probably don't want to copy-and-paste all the introductory and
> >> requirements information. I think we can make this initially much
> >> briefer, like the Windows installation chapter. For example, instead
> >> of documenting each setup option again, just mention which ones exist
> >> and then point (link) to the configure chapter for details.
> > The current docs, including the windows ones, are already hard to
> follow. I
> > think we should take some care to not make the meson bits even more
> > confusing. Cross referencing left and right seems problematic from that
> angle.
>
> If you look at the current structure of the installation chapter
>
> 17.1. Short Version
> 17.2. Requirements
> 17.3. Getting the Source
> 17.4. Installation Procedure
> 17.5. Post-Installation Setup
> 17.6. Supported Platforms
> 17.7. Platform-Specific Notes
>
> only 17.1, small parts of 12.2, and 17.4 should differ between make and
> meson. There is no conceivable reason why the meson installation
> chapter should have a different "Getting the Source" section. And some
> of the post-installation and platform-specific information doesn't
> appear at all on the meson chapter.
>
> I think we can try to be a bit more ingenious in how we weave this
> together in the best way. What I really wouldn't want is two separate
> chapters that duplicate the entire process. I think we could do one
> chapter, like
>
> - Short Version
> - Requirements
> - Getting the Source
> - Installation Procedure
> - Installation Procedure using Meson
> - Post-Installation Setup
> - Supported Platforms
> - Platform-Specific Notes
>
I spent some more time thinking about the structure of the docs. The
getting the source, supported platforms, post installation setup and
platform specific notes sections are going to be mostly common. We do
expect some differences in supported platforms and platform specific notes
but I think they should be manageable without confusing readers.
The others; short version, requirements, and installation procedure are
pretty different and I feel combining them will end up confusing readers or
require creating autoconf / make and meson versions of many things at many
different places. Also, if we keep it separate, it'll be easier to remove
make / autoconf specific sections if (when?) we want to do that.
So, I was thinking of the following structure:
- Supported Platforms
- Getting the Source
- Building with make and autoconf
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Building with Meson
-- Short version
-- Requirements
-- Installation Procedure and it's subsections
- Post-installation Setup
- Platform specific notes
It has the disadvantage of short version moving to a bit later in the
chapter but I think it's a good structure to reduce duplication and also
keep sections which are different separate. Thoughts on this approach? If
this looks good, I can submit a patch rearranging things this way.
As a follow up patch, we could also try to fit the Windows part into this
model. We could add a Building with visual C++ or Microsoft windows SDK
section. It doesn't have a short version but follows the remaining template
of requirements and installation procedure subsections (Building, Cleaning
and Installing and Running Regression tests) well.
Regards,
Samay
>
> Alternatively, if people prefer two separate chapters, let's think about
> some source-code level techniques to share the common contents.
>
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-02 17:16 samay sharma <smilingsamay@gmail.com>
parent: samay sharma <smilingsamay@gmail.com>
1 sibling, 1 reply; 17+ messages in thread
From: samay sharma @ 2022-09-02 17:16 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
On Thu, Sep 1, 2022 at 4:12 PM samay sharma <smilingsamay@gmail.com> wrote:
> Hi,
>
> On Wed, Aug 31, 2022 at 1:42 AM Peter Eisentraut <
> peter.eisentraut@enterprisedb.com> wrote:
>
>> On 24.08.22 17:30, Andres Freund wrote:
>> >> 0545eec895 meson: Add docs
>> >>
>> >> We should think more about how to arrange the documentation. We
>> >> probably don't want to copy-and-paste all the introductory and
>> >> requirements information. I think we can make this initially much
>> >> briefer, like the Windows installation chapter. For example, instead
>> >> of documenting each setup option again, just mention which ones exist
>> >> and then point (link) to the configure chapter for details.
>> > The current docs, including the windows ones, are already hard to
>> follow. I
>> > think we should take some care to not make the meson bits even more
>> > confusing. Cross referencing left and right seems problematic from that
>> angle.
>>
>> If you look at the current structure of the installation chapter
>>
>> 17.1. Short Version
>> 17.2. Requirements
>> 17.3. Getting the Source
>> 17.4. Installation Procedure
>> 17.5. Post-Installation Setup
>> 17.6. Supported Platforms
>> 17.7. Platform-Specific Notes
>>
>> only 17.1, small parts of 12.2, and 17.4 should differ between make and
>> meson. There is no conceivable reason why the meson installation
>> chapter should have a different "Getting the Source" section. And some
>> of the post-installation and platform-specific information doesn't
>> appear at all on the meson chapter.
>>
>> I think we can try to be a bit more ingenious in how we weave this
>> together in the best way. What I really wouldn't want is two separate
>> chapters that duplicate the entire process. I think we could do one
>> chapter, like
>>
>> - Short Version
>> - Requirements
>> - Getting the Source
>> - Installation Procedure
>> - Installation Procedure using Meson
>> - Post-Installation Setup
>> - Supported Platforms
>> - Platform-Specific Notes
>>
>
> I spent some more time thinking about the structure of the docs. The
> getting the source, supported platforms, post installation setup and
> platform specific notes sections are going to be mostly common. We do
> expect some differences in supported platforms and platform specific notes
> but I think they should be manageable without confusing readers.
>
> The others; short version, requirements, and installation procedure are
> pretty different and I feel combining them will end up confusing readers or
> require creating autoconf / make and meson versions of many things at many
> different places. Also, if we keep it separate, it'll be easier to remove
> make / autoconf specific sections if (when?) we want to do that.
>
> So, I was thinking of the following structure:
> - Supported Platforms
> - Getting the Source
> - Building with make and autoconf
> -- Short version
> -- Requirements
> -- Installation Procedure and it's subsections
> - Building with Meson
> -- Short version
> -- Requirements
> -- Installation Procedure and it's subsections
> - Post-installation Setup
> - Platform specific notes
>
> It has the disadvantage of short version moving to a bit later in the
> chapter but I think it's a good structure to reduce duplication and also
> keep sections which are different separate. Thoughts on this approach? If
> this looks good, I can submit a patch rearranging things this way.
>
Another thing I'd like input on. A common question I've heard from people
who've tried out the docs is How do we do the equivalent of X in make with
meson. As meson will be new for a bunch of people who are fluent with make,
I won't be surprised if this is a common ask. To address that, I was
planning to add a page to specify the key things one needs to keep in mind
while "migrating" from make to meson and having a translation table of
commonly used commands.
I was planning to add it in the meson section, but if we go ahead with the
structure proposed above, it doesn't fit it into one as cleanly. Maybe, it
still goes in the meson section? Thoughts?
Regards,
Samay
>
> As a follow up patch, we could also try to fit the Windows part into this
> model. We could add a Building with visual C++ or Microsoft windows SDK
> section. It doesn't have a short version but follows the remaining template
> of requirements and installation procedure subsections (Building, Cleaning
> and Installing and Running Regression tests) well.
>
> Regards,
> Samay
>
>>
>> Alternatively, if people prefer two separate chapters, let's think about
>> some source-code level techniques to share the common contents.
>>
>
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-07 04:46 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: samay sharma <smilingsamay@gmail.com>
1 sibling, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-09-07 04:46 UTC (permalink / raw)
To: samay sharma <smilingsamay@gmail.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
On 02.09.22 01:12, samay sharma wrote:
> So, I was thinking of the following structure:
> - Supported Platforms
> - Getting the Source
> - Building with make and autoconf
> Â -- Short version
> Â -- Requirements
> Â -- Installation Procedure and it's subsections
> - Building with Meson
> Â -- Short version
> Â -- Requirements
> Â -- Installation Procedure and it's subsections
> - Post-installation Setup
> - Platform specific notes
I like that.
> As a follow up patch, we could also try to fit the Windows part into
> this model. We could add a Building with visual C++ or Microsoft windows
> SDK section. It doesn't have a short version but follows the remaining
> template of requirements and installation procedure subsections
> (Building, Cleaning and Installing and Running Regression tests) well.
We were thinking about removing the old Windows build system for PG 16.
Let's see how that goes. Otherwise, yes, that would be good as well.
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-07 04:48 Peter Eisentraut <peter.eisentraut@enterprisedb.com>
parent: samay sharma <smilingsamay@gmail.com>
0 siblings, 1 reply; 17+ messages in thread
From: Peter Eisentraut @ 2022-09-07 04:48 UTC (permalink / raw)
To: samay sharma <smilingsamay@gmail.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
On 02.09.22 19:16, samay sharma wrote:
> Another thing I'd like input on. A common question I've heard from
> people who've tried out the docs is How do we do the equivalent of X in
> make with meson. As meson will be new for a bunch of people who are
> fluent with make, I won't be surprised if this is a common ask. To
> address that, I was planning to add a page to specify the key things one
> needs to keep in mind while "migrating" from make to meson and having a
> translation table of commonly used commands.
>
> I was planning to add it in the meson section, but if we go ahead with
> the structure proposed above, it doesn't fit it into one as cleanly.
> Maybe, it still goes in the meson section? Thoughts?
This could go into the wiki.
For example, we have
<https://wiki.postgresql.org/wiki/Working_with_Git;, which was added
during the CVS->Git transition.
This avoids that we make the PostgreSQL documentation a substitute
manual for a third-party product.
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-08 07:20 samay sharma <smilingsamay@gmail.com>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 0 replies; 17+ messages in thread
From: samay sharma @ 2022-09-08 07:20 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
Hi,
On Tue, Sep 6, 2022 at 9:48 PM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:
> On 02.09.22 19:16, samay sharma wrote:
> > Another thing I'd like input on. A common question I've heard from
> > people who've tried out the docs is How do we do the equivalent of X in
> > make with meson. As meson will be new for a bunch of people who are
> > fluent with make, I won't be surprised if this is a common ask. To
> > address that, I was planning to add a page to specify the key things one
> > needs to keep in mind while "migrating" from make to meson and having a
> > translation table of commonly used commands.
> >
> > I was planning to add it in the meson section, but if we go ahead with
> > the structure proposed above, it doesn't fit it into one as cleanly.
> > Maybe, it still goes in the meson section? Thoughts?
>
> This could go into the wiki.
>
> For example, we have
> <https://wiki.postgresql.org/wiki/Working_with_Git;, which was added
> during the CVS->Git transition.
>
That's a good idea. I'll add a page to the wiki about this topic and share
it on the list for review.
>
> This avoids that we make the PostgreSQL documentation a substitute
> manual for a third-party product.
>
Regards,
Samay
^ permalink raw reply [nested|flat] 17+ messages in thread
* Re: [RFC] building postgres with meson - v11
@ 2022-09-08 22:26 samay sharma <smilingsamay@gmail.com>
parent: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
0 siblings, 0 replies; 17+ messages in thread
From: samay sharma @ 2022-09-08 22:26 UTC (permalink / raw)
To: Peter Eisentraut <peter.eisentraut@enterprisedb.com>; +Cc: Andres Freund <andres@anarazel.de>; pgsql-hackers@postgresql.org, Nazir Bilal Yavuz <byavuz81@gmail.com>
On Tue, Sep 6, 2022 at 9:46 PM Peter Eisentraut <
peter.eisentraut@enterprisedb.com> wrote:
> On 02.09.22 01:12, samay sharma wrote:
> > So, I was thinking of the following structure:
> > - Supported Platforms
> > - Getting the Source
> > - Building with make and autoconf
> > -- Short version
> > -- Requirements
> > -- Installation Procedure and it's subsections
> > - Building with Meson
> > -- Short version
> > -- Requirements
> > -- Installation Procedure and it's subsections
> > - Post-installation Setup
> > - Platform specific notes
>
> I like that.
>
Attached is a docs-only patch with that structure. We need to update the
platform specific notes section to add meson specific nuances. Also, in
terms of supported platforms, if there are platforms which work with make
but not with meson, we have to add that too.
Regards,
Samay
>
> > As a follow up patch, we could also try to fit the Windows part into
> > this model. We could add a Building with visual C++ or Microsoft windows
> > SDK section. It doesn't have a short version but follows the remaining
> > template of requirements and installation procedure subsections
> > (Building, Cleaning and Installing and Running Regression tests) well.
>
> We were thinking about removing the old Windows build system for PG 16.
> Let's see how that goes. Otherwise, yes, that would be good as well.
>
Attachments:
v1-0001-Add-meson-docs-to-existing-build-from-source.patch (application/octet-stream, 85.9K) download
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 70d188e2bc..e9c56178e3 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -31,7 +31,144 @@ documentation. See standalone-profile.xsl for details.
C++</productname>, see <xref linkend="install-windows"/> instead.
</para>
- <sect1 id="install-short">
+ <sect1 id="supported-platforms">
+ <title>Supported Platforms</title>
+
+ <para>
+ A platform (that is, a CPU architecture and operating system combination)
+ is considered supported by the <productname>PostgreSQL</productname> development
+ community if the code contains provisions to work on that platform and
+ it has recently been verified to build and pass its regression tests
+ on that platform. Currently, most testing of platform compatibility
+ is done automatically by test machines in the
+ <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
+ If you are interested in using <productname>PostgreSQL</productname> on a platform
+ that is not represented in the build farm, but on which the code works
+ or can be made to work, you are strongly encouraged to set up a build
+ farm member machine so that continued compatibility can be assured.
+ </para>
+
+ <para>
+ In general, <productname>PostgreSQL</productname> can be expected to work on
+ these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
+ and PA-RISC, including
+ big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
+ It is often
+ possible to build on an unsupported CPU type by configuring with
+ <option>--disable-spinlocks</option>, but performance will be poor.
+ </para>
+
+ <para>
+ <productname>PostgreSQL</productname> can be expected to work on current
+ versions of these operating systems: Linux, Windows,
+ FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
+ Other Unix-like systems may also work but are not currently
+ being tested. In most cases, all CPU architectures supported by
+ a given operating system will work. Look in
+ <xref linkend="installation-platform-notes"/> below to see if
+ there is information
+ specific to your operating system, particularly if using an older system.
+ </para>
+
+ <para>
+ If you have installation problems on a platform that is known
+ to be supported according to recent build farm results, please report
+ it to <email>pgsql-bugs@lists.postgresql.org</email>. If you are interested
+ in porting <productname>PostgreSQL</productname> to a new platform,
+ <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
+ to discuss that.
+ </para>
+
+ <para>
+ Historical versions of <productname>PostgreSQL</productname> or POSTGRES
+ also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
+ M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
+ BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
+ Tru64 UNIX, and ULTRIX.
+ </para>
+ </sect1>
+
+ <sect1 id="get-source">
+ <title>Getting the Source</title>
+
+ <para>
+ You can download the source code in two ways - via git or the source code
+ tarballs.
+ </para>
+
+ <sect2 id="get-source-git">
+ <title>Getting the Source via <productname>Git</productname></title>
+ <para>
+ With <productname>Git</productname>, you can make a copy of the entire code repository
+ on your local machine, so you will have access to all history and branches
+ offline. This is the fastest and most flexible way to develop or test
+ patches.
+ </para>
+
+ <procedure>
+ <step>
+ <para>
+ To begin using the Git repository, make a clone of the official mirror:
+
+<programlisting>
+git clone https://git.postgresql.org/git/postgresql.git
+</programlisting>
+
+ This will copy the full repository to your local machine, so it may take
+ a while to complete, especially if you have a slow Internet connection.
+ The files will be placed in a new subdirectory <filename>postgresql</filename> of
+ your current directory.
+ </para>
+
+ </step>
+
+ <step>
+ <para>
+ Whenever you want to get the latest updates in the system, <command>cd</command>
+ into the repository, and run:
+
+<programlisting>
+git pull
+</programlisting>
+ </para>
+ </step>
+ </procedure>
+
+ <para>
+ <productname>Git</productname> can do a lot more things than just fetch the source.
+ Our wiki, <ulink
+ url="https://wiki.postgresql.org/wiki/Working_with_Git"></ulink>,
+ has some discussion on working with Git. For more information, consult the
+ <productname>Git</productname> man pages, or see the website at
+ <ulink url="https://git-scm.com"></ulink>.
+ </para>
+ </sect2>
+ <sect2 id="get-source-tarball">
+ <title>Getting the Source via Tarballs</title>
+
+ <para>
+ The <productname>PostgreSQL</productname> source code for released versions
+ can also be obtained from the download section of our website:
+ <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
+ Download the
+ <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
+ or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
+ file you're interested in, then unpack it:
+<screen>
+<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
+</screen>
+ This will create a directory
+ <filename>postgresql-<replaceable>version</replaceable></filename> under
+ the current directory with the <productname>PostgreSQL</productname> sources.
+ Change into that directory for the rest of the installation procedure.
+ </para>
+ </sect2>
+ </sect1>
+
+<sect1 id="install-make">
+ <title>Building and Installation with autoconf and make</title>
+
+ <sect2 id="install-short-make">
<title>Short Version</title>
<para>
@@ -50,12 +187,12 @@ su - postgres
/usr/local/pgsql/bin/psql test
</synopsis>
The long version is the rest of this
- <phrase>chapter</phrase>.
+ <phrase>section</phrase>.
</para>
- </sect1>
+ </sect2>
- <sect1 id="install-requirements">
+ <sect2 id="install-requirements-make">
<title>Requirements</title>
<para>
@@ -343,45 +480,9 @@ su - postgres
url="ftp://ftp.gnu.org/gnu/"></ulink>.
</para>
- <para>
- Also check that you have sufficient disk space. You will need about
- 350 MB for the source tree during compilation and about 60 MB for
- the installation directory. An empty database cluster takes about
- 40 MB; databases take about five times the amount of space that a
- flat text file with the same data would take. If you are going to
- run the regression tests you will temporarily need up to an extra
- 300 MB. Use the <command>df</command> command to check free disk
- space.
- </para>
- </sect1>
-
- <sect1 id="install-getsource">
- <title>Getting the Source</title>
-
- <para>
- The <productname>PostgreSQL</productname> source code for released versions
- can be obtained from the download section of our website:
- <ulink url="https://www.postgresql.org/ftp/source/"></ulink>.
- Download the
- <filename>postgresql-<replaceable>version</replaceable>.tar.gz</filename>
- or <filename>postgresql-<replaceable>version</replaceable>.tar.bz2</filename>
- file you're interested in, then unpack it:
-<screen>
-<userinput>tar xf postgresql-<replaceable>version</replaceable>.tar.bz2</userinput>
-</screen>
- This will create a directory
- <filename>postgresql-<replaceable>version</replaceable></filename> under
- the current directory with the <productname>PostgreSQL</productname> sources.
- Change into that directory for the rest of the installation procedure.
- </para>
-
- <para>
- Alternatively, you can use the Git version control system; see
- <xref linkend="git"/> for more information.
- </para>
- </sect1>
+ </sect2>
- <sect1 id="install-procedure">
+ <sect2 id="install-procedure-make">
<title>Installation Procedure</title>
<procedure>
@@ -630,6 +731,7 @@ build-postgresql:
rebuilding. Without this, your changes in configuration choices
might not propagate everywhere they need to.
</para>
+ </sect2>
<sect2 id="configure-options">
<title><filename>configure</filename> Options</title>
@@ -844,7 +946,7 @@ build-postgresql:
various <productname>PostgreSQL</productname> features that are not
built by default. Most of these are non-default only because they
require additional software, as described in
- <xref linkend="install-requirements"/>.
+ <xref linkend="install-requirements-make"/>.
</para>
<variablelist>
@@ -1672,9 +1774,7 @@ build-postgresql:
</sect3>
- </sect2>
-
- <sect2 id="configure-envvars">
+ <sect3 id="configure-envvars">
<title><filename>configure</filename> Environment Variables</title>
<indexterm zone="configure-envvars">
@@ -1955,130 +2055,1721 @@ build-postgresql:
adjustments, while <envar>COPT</envar> might be kept set all the time.
</para>
</note>
+ </sect3>
</sect2>
</sect1>
- <sect1 id="install-post">
- <title>Post-Installation Setup</title>
+ <sect1 id="install-meson">
+ <title>Building and Installation with meson</title>
- <sect2 id="install-post-shlibs">
- <title>Shared Libraries</title>
+ <sect2 id="install-short-meson">
+ <title>Short Version</title>
- <indexterm>
- <primary>shared library</primary>
- </indexterm>
+ <para>
+<synopsis>
- <para>
- On some systems with shared libraries
- you need to tell the system how to find the newly installed
- shared libraries. The systems on which this is
- <emphasis>not</emphasis> necessary include
- <systemitem class="osname">FreeBSD</systemitem>,
- <systemitem class="osname">Linux</systemitem>,
- <systemitem class="osname">NetBSD</systemitem>, <systemitem
- class="osname">OpenBSD</systemitem>, and
- <systemitem class="osname">Solaris</systemitem>.
- </para>
+# create working directory
+mkdir postgres
+cd postgres
- <para>
- The method to set the shared library search path varies between
- platforms, but the most widely-used method is to set the
- environment variable <envar>LD_LIBRARY_PATH</envar> like so: In Bourne
- shells (<command>sh</command>, <command>ksh</command>, <command>bash</command>, <command>zsh</command>):
-<programlisting>
-LD_LIBRARY_PATH=/usr/local/pgsql/lib
-export LD_LIBRARY_PATH
-</programlisting>
- or in <command>csh</command> or <command>tcsh</command>:
-<programlisting>
-setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
-</programlisting>
- Replace <literal>/usr/local/pgsql/lib</literal> with whatever you set
- <option><literal>--libdir</literal></option> to in <xref linkend="configure"/>.
- You should put these commands into a shell start-up file such as
- <filename>/etc/profile</filename> or <filename>~/.bash_profile</filename>. Some
- good information about the caveats associated with this method can
- be found at <ulink
- url="http://xahlee.info/UnixResource_dir/_/ldpath.html"></ulink>.
- </para>
+# fetch source code
+# git clone https://git.postgresql.org/git/postgresql.git src
- <para>
- On some systems it might be preferable to set the environment
- variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis>
- building.
- </para>
+# current instructions for testing (to be removed when merging)
+git clone -b meson https://github.com/anarazel/postgres.git src
- <para>
- On <systemitem class="osname">Cygwin</systemitem>, put the library
- directory in the <envar>PATH</envar> or move the
- <filename>.dll</filename> files into the <filename>bin</filename>
- directory.
- </para>
+# setup and enter build directory (done only first time)
+meson setup build src --prefix=$PWD/install
+cd build
- <para>
- If in doubt, refer to the manual pages of your system (perhaps
- <command>ld.so</command> or <command>rld</command>). If you later
- get a message like:
-<screen>
-psql: error in loading shared libraries
-libpq.so.2.1: cannot open shared object file: No such file or directory
-</screen>
- then this step was necessary. Simply take care of it then.
- </para>
+# Compile source
+ninja
- <para>
- <indexterm>
- <primary>ldconfig</primary>
- </indexterm>
- If you are on <systemitem class="osname">Linux</systemitem> and you have root
- access, you can run:
-<programlisting>
-/sbin/ldconfig /usr/local/pgsql/lib
-</programlisting>
- (or equivalent directory) after installation to enable the
- run-time linker to find the shared libraries faster. Refer to the
- manual page of <command>ldconfig</command> for more information. On
- <systemitem class="osname">FreeBSD</systemitem>, <systemitem
- class="osname">NetBSD</systemitem>, and <systemitem
- class="osname">OpenBSD</systemitem> the command is:
-<programlisting>
-/sbin/ldconfig -m /usr/local/pgsql/lib
-</programlisting>
- instead. Other systems are not known to have an equivalent
- command.
- </para>
- </sect2>
+# Install to the prefix directory specified above
+ninja install
- <sect2>
- <title>Environment Variables</title>
+# Run all tests (optional, takes time)
+meson test
- <indexterm>
- <primary><envar>PATH</envar></primary>
- </indexterm>
+# Initialize a new database
+../install/bin/initdb -D ../data
- <para>
- If you installed into <filename>/usr/local/pgsql</filename> or some other
- location that is not searched for programs by default, you should
- add <filename>/usr/local/pgsql/bin</filename> (or whatever you set
- <option><literal>--bindir</literal></option> to in <xref linkend="configure"/>)
- into your <envar>PATH</envar>. Strictly speaking, this is not
- necessary, but it will make the use of <productname>PostgreSQL</productname>
- much more convenient.
- </para>
+# Start database
+../install/bin/pg_ctl -D ../data/ -l logfile start
- <para>
- To do this, add the following to your shell start-up file, such as
- <filename>~/.bash_profile</filename> (or <filename>/etc/profile</filename>, if you
- want it to affect all users):
-<programlisting>
-PATH=/usr/local/pgsql/bin:$PATH
-export PATH
-</programlisting>
- If you are using <command>csh</command> or <command>tcsh</command>, then use this command:
-<programlisting>
-set path = ( /usr/local/pgsql/bin $path )
-</programlisting>
- </para>
+# Connect to the database
+../install/bin/psql -d postgres
+
+</synopsis>
+ The long version is the rest of this
+ <phrase>section</phrase>.
+ </para>
+ </sect2>
+
+ <sect2 id="install-requirements-meson">
+ <title>Requirements</title>
+
+ <para>
+ In general, a modern Unix-compatible platform or Windows should be able
+ to build <productname>PostgreSQL</productname> with meson and run it.
+ The platforms which have received specific testing at the time of release are:
+
+ <itemizedlist spacing="compact">
+ <listitem><simpara>Linux</simpara></listitem>
+ <listitem><simpara>Windows</simpara></listitem>
+ <listitem><simpara>OpenBSD</simpara></listitem>
+ <listitem><simpara>NetBSD</simpara></listitem>
+ <listitem><simpara>FreeBSD</simpara></listitem>
+ <listitem><simpara>macOS</simpara></listitem>
+ </itemizedlist>
+ </para>
+
+ <sect3 id="required-packages">
+ <title>Required packages</title>
+
+ <para>
+ The following software packages are required for building
+ <productname>PostgreSQL</productname>:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ You can download the source code in two ways - via git or by downloading
+ the source code tarballs. For the former, you will need an installed version of
+ <productname>Git</productname>, which you can get from
+ <ulink url="https://git-scm.com"></ulink>. Many systems already
+ have a recent version of <productname>Git</productname>
+ installed by default, or available in their package distribution system.
+ If you download the source code tarballs, you will need
+ <application>tar</application> in addition to
+ <application>gzip</application> or <application>bzip2</application>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>meson</primary>
+ </indexterm>
+ You need to install <application>
+ <ulink url="https://mesonbuild.com/">meson</ulink></application> version
+ 0.54 or later to be able to build <productname>PostgreSQL</productname>
+ with it. If your operating system provides a package manager, you can install
+ <application>meson</application> with that. If not, you
+ can download a <ulink url="https://github.com/mesonbuild/meson">meson release</ulink>
+ from github and run <literal>./meson.py</literal> from the git repository
+ itself. Lastly, Meson is also available in the python package index and can
+ be installed with <literal>pip</literal>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ You need an <acronym>ISO</acronym>/<acronym>ANSI</acronym> C compiler (at least
+ C99-compliant). Recent
+ versions of <productname>GCC</productname> are recommended, but
+ <productname>PostgreSQL</productname> is known to build using a wide variety
+ of compilers from different vendors.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>flex</primary>
+ </indexterm>
+ <indexterm>
+ <primary>lex</primary>
+ </indexterm>
+ <indexterm>
+ <primary>bison</primary>
+ </indexterm>
+ <indexterm>
+ <primary>yacc</primary>
+ </indexterm>
+
+ <application>Flex</application> and <application>Bison</application>
+ are needed to build <productname>PostgreSQL</productname> using
+ <application>meson</application>. Be sure to get
+ <application>Flex</application> 2.5.31 or later and
+ <application>Bison</application> 1.875 or later from your package manager.
+ Other <application>lex</application> and <application>yacc</application>
+ programs cannot be used.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>perl</primary>
+ </indexterm>
+ <application>Perl</application> 5.8.3 or later is needed to build PostgreSQL
+ using <application>meson</application> and to run some test suites.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect3>
+
+ <sect3 id="recommended-packages">
+ <title>Recommended packages</title>
+
+ <para>
+ The following packages are not required to build
+ <application>PostgreSQL</application> but are strongly recommended:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>readline</primary>
+ </indexterm>
+ <indexterm>
+ <primary>libedit</primary>
+ </indexterm>
+
+ The <acronym>GNU</acronym> <productname>Readline</productname> library
+ allows <application>psql</application> (the PostgreSQL command line
+ SQL interpreter) to remember each command you type, and allows you to
+ use arrow keys to recall and edit previous commands. This is very
+ helpful and is strongly recommended. As an alternative, you can often
+ use the BSD-licensed <filename>libedit</filename> library, originally
+ developed on <productname>NetBSD</productname>. The
+ <filename>libedit</filename> library is GNU
+ <productname>Readline</productname>-compatible and is used if
+ <filename>libreadline</filename> is not found, or if
+ <option>libedit_preferred</option> is enabled as an
+ option to <filename>meson configure</filename>. If you are using a
+ package-based Linux distribution, be aware that you need both the
+ <literal>readline</literal> and <literal>readline-devel</literal> packages, if
+ those are separate in your distribution.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>zlib</primary>
+ </indexterm>
+
+ The <productname>zlib</productname> compression library is
+ used to provide support for compressed archives in
+ <application>pg_dump</application> and
+ <application>pg_restore</application> and is recommended.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Various tests, particularly the client program tests under
+ <filename>src/bin</filename>, use the Perl TAP tools. Running
+ these tests is recommended for development. These TAP tests
+ require the Perl module <literal>IPC::Run</literal> which is
+ available from CPAN or an operating system package.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect3>
+
+ <sect3 id="optional-packages">
+ <title>Optional packages</title>
+
+ <para>
+ The following packages are optional. They are not required in the
+ default configuration, but they are needed when certain build
+ options are enabled, as explained below:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ You need <productname>OpenSSL</productname>, if you want to support
+ encrypted client connections. <productname>OpenSSL</productname> is
+ also required for random number generation on platforms that do not
+ have <filename>/dev/urandom</filename> (except Windows). The minimum
+ required version is 1.0.1.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ You need <productname>LZ4</productname>, if you want to support
+ compression of data with that method; see
+ <xref linkend="guc-default-toast-compression"/> and
+ <xref linkend="guc-wal-compression"/>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ You need <productname>Zstandard</productname>, if you want to support
+ compression of data or backups with that method; see
+ <xref linkend="guc-wal-compression"/>.
+ The minimum required version is 1.4.0.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ You need <application>Kerberos</application>, <productname>OpenLDAP</productname>,
+ and/or <application>PAM</application>, if you want to support authentication
+ using those services.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ To build the server programming language
+ <application>PL/Perl</application> you need a full
+ <productname>Perl</productname> installation, including the
+ <filename>libperl</filename> library and the header files.
+ The minimum required version is <productname>Perl</productname> 5.8.3.
+ Since <application>PL/Perl</application> will be a shared
+ library, the <indexterm><primary>libperl</primary></indexterm>
+ <filename>libperl</filename> library must be a shared library
+ also on most platforms. This appears to be the default in
+ recent <productname>Perl</productname> versions, but it was not
+ in earlier versions, and in any case it is the choice of whomever
+ installed Perl at your site. <filename>configure</filename> will fail
+ if building <application>PL/Perl</application> is selected but it cannot
+ find a shared <filename>libperl</filename>. In that case, you will have
+ to rebuild and install <productname>Perl</productname> manually to be
+ able to build <application>PL/Perl</application>. During the
+ configuration process for <productname>Perl</productname>, request a
+ shared library.
+ </para>
+
+ <para>
+ If you intend to make more than incidental use of
+ <application>PL/Perl</application>, you should ensure that the
+ <productname>Perl</productname> installation was built with the
+ <literal>usemultiplicity</literal> option enabled (<literal>perl -V</literal>
+ will show whether this is the case).
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ To build the <application>PL/Python</application> server programming
+ language, you need a <productname>Python</productname>
+ installation with the header files and
+ the <application>sysconfig</application> module. The minimum
+ required version is <productname>Python</productname> 3.2.
+ </para>
+
+ <para>
+ Since <application>PL/Python</application> will be a shared
+ library, the <indexterm><primary>libpython</primary></indexterm>
+ <filename>libpython</filename> library must be a shared library
+ also on most platforms. This is not the case in a default
+ <productname>Python</productname> installation built from source, but a
+ shared library is available in many operating system
+ distributions. <filename>configure</filename> will fail if
+ building <application>PL/Python</application> is selected but it cannot
+ find a shared <filename>libpython</filename>. That might mean that you
+ either have to install additional packages or rebuild (part of) your
+ <productname>Python</productname> installation to provide this shared
+ library. When building from source, run <productname>Python</productname>'s
+ configure with the <literal>--enable-shared</literal> flag.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ To build the <application>PL/Tcl</application>
+ procedural language, you of course need a <productname>Tcl</productname>
+ installation. The minimum required version is
+ <productname>Tcl</productname> 8.4.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ To enable Native Language Support (<acronym>NLS</acronym>), that
+ is, the ability to display a program's messages in a language
+ other than English, you need an implementation of the
+ <application>Gettext</application> <acronym>API</acronym>. Some operating
+ systems have this built-in (e.g., <systemitem
+ class="osname">Linux</systemitem>, <systemitem class="osname">NetBSD</systemitem>,
+ <systemitem class="osname">Solaris</systemitem>), for other systems you
+ can download an add-on package from <ulink
+ url="https://www.gnu.org/software/gettext/"></ulink>.
+ If you are using the <application>Gettext</application> implementation in
+ the <acronym>GNU</acronym> C library then you will additionally
+ need the <productname>GNU Gettext</productname> package for some
+ utility programs. For any of the other implementations you will
+ not need it.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ To build the <productname>PostgreSQL</productname> documentation,
+ there is a separate set of requirements; see
+ <xref linkend="docguide-toolsets"/>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="configure-meson">
+ <title>Configuring the build</title>
+
+ <para>
+ The first step of the installation procedure is to configure the
+ source tree for your system and choose the options you would like. To
+ create and configure the build directory, you can start with the
+ <literal>meson setup</literal> command.
+ </para>
+
+<screen>
+<userinput>meson setup build</userinput>
+</screen>
+
+ <para>
+ The setup command takes a <literal>builddir</literal> and a <literal>srcdir</literal>
+ argument. If no <literal>srcdir</literal> is given Meson will deduce the
+ <literal>srcdir</literal> based on the current directory and the location
+ of <literal>meson.build</literal>. The <literal>builddir</literal> is mandatory.
+ </para>
+
+ <para>
+ Meson then loads the build configuration file and sets up the build directory.
+ Additionally, the invocation can pass options to Meson. The list of commonly
+ used options is in subsequent sections. A few examples of specifying different
+ build options are:
+
+<screen>
+#Setup build directory with a different installation prefix
+meson setup build --prefix=/home/user/pg-install
+
+#Setup build directory to generate a debug build
+meson setup build --buildtype=debug
+
+#Setup build directory with ssl (Use -D for project specific options)
+meson setup build -Dssl=openssl
+</screen>
+
+ Setting up the build directory is a one-time step. To reconfigure before a
+ new build, you can simply use the <literal>meson configure</literal> command
+ </para>
+
+<para>
+<screen>
+meson configure -Dcassert=true
+</screen>
+</para>
+
+<para>
+ <command>meson configure</command>'s commonly used command line options
+ are explained below. This list is not exhaustive (use
+ <literal>meson configure --help</literal> to get one that is).
+ The options not covered here are meant for advanced use-cases, and are
+ documented in the standard meson
+ <ulink url="https://mesonbuild.com/Commands.html#configure">documentation</ulink>.
+ These arguments can be used with <command>meson setup</command> as well.
+</para>
+
+ <sect3 id="configure-install-locations">
+ <title>Installation Locations</title>
+
+ <para>
+ These options control where <literal>ninja install (or meson install)</literal> will put
+ the files. The <option>--prefix</option> option is sufficient for
+ most cases. If you have special needs, you can customize the
+ installation subdirectories with the other options described in this
+ section. Beware however that changing the relative locations of the
+ different subdirectories may render the installation non-relocatable,
+ meaning you won't be able to move it after installation.
+ (The <literal>man</literal> and <literal>doc</literal> locations are
+ not affected by this restriction.)
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--prefix=<replaceable>PREFIX</replaceable></option></term>
+ <listitem>
+ <para>
+ Install all files under the directory <replaceable>PREFIX</replaceable>
+ instead of <filename>/usr/local/pgsql</filename>. The actual
+ files will be installed into various subdirectories; no files
+ will ever be installed directly into the
+ <replaceable>PREFIX</replaceable> directory.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--bindir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Specifies the directory for executable programs. The default
+ is <filename><replaceable>PREFIX</replaceable>/bin</filename>, which
+ normally means <filename>/usr/local/pgsql/bin</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--sysconfdir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Sets the directory for various configuration files,
+ <filename><replaceable>PREFIX</replaceable>/etc</filename> by default.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--libdir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Sets the location to install libraries and dynamically loadable
+ modules. The default is
+ <filename><replaceable>PREFIX</replaceable>/lib</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--includedir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Sets the directory for installing C and C++ header files. The
+ default is <filename><replaceable>PREFIX</replaceable>/include</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--datadir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Sets the directory for read-only data files used by the
+ installed programs. The default is
+ <filename><replaceable>PREFIX</replaceable>/share</filename>. Note that this has
+ nothing to do with where your database files will be placed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--localedir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ Sets the directory for installing locale data, in particular
+ message translation catalog files. The default is
+ <filename><replaceable>DATADIR</replaceable>/locale</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--mandir=<replaceable>DIRECTORY</replaceable></option></term>
+ <listitem>
+ <para>
+ The man pages that come with <productname>PostgreSQL</productname> will be installed under
+ this directory, in their respective
+ <filename>man<replaceable>x</replaceable></filename> subdirectories.
+ The default is <filename><replaceable>DATADIR</replaceable>/man</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <note>
+ <para>
+ Care has been taken to make it possible to install
+ <productname>PostgreSQL</productname> into shared installation locations
+ (such as <filename>/usr/local/include</filename>) without
+ interfering with the namespace of the rest of the system. First,
+ the string <quote><literal>/postgresql</literal></quote> is
+ automatically appended to <varname>datadir</varname>,
+ <varname>sysconfdir</varname>, and <varname>docdir</varname>,
+ unless the fully expanded directory name already contains the
+ string <quote><literal>postgres</literal></quote> or
+ <quote><literal>pgsql</literal></quote>. For example, if you choose
+ <filename>/usr/local</filename> as prefix, the documentation will
+ be installed in <filename>/usr/local/doc/postgresql</filename>,
+ but if the prefix is <filename>/opt/postgres</filename>, then it
+ will be in <filename>/opt/postgres/doc</filename>. The public C
+ header files of the client interfaces are installed into
+ <varname>includedir</varname> and are namespace-clean. The
+ internal header files and the server header files are installed
+ into private directories under <varname>includedir</varname>. See
+ the documentation of each interface for information about how to
+ access its header files. Finally, a private subdirectory will
+ also be created, if appropriate, under <varname>libdir</varname>
+ for dynamically loadable modules.
+ </para>
+ </note>
+ </sect3>
+
+ <sect3 id="configure-pg-features">
+ <title><productname>PostgreSQL</productname> Features</title>
+
+ <para>
+ The options described in this section enable building of
+ various <productname>PostgreSQL</productname> features that are not
+ built by default. Most of these are non-default only because they
+ require additional software, as described in
+ <xref linkend="install-requirements-meson"/>. To specify PostgreSQL
+ specific options, the name of the option should be prefixed by -D.
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><option>-Dnls=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Enables or disables Native Language Support (<acronym>NLS</acronym>),
+ that is, the ability to display a program's messages in a
+ language other than English. It defaults to auto, meaning that it
+ will be enabled automatically if the required packages are found.
+ </para>
+
+ <para>
+ To use this option, you will need an implementation of the
+ <application>Gettext</application> API.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dplperl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build the <application>PL/Perl</application> server-side language. It
+ defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dplpython=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build the <application>PL/Python</application> server-side language.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dpltcl=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build the <application>PL/Tcl</application> server-side language.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dtcl_version=<replaceable>TCL_VERSION</replaceable></option></term>
+ <listitem>
+ <para>
+ Specifies the TCL version to use when building PL/Tcl.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dicu=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with support for
+ the <productname>ICU</productname><indexterm><primary>ICU</primary></indexterm>
+ library, enabling use of ICU collation
+ features<phrase condition="standalone-ignore"> (see
+ <xref linkend="collation"/>)</phrase>.
+ This requires the <productname>ICU4C</productname> package
+ to be installed. The minimum required version
+ of <productname>ICU4C</productname> is currently 4.2.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+
+ <para>
+ By default,
+ <productname>pkg-config</productname><indexterm><primary>pkg-config</primary></indexterm>
+ will be used to find the required compilation options. This is
+ supported for <productname>ICU4C</productname> version 4.6 and later.
+ <!-- Add description for older ICU4C versions and when pkg-config isn't available-->
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="configure-with-llvm-meson">
+ <term><option>-Dllvm=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with support for <productname>LLVM</productname> based
+ <acronym>JIT</acronym> compilation<phrase
+ condition="standalone-ignore"> (see <xref
+ linkend="jit"/>)</phrase>. This
+ requires the <productname>LLVM</productname> library to be installed.
+ The minimum required version of <productname>LLVM</productname> is
+ currently 3.9. It is set to disabled by default.
+ </para>
+ <para>
+ <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
+ will be used to find the required compilation options.
+ <command>llvm-config</command>, and then
+ <command>llvm-config-$major-$minor</command> for all supported
+ versions, will be searched for in your <envar>PATH</envar>.
+ <!--Add substitute fo LLVM_CONFIG when llvm-config is not in PATH-->
+ </para>
+
+ <para>
+ <productname>LLVM</productname> support requires a compatible
+ <command>clang</command> compiler (specified, if necessary, using the
+ <envar>CLANG</envar> environment variable), and a working C++
+ compiler (specified, if necessary, using the <envar>CXX</envar>
+ environment variable).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dlz4=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with <productname>LZ4</productname> compression support.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dzstd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with <productname>Zstandard</productname> compression support.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dssl=<replaceable>LIBRARY</replaceable></option>
+ <indexterm>
+ <primary>OpenSSL</primary>
+ <seealso>SSL</seealso>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Build with support for <acronym>SSL</acronym> (encrypted)
+ connections. The only <replaceable>LIBRARY</replaceable>
+ supported is <option>openssl</option>. This requires the
+ <productname>OpenSSL</productname> package to be installed.
+ <filename>configure</filename> will check for the required
+ header files and libraries to make sure that your
+ <productname>OpenSSL</productname> installation is sufficient
+ before proceeding. The default for this option is none.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dgssapi=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with support for GSSAPI authentication. On many systems, the
+ GSSAPI system (usually a part of the Kerberos installation) is not
+ installed in a location
+ that is searched by default (e.g., <filename>/usr/include</filename>,
+ <filename>/usr/lib</filename>), so you must use the options
+ <option>-Dextra_include_dirs</option> and <option>-Dextra_lib_dirs</option> in
+ addition to this option. <filename>meson configure</filename> will check
+ for the required header files and libraries to make sure that
+ your GSSAPI installation is sufficient before proceeding.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dldap=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with <acronym>LDAP</acronym><indexterm><primary>LDAP</primary></indexterm>
+ support for authentication and connection parameter lookup (see
+ <phrase id="install-ldap-links-meson"><xref linkend="libpq-ldap"/> and
+ <xref linkend="auth-ldap"/></phrase> for more information). On Unix,
+ this requires the <productname>OpenLDAP</productname> package to be
+ installed. On Windows, the default <productname>WinLDAP</productname>
+ library is used. <filename>configure</filename> will check for the required
+ header files and libraries to make sure that your
+ <productname>OpenLDAP</productname> installation is sufficient before
+ proceeding. It defaults to auto, meaning that it will be enabled automatically
+ if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dpam=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with <acronym>PAM</acronym><indexterm><primary>PAM</primary></indexterm>
+ (Pluggable Authentication Modules) support. It defaults to auto, meaning that it
+ will be enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dbsd_auth=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with BSD Authentication support. (The BSD Authentication framework is
+ currently only available on OpenBSD.) It defaults to auto, meaning that it
+ will be enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dsystemd=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with support
+ for <application>systemd</application><indexterm><primary>systemd</primary></indexterm>
+ service notifications. This improves integration if the server
+ is started under <application>systemd</application> but has no impact
+ otherwise<phrase condition="standalone-ignore">; see <xref linkend="server-start"/> for more
+ information</phrase>. <application>libsystemd</application> and the
+ associated header files need to be installed to use this option.
+ It defaults to auto, meaning that it will be enabled automatically if the
+ required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dbonjour=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with support for Bonjour automatic service discovery.
+ This requires Bonjour support in your operating system.
+ Recommended on macOS. It defaults to auto, meaning that it will be
+ enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Duuid=<replaceable>LIBRARY</replaceable></option></term>
+ <listitem>
+ <para>
+ Build the <xref linkend="uuid-ossp"/> module
+ (which provides functions to generate UUIDs), using the specified
+ UUID library.<indexterm><primary>UUID</primary></indexterm>
+ <replaceable>LIBRARY</replaceable> must be one of:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <option>none</option> to not build the ussp module. This is the default.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>bsd</option> to use the UUID functions found in FreeBSD, NetBSD,
+ and some other BSD-derived systems
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>e2fs</option> to use the UUID library created by
+ the <literal>e2fsprogs</literal> project; this library is present in most
+ Linux systems and in macOS, and can be obtained for other
+ platforms as well
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>ossp</option> to use the <ulink
+ url="http://www.ossp.org/pkg/lib/uuid/">OSSP UUID library</ulink>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dlibxml=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with libxml2, enabling SQL/XML support. Libxml2 version 2.6.23 or
+ later is required for this feature. It defaults to auto, meaning that it will be
+ enabled automatically if the required packages are found.
+ </para>
+
+ <para>
+ To detect the required compiler and linker options, PostgreSQL will
+ query <command>pkg-config</command>, if that is installed and knows
+ about libxml2. Otherwise the program <command>xml2-config</command>,
+ which is installed by libxml2, will be used if it is found. Use
+ of <command>pkg-config</command> is preferred, because it can deal
+ with multi-architecture installations better.
+ </para>
+
+ <para>
+ To use a libxml2 installation that is in an unusual location, you
+ can set <command>pkg-config</command>-related environment
+ variables (see its documentation).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dlibxslt=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Build with libxslt, enabling the
+ <xref linkend="xml2"/>
+ module to perform XSL transformations of XML.
+ <option>-Dlibxml</option> must be specified as well.
+ It defaults to auto, meaning that it will be
+ enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dreadline=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Allows use of the <application>Readline</application> library
+ (and <application>libedit</application> as well). This option enables
+ command-line editing and history in
+ <application>psql</application> and is strongly recommended.
+ It defaults to auto, meaning that it will be
+ enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dlibedit_preferred=<replaceable>true/false</replaceable></option></term>
+ <listitem>
+ <para>
+ Setting this to true favors the use of the BSD-licensed <application>libedit</application> library
+ rather than GPL-licensed <application>Readline</application>. This option
+ is significant only if you have both libraries installed; the
+ default is false that is to use <application>Readline</application>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dzlib=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>zlib</primary>
+ </indexterm>
+ Enabls use of the <application>Zlib</application> library.
+ This enables
+ support for compressed archives in <application>pg_dump</application>
+ and <application>pg_restore</application> and is recommended.
+ It defaults to auto, meaning that it will be
+ enabled automatically if the required packages are found.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dspinlocks=<replaceable>true/false</replaceable></option></term>
+ <listitem>
+ <para>
+ This option is set to true by default and
+ setting it to false will allow the build to succeed even if <productname>PostgreSQL</productname>
+ has no CPU spinlock support for the platform. The lack of
+ spinlock support will result in very poor performance; therefore,
+ this option should only be changed if the build aborts and
+ informs you that the platform lacks spinlock support. If setting this
+ option to false is required to build <productname>PostgreSQL</productname> on
+ your platform, please report the problem to the
+ <productname>PostgreSQL</productname> developers.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Datomics=<replaceable>true/false</replaceable></option></term>
+ <listitem>
+ <para>
+ This option is set to true and setting it to false will
+ disable use of CPU atomic operations. The option does nothing on
+ platforms that lack such operations. On platforms that do have
+ them, disabling atomics will result in poor performance. Changing
+ this option is only useful for debugging or making performance comparisons.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="configure-build-process">
+ <title>Build Process Details</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><option>--auto_features=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ Setting this option allows you to override value of all 'auto' features.
+ This can be useful when you want to disable or enable all the "optional"
+ features at once without having to set each of them manually. The default
+ value for this parameter is auto.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--backend=<replaceable>BACKEND</replaceable></option></term>
+ <listitem>
+ <para>
+ The default backend meson uses is ninja and that should suffice for most use cases.
+ However, if you'd like to fully integrate with visual studio, you can set the
+ BACKEND to <command>vs</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dc_args=<replaceable>OPTIONS</replaceable></option></term>
+ <listitem>
+ <para>
+ This option can be used to pass extra options to the C compiler.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dc_link_args=<replaceable>OPTIONS</replaceable></option></term>
+ <listitem>
+ <para>
+ This option can be used to pass extra options to the C linker.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dextra_include_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+ <listitem>
+ <para>
+ <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+ directories that will be added to the list the compiler
+ searches for header files. If you have optional packages
+ (such as GNU <application>Readline</application>) installed in a non-standard
+ location,
+ you have to use this option and probably also the corresponding
+ <option>-Dextra_lib_dirs</option> option.
+ </para>
+ <para>
+ Example: <literal>-Dextra_include_dirs=/opt/gnu/include:/usr/sup/include</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dextra_lib_dirs=<replaceable>DIRECTORIES</replaceable></option></term>
+ <listitem>
+ <para>
+ <replaceable>DIRECTORIES</replaceable> is a colon-separated list of
+ directories to search for libraries. You will probably have
+ to use this option (and the corresponding
+ <option>-Dextra_include_dirs</option> option) if you have packages
+ installed in non-standard locations.
+ </para>
+ <para>
+ Example: <literal>-Dextra_lib_dirs=/opt/gnu/lib:/usr/sup/lib</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dsystem_tzdata=<replaceable>DIRECTORY</replaceable></option>
+ <indexterm>
+ <primary>time zone data</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ <productname>PostgreSQL</productname> includes its own time zone database,
+ which it requires for date and time operations. This time zone
+ database is in fact compatible with the IANA time zone
+ database provided by many operating systems such as FreeBSD,
+ Linux, and Solaris, so it would be redundant to install it again.
+ When this option is used, the system-supplied time zone database
+ in <replaceable>DIRECTORY</replaceable> is used instead of the one
+ included in the PostgreSQL source distribution.
+ <replaceable>DIRECTORY</replaceable> must be specified as an
+ absolute path. <filename>/usr/share/zoneinfo</filename> is a
+ likely directory on some operating systems. Note that the
+ installation routine will not detect mismatching or erroneous time
+ zone data. If you use this option, you are advised to run the
+ regression tests to verify that the time zone data you have
+ pointed to works correctly with <productname>PostgreSQL</productname>.
+ </para>
+
+ <indexterm><primary>cross compilation</primary></indexterm>
+
+ <para>
+ This option is mainly aimed at binary package distributors
+ who know their target operating system well. The main
+ advantage of using this option is that the PostgreSQL package
+ won't need to be upgraded whenever any of the many local
+ daylight-saving time rules change. Another advantage is that
+ PostgreSQL can be cross-compiled more straightforwardly if the
+ time zone database files do not need to be built during the
+ installation.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dextra_version=<replaceable>STRING</replaceable></option></term>
+ <listitem>
+ <para>
+ Append <replaceable>STRING</replaceable> to the PostgreSQL version number. You
+ can use this, for example, to mark binaries built from unreleased Git
+ snapshots or containing custom patches with an extra version string,
+ such as a <command>git describe</command> identifier or a
+ distribution package release number.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-D<replaceable>BINARY_NAME</replaceable>=<replaceable>PATH</replaceable></option></term>
+ <listitem>
+ <para>
+ If you have the binaries for certain by programs required to build
+ Postgres (with or without optional flags) stored at non-standard
+ paths, you could specify them manually to meson configure. The complete
+ list of programs for whom this is supported can be found by running
+ <literal>meson configure</literal>. An example is included below.
+<programlisting>meson configure -DBISON=PATH_TO_BISON</programlisting>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="configure-layout">
+ <title>Data layout</title>
+
+ <para>
+ These options affect how PostgreSQL lays out data on disk.
+ Note that changing these breaks on-disk database compatibility,
+ meaning you cannot use <command>pg_upgrade</command> to upgrade to
+ a build with a different value of these options.
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><option>-Dsegsize=<replaceable>SEGSIZE</replaceable></option></term>
+ <listitem>
+ <para>
+ Set the <firstterm>segment size</firstterm>, in gigabytes. Large tables are
+ divided into multiple operating-system files, each of size equal
+ to the segment size. This avoids problems with file size limits
+ that exist on many platforms. The default segment size, 1 gigabyte,
+ is safe on all supported platforms. If your operating system has
+ <quote>largefile</quote> support (which most do, nowadays), you can use
+ a larger segment size. This can be helpful to reduce the number of
+ file descriptors consumed when working with very large tables.
+ But be careful not to select a value larger than is supported
+ by your platform and the file systems you intend to use. Other
+ tools you might wish to use, such as <application>tar</application>, could
+ also set limits on the usable file size.
+ It is recommended, though not absolutely required, that this value
+ be a power of 2.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dblocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+ <listitem>
+ <para>
+ Set the <firstterm>block size</firstterm>, in kilobytes. This is the unit
+ of storage and I/O within tables. The default, 8 kilobytes,
+ is suitable for most situations; but other values may be useful
+ in special cases.
+ The value must be a power of 2 between 1 and 32 (kilobytes).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dwal_blocksize=<replaceable>BLOCKSIZE</replaceable></option></term>
+ <listitem>
+ <para>
+ Set the <firstterm>WAL block size</firstterm>, in kilobytes. This is the unit
+ of storage and I/O within the WAL log. The default, 8 kilobytes,
+ is suitable for most situations; but other values may be useful
+ in special cases.
+ The value must be a power of 2 between 1 and 64 (kilobytes).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+
+ <sect3 id="configure-devel">
+ <title>Developer Options</title>
+
+ <para>
+ Most of the options in this section are only of interest for
+ developing or debugging <productname>PostgreSQL</productname>.
+ They are not recommended for production builds, except
+ for <option>--debug</option>, which can be useful to enable
+ detailed bug reports in the unlucky event that you encounter a bug.
+ On platforms supporting DTrace, <option>-Ddtrace</option>
+ may also be reasonable to use in production.
+ </para>
+
+ <para>
+ When building an installation that will be used to develop code inside
+ the server, it is recommended to use atleast the <option>--buildtype=debug</option>
+ and <option>-Dcassert</option> options.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--buildtype=<replaceable>BUILDTYPE</replaceable></option></term>
+ <listitem>
+ <para>
+ This option can be used to specify the buildtype to use; defaults
+ to release. If you'd like finer control on the debug symbols
+ and optimization levels than what this option provides, you can
+ refer to the --debug and --optimization flags.
+
+ The following build types are generally used:
+ <variablelist>
+ <varlistentry>
+ <term><literal>plain</literal></term>
+ <listitem>
+ <para>
+ No extra build flags are used, even for compiler warnings,
+ useful for distro packagers and other cases where you need to
+ specify all arguments by yourself.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>debug</literal></term>
+ <listitem>
+ <para>
+ Debug info is generated but the result is not optimized.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>debugoptimized</literal></term>
+ <listitem>
+ <para>
+ Debug info is generated and the code is optimized (on most compilers
+ this means <literal>-g -O2</literal>)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>release</literal></term>
+ <listitem>
+ <para>
+ This enables full optimization and no debug info is generated. This is
+ the default.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--debug</option></term>
+ <listitem>
+ <para>
+ Compiles all programs and libraries with debugging symbols.
+ This means that you can run the programs in a debugger
+ to analyze problems. This enlarges the size of the installed
+ executables considerably, and on non-GCC compilers it usually
+ also disables compiler optimization, causing slowdowns. However,
+ having the symbols available is extremely helpful for dealing
+ with any problems that might arise. Currently, this option is
+ recommended for production installations only if you use GCC.
+ But you should always have it on if you are doing development work
+ or running a beta version.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--optimization</option>=<replaceable>LEVEL</replaceable></term>
+ <listitem>
+ <para>
+ Specify the optimization level. LEVEL can be set to any of {0,g,1,2,3,s}.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--werror</option></term>
+ <listitem>
+ <para>
+ Setting this option asks the compiler to treat warnings as errors. This can
+ be useful for code development purposes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dcassert</option></term>
+ <listitem>
+ <para>
+ Enables <firstterm>assertion</firstterm> checks in the server, which test for
+ many <quote>cannot happen</quote> conditions. This is invaluable for
+ code development purposes, but the tests can slow down the
+ server significantly.
+ Also, having the tests turned on won't necessarily enhance the
+ stability of your server! The assertion checks are not categorized
+ for severity, and so what might be a relatively harmless bug will
+ still lead to server restarts if it triggers an assertion
+ failure. This option is not recommended for production use, but
+ you should have it on for development work or when running a beta
+ version.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dtap-tests</option></term>
+ <listitem>
+ <para>
+ Enable tests using the Perl TAP tools. This requires a Perl
+ installation and the Perl module <literal>IPC::Run</literal>.
+ <phrase condition="standalone-ignore">See <xref linkend="regress-tap"/> for more information.</phrase>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-DPG_TEST_EXTRA=<replaceable>TEST_SUITES</replaceable></option></term>
+ <listitem>
+ <para>
+ Enable test suites which require special software to run. This option
+ accepts arguments via a whitespace-separated list. The following values
+ are currently supported:
+ <variablelist>
+ <varlistentry>
+ <term><literal>kerberos</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/kerberos</filename>. This
+ requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ldap</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/ldap</filename>. This
+ requires an <productname>OpenLDAP</productname> installation and opens
+ TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ssl</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/ssl</filename>. This opens TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>wal_consistency_checking</literal></term>
+ <listitem>
+ <para>
+ Uses <literal>wal_consistency_checking=all</literal> while running
+ certain tests under <filename>src/test/recovery</filename>. Not
+ enabled by default because it is resource intensive.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ Tests for features that are not supported by the current build
+ configuration are not run even if they are mentioned in
+ <varname>PG_TEST_EXTRA</varname>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>--errorlogs</option></term>
+ <listitem>
+ <para>
+ This option can be used to print the logs from the failing tests
+ making debugging easier.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Db_coverage</option></term>
+ <listitem>
+ <para>
+ If using GCC, all programs and libraries are compiled with
+ code coverage testing instrumentation. When run, they
+ generate files in the build directory with code coverage
+ metrics.
+ <phrase condition="standalone-ignore">See <xref linkend="regress-coverage"/>
+ for more information.</phrase> This option is for use only with GCC
+ and when doing development work.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Ddtrace=<replaceable>auto/enabled/disabled</replaceable></option></term>
+ <listitem>
+ <para>
+ <indexterm>
+ <primary>DTrace</primary>
+ </indexterm>
+ Enabling this compiles <productname>PostgreSQL</productname> with support for the
+ dynamic tracing tool DTrace.
+ <phrase condition="standalone-ignore">See <xref linkend="dynamic-trace"/>
+ for more information.</phrase>
+ </para>
+
+ <para>
+ To point to the <command>dtrace</command> program, the
+ environment variable <envar>DTRACE</envar> can be set. This
+ will often be necessary because <command>dtrace</command> is
+ typically installed under <filename>/usr/sbin</filename>,
+ which might not be in your <envar>PATH</envar>.
+ </para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ <sect3 id="configure-misc">
+ <title>Miscellaneous</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>-Dpgport=<replaceable>NUMBER</replaceable></option></term>
+ <listitem>
+ <para>
+ Set <replaceable>NUMBER</replaceable> as the default port number for
+ server and clients. The default is 5432. The port can always
+ be changed later on, but if you specify it here then both
+ server and clients will have the same default compiled in,
+ which can be very convenient. Usually the only good reason
+ to select a non-default value is if you intend to run multiple
+ <productname>PostgreSQL</productname> servers on the same machine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-Dkrb_srvnam=<replaceable>NAME</replaceable></option></term>
+ <listitem>
+ <para>
+ The default name of the Kerberos service principal used
+ by GSSAPI.
+ <literal>postgres</literal> is the default. There's usually no
+ reason to change this unless you are building for a Windows
+ environment, in which case it must be set to upper case
+ <literal>POSTGRES</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="build-meson">
+ <title>Building the source</title>
+ <para>
+ By default, <productname>Meson</productname> uses the
+ <ulink url="https://ninja-build.org/"> Ninja build system</ulink>.
+ To build <productname>PostgreSQL</productname> from source using meson, you can
+ simply use the <literal>ninja</literal> command in the build directory.
+<screen>
+ninja
+</screen>
+ Ninja will automatically detect the number of CPUs in your computer and
+ parallelize itself accordingly. You can override the amount of parallel
+ processes used with the command line argument <literal>-j</literal>.
+ </para>
+
+ <para>
+ It should be noted that after the initial configure step
+ <command>ninja</command> is the only command you ever need to type to
+ compile. No matter how you alter your source tree (short of moving it to
+ a completely new location), Meson will detect the changes and regenerate
+ itself accordingly. This is especially handy if you have multiple build
+ directories. Often one of them is used for development (the "debug" build)
+ and others only every now and then (such as a "static analysis" build).
+ Any configuration can be built just by cd'ing to the corresponding directory
+ and running Ninja.
+ </para>
+
+ <para>
+ If you'd like to build with a backend other that ninja, you can use configure
+ with the <option>--backend</option> option to select the one you want to use and then
+ build using <literal>meson compile</literal>. To learn more about these
+ backends and other arguments you can provide to ninja, you can refer to the
+ meson <ulink url="https://mesonbuild.com/Running-Meson.html#building-from-the-source">
+ documentation</ulink>.
+ </para>
+ </sect2>
+
+ <sect2 id="install-files-meson">
+ <title>Installing the files</title>
+ <para>
+ Once Postgres is built, you can install it by simply running the
+ <literal>ninja install</literal> command.
+
+<screen>
+ninja install
+</screen>
+ </para>
+
+ <para>
+ This will install files into the directories that were specified
+ in <xref linkend="configure-meson"/>. Make sure that you have appropriate
+ permissions to write into that area. You might need to do this
+ step as root. Alternatively, you can create the target directories
+ in advance and arrange for appropriate permissions to be granted.
+ The standard installation provides all the header files needed for client
+ application development as well as for server-side program
+ development, such as custom functions or data types written in C.
+ </para>
+
+ <para>
+ <literal>ninja install</literal> should work for most cases
+ but if you'd like to use more options, you could also use
+ <literal>meson install</literal> instead. You can learn more about
+ <ulink url="https://mesonbuild.com/Commands.html#install">meson install</ulink>
+ and it's options in the meson documentation.
+ </para>
+
+ <para>
+ Depending on your platform and setup, you might have to perform a
+ few steps after installation. Those are outlined in
+ <xref linkend="install-post"/>.
+ </para>
+
+ <formalpara>
+ <title>Uninstallation:</title>
+ <para>
+ To undo the installation, you can use the <command>ninja
+ uninstall</command> command.
+ </para>
+ </formalpara>
+
+ <formalpara>
+ <title>Cleaning:</title>
+ <para>
+ After the installation you can free disk space by removing the built
+ files from the source tree with the <command>ninja clean</command>
+ command.
+ </para>
+ </formalpara>
+
+ </sect2>
+
+ <sect2 id="running-tests">
+ <title>Running tests</title>
+ <para>
+ If you want to test the newly built server, you can run the regression
+ tests. The regression tests are a collection of test suites to verify
+ that <productname>PostgreSQL</productname> runs on your machine in
+ the way the developers expected it to. To run them, simply type:
+<screen>
+<userinput>meson test</userinput>
+</screen>
+ You can repeat this at any later time by issuing the same command.
+ </para>
+
+ <para>Meson also allows you to list tests and run specific tests or suites.
+<screen>
+# List all tests
+<userinput>meson test --list</userinput>
+
+# Run a specific test
+<userinput>meson test recovery/001_stream_rep</userinput>
+
+# Run the main pg_regress and isolation tests
+<userinput>meson test --suite main</userinput>
+</screen>
+ </para>
+
+ <para>
+ To learn more about running the tests and how to interpret the results
+ you can refer to the documentation for interpreting test results.
+ <literal>meson test</literal> also provides a number of additional
+ options you can use which can be found in the
+ <ulink url="https://mesonbuild.com/Unit-tests.html#testing-tool">meson test documentation</ulink>.
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="install-post">
+ <title>Post-Installation Setup</title>
+
+ <sect2 id="install-post-shlibs">
+ <title>Shared Libraries</title>
+
+ <indexterm>
+ <primary>shared library</primary>
+ </indexterm>
+
+ <para>
+ On some systems with shared libraries
+ you need to tell the system how to find the newly installed
+ shared libraries. The systems on which this is
+ <emphasis>not</emphasis> necessary include
+ <systemitem class="osname">FreeBSD</systemitem>,
+ <systemitem class="osname">Linux</systemitem>,
+ <systemitem class="osname">NetBSD</systemitem>, <systemitem
+ class="osname">OpenBSD</systemitem>, and
+ <systemitem class="osname">Solaris</systemitem>.
+ </para>
+
+ <para>
+ The method to set the shared library search path varies between
+ platforms, but the most widely-used method is to set the
+ environment variable <envar>LD_LIBRARY_PATH</envar> like so: In Bourne
+ shells (<command>sh</command>, <command>ksh</command>, <command>bash</command>, <command>zsh</command>):
+<programlisting>
+LD_LIBRARY_PATH=/usr/local/pgsql/lib
+export LD_LIBRARY_PATH
+</programlisting>
+ or in <command>csh</command> or <command>tcsh</command>:
+<programlisting>
+setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
+</programlisting>
+ Replace <literal>/usr/local/pgsql/lib</literal> with whatever you set
+ <option><literal>--libdir</literal></option> to in <xref linkend="configure"/>.
+ You should put these commands into a shell start-up file such as
+ <filename>/etc/profile</filename> or <filename>~/.bash_profile</filename>. Some
+ good information about the caveats associated with this method can
+ be found at <ulink
+ url="http://xahlee.info/UnixResource_dir/_/ldpath.html"></ulink>.
+ </para>
+
+ <para>
+ On some systems it might be preferable to set the environment
+ variable <envar>LD_RUN_PATH</envar> <emphasis>before</emphasis>
+ building.
+ </para>
+
+ <para>
+ On <systemitem class="osname">Cygwin</systemitem>, put the library
+ directory in the <envar>PATH</envar> or move the
+ <filename>.dll</filename> files into the <filename>bin</filename>
+ directory.
+ </para>
+
+ <para>
+ If in doubt, refer to the manual pages of your system (perhaps
+ <command>ld.so</command> or <command>rld</command>). If you later
+ get a message like:
+<screen>
+psql: error in loading shared libraries
+libpq.so.2.1: cannot open shared object file: No such file or directory
+</screen>
+ then this step was necessary. Simply take care of it then.
+ </para>
+
+ <para>
+ <indexterm>
+ <primary>ldconfig</primary>
+ </indexterm>
+ If you are on <systemitem class="osname">Linux</systemitem> and you have root
+ access, you can run:
+<programlisting>
+/sbin/ldconfig /usr/local/pgsql/lib
+</programlisting>
+ (or equivalent directory) after installation to enable the
+ run-time linker to find the shared libraries faster. Refer to the
+ manual page of <command>ldconfig</command> for more information. On
+ <systemitem class="osname">FreeBSD</systemitem>, <systemitem
+ class="osname">NetBSD</systemitem>, and <systemitem
+ class="osname">OpenBSD</systemitem> the command is:
+<programlisting>
+/sbin/ldconfig -m /usr/local/pgsql/lib
+</programlisting>
+ instead. Other systems are not known to have an equivalent
+ command.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Environment Variables</title>
+
+ <indexterm>
+ <primary><envar>PATH</envar></primary>
+ </indexterm>
+
+ <para>
+ If you installed into <filename>/usr/local/pgsql</filename> or some other
+ location that is not searched for programs by default, you should
+ add <filename>/usr/local/pgsql/bin</filename> (or whatever you set
+ <option><literal>--bindir</literal></option> to in <xref linkend="configure"/>)
+ into your <envar>PATH</envar>. Strictly speaking, this is not
+ necessary, but it will make the use of <productname>PostgreSQL</productname>
+ much more convenient.
+ </para>
+
+ <para>
+ To do this, add the following to your shell start-up file, such as
+ <filename>~/.bash_profile</filename> (or <filename>/etc/profile</filename>, if you
+ want it to affect all users):
+<programlisting>
+PATH=/usr/local/pgsql/bin:$PATH
+export PATH
+</programlisting>
+ If you are using <command>csh</command> or <command>tcsh</command>, then use this command:
+<programlisting>
+set path = ( /usr/local/pgsql/bin $path )
+</programlisting>
+ </para>
<para>
<indexterm>
@@ -2106,62 +3797,6 @@ export MANPATH
</sect2>
</sect1>
- <sect1 id="supported-platforms">
- <title>Supported Platforms</title>
-
- <para>
- A platform (that is, a CPU architecture and operating system combination)
- is considered supported by the <productname>PostgreSQL</productname> development
- community if the code contains provisions to work on that platform and
- it has recently been verified to build and pass its regression tests
- on that platform. Currently, most testing of platform compatibility
- is done automatically by test machines in the
- <ulink url="https://buildfarm.postgresql.org/">PostgreSQL Build Farm</ulink>.
- If you are interested in using <productname>PostgreSQL</productname> on a platform
- that is not represented in the build farm, but on which the code works
- or can be made to work, you are strongly encouraged to set up a build
- farm member machine so that continued compatibility can be assured.
- </para>
-
- <para>
- In general, <productname>PostgreSQL</productname> can be expected to work on
- these CPU architectures: x86, PowerPC, S/390, SPARC, ARM, MIPS, RISC-V,
- and PA-RISC, including
- big-endian, little-endian, 32-bit, and 64-bit variants where applicable.
- It is often
- possible to build on an unsupported CPU type by configuring with
- <option>--disable-spinlocks</option>, but performance will be poor.
- </para>
-
- <para>
- <productname>PostgreSQL</productname> can be expected to work on current
- versions of these operating systems: Linux, Windows,
- FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos.
- Other Unix-like systems may also work but are not currently
- being tested. In most cases, all CPU architectures supported by
- a given operating system will work. Look in
- <xref linkend="installation-platform-notes"/> below to see if
- there is information
- specific to your operating system, particularly if using an older system.
- </para>
-
- <para>
- If you have installation problems on a platform that is known
- to be supported according to recent build farm results, please report
- it to <email>pgsql-bugs@lists.postgresql.org</email>. If you are interested
- in porting <productname>PostgreSQL</productname> to a new platform,
- <email>pgsql-hackers@lists.postgresql.org</email> is the appropriate place
- to discuss that.
- </para>
-
- <para>
- Historical versions of <productname>PostgreSQL</productname> or POSTGRES
- also ran on CPU architectures including Alpha, Itanium, M32R, M68K,
- M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS,
- BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS,
- Tru64 UNIX, and ULTRIX.
- </para>
- </sect1>
<sect1 id="installation-platform-notes">
<title>Platform-Specific Notes</title>
@@ -2170,7 +3805,7 @@ export MANPATH
This section documents additional platform-specific issues
regarding the installation and setup of PostgreSQL. Be sure to
read the installation instructions, and in
- particular <xref linkend="install-requirements"/> as well. Also,
+ particular <xref linkend="install-requirements-make"/> as well. Also,
check <xref linkend="regress"/> regarding the
interpretation of regression test results.
</para>
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 1d9509a2f6..214e1b1d55 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -7072,7 +7072,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
explicitly tell the configure script to make the probes available
in <productname>PostgreSQL</productname>. To include DTrace support
specify <option>--enable-dtrace</option> to configure. See <xref
- linkend="install-procedure"/> for further information.
+ linkend="configure-options-devel"/> for further information.
</para>
</sect2>
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index c802c0c5f5..3d860550d7 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1855,7 +1855,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
<step>
<para>
Install the new version of <productname>PostgreSQL</productname> as
- outlined in <xref linkend="install-procedure"/>.
+ outlined in <xref linkend="installation"/>.
</para>
</step>
diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml
index 0ed7f8a3fe..f16be29a61 100644
--- a/doc/src/sgml/sourcerepo.sgml
+++ b/doc/src/sgml/sourcerepo.sgml
@@ -20,9 +20,10 @@
Note that building <productname>PostgreSQL</productname> from the source
repository requires reasonably up-to-date versions of <application>bison</application>,
<application>flex</application>, and <application>Perl</application>. These tools are not needed
- to build from a distribution tarball, because the files that these tools
+ to build from a distribution tarball if building via make, because the files that these tools
are used to build are included in the tarball. Other tool requirements
- are the same as shown in <xref linkend="install-requirements"/>.
+ are the same as shown in <xref linkend="install-requirements-make"/> and
+ <xref linkend="install-requirements-meson"/>.
</para>
<sect1 id="git">
^ permalink raw reply [nested|flat] 17+ messages in thread
end of thread, other threads:[~2022-09-08 22:26 UTC | newest]
Thread overview: 17+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2022-08-11 00:20 Re: [RFC] building postgres with meson - v11 Andres Freund <andres@anarazel.de>
2022-08-17 13:50 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-08-17 21:53 ` Andres Freund <andres@anarazel.de>
2022-08-20 07:38 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-08-20 18:01 ` Andres Freund <andres@anarazel.de>
2022-08-24 09:39 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-08-24 15:30 ` Andres Freund <andres@anarazel.de>
2022-08-24 18:21 ` samay sharma <smilingsamay@gmail.com>
2022-08-25 13:29 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-08-31 08:42 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-09-01 23:12 ` samay sharma <smilingsamay@gmail.com>
2022-09-02 17:16 ` samay sharma <smilingsamay@gmail.com>
2022-09-07 04:48 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-09-08 07:20 ` samay sharma <smilingsamay@gmail.com>
2022-09-07 04:46 ` Peter Eisentraut <peter.eisentraut@enterprisedb.com>
2022-09-08 22:26 ` samay sharma <smilingsamay@gmail.com>
2022-08-24 17:42 ` Andres Freund <andres@anarazel.de>
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox