Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1maDIA-00038Q-Re for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Oct 2021 08:37:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1maDI9-0006Mf-R9 for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Oct 2021 08:37:45 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1maDI7-0006MU-6Q for pgsql-hackers@lists.postgresql.org; Tue, 12 Oct 2021 08:37:45 +0000 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1maDHr-00038W-2j for pgsql-hackers@postgresql.org; Tue, 12 Oct 2021 08:37:42 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.west.internal (Postfix) with ESMTP id 29F6F3200953 for ; Tue, 12 Oct 2021 04:37:24 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Tue, 12 Oct 2021 04:37:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anarazel.de; h= date:from:to:subject:message-id:mime-version:content-type :content-transfer-encoding; s=fm2; bh=sZTacrm5qIyACQG+NkWPJD/KnU iTld7L1Q3snH6IOw4=; b=rG7aghy5g/+y2uCZDzimEHMF5AMQjc2nKW51xE74De 3bqE5o2Z27+LtKWNHhsLN5gHmBr1OY9e0jAQD+yIUEGdXkgFr/gIkHdRZ4yWct9h zdHutHysZCb0z2bZF2HPJJqyA9u0WhtKzlJMXy/vPO3eX1OJukFU2+Emhu0pr8FI Ha9LsRQOcT0u8HYXHu6aE1cv3sgghBl2AsA4Rgb1UTSnJoEuE7CxuA6yIOlw6rYQ xPOA2sZ2SZZ21LxnB9hNgMbOFZvLYmTLkB1/r5vQlc8L/9aPKkZWJ7OplIXU6EXI tAEGG7YW0oRwLqOhWDZ88puUTZ7QAItYAFJSc31ztPlw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; bh=sZTacr m5qIyACQG+NkWPJD/KnUiTld7L1Q3snH6IOw4=; b=JtRcjj2/oC0XPqGRM/tb60 FgnyK4sHdJ8ypI51Bb/ELCqEywbNUjOd4zvR56CgiXaBGzNi/pC5UyBVh9VeQ/Pn lkEX97lxOPwGepXqcutzhaeKQkBkZMuir6dzH3peSMbQReZIb8XPN+SjSbyicOyB eu+m5punlsyB/+XvLqNiokldDd7CaDUUnlBXzVhl2zirg/LmppRlTbsjeODJxfKy JPEA6QyK2eUfJsaXZkSQf6F35hfKIZU/TlXpo1jdm5G1XBthlRj4nB4Y/PorwV17 wD4qFEVXQgtH1HdsE+mjdBtpIW5f2HCYhBMKtosgU5eCIaSSAx1I3R6gvL17OY5w == X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrvddtkedgtdegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpeffhffvuffkgggtugfgsehmkeerre dttddvnecuhfhrohhmpeetnhgurhgvshcuhfhrvghunhguuceorghnughrvghssegrnhgr rhgriigvlhdruggvqeenucggtffrrghtthgvrhhnpeethfdufefhkefgkeelffevgfejie ekvddvfeduuddtiedtheeutdeukeekvdegudenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpegrnhgurhgvshesrghnrghrrgiivghlrdguvg X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Tue, 12 Oct 2021 04:37:23 -0400 (EDT) Date: Tue, 12 Oct 2021 01:37:21 -0700 From: Andres Freund To: pgsql-hackers@postgresql.org Subject: [RFC] building postgres with meson Message-ID: <20211012083721.hvixq4pnh2pixr3j@alap3.anarazel.de> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="qozqt6hocm2wibt2" Content-Disposition: inline Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --qozqt6hocm2wibt2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, For the last year or so I've on and off tinkered with $subject. I think it's in a state worth sharing now. First, let's look at a little comparison. My workstation: non-cached configure: current: 11.80s meson: 6.67s non-cached build (world-bin): current: 40.46s ninja: 7.31s no-change build: current: 1.17s ninja: 0.06s test world: current: 105s meson: 63s What actually started to motivate me however were the long times windows builds took to come back with testsresults. On CI, with the same machine config: build: current: 202s (doesn't include genbki etc) meson+ninja: 140s meson+msbuild: 206s test: current: 1323s (many commands) meson: 903s (single command) (note that the test comparison isn't quite fair - there's a few tests missing, but it's just small contrib ones afaik) The biggest difference to me however is not the speed, but how readable the output is. Running the tests with meson in a terminal, shows the number of tests that completed out of how many total, how much time has passed, how long the currently running tests already have been running. At the end of a testrun a count of tests is shown: 188/189 postgresql:tap+pg_basebackup / pg_basebackup/t/010_pg_basebackup.pl OK 39.51s 110 subtests passed 189/189 postgresql:isolation+snapshot_too_old / snapshot_too_old/isolation OK 62.93s Ok: 188 Expected Fail: 0 Fail: 1 Unexpected Pass: 0 Skipped: 0 Timeout: 0 Full log written to /tmp/meson/meson-logs/testlog.txt The log has the output of the tests and ends with: Summary of Failures: 120/189 postgresql:tap+recovery / recovery/t/007_sync_rep.pl ERROR 7.16s (exit status 255 or signal 127 SIGinvalid) Quite the difference to make check-world -jnn output. So, now that the teasing is done, let me explain a bit what lead me down this path: Autoconf + make is not being actively developed. Especially autoconf is *barely* in maintenance mode - despite many shortcomings and bugs. It's also technology that very few want to use - autoconf m4 is scary, and it's scarier for people that started more recently than a lot of us committers for example. Recursive make as we use it is hard to get right. One reason the clean make build is so slow compared to meson is that we had to resort to .NOTPARALLEL to handle dependencies in a bunch of places. And despite that, I quite regularly see incremental build failures that can be resolved by retrying the build. While we have incremental build via --enable-depend, they don't work that reliable (i.e. misses necessary rebuilds) and yet is often too aggressive. More modern build system can keep track of the precise command used to build a target and rebuild it when that command changes. We also don't just have the autoconf / make buildsystem, there's also the msvc project generator - something most of us unix-y folks do not like to touch. I think that, combined with there being no easy way to run all tests, and it being just different, really hurt our windows developer appeal (and subsequently the quality of postgres on windows). I'm not saying this to ding the project generator - that was well before there were decent "meta" buildsystems out there (and in some ways it is a small one itself). The last big issue I have with the current situation is that there's no good test integration. make check-world output is essentially unreadable / not automatically parseable. Which led to the buildfarm having a separate list of things it needs to test, so that failures can be pinpointed and paired with appropriate logs. That approach unfortunately doesn't scale well to multi-core CPUs, slowing down the buildfarm by a fair bit. This all led to me to experiment with improvements. I tried a few somewhat crazy but incremental things like converting our buildsystem to non-recursive make (I got it to build the backend, but it's too hard to do manually I think), or to not run tests during the recursive make check-world, but to append commands to a list of tests, that then is run by a helper (can kinda be made to work). In the end I concluded that the amount of time we'd need to invest to maintain our more-and-more custom buildsystem going forward doesn't make sense. Which lead me to look around and analyze which other buildsystems there are that could make some sense for us. The halfway decent list includes, I think: 1) cmake 2) bazel 3) meson cmake would be a decent choice, I think. However, I just can't fully warm up to it. Something about it just doesn't quite sit right with me. That's not a good enough reason to prevent others from suggesting to use it, but it's good enough to justify not investing a lot of time in it myself. Bazel has some nice architectural properties. But it requires a JVM to run - I think that basically makes it insuitable for us. And the build information seems quite arduous to maintain too. Which left me with meson. It is a meta-buildsystem that can do the actual work of building via ninja (the most common one, also targeted by cmake), msbuild (visual studio project files, important for GUI work) and xcode projects (I assume that's for a macos IDE, but I haven't tried to use it). Meson roughly does what autoconf+automake did, in a python-esque DSL, and outputs build-instructions for ninja / msbuild / xcode. One interesting bit is that meson itself is written in python ( and fairly easy to contribute too - I got a few changes in now). I don't think meson is perfect architecturally - e.g. its insistence on not having functions ends up making it a bit harder to not end up duplicating code. There's some user-interface oddities that are now hard to fix fully, due to the faily wide usage. But all-in-all it's pretty nice to use. Its worth calling out that a lot of large open source projects have been / are migrating to meson. qemu/kvm, mesa (core part of graphics stack on linux and also widely used in other platforms), a good chunk of GNOME, and quite a few more. Due to that it seems unlikely to be abandoned soon. As far as I can tell the only OS that postgres currently supports that meson doesn't support is HPUX. It'd likely be fairly easy to add gcc-on-hpux support, a chunk more to add support for the proprietary ones. The attached patch (meson support is 0016, the rest is prerequisites that aren't that interesting at this stage) converts most of postgres to meson. There's a few missing contrib modules, only about half the optional library dependencies are implemented, and I've only built on x64. It builds on freebsd, linux, macos and windows (both ninja and msbuild) and cross builds from linux to windows. Thomas helped make the freebsd / macos pieces a reality, thanks! I took a number of shortcuts (although there used to be a *lot* more). So this shouldn't be reviewed to the normal standard of the community - it's a prototype. But I think it's in a complete enough shape that it allows to do a well-informed evaluation. What doesn't yet work/ build: - plenty optional libraries, contrib, NLS, docs build - PGXS - and I don't yet know what to best do about it. One backward-compatible way would be to continue use makefiles for pgxs, but do the necessary replacement of Makefile.global.in via meson (and not use that for postgres' own build). But that doesn't really provide a nicer path for building postgres extensions on windows, so it'd definitely not be a long-term path. - JIT bitcode generation for anything but src/backend. - anything but modern-ish x86. That's proably a small amount of work, but something that needs to be done. - exporting all symbols for extension modules on windows (the stuff for postgres is implemented). Instead I marked the relevant symbols als declspec(dllexport). I think we should do that regardless of the buildsystem change. Restricting symbol visibility via gcc's -fvisibility=hidden for extensions results in a substantially reduced number of exported symbols, and even reduces object size (and I think improves the code too). I'll send an email about that separately. There's a lot more stuff to talk about, but I'll stop with a small bit of instructions below: Demo / instructions: # Get code git remote add andres git@github.com:anarazel/postgres.git git fetch andres git checkout --track andres/meson # setup build directory meson setup build --buildtype debug cd build # build (uses automatically as many cores as available) ninja # change configuration, build again meson configure -Dssl=openssl ninja # run all tests meson test # run just recovery tests meson test --suite setup --suite recovery # list tests meson test --list Greetings, Andres Freund --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0001-ci-backend-windows-DONTMERGE-crash-reporting-back.patch" From a9b4a00a55d29fbfc96b81b0dd568a0cf9f61c20 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 9 Sep 2021 17:49:39 -0700 Subject: [PATCH v3 01/17] ci: backend: windows: DONTMERGE: crash reporting (backend). --- src/backend/main/main.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ad84a45e28c..65a325723fd 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -26,6 +26,10 @@ #include #endif +#if defined(WIN32) +#include +#endif + #if defined(_M_AMD64) && _MSC_VER == 1800 #include #include @@ -238,7 +242,15 @@ startup_hacks(const char *progname) } /* In case of general protection fault, don't show GUI popup box */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + SetErrorMode(SEM_FAILCRITICALERRORS /* | SEM_NOGPFAULTERRORBOX */); + + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); +#ifndef __MINGW64__ + _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, _CALL_REPORTFAULT | _WRITE_ABORT_MSG); +#endif #if defined(_M_AMD64) && _MSC_VER == 1800 -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0002-ci-Add-CI-for-FreeBSD-Linux-MacOS-and-Windows-uti.patch" From 7a364ae12c87f2523576f1a309ef688962f3d047 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 15 Mar 2021 09:25:15 -0700 Subject: [PATCH v3 02/17] ci: Add CI for FreeBSD, Linux, MacOS and Windows, utilizing cirrus-ci. --- .cirrus.yml | 395 ++++++++++++++++++++++++++++++++ .dockerignore | 3 + ci/docker/linux_debian_bullseye | 13 ++ ci/docker/windows_vs_2019 | 105 +++++++++ ci/freebsd_gcp_repartition.sh | 28 +++ ci/pg_ci_base.conf | 12 + ci/windows_build_config.pl | 10 + 7 files changed, 566 insertions(+) create mode 100644 .cirrus.yml create mode 100644 .dockerignore create mode 100644 ci/docker/linux_debian_bullseye create mode 100644 ci/docker/windows_vs_2019 create mode 100755 ci/freebsd_gcp_repartition.sh create mode 100644 ci/pg_ci_base.conf create mode 100644 ci/windows_build_config.pl diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 00000000000..f75bdce6dec --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,395 @@ +env: + # accelerate initial clone, but a bit of depth so that concurrent tasks work + CIRRUS_CLONE_DEPTH: 100 + # Useful to be able to analyse what in a script takes long + CIRRUS_LOG_TIMESTAMP: true + # target to test, for all but windows + CHECK: check-world + CHECKFLAGS: -Otarget + PGCTLTIMEOUT: 120 + CCACHE_MAXSIZE: "500M" + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + PG_TEST_EXTRA: kerberos ldap ssl + + +task: + name: FreeBSD + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' + compute_engine_instance: + image_project: pg-vm-images-aio + image: family/pg-aio-freebsd-13-0 + platform: freebsd + cpu: 2 + memory: 2G + disk: 50 + env: + CCACHE_DIR: "/tmp/ccache_dir" + + ccache_cache: + folder: "/tmp/ccache_dir" + sysinfo_script: + - export || true + sysconfig_script: + - sudo sysctl kern.corefile='/tmp/%N.%P.core' + repartition_script: + - ci/freebsd_gcp_repartition.sh + create_user_script: + - pw useradd postgres + - chown -R postgres:postgres . + - mkdir -p /tmp/ccache_dir + - chown -R postgres:postgres /tmp/ccache_dir + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --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/ \ + --with-uuid=bsd \ + \ + --with-includes=/usr/local/include --with-libs=/usr/local/lib \ + CC="ccache cc"' + build_script: + - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib' + upload_caches: + - ccache + + tests_script: + - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}' + + on_failure: + cores_script: | + for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do + binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ; + echo dumping $corefile for $binary ; + gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: Linux + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' + compute_engine_instance: + image_project: pg-vm-images-aio + image: family/pg-aio-bullseye + platform: linux + cpu: 4 + memory: 2G + nested_virtualization: false + env: + CCACHE_DIR: "/tmp/ccache_dir" + DEBUGINFOD_URLS: "https://debuginfod.debian.net" + + ccache_cache: + folder: "/tmp/ccache_dir" + + sysinfo_script: + - id + - uname -a + - cat /proc/cmdline + - lsblk + - ulimit -a -H + - ulimit -a -S + - export + sysconfig_script: + - useradd -m postgres + - chown -R postgres:postgres . + - mkdir -p /tmp/ccache_dir + - chown -R postgres:postgres /tmp/ccache_dir + - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf + - su postgres -c 'ulimit -l -H' + - su postgres -c 'ulimit -l -S' + - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-gssapi \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + --with-llvm \ + --with-lz4 \ + --with-pam \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-systemd \ + --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"' + build_script: + - su postgres -c 'make -s -j4 && make -s -j4 -C contrib' + upload_caches: + - ccache + + tests_script: | + su postgres -c '\ + ulimit -c unlimited; \ + make -s ${CHECK} ${CHECKFLAGS} -j8 \ + ' + + on_failure: + cores_script: | + for corefile in $(find /tmp -name '*.core' 2>/dev/null) ; do + binary=$(gdb -quiet -core $corefile -batch -ex 'info auxv' | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") ; + echo dumping $corefile for $binary ; + gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $binary $corefile ; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: macOS + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' + osx_instance: + image: big-sur-base + env: + CIRRUS_WORKING_DIR: ${HOME}/pgsql/ + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + CCACHE_DIR: ${HOME}/ccache + HOMEBREW_CACHE: ${HOME}/homebrew-cache + PERL5LIB: ${HOME}/perl5/lib/perl5 + + sysinfo_script: + - id + - export + ccache_cache: + folder: ${CCACHE_DIR} + homebrew_cache: + folder: ${HOMEBREW_CACHE} + perl_cache: + folder: ~/perl5 + + cpan_install_script: + - perl -mIPC::Run -e 1 || cpan -T IPC::Run + - perl -mIO::Pty -e 1 || cpan -T IO::Pty + upload_caches: + - perl + core_install_script: + - sudo chmod 777 /cores + homebrew_install_script: + - brew install make coreutils ccache icu4c lz4 tcl-tk openldap + upload_caches: + - homebrew + + configure_script: | + LIBS="/usr/local/lib:$LIBS" + INCLUDES="/usr/local/include:$INCLUDES" + + INCLUDES="/usr/local/opt/openssl/include:$INCLUDES" + LIBS="/usr/local/opt/openssl/lib:$LIBS" + + PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH" + INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES" + LIBS="/usr/local/opt/icu4c/lib:$LIBS" + + LIBS="/usr/local/opt/openldap/lib:$LIBS" + INCLUDES="/usr/local/opt/openldap/include:$INCLUDES" + + export PKG_CONFIG_PATH + + ./configure \ + --prefix=$HOME/install \ + --with-includes="$INCLUDES" \ + --with-libs="$LIBS" \ + \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + \ + --with-lz4 \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CFLAGS="-O0 -ggdb" + build_script: + - gmake -s -j12 && gmake -s -j12 -C contrib + upload_caches: + - ccache + + tests_script: + - ulimit -c unlimited + - ulimit -n 1024 + - gmake -s -j12 ${CHECK} ${CHECKFLAGS} + + on_failure: + cores_script: | + for corefile in $(find /cores/ -name 'core.*' 2>/dev/null) ; do + lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' ; + done + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: Windows + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' + windows_container: + dockerfile: ci/docker/windows_vs_2019 + cpu: 4 + memory: 4G + env: + PROVE_FLAGS: -j10 + # The default working dir is in a directory msbuild complains about + CIRRUS_WORKING_DIR: "c:/cirrus" + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf + # Avoid re-installing over and over + NO_TEMP_INSTALL: 1 + + sysinfo_script: + - chcp + - systeminfo + - powershell -Command get-psdrive -psprovider filesystem + - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' + - set + + configure_script: + - copy ci\windows_build_config.pl src\tools\msvc\config.pl + - vcvarsall x64 + - perl src/tools/msvc/mkvcbuild.pl + build_script: + - vcvarsall x64 + # Disable file tracker, we're never going to rebuild... + - msbuild -m /p:TrackFileAccess=false pgsql.sln + tempinstall_script: + # Installation on windows currently only completely works from src\tools\msvc + - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install + + check_test_script: + - perl src/tools/msvc/vcregress.pl check parallel + startcreate_test_script: + - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log + - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf + - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log + plcheck_test_script: + - perl src/tools/msvc/vcregress.pl plcheck + isolationcheck_test_script: + - perl src/tools/msvc/vcregress.pl isolationcheck + modulescheck_test_script: + - perl src/tools/msvc/vcregress.pl modulescheck + contribcheck_test_script: + - perl src/tools/msvc/vcregress.pl contribcheck + stop_test_script: + - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log + ssl_test_script: + - set with_ssl=openssl + - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\ + subscriptioncheck_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\ + authentication_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\ + recoverycheck_test_script: + - perl src/tools/msvc/vcregress.pl recoverycheck + bincheck_test_script: + - perl src/tools/msvc/vcregress.pl bincheck + upgradecheck_test_script: + - perl src/tools/msvc/vcregress.pl upgradecheck + ecpgcheck_test_script: + # tries to build additional stuff + - vcvarsall x64 + # References ecpg_regression.proj in the current dir + - cd src\tools\msvc + - perl vcregress.pl ecpgcheck + + always: + cores_script: + - cat crashlog.txt || true + dump_artifacts: + path: "crashlog.txt" + type: text/plain + + on_failure: + log_artifacts: + path: "**/**.log" + type: text/plain + regress_diffs_artifacts: + path: "**/**.diffs" + type: text/plain + tap_artifacts: + path: "**/regress_log_*" + type: text/plain + + +task: + name: CompilerWarnings + depends_on: + - Linux + # task that did not run count as a success, so we need to recheck Linux' condition here :/ + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' + container: + dockerfile: ci/docker/linux_debian_bullseye + env: + CCACHE_SIZE: "4GB" + CCACHE_DIR: "/tmp/ccache_dir" + ccache_cache: + folder: "/tmp/ccache_dir" + setup_script: + - echo "COPT=-Werror" > src/Makefile.custom + - gcc -v + - clang -v + # gcc with asserts disabled + always: + gcc_warning_script: + - ./configure --cache gcc.cache CC="ccache gcc" + - time make -s -j4 clean && time make -s -j4 + # gcc with asserts enabled + always: + gcc_a_warning_script: + - ./configure --cache gcc.cache --enable-cassert CC="ccache gcc" + - time make -s -j4 clean && time make -s -j4 + # clang with asserts disabled + always: + clang_warning_script: + - ./configure --cache clang.cache CC="ccache clang" + - time make -s -j4 clean && time make -s -j4 + # clang with asserts enabled + always: + clang_a_warning_script: + - ./configure --cache clang.cache --enable-cassert CC="ccache clang" + - time make -s -j4 clean && time make -s -j4 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..3fceab2e97b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +# Ignore everything, except ci/ +* +!ci/* diff --git a/ci/docker/linux_debian_bullseye b/ci/docker/linux_debian_bullseye new file mode 100644 index 00000000000..f6c1782f16b --- /dev/null +++ b/ci/docker/linux_debian_bullseye @@ -0,0 +1,13 @@ +FROM debian:bullseye +RUN \ + apt-get -y update && \ + apt-get -y upgrade && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + git build-essential gcc g++ libreadline-dev flex bison make perl libipc-run-perl \ + libio-pty-perl clang llvm-dev libperl-dev libpython3-dev tcl-dev libldap2-dev \ + libicu-dev docbook-xml docbook-xsl fop libxml2-utils xsltproc krb5-admin-server \ + krb5-kdc krb5-user slapd ldap-utils libssl-dev pkg-config locales-all liblz4-dev \ + libsystemd-dev libxml2-dev libxslt1-dev python3-dev libkrb5-dev libpam-dev \ + libkrb5-*-heimdal uuid-dev gettext \ + liburing-dev python3-distutils ccache && \ + apt-get clean diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019 new file mode 100644 index 00000000000..e09ca0d5825 --- /dev/null +++ b/ci/docker/windows_vs_2019 @@ -0,0 +1,105 @@ +# escape=` + +# We used to use the visual studio container, but it's too outdated now +FROM cirrusci/windowsservercore:2019 + +SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"] + + +RUN ` + New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio' ; ` + New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' ; ` + New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' -Name KeepDownloadedPayloads -Value 0 -PropertyType DWord + + +# Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt +# +# Done manually as doing this via chocolatey / the installer directly, ends up +# with a lot of unnecessary chaff, making the layer unnecessarily large. +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; ` + Start-Process -Wait -FilePath ".\windsdksetup.exe" ` + -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' ` + ; ` + ` + Start-Process -Wait -FilePath msiexec.exe ` + -ArgumentList '/a \"C:\t\sdk\Installers\X64 Debuggers And Tools-x64_en-us.msi\" /qb /log install2.log' ` + ; ` + C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; ` + ` + cd c:\ ; ` + Remove-Item C:\t\* -Force -Recurse ; ` + Remove-Item C:\t -Force -Recurse ; ` + Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; ` + New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; ` + Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger; ` + setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m + + +# Install perl, python, flex and bison. +# +# Done manually as choco takes a lot longer. I think it's download issues with +# powershell's download stuff? That's wy curl.exe is directly used here at least... +# +# Using perl 5.26.3.1 for now, as newer versions don't currently work correctly +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + curl.exe -sSL -o perl.zip ` + https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; ` + 7z.exe x .\perl.zip -xr!c -oc:\strawberry ; ` + ` + curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; ` + Start-Process -Wait -FilePath ".\python.exe" ` + -ArgumentList ` + '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', ` + 'TargetDir=c:\python\', 'InstallAllUsers=1', 'Shortcuts=0', ` + 'Include_docs=0', 'Include_tcltk=0', 'Include_tests=0' ` + ; ` + ` + curl.exe -sSL -o winflexbison.zip ` + https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; ` + 7z.exe x .\winflexbison.zip -oc:\winflexbison ; ` + Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; ` + Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse ; ` + setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m + + +# Install visual studio +# +# Adding VS path to vcvarsall.bat so user of container doesn't need to know the full path +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; ` + Start-Process -Wait ` + -FilePath c:\t\vs_buildtools.exe ` + -ArgumentList ` + '--quiet', '--wait', '--norestart', '--nocache', ` + '--installPath', 'c:\BuildTools', ` + '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', ` + '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348' ; ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse ; ` + Remove-Item -Force -Recurse ${Env:TEMP}\*; ` + Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\" ; ` + setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m + + +# Install openssl +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; ` + Start-Process -Wait -FilePath ".\openssl-setup.exe" ` + -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse diff --git a/ci/freebsd_gcp_repartition.sh b/ci/freebsd_gcp_repartition.sh new file mode 100755 index 00000000000..2d5e1738998 --- /dev/null +++ b/ci/freebsd_gcp_repartition.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e +set -x + +# The default filesystem on freebsd gcp images is very slow to run tests on, +# due to its 32KB block size +# +# XXX: It'd probably better to fix this in the image, using something like +# https://people.freebsd.org/~lidl/blog/re-root.html + +# fix backup partition table after resize +gpart recover da0 +gpart show da0 +# kill swap, so we can delete a partition +swapoff -a || true +# (apparently we can only have 4!?) +gpart delete -i 3 da0 +gpart add -t freebsd-ufs -l data8k -a 4096 da0 +gpart show da0 +newfs -U -b 8192 /dev/da0p3 + +# Migrate working directory +du -hs $CIRRUS_WORKING_DIR +mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig +mkdir $CIRRUS_WORKING_DIR +mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR +cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/ diff --git a/ci/pg_ci_base.conf b/ci/pg_ci_base.conf new file mode 100644 index 00000000000..637e3cfb343 --- /dev/null +++ b/ci/pg_ci_base.conf @@ -0,0 +1,12 @@ +# Tends to produce too many core files, taking a long time +restart_after_crash = false + +# So that tests using the "manually" started postgres on windows can use +# prepared statements +max_prepared_transactions=10 + +# Settings that make logs more useful +log_line_prefix='%m [%p][%b][%v:%x] ' +log_checkpoints = true +log_connections = true +log_disconnections = true diff --git a/ci/windows_build_config.pl b/ci/windows_build_config.pl new file mode 100644 index 00000000000..bf0660416fa --- /dev/null +++ b/ci/windows_build_config.pl @@ -0,0 +1,10 @@ +use strict; +use warnings; + +our $config; + +$config->{"tap_tests"} = 1; +$config->{"asserts"} = 1; +$config->{"openssl"} = "c:/openssl/1.1.1l/"; + +1; -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0003-fixup-ci-Add-CI-for-FreeBSD-Linux-MacOS-and-Windo.patch" From dadd0b04a94be8bd1b3f3dba1ce378bcdadbd2f9 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 8 Oct 2021 23:29:08 -0700 Subject: [PATCH v3 03/17] fixup! ci: Add CI for FreeBSD, Linux, MacOS and Windows, utilizing cirrus-ci. --- ci/docker/windows_vs_2019 | 62 +++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/ci/docker/windows_vs_2019 b/ci/docker/windows_vs_2019 index e09ca0d5825..a4fcaceae96 100644 --- a/ci/docker/windows_vs_2019 +++ b/ci/docker/windows_vs_2019 @@ -6,12 +6,6 @@ FROM cirrusci/windowsservercore:2019 SHELL ["powershell", "-NoLogo", "-NoProfile", "-Command"] -RUN ` - New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio' ; ` - New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' ; ` - New-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup' -Name KeepDownloadedPayloads -Value 0 -PropertyType DWord - - # Install commandline debugger and log all crashes to c:\cirrus\crashlog.txt # # Done manually as doing this via chocolatey / the installer directly, ends up @@ -19,7 +13,11 @@ RUN ` RUN ` mkdir c:\t ; ` cd c:\t ; ` + ` + setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m ; ` + ` curl.exe -sSL -o 'windsdksetup.exe' https://download.microsoft.com/download/9/7/9/97982c1d-d687-41be-9dd3-6d01e52ceb68/windowssdk/winsdksetup.exe ; ` + echo 'starting sdk installation (for debugger)' ; ` Start-Process -Wait -FilePath ".\windsdksetup.exe" ` -ArgumentList '/Features OptionId.WindowsDesktopDebuggers /layout c:\t\sdk /quiet /norestart /log c:\t\sdk.log' ` ; ` @@ -29,13 +27,12 @@ RUN ` ; ` C:\Windows` Kits\10\Debuggers\x64\cdb.exe -version ; ` ` - cd c:\ ; ` - Remove-Item C:\t\* -Force -Recurse ; ` - Remove-Item C:\t -Force -Recurse ; ` Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Debugger' -Value '\"C:\Windows Kits\10\Debuggers\x64\cdb.exe\" -p %ld -e %ld -g -kqm -c \".lines -e; .symfix+ ;.logappend c:\cirrus\crashlog.txt ; !peb; ~*kP ; .logclose ; q \"' ; ` New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name 'Auto' -Value 1 -PropertyType DWord ; ` - Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger; ` - setx PATH \"C:\Windows Kits\10\Debuggers\x64;$Env:PATH\" /m + Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' -Name Debugger ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse # Install perl, python, flex and bison. @@ -48,11 +45,16 @@ RUN ` mkdir c:\t ; ` cd c:\t ; ` ` + echo 'adding to path, before setup below, so changes are not overwritten' ; ` + setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m ; ` + ` curl.exe -sSL -o perl.zip ` https://strawberryperl.com/download/5.26.3.1/strawberry-perl-5.26.3.1-64bit-portable.zip ; ` + echo 'installing perl' ; ` 7z.exe x .\perl.zip -xr!c -oc:\strawberry ; ` ` curl.exe -sSL -o python.exe https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe ; ` + echo 'installing python' ; ` Start-Process -Wait -FilePath ".\python.exe" ` -ArgumentList ` '/quiet', 'SimpleInstall=1', 'PrependPath=1', 'CompileAll=1', ` @@ -62,13 +64,27 @@ RUN ` ` curl.exe -sSL -o winflexbison.zip ` https://github.com/lexxmark/winflexbison/releases/download/v2.5.24/win_flex_bison-2.5.24.zip ; ` + echo 'installing winflexbison' ; ` 7z.exe x .\winflexbison.zip -oc:\winflexbison ; ` Rename-Item -Path c:\winflexbison\win_flex.exe c:\winflexbison\flex.exe ; ` Rename-Item -Path c:\winflexbison\win_bison.exe c:\winflexbison\bison.exe ; ` ` cd c:\ ; ` - Remove-Item C:\t -Force -Recurse ; ` - setx PATH \"C:\strawberry\perl\bin;C:\winflexbison;C:\Program Files\Git\usr\bin;$Env:PATH\" /m + Remove-Item C:\t -Force -Recurse + + +# Install openssl +RUN ` + mkdir c:\t ; ` + cd c:\t ; ` + ` + curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; ` + echo 'staring openssl installation' ; ` + Start-Process -Wait -FilePath ".\openssl-setup.exe" ` + -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; ` + ` + cd c:\ ; ` + Remove-Item C:\t -Force -Recurse # Install visual studio @@ -77,7 +93,10 @@ RUN ` RUN ` mkdir c:\t ; ` cd c:\t ; ` + setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m ; ` + ` curl.exe -sSL -o c:\t\vs_buildtools.exe https://aka.ms/vs/16/release/vs_buildtools.exe ; ` + echo 'starting visual studio installation' ; ` Start-Process -Wait ` -FilePath c:\t\vs_buildtools.exe ` -ArgumentList ` @@ -85,21 +104,8 @@ RUN ` '--installPath', 'c:\BuildTools', ` '--add', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', ` '--add', 'Microsoft.VisualStudio.Component.Windows10SDK.20348' ; ` + ` cd c:\ ; ` Remove-Item C:\t -Force -Recurse ; ` Remove-Item -Force -Recurse ${Env:TEMP}\*; ` - Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\" ; ` - setx PATH \"c:\BuildTools\VC\Auxiliary\Build;$Env:PATH\" /m - - -# Install openssl -RUN ` - mkdir c:\t ; ` - cd c:\t ; ` - ` - curl.exe -o openssl-setup.exe -sSL https://slproweb.com/download/Win64OpenSSL-1_1_1L.exe ; ` - Start-Process -Wait -FilePath ".\openssl-setup.exe" ` - -ArgumentList '/DIR=c:\openssl\1.1.1l\ /VERYSILENT /SP- /SUPPRESSMSGBOXES' ; ` - ` - cd c:\ ; ` - Remove-Item C:\t -Force -Recurse + Remove-Item -Force -Recurse \"${Env:ProgramData}\Package Cache\" -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0004-meson-prereq-output-and-depencency-tracking-work.patch" From 3c0caccb8d9686538385cbb617a73a2d9b2476bd Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 8 Mar 2021 13:47:39 -0800 Subject: [PATCH v3 04/17] meson: prereq: output and depencency tracking work. --- src/backend/utils/misc/Makefile | 5 ++++- src/backend/utils/misc/guc.c | 2 +- src/bin/initdb/initdb.c | 5 +++-- src/bin/psql/Makefile | 4 ++-- src/bin/psql/create_help.pl | 16 ++++++++++++---- src/tools/msvc/MSBuildProject.pm | 9 +++++++-- src/tools/msvc/Mkvcbuild.pm | 3 +++ src/tools/msvc/Solution.pm | 2 +- src/tools/msvc/pgflex.pl | 4 ++-- 9 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile index 1d5327cf644..14861fd96b2 100644 --- a/src/backend/utils/misc/Makefile +++ b/src/backend/utils/misc/Makefile @@ -37,8 +37,11 @@ endif include $(top_srcdir)/src/backend/common.mk +guc-file.c.h: guc-file.l + flex -o $@ $< + # guc-file is compiled as part of guc -guc.o: guc-file.c +guc.o: guc-file.c.h # Note: guc-file.c is not deleted by 'make clean', # since we want to ship it in distribution tarballs. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index d2ce4a84506..3786ae11a08 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -12559,4 +12559,4 @@ check_default_with_oids(bool *newval, void **extra, GucSource source) return true; } -#include "guc-file.c" +#include "guc-file.c.h" diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 1ed4808d53f..9067a06e58a 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1368,8 +1368,9 @@ bootstrap_template1(void) if (strcmp(headerline, *bki_lines) != 0) { - pg_log_error("input file \"%s\" does not belong to PostgreSQL %s", - bki_file, PG_VERSION); + pg_log_error("input file \"%s\" does not belong to PostgreSQL %s (expect %s, is %s)", + bki_file, PG_VERSION, + headerline, *bki_lines); fprintf(stderr, _("Check your installation or specify the correct path " "using the option -L.\n")); diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile index d00881163c0..3851da1c8ef 100644 --- a/src/bin/psql/Makefile +++ b/src/bin/psql/Makefile @@ -56,7 +56,7 @@ sql_help.c: sql_help.h touch $@ sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml) - $(PERL) $< $(REFDOCDIR) $* + $(PERL) $< $(REFDOCDIR) . $* psqlscanslash.c: FLEXFLAGS = -Cfe -p -p psqlscanslash.c: FLEX_NO_BACKUP=yes @@ -81,7 +81,7 @@ clean distclean: # files removed here are supposed to be in the distribution tarball, # so do not clean them in the clean/distclean rules maintainer-clean: distclean - rm -f sql_help.h sql_help.c psqlscanslash.c + rm -f sql_help.h sql_help.c sql_help.dep psqlscanslash.c check: $(prove_check) diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl index 83324239740..40eb6ac2d3f 100644 --- a/src/bin/psql/create_help.pl +++ b/src/bin/psql/create_help.pl @@ -23,9 +23,12 @@ use strict; use warnings; my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n"; -my $hfile = $ARGV[1] . '.h' +my $outdir = $ARGV[1] or die "$0: missing required argument: outdir\n"; + +my $hfile = $ARGV[2] . '.h' or die "$0: missing required argument: output file\n"; -my $cfile = $ARGV[1] . '.c'; +my $cfile = $ARGV[2] . '.c'; +my $depfile = $ARGV[2] . '.dep'; my $hfilebasename; if ($hfile =~ m!.*/([^/]+)$!) @@ -43,10 +46,12 @@ $define =~ s/\W/_/g; opendir(DIR, $docdir) or die "$0: could not open documentation source dir '$docdir': $!\n"; -open(my $hfile_handle, '>', $hfile) +open(my $hfile_handle, '>', $outdir . '/' . $hfile) or die "$0: could not open output file '$hfile': $!\n"; -open(my $cfile_handle, '>', $cfile) +open(my $cfile_handle, '>', $outdir . '/' . $cfile) or die "$0: could not open output file '$cfile': $!\n"; +open(my $depfile_handle, '>', $outdir . '/' . $depfile) + or die "$0: could not open output file '$depfile': $!\n"; print $hfile_handle "/* * *** Do not change this file by hand. It is automatically @@ -98,6 +103,8 @@ foreach my $file (sort readdir DIR) my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis); $file =~ /\.sgml$/ or next; + print $depfile_handle "$cfile $hfile: $docdir/$file\n"; + open(my $fh, '<', "$docdir/$file") or next; my $filecontent = join('', <$fh>); close $fh; @@ -216,4 +223,5 @@ print $hfile_handle " close $cfile_handle; close $hfile_handle; +close $depfile_handle; closedir DIR; diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm index fdd22e89eb2..036e44fcb83 100644 --- a/src/tools/msvc/MSBuildProject.pm +++ b/src/tools/msvc/MSBuildProject.pm @@ -211,14 +211,19 @@ EOF } else #if ($grammarFile =~ /\.l$/) { + if ($outputFile eq 'src/backend/utils/misc/guc-file.c') + { + $outputFile = 'src/backend/utils/misc/guc-file.c.h'; + } + print $f < Running flex on $grammarFile - perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile" %(AdditionalInputs) $outputFile;%(Outputs) Running flex on $grammarFile - perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" "$outputFile" %(AdditionalInputs) $outputFile;%(Outputs) diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 4362bd44fd1..b8e62c6d3f7 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -330,6 +330,7 @@ sub mkvcbuild $pgregress_ecpg->AddFile('src/test/regress/pg_regress.c'); $pgregress_ecpg->AddIncludeDir('src/port'); $pgregress_ecpg->AddIncludeDir('src/test/regress'); + $pgregress_ecpg->AddDefine('DLSUFFIX=".dll"'); $pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_ecpg->AddLibrary('ws2_32.lib'); $pgregress_ecpg->AddDirResourceFile('src/interfaces/ecpg/test'); @@ -345,6 +346,7 @@ sub mkvcbuild $isolation_tester->AddIncludeDir('src/port'); $isolation_tester->AddIncludeDir('src/test/regress'); $isolation_tester->AddIncludeDir('src/interfaces/libpq'); + $isolation_tester->AddDefine('DLSUFFIX=".dll"'); $isolation_tester->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $isolation_tester->AddLibrary('ws2_32.lib'); $isolation_tester->AddDirResourceFile('src/test/isolation'); @@ -356,6 +358,7 @@ sub mkvcbuild $pgregress_isolation->AddFile('src/test/regress/pg_regress.c'); $pgregress_isolation->AddIncludeDir('src/port'); $pgregress_isolation->AddIncludeDir('src/test/regress'); + $pgregress_isolation->AddDefine('DLSUFFIX=".dll"'); $pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress_isolation->AddLibrary('ws2_32.lib'); $pgregress_isolation->AddDirResourceFile('src/test/isolation'); diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 165a93987ac..721f690ae46 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -688,7 +688,7 @@ sub GenerateFiles { print "Generating sql_help.h...\n"; chdir('src/bin/psql'); - system("perl create_help.pl ../../../doc/src/sgml/ref sql_help"); + system("perl create_help.pl ../../../doc/src/sgml/ref . sql_help"); chdir('../../..'); } diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl index 0728b85d4de..19f26ff213f 100644 --- a/src/tools/msvc/pgflex.pl +++ b/src/tools/msvc/pgflex.pl @@ -29,6 +29,8 @@ unless ($verparts[0] == 2 } my $input = shift; +my $output = shift; + if ($input !~ /\.l$/) { print "Input must be a .l file\n"; @@ -40,8 +42,6 @@ elsif (!-e $input) exit 1; } -(my $output = $input) =~ s/\.l$/.c/; - # get flex flags from make file my $makefile = dirname($input) . "/Makefile"; my ($mf, $make); -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0005-meson-prereq-move-snowball_create.sql-creation-in.patch" From 3735dde29b192404e3e52c2989ec990a39d3e513 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 8 Mar 2021 14:59:22 -0800 Subject: [PATCH v3 05/17] meson: prereq: move snowball_create.sql creation into perl file. FIXME: deduplicate with Install.pm --- src/backend/snowball/Makefile | 27 +----- src/backend/snowball/snowball_create.pl | 110 ++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 24 deletions(-) create mode 100644 src/backend/snowball/snowball_create.pl diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile index 50b9199910c..259104f8eb3 100644 --- a/src/backend/snowball/Makefile +++ b/src/backend/snowball/Makefile @@ -119,29 +119,8 @@ all: all-shared-lib $(SQLSCRIPT) include $(top_srcdir)/src/Makefile.shlib -$(SQLSCRIPT): Makefile snowball_func.sql.in snowball.sql.in - echo '-- Language-specific snowball dictionaries' > $@ - cat $(srcdir)/snowball_func.sql.in >> $@ - @set -e; \ - set $(LANGUAGES) ; \ - while [ "$$#" -gt 0 ] ; \ - do \ - lang=$$1; shift; \ - nonascdictname=$$lang; \ - ascdictname=$$1; shift; \ - if [ -s $(srcdir)/stopwords/$${lang}.stop ] ; then \ - stop=", StopWords=$${lang}" ; \ - else \ - stop=""; \ - fi; \ - cat $(srcdir)/snowball.sql.in | \ - sed -e "s#_LANGNAME_#$$lang#g" | \ - sed -e "s#_DICTNAME_#$${lang}_stem#g" | \ - sed -e "s#_CFGNAME_#$$lang#g" | \ - sed -e "s#_ASCDICTNAME_#$${ascdictname}_stem#g" | \ - sed -e "s#_NONASCDICTNAME_#$${nonascdictname}_stem#g" | \ - sed -e "s#_STOPWORDS_#$$stop#g" ; \ - done >> $@ +$(SQLSCRIPT): snowball_create.pl Makefile snowball_func.sql.in snowball.sql.in + $(PERL) $< --input ${srcdir} --output . install: all installdirs install-lib $(INSTALL_DATA) $(SQLSCRIPT) '$(DESTDIR)$(datadir)' @@ -171,4 +150,4 @@ uninstall: uninstall-lib done clean distclean maintainer-clean: clean-lib - rm -f $(OBJS) $(SQLSCRIPT) + rm -f $(OBJS) $(SQLSCRIPT) snowball_create.dep diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl new file mode 100644 index 00000000000..d9d79f3668f --- /dev/null +++ b/src/backend/snowball/snowball_create.pl @@ -0,0 +1,110 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Getopt::Long; + +my $output_path = ''; +my $makefile_path = ''; +my $input_path = ''; + +GetOptions( + 'output:s' => \$output_path, + 'input:s' => \$input_path) || usage(); + +# Make sure input_path ends in a slash if needed. +if ($input_path ne '' && substr($input_path, -1) ne '/') +{ + $output_path .= '/'; +} + +# Make sure output_path ends in a slash if needed. +if ($output_path ne '' && substr($output_path, -1) ne '/') +{ + $output_path .= '/'; +} + +GenerateTsearchFiles(); + +sub usage +{ + die < --input + --output Output directory (default '.') + --input Input directory + +snowball_create.pl creates snowball.sql from snowball.sql.in +EOM +} + +sub GenerateTsearchFiles +{ + my $target = shift; + my $output_file = "$output_path/snowball_create.sql"; + + print "Generating tsearch script..."; + my $F; + my $D; + my $tmpl = read_file("$input_path/snowball.sql.in"); + my $mf = read_file("$input_path/Makefile"); + + open($D, '>', "$output_path/snowball_create.dep") + || die "Could not write snowball_create.dep"; + + print $D "$output_file: $input_path/Makefile\n"; + print $D "$output_file: $input_path/snowball.sql.in\n"; + print $D "$output_file: $input_path/snowball_func.sql.in\n"; + + $mf =~ s{\\\r?\n}{}g; + $mf =~ /^LANGUAGES\s*=\s*(.*)$/m + || die "Could not find LANGUAGES line in snowball Makefile\n"; + my @pieces = split /\s+/, $1; + open($F, '>', $output_file) + || die "Could not write snowball_create.sql"; + + print $F "-- Language-specific snowball dictionaries\n"; + + print $F read_file("$input_path/snowball_func.sql.in"); + + while ($#pieces > 0) + { + my $lang = shift @pieces || last; + my $asclang = shift @pieces || last; + my $txt = $tmpl; + my $stop = ''; + my $stopword_path = "$input_path/stopwords/$lang.stop"; + + if (-s "$stopword_path") + { + $stop = ", StopWords=$lang"; + + print $D "$output_file: $stopword_path\n"; + } + + $txt =~ s#_LANGNAME_#${lang}#gs; + $txt =~ s#_DICTNAME_#${lang}_stem#gs; + $txt =~ s#_CFGNAME_#${lang}#gs; + $txt =~ s#_ASCDICTNAME_#${asclang}_stem#gs; + $txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs; + $txt =~ s#_STOPWORDS_#$stop#gs; + print $F $txt; + print "."; + } + close($F); + close($D); + print "\n"; + return; +} + + +sub read_file +{ + my $filename = shift; + my $F; + local $/ = undef; + open($F, '<', $filename) || die "Could not open file $filename\n"; + my $txt = <$F>; + close($F); + + return $txt; +} -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0006-meson-prereq-add-output-path-arg-in-generate-lwlo.patch" From ff46bc3dd368d11043d6089b2da2f82c1c28f631 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 10 Mar 2021 01:43:07 -0800 Subject: [PATCH v3 06/17] meson: prereq: add output path arg in generate-lwlocknames.pl --- src/backend/storage/lmgr/generate-lwlocknames.pl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl index 8a44946594d..315156b29f1 100644 --- a/src/backend/storage/lmgr/generate-lwlocknames.pl +++ b/src/backend/storage/lmgr/generate-lwlocknames.pl @@ -5,15 +5,21 @@ use strict; use warnings; +use Getopt::Long; + +my $output_path = '.'; my $lastlockidx = -1; my $continue = "\n"; +GetOptions( + 'output:s' => \$output_path); + open my $lwlocknames, '<', $ARGV[0] or die; # Include PID in suffix in case parallel make runs this multiple times. -my $htmp = "lwlocknames.h.tmp$$"; -my $ctmp = "lwlocknames.c.tmp$$"; +my $htmp = "$output_path/lwlocknames.h.tmp$$"; +my $ctmp = "$output_path/lwlocknames.c.tmp$$"; open my $h, '>', $htmp or die "Could not open $htmp: $!"; open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; @@ -65,7 +71,7 @@ printf $h "#define NUM_INDIVIDUAL_LWLOCKS %s\n", $lastlockidx + 1; close $h; close $c; -rename($htmp, 'lwlocknames.h') || die "rename: $htmp: $!"; -rename($ctmp, 'lwlocknames.c') || die "rename: $ctmp: $!"; +rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!"; +rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!"; close $lwlocknames; -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0007-meson-prereq-add-src-tools-gen_versioning_script..patch" From 442cee8d3c2b32d59696e2114f97de062f798293 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 10 Mar 2021 15:11:13 -0800 Subject: [PATCH v3 07/17] meson: prereq: add src/tools/gen_versioning_script.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_versioning_script.pl | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/tools/gen_versioning_script.pl diff --git a/src/tools/gen_versioning_script.pl b/src/tools/gen_versioning_script.pl new file mode 100644 index 00000000000..862b5e14aad --- /dev/null +++ b/src/tools/gen_versioning_script.pl @@ -0,0 +1,58 @@ +use strict; +use warnings; + +my $format = $ARGV[0] or die "$0: missing required argument: format\n"; +my $input = $ARGV[1] or die "$0: missing required argument: input\n"; +my $output = $ARGV[2] or die "$0: missing required argument: output\n"; + +#FIXME: handle format argument, so we can reuse the one script for several platforms +if (not ($format eq 'gnu' or $format eq 'darwin')) +{ + die "$0: $format is not yet handled (only gnu is)\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: +"; +} + +while (<$input_handle>) +{ + if (/^#/) + { + # don't do anything with a comment + } + elsif (/^([^\s]+)\s+([^\s]+)/) + { + if ($format eq 'gnu') + { + print $output_handle " $1;\n"; + } + elsif ($format eq 'darwin') + { + print $output_handle " _$1\n"; + } + } + else + { + die "$0: unexpected line $_\n"; + } +} + +if ($format eq 'gnu') +{ + print $output_handle " local: *; +}; +"; +} + +exit(0); -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0008-meson-prereq-generate-errcodes.pl-accept-output-f.patch" From aa5915c8bab7ef119d34d350dbeaf17ec59c16e3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 27 Sep 2021 00:14:09 -0700 Subject: [PATCH v3 08/17] meson: prereq: generate-errcodes.pl: accept output file --- src/backend/utils/Makefile | 2 +- src/backend/utils/generate-errcodes.pl | 13 ++++++++----- src/tools/msvc/Solution.pm | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile index ef8df254826..469caf0d704 100644 --- a/src/backend/utils/Makefile +++ b/src/backend/utils/Makefile @@ -52,7 +52,7 @@ fmgr-stamp: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/ca touch $@ errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl - $(PERL) $(srcdir)/generate-errcodes.pl $< > $@ + $(PERL) $(srcdir)/generate-errcodes.pl $< $@ ifneq ($(enable_dtrace), yes) probes.h: Gen_dummy_probes.sed diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl index c5cdd388138..57ec2a5ca21 100644 --- a/src/backend/utils/generate-errcodes.pl +++ b/src/backend/utils/generate-errcodes.pl @@ -6,11 +6,13 @@ use strict; use warnings; -print +open my $errcodes, '<', $ARGV[0] or die; +open my $out, '>', $ARGV[1] or die; + +print $out "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n"; -print "/* there is deliberately not an #ifndef ERRCODES_H here */\n"; +print $out "/* there is deliberately not an #ifndef ERRCODES_H here */\n"; -open my $errcodes, '<', $ARGV[0] or die; while (<$errcodes>) { @@ -25,7 +27,7 @@ while (<$errcodes>) { my $header = $1; $header =~ s/^\s+//; - print "\n/* $header */\n"; + print $out "\n/* $header */\n"; next; } @@ -40,7 +42,8 @@ while (<$errcodes>) # And quote them $sqlstate =~ s/([^,])/'$1'/g; - print "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n"; + print $out "#define $errcode_macro MAKE_SQLSTATE($sqlstate)\n"; } close $errcodes; +close $out; diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 721f690ae46..aba59a270b4 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -658,7 +658,7 @@ sub GenerateFiles { print "Generating errcodes.h...\n"; system( - 'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h' + 'perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt src/backend/utils/errcodes.h' ); copyFile('src/backend/utils/errcodes.h', 'src/include/utils/errcodes.h'); -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0009-meson-prereq-remove-unhelpful-chattiness-in-snowb.patch" From f78a0f77bcb97fc1dc2fa6d9ee3143f8b95561d4 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 27 Sep 2021 15:41:24 -0700 Subject: [PATCH v3 09/17] meson: prereq: remove unhelpful chattiness in snowball_create.pl. --- src/backend/snowball/snowball_create.pl | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl index d9d79f3668f..285cf4f5d90 100644 --- a/src/backend/snowball/snowball_create.pl +++ b/src/backend/snowball/snowball_create.pl @@ -42,7 +42,6 @@ sub GenerateTsearchFiles my $target = shift; my $output_file = "$output_path/snowball_create.sql"; - print "Generating tsearch script..."; my $F; my $D; my $tmpl = read_file("$input_path/snowball.sql.in"); @@ -88,11 +87,9 @@ sub GenerateTsearchFiles $txt =~ s#_NONASCDICTNAME_#${lang}_stem#gs; $txt =~ s#_STOPWORDS_#$stop#gs; print $F $txt; - print "."; } close($F); close($D); - print "\n"; return; } -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0010-meson-prereq-Can-we-get-away-with-not-export-all-.patch" From 8d3ca1659baf70926fb034f4043d3d90669f242b Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 29 Sep 2021 00:29:10 -0700 Subject: [PATCH v3 10/17] meson: prereq: Can we get away with not export-all'ing libraries? --- configure | 49 ++++++++++++++++++++++ configure.ac | 10 +++++ contrib/hstore/hstore.h | 16 +++---- contrib/ltree/ltree.h | 40 +++++++++--------- src/Makefile.global.in | 1 + src/Makefile.shlib | 12 ++++++ src/include/c.h | 15 +++++-- src/include/fmgr.h | 6 ++- src/include/jit/jit.h | 2 +- src/include/pg_config.h.in | 3 ++ src/include/replication/output_plugin.h | 2 + src/pl/plpython/plpy_elog.h | 8 ++-- src/pl/plpython/plpy_typeio.h | 18 ++++---- src/pl/plpython/plpy_util.h | 8 ++-- src/test/modules/test_shm_mq/test_shm_mq.h | 2 +- src/test/modules/worker_spi/worker_spi.c | 2 +- src/tools/msvc/Solution.pm | 1 + 17 files changed, 142 insertions(+), 53 deletions(-) diff --git a/configure b/configure index 4ffefe46552..a62008e5ac5 100755 --- a/configure +++ b/configure @@ -735,6 +735,7 @@ CPP CFLAGS_SL BITCODE_CXXFLAGS BITCODE_CFLAGS +CFLAGS_SL_MOD CFLAGS_VECTORIZE CFLAGS_UNROLL_LOOPS PERMIT_DECLARATION_AFTER_STATEMENT @@ -6421,6 +6422,54 @@ fi if test -n "$NOT_THE_CFLAGS"; then CFLAGS="$CFLAGS -Wno-stringop-truncation" fi + + # If the compiler knows how to hide symbols, use that. But only for shared libraries, + # for postgres itself that'd be too verbose for now. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD" >&5 +$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MOD... " >&6; } +if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +pgac_save_CC=$CC +CC=${CC} +CFLAGS="${CFLAGS_SL_MOD} -fvisibility=hidden" +ac_save_c_werror_flag=$ac_c_werror_flag +ac_c_werror_flag=yes +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_prog_CC_cflags__fvisibility_hidden=yes +else + pgac_cv_prog_CC_cflags__fvisibility_hidden=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_c_werror_flag=$ac_save_c_werror_flag +CFLAGS="$pgac_save_CFLAGS" +CC="$pgac_save_CC" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5 +$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; } +if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then + CFLAGS_SL_MOD="${CFLAGS_SL_MOD} -fvisibility=hidden" +fi + + + if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then + +$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h + + fi + elif test "$ICC" = yes; then # Intel's compiler has a bug/misoptimization in checking for # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS. diff --git a/configure.ac b/configure.ac index 44ee3ebe2f1..973f83db52c 100644 --- a/configure.ac +++ b/configure.ac @@ -541,6 +541,15 @@ if test "$GCC" = yes -a "$ICC" = no; then if test -n "$NOT_THE_CFLAGS"; then CFLAGS="$CFLAGS -Wno-stringop-truncation" fi + + # If the compiler knows how to hide symbols, use that. But only for shared libraries, + # for postgres itself that'd be too verbose for now. + PGAC_PROG_CC_VAR_OPT(CFLAGS_SL_MOD, [-fvisibility=hidden]) + if test "$pgac_cv_prog_CC_cflags__fvisibility_hidden" = yes; then + AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE, 1, + [Define to 1 if your compiler knows the visibility("hidden") attribute.]) + fi + elif test "$ICC" = yes; then # Intel's compiler has a bug/misoptimization in checking for # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS. @@ -564,6 +573,7 @@ fi AC_SUBST(CFLAGS_UNROLL_LOOPS) AC_SUBST(CFLAGS_VECTORIZE) +AC_SUBST(CFLAGS_SL_MOD) # Determine flags used to emit bitcode for JIT inlining. Need to test # for behaviour changing compiler flags, to keep compatibility with diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h index bf4a565ed9b..625134c9f69 100644 --- a/contrib/hstore/hstore.h +++ b/contrib/hstore/hstore.h @@ -147,7 +147,7 @@ typedef struct } while (0) /* DatumGetHStoreP includes support for reading old-format hstore values */ -extern HStore *hstoreUpgrade(Datum orig); +extern PGDLLEXPORT HStore *hstoreUpgrade(Datum orig); #define DatumGetHStoreP(d) hstoreUpgrade(d) @@ -168,14 +168,14 @@ typedef struct bool needfree; /* need to pfree the value? */ } Pairs; -extern int hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen); -extern HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen); +extern PGDLLEXPORT int hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen); +extern PGDLLEXPORT HStore *hstorePairs(Pairs *pairs, int32 pcount, int32 buflen); -extern size_t hstoreCheckKeyLen(size_t len); -extern size_t hstoreCheckValLen(size_t len); +extern PGDLLEXPORT size_t hstoreCheckKeyLen(size_t len); +extern PGDLLEXPORT size_t hstoreCheckValLen(size_t len); -extern int hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen); -extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs); +extern PGDLLEXPORT int hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen); +extern PGDLLEXPORT Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs); #define HStoreContainsStrategyNumber 7 #define HStoreExistsStrategyNumber 9 @@ -194,7 +194,7 @@ extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs); #if HSTORE_POLLUTE_NAMESPACE #define HSTORE_POLLUTE(newname_,oldname_) \ PG_FUNCTION_INFO_V1(oldname_); \ - Datum newname_(PG_FUNCTION_ARGS); \ + extern PGDLLEXPORT Datum newname_(PG_FUNCTION_ARGS); \ Datum oldname_(PG_FUNCTION_ARGS) { return newname_(fcinfo); } \ extern int no_such_variable #else diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index 5b4be5e680a..d8bcdedbdbe 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -176,30 +176,30 @@ typedef struct /* use in array iterator */ -Datum ltree_isparent(PG_FUNCTION_ARGS); -Datum ltree_risparent(PG_FUNCTION_ARGS); -Datum ltq_regex(PG_FUNCTION_ARGS); -Datum ltq_rregex(PG_FUNCTION_ARGS); -Datum lt_q_regex(PG_FUNCTION_ARGS); -Datum lt_q_rregex(PG_FUNCTION_ARGS); -Datum ltxtq_exec(PG_FUNCTION_ARGS); -Datum ltxtq_rexec(PG_FUNCTION_ARGS); -Datum _ltq_regex(PG_FUNCTION_ARGS); -Datum _ltq_rregex(PG_FUNCTION_ARGS); -Datum _lt_q_regex(PG_FUNCTION_ARGS); -Datum _lt_q_rregex(PG_FUNCTION_ARGS); -Datum _ltxtq_exec(PG_FUNCTION_ARGS); -Datum _ltxtq_rexec(PG_FUNCTION_ARGS); -Datum _ltree_isparent(PG_FUNCTION_ARGS); -Datum _ltree_risparent(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_isparent(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_risparent(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltq_regex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltq_rregex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum lt_q_regex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum lt_q_rregex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltxtq_exec(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltxtq_rexec(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltq_regex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltq_rregex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _lt_q_regex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _lt_q_rregex(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltxtq_exec(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltxtq_rexec(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltree_isparent(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum _ltree_risparent(PG_FUNCTION_ARGS); /* Concatenation functions */ -Datum ltree_addltree(PG_FUNCTION_ARGS); -Datum ltree_addtext(PG_FUNCTION_ARGS); -Datum ltree_textadd(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_addltree(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_addtext(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_textadd(PG_FUNCTION_ARGS); /* Util function */ -Datum ltree_in(PG_FUNCTION_ARGS); +PGDLLEXPORT Datum ltree_in(PG_FUNCTION_ARGS); bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM *val)); diff --git a/src/Makefile.global.in b/src/Makefile.global.in index a1da1ea4eeb..a4ab27ae145 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -259,6 +259,7 @@ SUN_STUDIO_CC = @SUN_STUDIO_CC@ CXX = @CXX@ CFLAGS = @CFLAGS@ CFLAGS_SL = @CFLAGS_SL@ +CFLAGS_SL_MOD = @CFLAGS_SL_MOD@ CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@ CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@ CFLAGS_SSE42 = @CFLAGS_SSE42@ diff --git a/src/Makefile.shlib b/src/Makefile.shlib index 551023c6fb0..d36782aa942 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -253,6 +253,18 @@ ifeq ($(PORTNAME), win32) endif +# If the shared library doesn't have an export file, mark all symbols not +# explicitly exported using PGDLLEXPORT as hidden. We can't pass these flags +# when building a library with explicit exports, as the symbols would be +# hidden before the linker script / exported symbol list takes effect. +# +# XXX: This probably isn't the best location, but not clear instead? +ifeq ($(SHLIB_EXPORTS),) + LDFLAGS += $(CFLAGS_SL_MOD) + override CFLAGS += $(CFLAGS_SL_MOD) + override CXXFLAGS += $(CFLAGS_SL_MOD) +endif + ## ## BUILD diff --git a/src/include/c.h b/src/include/c.h index c8ede082739..9b539a2657b 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1312,11 +1312,18 @@ extern long long strtoll(const char *str, char **endptr, int base); extern unsigned long long strtoull(const char *str, char **endptr, int base); #endif -/* no special DLL markers on most ports */ -#ifndef PGDLLIMPORT -#define PGDLLIMPORT +/* + * If the platform knows __attribute__((visibility("*"))), i.e. gcc like + * compilers, we use that. + */ +#if !defined(PGDLLIMPORT) && defined(HAVE_VISIBILITY_ATTRIBUTE) +#define PGDLLIMPORT __attribute__((visibility("default"))) +#define PGDLLEXPORT __attribute__((visibility("default"))) #endif -#ifndef PGDLLEXPORT + +/* No special DLL markers on the remaining ports. */ +#if !defined(PGDLLIMPORT) +#define PGDLLIMPORT #define PGDLLEXPORT #endif diff --git a/src/include/fmgr.h b/src/include/fmgr.h index ab7b85c86e1..679443cca19 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -413,7 +413,7 @@ typedef const Pg_finfo_record *(*PGFInfoFunction) (void); * info function, since authors shouldn't need to be explicitly aware of it. */ #define PG_FUNCTION_INFO_V1(funcname) \ -extern Datum funcname(PG_FUNCTION_ARGS); \ +extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \ extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ const Pg_finfo_record * \ CppConcat(pg_finfo_,funcname) (void) \ @@ -424,6 +424,10 @@ CppConcat(pg_finfo_,funcname) (void) \ extern int no_such_variable +extern PGDLLEXPORT void _PG_init(void); +extern PGDLLEXPORT void _PG_fini(void); + + /*------------------------------------------------------------------------- * Support for verifying backend compatibility of loaded modules * diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h index b634df30b98..74617ad1b64 100644 --- a/src/include/jit/jit.h +++ b/src/include/jit/jit.h @@ -63,7 +63,7 @@ typedef struct JitContext typedef struct JitProviderCallbacks JitProviderCallbacks; -extern void _PG_jit_provider_init(JitProviderCallbacks *cb); +extern PGDLLEXPORT void _PG_jit_provider_init(JitProviderCallbacks *cb); typedef void (*JitProviderInit) (JitProviderCallbacks *cb); typedef void (*JitProviderResetAfterErrorCB) (void); typedef void (*JitProviderReleaseContextCB) (JitContext *context); diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 15ffdd895aa..e3ab1c7752f 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -710,6 +710,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H +/* Define to 1 if your compiler knows the visibility("hidden") attribute. */ +#undef HAVE_VISIBILITY_ATTRIBUTE + /* Define to 1 if you have the `wcstombs_l' function. */ #undef HAVE_WCSTOMBS_L diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h index 810495ed0e4..a087f14dadd 100644 --- a/src/include/replication/output_plugin.h +++ b/src/include/replication/output_plugin.h @@ -35,6 +35,8 @@ typedef struct OutputPluginOptions */ typedef void (*LogicalOutputPluginInit) (struct OutputPluginCallbacks *cb); +extern PGDLLEXPORT void _PG_output_plugin_init(struct OutputPluginCallbacks *cb); + /* * Callback that gets called in a user-defined plugin. ctx->private_data can * be set to some private data. diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h index e02ef4ffe9f..aeade82ce10 100644 --- a/src/pl/plpython/plpy_elog.h +++ b/src/pl/plpython/plpy_elog.h @@ -34,13 +34,13 @@ extern PyObject *PLy_exc_spi_error; } while(0) #endif /* HAVE__BUILTIN_CONSTANT_P */ -extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3); +extern PGDLLEXPORT void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3); -extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3); +extern PGDLLEXPORT void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3); -extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, +extern PGDLLEXPORT void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5); -extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata); +extern PGDLLEXPORT void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata); #endif /* PLPY_ELOG_H */ diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h index d11e6ae1b89..87e3b2c464e 100644 --- a/src/pl/plpython/plpy_typeio.h +++ b/src/pl/plpython/plpy_typeio.h @@ -147,29 +147,29 @@ struct PLyObToDatum }; -extern PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val); -extern Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val, +extern PGDLLEXPORT PyObject *PLy_input_convert(PLyDatumToOb *arg, Datum val); +extern PGDLLEXPORT Datum PLy_output_convert(PLyObToDatum *arg, PyObject *val, bool *isnull); -extern PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple, +extern PGDLLEXPORT PyObject *PLy_input_from_tuple(PLyDatumToOb *arg, HeapTuple tuple, TupleDesc desc, bool include_generated); -extern void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, +extern PGDLLEXPORT void PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, Oid typeOid, int32 typmod, struct PLyProcedure *proc); -extern void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, +extern PGDLLEXPORT void PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, Oid typeOid, int32 typmod, struct PLyProcedure *proc); -extern void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc, +extern PGDLLEXPORT void PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc, struct PLyProcedure *proc); -extern void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc, +extern PGDLLEXPORT void PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc, struct PLyProcedure *proc); -extern void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc, +extern PGDLLEXPORT void PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc, struct PLyProcedure *proc); /* conversion from Python objects to C strings --- exported for transforms */ -extern char *PLyObject_AsString(PyObject *plrv); +extern PGDLLEXPORT char *PLyObject_AsString(PyObject *plrv); #endif /* PLPY_TYPEIO_H */ diff --git a/src/pl/plpython/plpy_util.h b/src/pl/plpython/plpy_util.h index c9ba7edc0ec..6927601e0be 100644 --- a/src/pl/plpython/plpy_util.h +++ b/src/pl/plpython/plpy_util.h @@ -8,12 +8,12 @@ #include "plpython.h" -extern PyObject *PLyUnicode_Bytes(PyObject *unicode); -extern char *PLyUnicode_AsString(PyObject *unicode); +extern PGDLLEXPORT PyObject *PLyUnicode_Bytes(PyObject *unicode); +extern PGDLLEXPORT char *PLyUnicode_AsString(PyObject *unicode); #if PY_MAJOR_VERSION >= 3 -extern PyObject *PLyUnicode_FromString(const char *s); -extern PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size); +extern PGDLLEXPORT PyObject *PLyUnicode_FromString(const char *s); +extern PGDLLEXPORT PyObject *PLyUnicode_FromStringAndSize(const char *s, Py_ssize_t size); #endif #endif /* PLPY_UTIL_H */ diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h index a6661218347..a7a36714a48 100644 --- a/src/test/modules/test_shm_mq/test_shm_mq.h +++ b/src/test/modules/test_shm_mq/test_shm_mq.h @@ -40,6 +40,6 @@ extern void test_shm_mq_setup(int64 queue_size, int32 nworkers, shm_mq_handle **input); /* Main entrypoint for a worker. */ -extern void test_shm_mq_main(Datum) pg_attribute_noreturn(); +extern PGDLLEXPORT void test_shm_mq_main(Datum) pg_attribute_noreturn(); #endif diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c index 0b6246676b6..e267bc3cffa 100644 --- a/src/test/modules/worker_spi/worker_spi.c +++ b/src/test/modules/worker_spi/worker_spi.c @@ -47,7 +47,7 @@ PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(worker_spi_launch); void _PG_init(void); -void worker_spi_main(Datum) pg_attribute_noreturn(); +PGDLLEXPORT void worker_spi_main(Datum) pg_attribute_noreturn(); /* GUC variables */ static int worker_spi_naptime = 10; diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index aba59a270b4..811d6fcc5b2 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -432,6 +432,7 @@ sub GenerateFiles HAVE_WINLDAP_H => undef, HAVE_WCSTOMBS_L => 1, HAVE_WCTYPE_H => 1, + HAVE_VISIBILITY_ATTRIBUTE => undef, HAVE_WRITEV => undef, HAVE_X509_GET_SIGNATURE_NID => 1, HAVE_X86_64_POPCNTQ => undef, -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0011-meson-prereq-Handle-DLSUFFIX-in-msvc-builds-simil.patch" From 9f1027a30568d7142ed3a57129b8c84494a8eb1f Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 30 Sep 2021 10:20:24 -0700 Subject: [PATCH v3 11/17] meson: prereq: Handle DLSUFFIX in msvc builds similar to other build envs. --- src/include/port/win32_port.h | 3 --- src/tools/msvc/Mkvcbuild.pm | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h index c1c4831595a..72b2d2b5a01 100644 --- a/src/include/port/win32_port.h +++ b/src/include/port/win32_port.h @@ -529,9 +529,6 @@ typedef unsigned short mode_t; #define W_OK 2 #define R_OK 4 -/* Pulled from Makefile.port in MinGW */ -#define DLSUFFIX ".dll" - #endif /* _MSC_VER */ #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || \ diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index b8e62c6d3f7..47b5c43357a 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -195,6 +195,7 @@ sub mkvcbuild 'syncrep_gram.y'); $postgres->AddFiles('src/backend/utils/adt', 'jsonpath_scan.l', 'jsonpath_gram.y'); + $postgres->AddDefine('DLSUFFIX=".dll"'); $postgres->AddDefine('BUILDING_DLL'); $postgres->AddLibrary('secur32.lib'); $postgres->AddLibrary('ws2_32.lib'); @@ -298,6 +299,7 @@ sub mkvcbuild my $libecpg = $solution->AddProject('libecpg', 'dll', 'interfaces', 'src/interfaces/ecpg/ecpglib'); $libecpg->AddDefine('FRONTEND'); + $libecpg->AddDefine('DLSUFFIX=".dll"'); $libecpg->AddIncludeDir('src/interfaces/ecpg/include'); $libecpg->AddIncludeDir('src/interfaces/libpq'); $libecpg->AddIncludeDir('src/port'); @@ -845,6 +847,7 @@ sub mkvcbuild $pgregress->AddFile('src/test/regress/pg_regress.c'); $pgregress->AddFile('src/test/regress/pg_regress_main.c'); $pgregress->AddIncludeDir('src/port'); + $pgregress->AddDefine('DLSUFFIX=".dll"'); $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); $pgregress->AddLibrary('ws2_32.lib'); $pgregress->AddDirResourceFile('src/test/regress'); -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0012-prereq-Move-sed-expression-from-regress-python3-m.patch" From 69e6ddf1d840d0d39005d559774626982c974bd1 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 3 Oct 2021 10:56:21 -0700 Subject: [PATCH v3 12/17] prereq: Move sed expression from regress-python3-mangle.mk into its own file. --- src/pl/plpython/regress-python3-mangle.mk | 17 ++--------------- src/pl/plpython/regress-python3-mangle.sed | 13 +++++++++++++ 2 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 src/pl/plpython/regress-python3-mangle.sed diff --git a/src/pl/plpython/regress-python3-mangle.mk b/src/pl/plpython/regress-python3-mangle.mk index a785818a172..a5c155e73de 100644 --- a/src/pl/plpython/regress-python3-mangle.mk +++ b/src/pl/plpython/regress-python3-mangle.mk @@ -14,21 +14,8 @@ REGRESS := $(foreach test,$(REGRESS),$(if $(filter $(test),$(REGRESS_PLPYTHON3_M pgregress-python3-mangle: $(MKDIR_P) sql/python3 expected/python3 results/python3 for file in $(patsubst %,$(srcdir)/sql/%.sql,$(REGRESS_PLPYTHON3_MANGLE)) $(patsubst %,$(srcdir)/expected/%*.out,$(REGRESS_PLPYTHON3_MANGLE)); do \ - sed \ - -e "s///g" \ - -e "s///g" \ - -e "s/\([0-9][0-9]*\)L/\1/g" \ - -e 's/\([ [{]\)u"/\1"/g' \ - -e "s/\([ [{]\)u'/\1'/g" \ - -e "s/def next/def __next__/g" \ - -e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \ - -e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \ - -e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \ - -e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \ - -e "s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g" \ - -e "s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g" \ - -e 's/installing required extension "plpython2u"/installing required extension "plpython3u"/g' \ - $$file >`echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \ + sed -f $(top_srcdir)/src/pl/plpython/regress-python3-mangle.sed $$file > \ + `echo $$file | sed 's,^.*/\([^/][^/]*/\)\([^/][^/]*\)$$,\1python3/\2,'` || exit; \ done check installcheck: pgregress-python3-mangle diff --git a/src/pl/plpython/regress-python3-mangle.sed b/src/pl/plpython/regress-python3-mangle.sed new file mode 100644 index 00000000000..d2fde24e0bf --- /dev/null +++ b/src/pl/plpython/regress-python3-mangle.sed @@ -0,0 +1,13 @@ +s///g +s///g +s/\([0-9][0-9]*\)L/\1/g +s/\([ [{]\)u"/\1"/g +s/\([ [{]\)u'/\1'/g +s/def next/def __next__/g +s/LANGUAGE plpythonu/LANGUAGE plpython3u/g +s/LANGUAGE plpython2u/LANGUAGE plpython3u/g +s/EXTENSION plpythonu/EXTENSION plpython3u/g +s/EXTENSION plpython2u/EXTENSION plpython3u/g +s/EXTENSION \([^ ]*\)_plpythonu/EXTENSION \1_plpython3u/g +s/EXTENSION \([^ ]*\)_plpython2u/EXTENSION \1_plpython3u/g +s/installing required extension "plpython2u"/installing required extension "plpython3u"/g -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0013-Adapt-src-test-ldap-t-001_auth.pl-to-work-with-op.patch" From 79eaef1e6a8039119d9e7a13671c8f94fecee2c3 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 9 Oct 2021 16:42:22 -0700 Subject: [PATCH v3 13/17] Adapt src/test/ldap/t/001_auth.pl to work with openldap 2.5. ldapsearch's deprecated -h/-p arguments were removed, need to use -H now. Discussion: https://postgr.es/m/20211009233850.wvr6apcrw2ai6cnj@alap3.anarazel.de Backpatch: 11-, where the tests were added. --- src/test/ldap/t/001_auth.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index f670bc5e0d5..a025a641b02 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -130,8 +130,8 @@ while (1) last if ( system_log( - "ldapsearch", "-h", $ldap_server, "-p", - $ldap_port, "-s", "base", "-b", + "ldapsearch", "-H", "$ldap_url", "-s", + "base", "-b", $ldap_basedn, "-D", $ldap_rootdn, "-y", $ldap_pwfile, "-n", "'objectclass=*'") == 0); die "cannot connect to slapd" if ++$retries >= 300; -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0014-wip-don-t-run-ldap-tests-on-windows.patch" From fddca5d028897e5a5f1d5affe3c426e9721a2655 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sun, 10 Oct 2021 13:49:12 -0700 Subject: [PATCH v3 14/17] wip: don't run ldap tests on windows. --- src/test/ldap/t/001_auth.pl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index a025a641b02..c921a3d4872 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -6,6 +6,13 @@ use warnings; use TestLib; use PostgresNode; use Test::More; +use Config; + +if ($Config{osname} eq 'MSWin32') +{ + plan skip_all => 'ldap tests '; + exit; +} if ($ENV{with_ldap} eq 'yes') { -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0015-wip-split-TESTDIR-into-two.patch" From 7eed3612b84eba13730c13eaf59cb0d7bdae9d81 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 1 Oct 2021 16:37:52 -0700 Subject: [PATCH v3 15/17] wip: split TESTDIR into two. --- src/Makefile.global.in | 3 +++ src/bin/psql/t/010_tab_completion.pl | 34 ++++++++++++++-------------- src/test/perl/TestLib.pm | 2 +- src/tools/msvc/vcregress.pl | 1 + 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index a4ab27ae145..7505e3fa79d 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -450,6 +450,7 @@ define prove_installcheck rm -rf '$(CURDIR)'/tmp_check $(MKDIR_P) '$(CURDIR)'/tmp_check cd $(srcdir) && \ + TESTOUTDIR='$(CURDIR)/tmp_check' \ TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' \ top_builddir='$(CURDIR)/$(top_builddir)' \ PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' \ @@ -460,6 +461,7 @@ define prove_installcheck rm -rf '$(CURDIR)'/tmp_check $(MKDIR_P) '$(CURDIR)'/tmp_check cd $(srcdir) && \ + TESTOUTDIR='$(CURDIR)/tmp_check' \ TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' \ top_builddir='$(top_builddir)' \ PG_REGRESS='$(top_builddir)/src/test/regress/pg_regress' \ @@ -471,6 +473,7 @@ define prove_check 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/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl index 8695d225451..9123ac4c1f0 100644 --- a/src/bin/psql/t/010_tab_completion.pl +++ b/src/bin/psql/t/010_tab_completion.pl @@ -67,23 +67,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; @@ -180,16 +180,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"); clear_query(); @@ -198,15 +198,15 @@ clear_query(); # 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 @@ -214,7 +214,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/TestLib.pm b/src/test/perl/TestLib.pm index 06aae1760eb..b3ae976d85c 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -187,7 +187,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/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index 35e8f67f013..d2f5ef1118a 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -248,6 +248,7 @@ sub tap_check $ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll"; $ENV{TESTDIR} = "$dir"; + $ENV{TESTOUTDIR} = "$dir/tmp_check"; rmtree('tmp_check'); system(@args); -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="v3-0016-meson-Add-draft-of-a-meson-based-buildsystem.patch" Content-Transfer-Encoding: 8bit From b41aabee7aa54ec2f8e0c1fd770c0ee52b09ca12 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 10 Sep 2021 09:51:51 -0700 Subject: [PATCH v3 16/17] meson: Add draft of a meson based buildsystem. Author: Andres Freund Author: Thomas Munro --- contrib/adminpack/meson.build | 20 + contrib/amcheck/meson.build | 35 + contrib/auth_delay/meson.build | 4 + contrib/auto_explain/meson.build | 13 + contrib/bloom/meson.build | 38 + contrib/bool_plperl/meson.build | 37 + contrib/btree_gin/meson.build | 51 + contrib/btree_gist/meson.build | 79 + contrib/citext/meson.build | 29 + contrib/cube/meson.build | 42 + contrib/dblink/meson.build | 29 + contrib/dict_int/meson.build | 19 + contrib/dict_xsyn/meson.build | 26 + contrib/earthdistance/meson.build | 20 + contrib/file_fdw/meson.build | 19 + contrib/fuzzystrmatch/meson.build | 23 + contrib/hstore/meson.build | 36 + contrib/hstore_plperl/meson.build | 38 + contrib/hstore_plpython/expected/meson.build | 15 + contrib/hstore_plpython/meson.build | 44 + contrib/hstore_plpython/sql/meson.build | 17 + contrib/jsonb_plperl/meson.build | 37 + contrib/jsonb_plpython/expected/meson.build | 15 + contrib/jsonb_plpython/meson.build | 44 + contrib/jsonb_plpython/sql/meson.build | 17 + contrib/meson.build | 63 + contrib/oid2name/meson.build | 14 + contrib/pageinspect/meson.build | 45 + contrib/pg_prewarm/meson.build | 16 + contrib/pg_stat_statements/meson.build | 31 + contrib/pg_trgm/meson.build | 33 + contrib/pg_visibility/meson.build | 25 + contrib/postgres_fdw/meson.build | 31 + contrib/spi/meson.build | 43 + contrib/test_decoding/meson.build | 69 + contrib/tsm_system_rows/meson.build | 22 + contrib/tsm_system_time/meson.build | 22 + contrib/unaccent/meson.build | 30 + contrib/vacuumlo/meson.build | 14 + contrib/xml2/meson.build | 30 + conversion_helpers.txt | 6 + meson.build | 1901 +++++++++++++++++ meson_options.txt | 81 + 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 | 28 + src/backend/bootstrap/meson.build | 12 + src/backend/catalog/meson.build | 41 + src/backend/commands/meson.build | 50 + 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 | 28 + src/backend/main/meson.build | 2 + src/backend/meson.build | 191 ++ src/backend/nodes/meson.build | 17 + 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 | 43 + src/backend/partitioning/meson.build | 5 + src/backend/port/meson.build | 28 + src/backend/port/win32/meson.build | 6 + src/backend/postmaster/meson.build | 15 + src/backend/regex/meson.build | 15 + .../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 | 83 + 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 | 18 + 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 | 5 + src/backend/utils/adt/meson.build | 118 + src/backend/utils/cache/meson.build | 16 + src/backend/utils/error/meson.build | 4 + 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 | 13 + src/backend/utils/misc/meson.build | 28 + src/backend/utils/mmgr/meson.build | 10 + src/backend/utils/mmgr/proxy.c | 217 ++ src/backend/utils/resowner/meson.build | 3 + src/backend/utils/sort/meson.build | 7 + src/backend/utils/time/meson.build | 4 + src/bin/initdb/meson.build | 24 + src/bin/meson.build | 20 + src/bin/pg_amcheck/meson.build | 22 + src/bin/pg_archivecleanup/meson.build | 14 + src/bin/pg_basebackup/meson.build | 44 + src/bin/pg_checksums/meson.build | 16 + src/bin/pg_config/meson.build | 14 + src/bin/pg_controldata/meson.build | 14 + src/bin/pg_ctl/meson.build | 17 + src/bin/pg_dump/meson.build | 69 + src/bin/pg_resetwal/meson.build | 15 + src/bin/pg_rewind/meson.build | 34 + src/bin/pg_test_fsync/meson.build | 14 + src/bin/pg_test_timing/meson.build | 14 + src/bin/pg_upgrade/meson.build | 26 + src/bin/pg_verifybackup/meson.build | 25 + src/bin/pg_waldump/meson.build | 23 + src/bin/pgbench/meson.build | 38 + src/bin/pgevent/meson.build | 1 + src/bin/psql/meson.build | 46 + src/bin/scripts/meson.build | 46 + src/common/meson.build | 140 ++ src/fe_utils/meson.build | 27 + src/include/catalog/meson.build | 113 + src/include/meson.build | 50 + src/include/parser/meson.build | 10 + src/include/pch/c_pch.h | 1 + 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 | 22 + src/interfaces/libpq/meson.build | 99 + src/meson.build | 10 + src/pl/meson.build | 4 + src/pl/plperl/meson.build | 81 + src/pl/plpgsql/meson.build | 1 + src/pl/plpgsql/src/meson.build | 67 + src/pl/plpython/expected/meson.build | 14 + src/pl/plpython/meson.build | 100 + src/pl/plpython/sql/meson.build | 15 + src/port/meson.build | 146 ++ src/test/authentication/meson.build | 9 + src/test/isolation/meson.build | 49 + src/test/kerberos/meson.build | 12 + src/test/ldap/meson.build | 9 + src/test/meson.build | 19 + src/test/modules/brin/meson.build | 19 + src/test/modules/commit_ts/meson.build | 20 + src/test/modules/delay_execution/meson.build | 15 + src/test/modules/dummy_index_am/meson.build | 20 + src/test/modules/dummy_seclabel/meson.build | 20 + src/test/modules/libpq_pipeline/meson.build | 21 + src/test/modules/meson.build | 25 + src/test/modules/plsample/meson.build | 20 + src/test/modules/snapshot_too_old/meson.build | 11 + src/test/modules/spgist_name_ops/meson.build | 20 + .../ssl_passphrase_callback/meson.build | 45 + src/test/modules/test_bloomfilter/meson.build | 20 + src/test/modules/test_ddl_deparse/meson.build | 40 + src/test/modules/test_extensions/meson.build | 38 + .../modules/test_ginpostinglist/meson.build | 20 + src/test/modules/test_integerset/meson.build | 20 + src/test/modules/test_misc/meson.build | 8 + src/test/modules/test_parser/meson.build | 20 + src/test/modules/test_pg_dump/meson.build | 24 + src/test/modules/test_predtest/meson.build | 20 + src/test/modules/test_rbtree/meson.build | 20 + src/test/modules/test_regex/meson.build | 21 + src/test/modules/test_rls_hooks/meson.build | 19 + src/test/modules/test_shm_mq/meson.build | 24 + src/test/modules/unsafe_tests/meson.build | 9 + src/test/modules/worker_spi/meson.build | 23 + src/test/recovery/meson.build | 33 + src/test/regress/meson.build | 57 + src/test/ssl/meson.build | 10 + src/test/subscription/meson.build | 33 + src/timezone/meson.build | 50 + src/timezone/tznames/meson.build | 20 + src/tools/find_meson | 20 + src/tools/irlink | 28 + src/tools/msvc/export2def.pl | 22 + src/tools/msvc/gendef2.pl | 177 ++ src/tools/testwrap | 22 + 199 files changed, 7430 insertions(+) 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/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/expected/meson.build create mode 100644 contrib/hstore_plpython/meson.build create mode 100644 contrib/hstore_plpython/sql/meson.build create mode 100644 contrib/jsonb_plperl/meson.build create mode 100644 contrib/jsonb_plpython/expected/meson.build create mode 100644 contrib/jsonb_plpython/meson.build create mode 100644 contrib/jsonb_plpython/sql/meson.build create mode 100644 contrib/meson.build create mode 100644 contrib/oid2name/meson.build create mode 100644 contrib/pageinspect/meson.build create mode 100644 contrib/pg_prewarm/meson.build create mode 100644 contrib/pg_stat_statements/meson.build create mode 100644 contrib/pg_trgm/meson.build create mode 100644 contrib/pg_visibility/meson.build create mode 100644 contrib/postgres_fdw/meson.build create mode 100644 contrib/spi/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/vacuumlo/meson.build create mode 100644 contrib/xml2/meson.build create mode 100644 conversion_helpers.txt create mode 100644 meson.build create mode 100644 meson_options.txt 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/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/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/mmgr/proxy.c 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/bin/initdb/meson.build create mode 100644 src/bin/meson.build create mode 100644 src/bin/pg_amcheck/meson.build create mode 100644 src/bin/pg_archivecleanup/meson.build create mode 100644 src/bin/pg_basebackup/meson.build create mode 100644 src/bin/pg_checksums/meson.build create mode 100644 src/bin/pg_config/meson.build create mode 100644 src/bin/pg_controldata/meson.build create mode 100644 src/bin/pg_ctl/meson.build create mode 100644 src/bin/pg_dump/meson.build create mode 100644 src/bin/pg_resetwal/meson.build create mode 100644 src/bin/pg_rewind/meson.build create mode 100644 src/bin/pg_test_fsync/meson.build create mode 100644 src/bin/pg_test_timing/meson.build create mode 100644 src/bin/pg_upgrade/meson.build create mode 100644 src/bin/pg_verifybackup/meson.build create mode 100644 src/bin/pg_waldump/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/scripts/meson.build create mode 100644 src/common/meson.build create mode 100644 src/fe_utils/meson.build create mode 100644 src/include/catalog/meson.build create mode 100644 src/include/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/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/interfaces/libpq/meson.build create mode 100644 src/meson.build create mode 100644 src/pl/meson.build create mode 100644 src/pl/plperl/meson.build create mode 100644 src/pl/plpgsql/meson.build create mode 100644 src/pl/plpgsql/src/meson.build create mode 100644 src/pl/plpython/expected/meson.build create mode 100644 src/pl/plpython/meson.build create mode 100644 src/pl/plpython/sql/meson.build create mode 100644 src/port/meson.build create mode 100644 src/test/authentication/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_misc/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 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 100644 src/tools/msvc/export2def.pl create mode 100644 src/tools/msvc/gendef2.pl create mode 100755 src/tools/testwrap diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build new file mode 100644 index 00000000000..457a6089445 --- /dev/null +++ b/contrib/adminpack/meson.build @@ -0,0 +1,20 @@ +autoinc = 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, +) + +regress_tests += { + 'name': 'adminpack', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': ['adminpack'], +} diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build new file mode 100644 index 00000000000..7d6a7bc8385 --- /dev/null +++ b/contrib/amcheck/meson.build @@ -0,0 +1,35 @@ +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, +) + +regress_tests += { + 'name': 'amcheck', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'check', + 'check_btree', + 'check_heap' + ], +} + +tap_tests += { + 'name': 'amcheck', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_verify_heapam.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..321896efa2c --- /dev/null +++ b/contrib/auto_explain/meson.build @@ -0,0 +1,13 @@ +auto_explain = shared_module('auto_explain', + files('auto_explain.c'), + kwargs: contrib_mod_args, +) + +tap_tests += { + 'name': 'auto_explain', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_auto_explain.pl', + ] +} diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build new file mode 100644 index 00000000000..5c5d33c7f7a --- /dev/null +++ b/contrib/bloom/meson.build @@ -0,0 +1,38 @@ +bloom_sources = files( + 'blcost.c', + 'blinsert.c', + 'blscan.c', + 'blutils.c', + 'blvacuum.c', + 'blvalidate.c', +) + +bloom = shared_module('bloom', + bloom_sources, + c_pch: '../../src/include/pch/c_pch.h', + kwargs: contrib_mod_args, +) + +install_data( + 'bloom.control', + 'bloom--1.0.sql', + kwargs: contrib_data_args, +) + +regress_tests += { + 'name': 'bloom', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'bloom' + ], +} + +tap_tests += { + 'name': 'bloom', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..e15dc5285eb --- /dev/null +++ b/contrib/bool_plperl/meson.build @@ -0,0 +1,37 @@ +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, +) + +regress_tests += { + 'name': 'bool_plperl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..d25ece7500e --- /dev/null +++ b/contrib/btree_gin/meson.build @@ -0,0 +1,51 @@ +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, +) + +regress_tests += { + 'name': 'btree_gin', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..8ee0faea401 --- /dev/null +++ b/contrib/btree_gist/meson.build @@ -0,0 +1,79 @@ +btree_gist_sources = files( + 'btree_bit.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: '../../src/include/pch/c_pch.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', + kwargs: contrib_data_args, +) + +regress_tests += { + 'name': 'btree_gist', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ], +} diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build new file mode 100644 index 00000000000..f2e9ff2117d --- /dev/null +++ b/contrib/citext/meson.build @@ -0,0 +1,29 @@ +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, +) + +regress_tests += { + 'name': 'citext', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'citext' + ], +} diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build new file mode 100644 index 00000000000..49276aed644 --- /dev/null +++ b/contrib/cube/meson.build @@ -0,0 +1,42 @@ +cube_sources = files( + 'cube.c', +) + +# cubescan is compiled as part of cubeparse +cubescan = custom_target('cubescan', + input: ['cubescan.l'], + output: ['cubescan.c'], + command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@']) + +cube_sources += custom_target('cubeparse', + input: 'cubeparse.y', + output: 'cubeparse.c', + depends: cubescan, + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) + +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, +) + +regress_tests += { + 'name': 'cube', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'cube', + 'cube_sci', + ], +} diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build new file mode 100644 index 00000000000..7ac253700c9 --- /dev/null +++ b/contrib/dblink/meson.build @@ -0,0 +1,29 @@ +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, +) + +regress_tests += { + 'name': 'dblink', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'paths', + '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..7c23b275c5a --- /dev/null +++ b/contrib/dict_int/meson.build @@ -0,0 +1,19 @@ +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, +) + +regress_tests += { + 'name': 'dict_int', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'dict_int' + ], +} diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build new file mode 100644 index 00000000000..7cbabba02f1 --- /dev/null +++ b/contrib/dict_xsyn/meson.build @@ -0,0 +1,26 @@ +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': get_option('datadir') / 'tsearch_data' + } +) + +regress_tests += { + 'name': 'dict_xsyn', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'dict_xsyn' + ], +} diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build new file mode 100644 index 00000000000..d56abf4f260 --- /dev/null +++ b/contrib/earthdistance/meson.build @@ -0,0 +1,20 @@ +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, +) + +regress_tests += { + 'name': 'earthdistance', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'earthdistance' + ], +} diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build new file mode 100644 index 00000000000..0cd3348dfd0 --- /dev/null +++ b/contrib/file_fdw/meson.build @@ -0,0 +1,19 @@ +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, +) + +regress_tests += { + 'name': 'file_fdw', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'file_fdw' + ], +} diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build new file mode 100644 index 00000000000..d1e75479668 --- /dev/null +++ b/contrib/fuzzystrmatch/meson.build @@ -0,0 +1,23 @@ +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, +) + +regress_tests += { + 'name': 'fuzzystrmatch', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'fuzzystrmatch' + ], +} diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build new file mode 100644 index 00000000000..661e61f9692 --- /dev/null +++ b/contrib/hstore/meson.build @@ -0,0 +1,36 @@ +# .. 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: '../../src/include/pch/c_pch.h', + kwargs: contrib_mod_args, +) + +install_data( + 'hstore.control', + 'hstore--1.1--1.2.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, +) + +regress_tests += { + 'name': 'hstore', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'hstore' + ], +} diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build new file mode 100644 index 00000000000..48231cb1c9e --- /dev/null +++ b/contrib/hstore_plperl/meson.build @@ -0,0 +1,38 @@ +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, +) + +regress_tests += { + 'name': 'hstore_plperl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'hstore_plperl', + 'hstore_plperlu', + 'create_transform', + ], +} diff --git a/contrib/hstore_plpython/expected/meson.build b/contrib/hstore_plpython/expected/meson.build new file mode 100644 index 00000000000..5a33c3752ef --- /dev/null +++ b/contrib/hstore_plpython/expected/meson.build @@ -0,0 +1,15 @@ +foreach r2 : hstore_plpython_regress + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + + s2 = '@0@.out'.format(r2) + s3 = '@0@.out'.format(r3) + hstore_plpython3_deps += custom_target(s3, + input: '@0@.out'.format(r2), + output: '@0@.out'.format(r3), + capture: true, + command: plpython_regress_cmd, + build_by_default: false, + install: false, + ) +endforeach diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build new file mode 100644 index 00000000000..3c47a71e430 --- /dev/null +++ b/contrib/hstore_plpython/meson.build @@ -0,0 +1,44 @@ +if not python3.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, contrib_mod_args['dependencies']], + }, +) + +install_data( + 'hstore_plpythonu.control', + 'hstore_plpython2u.control', + 'hstore_plpython3u.control', + 'hstore_plpythonu--1.0.sql', + 'hstore_plpython2u--1.0.sql', + 'hstore_plpython3u--1.0.sql', + kwargs: contrib_data_args, +) + +hstore_plpython_regress = ['hstore_plpython'] + +hstore_plpython3_regress = [] +hstore_plpython3_deps = [] + +# FIXME: this is an abysmal hack +subdir('sql') +subdir('expected') + +regress_tests += { + 'name': 'hstore_plpython', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': hstore_plpython3_regress, + 'deps': hstore_plpython3_deps, + 'regress_args': ['--inputdir', meson.current_build_dir(), '--load-extension=hstore'], +} diff --git a/contrib/hstore_plpython/sql/meson.build b/contrib/hstore_plpython/sql/meson.build new file mode 100644 index 00000000000..612980fd37c --- /dev/null +++ b/contrib/hstore_plpython/sql/meson.build @@ -0,0 +1,17 @@ +# Convert plpython2 regression tests to plpython3 ones +foreach r2 : hstore_plpython_regress + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + hstore_plpython3_regress += r3 + + s2 = '@0@.sql'.format(r2) + s3 = '@0@.sql'.format(r3) + hstore_plpython3_deps += custom_target(s3, + input: '@0@.sql'.format(r2), + output: '@0@.sql'.format(r3), + capture: true, + command: plpython_regress_cmd, + build_by_default: false, + install: false, + ) +endforeach diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build new file mode 100644 index 00000000000..c34090e5f5c --- /dev/null +++ b/contrib/jsonb_plperl/meson.build @@ -0,0 +1,37 @@ +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, +) + +regress_tests += { + 'name': 'jsonb_plperl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'jsonb_plperl', + 'jsonb_plperlu', + ], +} diff --git a/contrib/jsonb_plpython/expected/meson.build b/contrib/jsonb_plpython/expected/meson.build new file mode 100644 index 00000000000..3840bdd92e5 --- /dev/null +++ b/contrib/jsonb_plpython/expected/meson.build @@ -0,0 +1,15 @@ +foreach r2 : jsonb_plpython_regress + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + + s2 = '@0@.out'.format(r2) + s3 = '@0@.out'.format(r3) + jsonb_plpython3_deps += custom_target(s3, + input: '@0@.out'.format(r2), + output: '@0@.out'.format(r3), + capture: true, + command: plpython_regress_cmd, + build_by_default: false, + install: false, + ) +endforeach diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build new file mode 100644 index 00000000000..21abebf41b7 --- /dev/null +++ b/contrib/jsonb_plpython/meson.build @@ -0,0 +1,44 @@ +if not python3.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, contrib_mod_args['dependencies']], + }, +) + +install_data( + 'jsonb_plpythonu.control', + 'jsonb_plpython2u.control', + 'jsonb_plpython3u.control', + 'jsonb_plpythonu--1.0.sql', + 'jsonb_plpython2u--1.0.sql', + 'jsonb_plpython3u--1.0.sql', + kwargs: contrib_data_args, +) + +jsonb_plpython_regress = ['jsonb_plpython'] + +jsonb_plpython3_regress = [] +jsonb_plpython3_deps = [] + +# FIXME: this is an abysmal hack +subdir('sql') +subdir('expected') + +regress_tests += { + 'name': 'jsonb_plpython', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': jsonb_plpython3_regress, + 'deps': jsonb_plpython3_deps, + 'regress_args': ['--inputdir', meson.current_build_dir()], +} diff --git a/contrib/jsonb_plpython/sql/meson.build b/contrib/jsonb_plpython/sql/meson.build new file mode 100644 index 00000000000..4b29029192a --- /dev/null +++ b/contrib/jsonb_plpython/sql/meson.build @@ -0,0 +1,17 @@ +# Convert plpython2 regression tests to plpython3 ones +foreach r2 : jsonb_plpython_regress + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + jsonb_plpython3_regress += r3 + + s2 = '@0@.sql'.format(r2) + s3 = '@0@.sql'.format(r3) + jsonb_plpython3_deps += custom_target(s3, + input: '@0@.sql'.format(r2), + output: '@0@.sql'.format(r3), + capture: true, + command: plpython_regress_cmd, + build_by_default: false, + install: false, + ) +endforeach diff --git a/contrib/meson.build b/contrib/meson.build new file mode 100644 index 00000000000..0d5f7315ebb --- /dev/null +++ b/contrib/meson.build @@ -0,0 +1,63 @@ +contrib_mod_args = pg_mod_args + +contrib_data_dir = get_option('datadir') / 'extension' +contrib_data_args = { + 'install_dir': contrib_data_dir +} + +subdir('adminpack') +subdir('amcheck') +subdir('auth_delay') +subdir('auto_explain') +subdir('bloom') +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') +# TODO: intagg +# TODO: intarray +# TODO: isn +subdir('jsonb_plperl') +subdir('jsonb_plpython') +# TODO: lo +# TODO: ltree +# TODO: ltree_plpython +subdir('oid2name') +# TODO: old_snapshot +subdir('pageinspect') +# TODO: passwordcheck +# TODO: pg_buffercache +# TODO: pgcrypto +# TODO: pg_freespacemap +subdir('pg_prewarm') +# TODO: pgrowlocks +subdir('pg_stat_statements') +# TODO: pgstattuple +# TODO: pg_surgery +subdir('pg_trgm') +subdir('pg_visibility') +subdir('postgres_fdw') +# TODO: seg +# TODO: sepgsql +subdir('spi') +# TODO: sslinfo +# TODO: start-scripts +# TODO: tablefunc +# TODO: tcn +subdir('test_decoding') +subdir('tsm_system_rows') +subdir('tsm_system_time') +subdir('unaccent') +# TODO: uuid-ossp +subdir('vacuumlo') +subdir('xml2') diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build new file mode 100644 index 00000000000..bee34d2137c --- /dev/null +++ b/contrib/oid2name/meson.build @@ -0,0 +1,14 @@ +executable('oid2name', + ['oid2name.c'], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name' : 'oid2name', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests' :[ + 't/001_basic.pl', + ] +} diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build new file mode 100644 index 00000000000..4bd5b1784e0 --- /dev/null +++ b/contrib/pageinspect/meson.build @@ -0,0 +1,45 @@ +pageinspect = shared_module('pageinspect', + files( + 'brinfuncs.c', + 'btreefuncs.c', + 'fsmfuncs.c', + 'ginfuncs.c', + 'gistfuncs.c', + 'hashfuncs.c', + 'heapfuncs.c', + 'rawpage.c', + ), + 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, +) + +regress_tests += { + 'name': 'pageinspect', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'page', + 'btree', + 'brin', + 'gin', + 'gist', + 'hash', + 'checksum', + 'oldextversions', + ], +} diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build new file mode 100644 index 00000000000..c93ccc2db6d --- /dev/null +++ b/contrib/pg_prewarm/meson.build @@ -0,0 +1,16 @@ +pg_prewarm = shared_module('pg_prewarm', + files( + 'autoprewarm.c', + 'pg_prewarm.c', + ), + c_pch: '../../src/include/pch/postgres_pch.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, +) diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build new file mode 100644 index 00000000000..6ed70ac0f18 --- /dev/null +++ b/contrib/pg_stat_statements/meson.build @@ -0,0 +1,31 @@ +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.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, +) + +regress_tests += { + 'name': 'pg_stat_statements', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'pg_stat_statements' + ], + 'regress_args': ['--temp-config', files('pg_stat_statements.conf')], +} diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build new file mode 100644 index 00000000000..0a56926ad6b --- /dev/null +++ b/contrib/pg_trgm/meson.build @@ -0,0 +1,33 @@ +pg_trgm = shared_module('pg_trgm', + files( + 'trgm_gin.c', + 'trgm_gist.c', + 'trgm_op.c', + 'trgm_regexp.c', + ), + c_pch: '../../src/include/pch/postgres_pch.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, +) + +regress_tests += { + 'name': 'pg_trgm', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..68a7e1cf28c --- /dev/null +++ b/contrib/pg_visibility/meson.build @@ -0,0 +1,25 @@ +pg_visibility = shared_module('pg_visibility', + files( + 'pg_visibility.c', + ), + c_pch: '../../src/include/pch/postgres_pch.h', + kwargs: contrib_mod_args, +) + +install_data( + 'pg_visibility--1.0--1.1.sql', + 'pg_visibility--1.1.sql', + 'pg_visibility--1.1--1.2.sql', + 'pg_visibility.control', + kwargs: contrib_data_args, +) + + +regress_tests += { + 'name': 'pg_visibility', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'pg_visibility' + ], +} diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build new file mode 100644 index 00000000000..507d01448b1 --- /dev/null +++ b/contrib/postgres_fdw/meson.build @@ -0,0 +1,31 @@ +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, +) + +regress_tests += { + 'name': 'postgres_fdw', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'postgres_fdw' + ], + 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'], +} diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build new file mode 100644 index 00000000000..51bc96ea657 --- /dev/null +++ b/contrib/spi/meson.build @@ -0,0 +1,43 @@ +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', + install_dir: get_option('datadir') / 'extension' +) + + +moddatetime = shared_module('moddatetime', + ['moddatetime.c'], + kwargs: contrib_mod_args, +) + +install_data('moddatetime.control', 'moddatetime--1.0.sql', + install_dir: get_option('datadir') / 'extension' +) + +# 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/test_decoding/meson.build b/contrib/test_decoding/meson.build new file mode 100644 index 00000000000..d26b43cbe79 --- /dev/null +++ b/contrib/test_decoding/meson.build @@ -0,0 +1,69 @@ +test_decoding_sources = files( + 'test_decoding.c', +) + +test_decoding = shared_module('test_decoding', + test_decoding_sources, + kwargs: contrib_mod_args, +) + + +regress_tests += { + 'name': 'test_decoding', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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_tests += { + 'name': 'test_decoding', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'specs': [ + 'mxact', + 'delayed_startup', + 'ondisk_startup', + 'concurrent_ddl_dml', + 'oldest_xmin', + 'snapshot_transfer', + 'subxact_without_top', + 'concurrent_stream', + 'twophase_snapshot', + ], + 'regress_args': [ + '--temp-config', files('logical.conf') + ] +} + + +tap_tests += { + 'name': 'test_decoding', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..2c8f4487f8d --- /dev/null +++ b/contrib/tsm_system_rows/meson.build @@ -0,0 +1,22 @@ +tsm_system_rows = shared_module('tsm_system_rows', + files( + 'tsm_system_rows.c', + ), + c_pch: '../../src/include/pch/postgres_pch.h', + kwargs: contrib_mod_args, +) + +install_data( + 'tsm_system_rows--1.0.sql', + 'tsm_system_rows.control', + kwargs: contrib_data_args, +) + +regress_tests += { + 'name': 'tsm_system_rows', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..df9c4aa4b51 --- /dev/null +++ b/contrib/tsm_system_time/meson.build @@ -0,0 +1,22 @@ +tsm_system_time = shared_module('tsm_system_time', + files( + 'tsm_system_time.c', + ), + c_pch: '../../src/include/pch/postgres_pch.h', + kwargs: contrib_mod_args, +) + +install_data( + 'tsm_system_time--1.0.sql', + 'tsm_system_time.control', + kwargs: contrib_data_args, +) + +regress_tests += { + 'name': 'tsm_system_time', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'tsm_system_time', + ], +} diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build new file mode 100644 index 00000000000..e77bf790d8c --- /dev/null +++ b/contrib/unaccent/meson.build @@ -0,0 +1,30 @@ +unaccent = shared_module('unaccent', + files( + 'unaccent.c', + ), + c_pch: '../../src/include/pch/postgres_pch.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: get_option('datadir') / 'tsearch_data' +) + +# XXX: Implement downlo +regress_tests += { + 'name': 'unaccent', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'unaccent', + ], + 'regress_args': ['--encoding=UTF8'], +} diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build new file mode 100644 index 00000000000..99e76daacf9 --- /dev/null +++ b/contrib/vacuumlo/meson.build @@ -0,0 +1,14 @@ +executable('vacuumlo', + ['vacuumlo.c'], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name' : 'vacuumlo', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests' :[ + 't/001_basic.pl', + ] +} diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build new file mode 100644 index 00000000000..6f8a26e4f0a --- /dev/null +++ b/contrib/xml2/meson.build @@ -0,0 +1,30 @@ +if not libxml.found() + subdir_done() +endif + +xml2 = shared_module('pgxml', + files( + 'xpath.c', + 'xslt_proc.c', + ), + c_pch: '../../src/include/pch/postgres_pch.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, +) + +regress_tests += { + 'name': 'xml2', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'xml2', + ], +} diff --git a/conversion_helpers.txt b/conversion_helpers.txt new file mode 100644 index 00000000000..e5879b4fe77 --- /dev/null +++ b/conversion_helpers.txt @@ -0,0 +1,6 @@ +convert list of files to quoted-one-per-line: + + ?\b\(\(?:\w\|\d\|_\|-\)+\)\.o ?\(?:\\ +\)? → '\1.c', + + diff --git a/meson.build b/meson.build new file mode 100644 index 00000000000..c9d123bdac3 --- /dev/null +++ b/meson.build @@ -0,0 +1,1901 @@ +project('postgresql', + ['c'], + version: '15devel', + license: 'PostgreSQL', + meson_version: '>=0.54', + default_options: [ + 'warning_level=2', + 'b_pie=true', + 'b_pch=false', + 'buildtype=release', + ] +) + + + +############################################################### +# Basic prep +############################################################### + +fs = import('fs') + +thread_dep = dependency('threads') + + + +############################################################### +# 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') +elif pg_version.contains('rc') + pg_version_arr = pg_version.split('rc') +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() + +cc = meson.get_compiler('c') + +cdata = configuration_data() + + +cdata.set_quoted('PACKAGE_NAME', 'PostgreSQL') +cdata.set_quoted('PACKAGE_BUGREPORT', 'pgsql-bugs@lists.postgresql.org') +cdata.set_quoted('PACKAGE_URL', 'https://www.postgresql.org/') + +cdata.set_quoted('PG_VERSION', pg_version) +cdata.set_quoted('PG_VERSION_STR', 'PostgreSQL @0@ on @1@, compiled by @2@-@3@'.format( + pg_version, target_machine.cpu_family(), 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_VERSION_NUM', (pg_version_major*10000)+pg_version_minor) +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_inc = [] +g_c_args = [] +g_l_args = [] + +if host_machine.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_machine.system() == 'linux' or host_machine.system() == 'cygwin' + g_c_args += '-D_GNU_SOURCE' +endif + +g_c_inc = [] + +g_c_inc += include_directories(get_option('extra_include_dirs')) +g_c_lib = get_option('extra_lib_dirs') + +add_project_arguments(g_c_args, language: ['c', 'cpp']) +add_project_link_arguments(g_l_args, language: ['c', 'cpp']) + + + +############################################################### +# Program paths +############################################################### + +# External programs +perl = find_program(get_option('PERL'), required: 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')) +tar = find_program(get_option('TAR'), native: true) +gzip = find_program(get_option('GZIP'), native: true) +touch = find_program('touch', native: true) + +# Internal programs +find_meson = find_program('src/tools/find_meson', native: true) +testwrap = find_program('src/tools/testwrap', native: true) + +bisonflags = [] +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') + bisonflags += ['-Wno-deprecated'] + endif +endif + + + +############################################################### +# Path to meson (for tests etc) +############################################################### + +# FIXME: this should really be part of meson, see +# https://github.com/mesonbuild/meson/issues/8511 +meson_binpath_r = run_command(find_meson) + +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_binpath = '' +meson_args = [] +foreach e : meson_binpath_s + if i == 0 + meson_binpath = e + else + meson_args += e + endif + i += 1 +endforeach + +meson_bin = find_program(meson_binpath, native: true) + + + +############################################################### +# Option Handling +############################################################### + +cdata.set('USE_ASSERT_CHECKING', get_option('cassert')) + +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', 8192) +cdata.set('RELSEG_SIZE', 131072) +cdata.set('DEF_PGPORT', 5432) +cdata.set_quoted('DEF_PGPORT_STR', '5432') +cdata.set_quoted('PG_KRB_SRVNAM', 'postgres') + + + +############################################################### +# Library: GSSAPI +############################################################### + +gssapiopt = get_option('gssapi') +if not gssapiopt.disabled() + gssapi = dependency('krb5-gssapi', required: gssapiopt) + + if gssapi.found() and \ + cc.check_header('gssapi/gssapi.h', args: g_c_args, dependencies: gssapi, required: gssapiopt) + + if not cc.has_function('gss_init_sec_context', args: g_c_args, dependencies: gssapi) + error('''could not find function 'gss_init_sec_context' required for GSSAPI''') + endif + cdata.set('ENABLE_GSS', 1) + endif + +else + gssapi = dependency('', required : false) +endif + + + +############################################################### +# Library: ldap +############################################################### + +ldapopt = get_option('ldap') +if not ldapopt.disabled() + + if host_machine.system() == 'windows' + ldap = cc.find_library('wldap32') + ldap_r = ldap + else + ldap = dependency('ldap', 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) + ldap_r = cc.find_library('ldap_r', required: ldapopt) + + # 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 + endif + + if ldap.found() + cdata.set('USE_LDAP', 1) + endif + +else + ldap_r = ldap = dependency('', required : false) +endif + + + +############################################################### +# Library: LLVM +############################################################### + +llvmopt = get_option('llvm') +if not llvmopt.disabled() + llvm = dependency('llvm', version : '>=3.9', method: 'config-tool', required: llvmopt) + + if llvm.found() + + cdata.set('USE_LLVM', 1) + + add_languages('cpp', required : true, native: false) + cpp = meson.get_compiler('cpp') + + llvm_binpath = llvm.get_variable(configtool: 'bindir') + + ccache = find_program('ccache', 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', + ] + + 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, + '@SOURCE_ROOT@', + '@BUILD_ROOT@', + llvm_lto, + '-o', '@OUTPUT0@', + '@PRIVATE_DIR@', + '@INPUT@', + ], + 'install': true, + 'install_dir': get_option('libdir'), + } + + 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: Perl (for plperl) +############################################################### + +perlopt = get_option('perl') +perl_dep = dependency('', required: false) + +if perlopt.disabled() + perl_may_work = false +else + perl_may_work = true + + perl_conf_cmd = [perl, '-MConfig', '-e', 'print $Config{$ARGV[0]}'] + + # FIXME: include copy-edited comments from perl.m4 + + 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 = include_directories('@0@/CORE'.format(archlibexp)) + + perl_ccflags = [] + + if useshrplib != 'true' + if perlopt.enabled() + warning('need a shared perl') + perl_may_work = false + else + error('need a shared perl') + endif + endif + + message('perl libperl: @0@'.format(libperl)) + + if host_machine.system() == 'darwin' + perl_ccflags += ['-iwithsysroot', '@0@/CORE'.format(archlibexp)] + endif + + # FIXME macOS may need sysroot muckery + + # XXX: On my system the cc.find_library() is actually enough to get a working + # plperl. Would be nice to get rid of the nasty stuff below. + if perl_may_work and \ + cc.has_header('perl.h', args: g_c_args + perl_ccflags, + include_directories: perl_inc, required: perlopt) + 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 + endif + else + perl_may_work = false + 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_machine.system() == 'windows' + perl_ccflags += ['-DPLPERL_HAVE_UID_GID'] + endif + + message('CCFLAGS for embedding perl: @0@'.format(' '.join(perl_ccflags))) + + # perl.m4 sayeth: + # + # We are after Embed's ldopts, but without the subset mentioned in + # Config's ccdlflags; + # + # FIXME: andres sayeth: But why? + + ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip() + ccdlflags = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().strip() + + ccdlflags_dict = {} + + foreach ccdlflag : ccdlflags.split(' ') + ccdlflags_dict += {ccdlflag: 1} + endforeach + + perl_ldopts = [] + foreach ldopt : ldopts.split(' ') + if ldopt == '' + continue + elif ccdlflags_dict.has_key(ldopt) + continue + # strawberry perl unhelpfully has that in ldopts + elif ldopt == '-s' + continue + endif + + perl_ldopts += ldopt.strip('"') + endforeach + + # FIXME: check if windows handling is necessary + + message('LDFLAGS for embedding perl: "@0@" (ccdlflags: "@1@", ldopts: "@2@")'.format( + ' '.join(perl_ldopts), ccdlflags, ldopts)) + + if perl_dep_int.found() + perl_dep = declare_dependency( + include_directories: perl_inc, + compile_args: perl_ccflags, + link_args: perl_ldopts, + version: perlversion, + ) + endif + endif # perl_may_work + + if perlopt.enabled() and not perl_may_work + error('could not find working perl') + endif +endif + + + +############################################################### +# Library: Python (for plpython) +############################################################### + +pyopt = get_option('python') +if not pyopt.disabled() + pm = import('python') + python3_inst = pm.find_installation(required: pyopt.enabled()) + python3 = python3_inst.dependency(embed: true, required: pyopt.enabled()) +else + python3 = dependency('', required: false) +endif + + + +############################################################### +# Library: Readline +# +# FIXME: editline support +############################################################### + +if not get_option('readline').disabled() + readline = dependency('readline', required: false) + if not readline.found() + readline = cc.find_library('readline', + required: get_option('readline').enabled()) + endif + + if readline.found() + cdata.set('HAVE_LIBREADLINE', 1) + + if cc.has_header('readline/history.h', args: g_c_args, dependencies: [readline], required: false) + history_h = 'readline/history.h' + cdata.set('HAVE_READLINE_HISTORY_H', 1) + cdata.set('HAVE_READLINE_H', false) + elif cc.has_header('history.h', args: g_c_args, dependencies: [readline], required: false) + history_h = 'history.h' + cdata.set('HAVE_READLINE_HISTORY_H', false) + cdata.set('HAVE_HISTORY_H', 1) + else + error('''readline header not found +If you have readline 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.''') + endif + + if cc.has_header('readline/readline.h', args: g_c_args, dependencies: [readline], required: false) + readline_h = 'readline/readline.h' + cdata.set('HAVE_READLINE_READLINE_H', 1) + elif cc.has_header('readline.h', args: g_c_args, dependencies: [readline], required: false) + readline_h = 'readline.h' + cdata.set('HAVE_READLINE_H', 1) + else + error('''readline header not found +If you have readline 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.''') + endif + + check_funcs = [ + 'rl_completion_matches', + 'rl_filename_completion_function', + 'rl_reset_screen_size', + 'append_history', + 'history_truncate_file', + ] + + 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_append_character', + '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, dependencies: [readline]) ? 1 : false) + endforeach + endif +else + readline = dependency('', required : false) +endif + + + +############################################################### +# Library: SSL +############################################################### + +if get_option('ssl') == 'openssl' + + # Try to find openssl via pkg-config et al, if that doesn't work, 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 + + cdata.set_quoted('WITH_SSL', get_option('ssl')) + + 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) + if not val and c.get(1, {}).get('required', false) + error('openssl function @0@ is required'.format(func)) + endif + cdata.set('HAVE_'+func.to_upper(), val ? 1 : false) + endforeach + + cdata.set('USE_OPENSSL', 1, + description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)') + + cdata.set('OPENSSL_API_COMPAT', 0x10001000, + description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.') +else + ssl = 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, 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 ') + 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 + + + +############################################################### +# Compiler tests +############################################################### + +sizeof_long = cc.sizeof('long', args: g_c_args) +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') +elif + error('do not know how to get a 64bit int') +endif + + +cdata.set('MAXIMUM_ALIGNOF', 8) +cdata.set('ALIGNOF_SHORT', cc.alignment('short', args: g_c_args)) +cdata.set('ALIGNOF_INT', cc.alignment('int', args: g_c_args)) +cdata.set('ALIGNOF_LONG', cc.alignment('long', args: g_c_args)) +cdata.set('ALIGNOF_DOUBLE', cc.alignment('double', args: g_c_args)) +cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: g_c_args)) + +# 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 + + +# XXX: for now just assume that compiler knows __func__ - it's C99 after all. +cdata.set('HAVE_FUNCNAME__FUNC', 1) + +# 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 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 ', args: g_c_args) \ + and cc.sizeof('bool', prefix: '#include ', args: g_c_args) == 1 + cdata.set('HAVE__BOOL', 1) + cdata.set('PG_USE_STDBOOL', 1) +endif + + +printf_attributes = ['gnu_printf', '__syslog__', 'printf'] +testsrc = 'extern void pgac_write(int ignore, const char *fmt,...) __attribute__((format(@0@, 2,3)));' +foreach a : printf_attributes + if cc.compiles(testsrc.format(a), args: g_c_args + ['-Werror'], 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 + + +if cc.has_function('__builtin_unreachable', args: g_c_args) + cdata.set('HAVE__BUILTIN_UNREACHABLE', 1) +endif + +if cc.has_function('__builtin_constant_p', args: g_c_args) + cdata.set('HAVE__BUILTIN_CONSTANT_P', 1) + + if host_machine.cpu_family() == 'ppc' or host_machine.cpu_family() == 'ppc64' + # Check if compiler accepts "i"(x) when __builtin_constant_p(x). + 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 + + + +# 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 + 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 + 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' +] + +add_project_arguments(cc.get_supported_arguments(common_functional_flags), language: 'c') + +vectorize_cflags = cc.get_supported_arguments(['-ftree-vectorize']) +unroll_loops_cflags = cc.get_supported_arguments(['-funroll-loops']) + + +common_warning_flags = [ + '-Wmissing-prototypes', + '-Wpointer-arith', + '-Werror=vla', + '-Wendif-labels', + '-Wmissing-format-attribute', + '-Wimplicit-fallthrough=3', + '-Wcast-function-type', + '-Wformat-security', +] + +add_project_arguments(cc.get_supported_arguments(common_warning_flags), language: 'c') + +if llvm.found() + add_project_arguments(cpp.get_supported_arguments(common_warning_flags), language: 'cpp') +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') + add_project_arguments('-Wdeclaration-after-statement', language: 'c') + using_declaration_after_statement_warning = true +else + using_declaration_after_statement_warning = false +endif + + +# We want to suppress a few unhelpful warnings - 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 = [ + 'unused-command-line-argument', + '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) + add_project_arguments('-Wno-'+w, language: 'c') + endif + + if llvm.found() and cpp.has_argument('-W'+w) + add_project_arguments('-Wno-'+w, language: 'cpp') + endif +endforeach + + +# From Project.pm +if cc.get_id() == 'msvc' + add_project_arguments('/wd4018', '/wd4244', '/wd4273', '/wd4102', '/wd4090', '/wd4267', + language: 'c') + add_project_arguments('/DWIN32', '/DWINDOWS', '/D__WINDOWS__', '/D__WIN32__', + '/DWIN32_STACK_RLIMIT=4194304', '/D_CRT_SECURE_NO_DEPRECATE', '/D_CRT_NONSTDC_NO_DEPRECATE', + language: 'c') +endif + + +############################################################### +# Atomics +############################################################### + +cdata.set('HAVE_SPINLOCKS', 1) + +if get_option('atomics') + 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);'''}, + +# FIXME: int64 reference + {'name': 'HAVE_GCC__SYNC_INT64_CAS', + 'desc': '__sync_val_compare_and_swap(int64)', + 'test': ''' +long 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);'''}, + +# FIXME: int64 reference + {'name': 'HAVE_GCC__ATOMIC_INT64_CAS', + 'desc': ' __atomic_compare_exchange_n(int64)', + 'test': ''' +long val = 0; +int 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)) + endforeach + +endif + + + +############################################################### +# Library / OS tests +############################################################### + +header_checks = [ + ['atomic.h'], + ['stdbool.h'], + ['copyfile.h'], + ['execinfo.h'], + ['getopt.h'], + ['ifaddrs.h'], + ['langinfo.h'], + ['mbarrier.h'], + ['poll.h'], + ['sys/epoll.h'], + ['sys/event.h'], + ['sys/ipc.h'], + ['sys/prctl.h'], + ['sys/procctl.h'], + ['sys/pstat.h'], + ['sys/resource.h'], + ['sys/select.h'], + ['sys/sem.h'], + ['sys/shm.h'], + ['sys/sockio.h'], + ['sys/tas.h'], + ['sys/uio.h'], + ['sys/un.h'], + ['termios.h'], + ['ucred.h'], + # FIXME: openbsd workaround + ['sys/ucred.h'], + ['wctype.h'], + ['netinet/tcp.h'], + ['net/if.h'], + ['crtdefs.h'], +] + +foreach c : header_checks + varname = 'HAVE_'+c.get(0).underscorify().to_upper() + + # Emulate autoconf behaviour of not-found->undef, found->1 + found = cc.has_header(c.get(0), include_directories: g_inc, args: g_c_args) + cdata.set(varname, found ? 1 : false, + description: 'Define to 1 if you have the <@0@> header file.'.format(c)) +endforeach + + + +decl_checks = [ + ['F_FULLFSYNC', 'fcntl.h'], + ['RTLD_GLOBAL', 'dlfcn.h'], + ['RTLD_NOW', 'dlfcn.h'], + ['fdatasync', 'unistd.h'], + ['posix_fadvise', 'fcntl.h'], + ['sigwait', 'signal.h'], + ['strlcat', 'string.h'], + ['strlcpy', 'string.h'], + ['strnlen', 'string.h'], + ['strsignal', 'string.h'], + ['strtoll', 'stdlib.h'], ['strtoull', 'stdlib.h'], # strto[u]ll may exist but not be declared +] + +# 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 + varname = 'HAVE_DECL_'+c.get(0).underscorify().to_upper() + + found = cc.has_header_symbol(c.get(1), c.get(0), args: g_c_args, kwargs: c.get(2, {})) + cdata.set10(varname, found, description: +'''Define to 1 if you have the declaration of `@0@\', and to 0 if you + don't.'''.format(c)) +endforeach + + + +# XXX: this is borked, HAVE_SYS_UCRED_H not defined +if cc.has_type('struct cmsgcred', + include_directories: g_inc, + args: g_c_args + ['@0@'.format(cdata.get('HAVE_SYS_UCRED_H')) == 'false' ? '-DHAVE_SYS_UCRED_H' : ''], + prefix: ''' +#include +#include +#ifdef HAVE_SYS_UCRED_H +#include +#endif''') + cdata.set('HAVE_STRUCT_CMSGCRED', 1) +else + cdata.set('HAVE_STRUCT_CMSGCRED', false) +endif + +if cc.has_function('getopt', args: g_c_args) and \ + cc.has_function('getopt_long', args: g_c_args) and \ + cc.has_type('struct option', args: g_c_args, prefix: '#include ') + cdata.set('HAVE_GETOPT', 1) + cdata.set('HAVE_GETOPT_LONG', 1) + cdata.set('HAVE_STRUCT_OPTION', 1) +else + warning('not yet implemented') +endif + + +foreach c : ['opterr', 'optreset'] + varname = 'HAVE_INT_'+c.underscorify().to_upper() + + if cc.links(''' +#include +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('struct sockaddr_storage', args: g_c_args, prefix: ''' +#include +#include ''') + cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1) +endif + +if cc.has_member('struct sockaddr_storage', 'ss_family', args: g_c_args, + prefix: '''#include +#include ''') + cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1) +endif + +if cc.has_member('struct sockaddr_storage', '__ss_family', args: g_c_args, + prefix: ''' +#include +#include ''') + cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY', 1) +endif + +if cc.has_type('struct sockaddr_un', args: g_c_args, prefix: ''' +#include +#include ''') + cdata.set('HAVE_STRUCT_SOCKADDR_UN', 1) +endif + +if cc.has_type('struct addrinfo', args: g_c_args, prefix: ''' +#include +#include +#include +''') + cdata.set('HAVE_STRUCT_ADDRINFO', 1) +endif + +if host_machine.system() == 'windows' + cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE', 1) + cdata.set('HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY', 1) +endif + +if cc.has_type('struct sockaddr_in6', args: g_c_args, prefix: ''' +#include ''') + cdata.set('HAVE_IPV6', 1) +endif + + +if cc.has_member('struct tm', 'tm_zone', args: g_c_args, prefix: ''' +#include +#include +''') + cdata.set('HAVE_STRUCT_TM_TM_ZONE', 1) +endif + +if cc.compiles(''' +#include +extern int foo(void); +int foo(void) +{ + return timezone / 60; +} +''', name: 'Check if the global variable `timezone\' exists', args: g_c_args,) + cdata.set('HAVE_INT_TIMEZONE', 1) +else + cdata.set('HAVE_INT_TIMEZONE', false) +endif + +# FIXME: sys/ipc.h, sys/sem.h includes were conditional +if cc.has_type('union semun', args: g_c_args, prefix: ''' +#include +#include +#include +''') + cdata.set('HAVE_UNION_SEMUN', 1) +endif + +if cc.compiles(''' +#include +int main(void) +{ + char buf[100]; + switch (strerror_r(1, buf, sizeof(buf))) + { case 0: break; default: break; } +}''', args: g_c_args) + cdata.set('STRERROR_R_INT', 1) +else + cdata.set('STRERROR_R_INT', false) +endif + +# FIXME +cdata.set('pg_restrict', '__restrict') + +# FIXME +if host_machine.system() == 'windows' + cdata.set('ACCEPT_TYPE_ARG1', 'unsigned int') + cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr *') + cdata.set('ACCEPT_TYPE_ARG3', 'int') + cdata.set('ACCEPT_TYPE_RETURN', 'unsigned int PASCAL') +else + cdata.set('ACCEPT_TYPE_ARG1', 'int') + cdata.set('ACCEPT_TYPE_ARG2', 'struct sockaddr') + cdata.set('ACCEPT_TYPE_ARG3', 'socklen_t') + cdata.set('ACCEPT_TYPE_RETURN', 'int') +endif + +cdata.set('HAVE_STRUCT_ADDRINFO', 1) + + +cdata.set('MEMSET_LOOP_LIMIT', 1024) + + +if cc.links(''' +#include +#include + +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 + + +# FIXME: this clearly needs to be cleaned up. +if cc.get_id() != 'msvc' + # FIXME: Need to actually test + add_project_arguments('-msse4.2', language: 'c') + cdata.set('USE_SSE42_CRC32C', false) + cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1) +else + cdata.set('USE_SSE42_CRC32C', false) + cdata.set('USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 1) +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) + +func_checks = [ + ['_configthreadlocale'], + ['backtrace_symbols', {'dependencies': [execinfo_dep]}], + ['clock_gettime', {'dependencies': [rt_dep, posix4_dep]}], + ['copyfile'], + ['dlopen', {'dependencies': [dl_dep]}], + ['explicit_bzero'], + ['fdatasync', {'dependencies': [rt_dep, posix4_dep]}], + ['fls'], + ['getaddrinfo'], + ['gethostbyname_r', {'dependencies': [thread_dep]}], + ['getifaddrs'], + ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep]}], + ['getopt_long',{'dependencies': [getopt_dep, gnugetopt_dep]}], + ['getpeereid'], + ['getpeerucred'], + ['getpwuid_r', {'dependencies': [thread_dep]}], + ['getrlimit'], + ['getrusage'], + ['gettimeofday'], # XXX: This seems to be in the autoconf case + ['inet_aton'], + ['kqueue'], + ['link'], + ['mbstowcs_l'], + ['memset_s'], + ['mkdtemp'], + ['poll'], + ['posix_fadvise'], + ['posix_fallocate'], + ['ppoll'], + ['pread'], + ['pstat'], + ['pthread_is_threaded_np'], + ['pwrite'], + ['random'], + ['readlink'], + ['readv'], + ['setenv'], # FIXME: windows handling + ['setproctitle', {'dependencies': [util_dep]}], + ['setproctitle_fast'], + ['setsid'], + ['shm_open', {'dependencies': [rt_dep]}], + ['shm_unlink', {'dependencies': [rt_dep]}], + ['srandom'], + ['strchrnul'], + ['strerror_r', {'dependencies': [thread_dep]}], + ['strlcat'], + ['strlcpy'], + ['strnlen'], + ['strsignal'], + ['strtof'], # strsignal is checked separately + ['strtoll'], ['__strtoll'], ['strtoq'], + ['strtoull'], ['__strtoull'], ['strtouq'], + ['symlink'], + ['sync_file_range'], + ['syncfs'], + ['unsetenv'], + ['uselocale'], + ['wcstombs_l'], + ['writev'], +] + +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, + kwargs: kwargs + {'dependencies': []}) + + if not found + foreach dep : deps + if not dep.found() + continue + endif + found = cc.has_function(func, args: g_c_args, + kwargs: kwargs + {'dependencies': [dep]}) + if found + os_deps += dep + break + endif + endforeach + endif + + # 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(c)) +endforeach + + + + + +if host_machine.system() == 'linux' or host_machine.system() == 'freebsd' + dlsuffix = '.so' +elif host_machine.system() == 'darwin' + dlsuffix = '.dylib' +elif host_machine.system() == 'windows' + dlsuffix = '.dll' +else + error('not yet') +endif + +cdata.set_quoted('DLSUFFIX', dlsuffix) + +if host_machine.system() == 'windows' + cdata.set('USE_WIN32_SEMAPHORES', 1) + cdata.set('USE_WIN32_SHARED_MEMORY', 1) +elif host_machine.system() == 'darwin' + cdata.set('USE_SYSV_SEMAPHORES', 1) + cdata.set('USE_SYSV_SHARED_MEMORY', 1) +else + cdata.set('USE_UNNAMED_POSIX_SEMAPHORES', 1) + cdata.set('USE_SYSV_SHARED_MEMORY', 1) +endif + + +if host_machine.system() == 'windows' + cdata.set('HAVE_IPV6', 1) + cdata.set('HAVE_SYMLINK', 1) + cdata.set('WIN32_STACK_RLIMIT', 4194304) + cdata.set('HAVE__CONFIGTHREADLOCALE', 1) +endif + +if cc.get_id() == 'msvc' + add_project_link_arguments( + '/fixed:no', + '/dynamicbase', + '/nxcompat', + language : ['c', 'cpp'], + ) +endif + +if host_machine.system() == 'windows' + os_deps += cc.find_library('ws2_32', required: true) +endif + + +############################################################### +# Threading +############################################################### + +# Probably not worth implementing other cases anymore +cdata.set('ENABLE_THREAD_SAFETY', 1) + +if thread_dep.found() + if cc.has_function('pthread_is_threaded_np', args: g_c_args, dependencies: [thread_dep]) + cdata.set('HAVE_PTHREAD_IS_THREADED_NP', 1) + endif + if cc.has_function('pthread_barrier_wait', args: g_c_args, dependencies: [thread_dep]) + cdata.set('HAVE_PTHREAD_BARRIER_WAIT', 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 = [] + + +# List of tap tests we later generate test() invocations for. The main +# reason for doing it that way instead of having test() invocations +# everywhere is that they end up being too large. A second benefit is +# that it'd make it easier to generate data for another runner. +tap_tests = [] +isolation_tests = [] +regress_tests = [] + + +# Default options for targets + +default_target_args = { + 'implicit_include_directories': false, + 'install': true, +} + +default_lib_args = default_target_args + { + 'name_prefix': 'lib', +} + +internal_lib_args = default_lib_args + { + 'build_by_default': false, + 'install': false, +} + +default_mod_args = default_lib_args + { + 'name_prefix': '', +} + +default_bin_args = default_target_args + { +} + + +# 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. + +generated_headers = [] +generated_backend_headers = [] + +postgres_inc = [include_directories('src/include')] + +if host_machine.system() == 'windows' + postgres_inc += include_directories('src/include/port/win32') + + if cc.get_id() == 'msvc' + postgres_inc += include_directories('src/include/port/win32_msvc') + endif +endif + +subdir('src/include') + + +# 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, +) + +subdir('src/interfaces/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, +) + +backend_code = declare_dependency( + compile_args: ['-DBUILDING_DLL'], + include_directories: [postgres_inc], + link_with: [], + sources: generated_headers + generated_backend_headers, + dependencies: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml], +) + +# 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: [os_deps, ssl, lz4, icu, icu_i18n, ldap, gssapi, libxml], +) + +# 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') + + +############################################################### +# 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_machine.system() == 'windows' + 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 + + +test('tmp_install', + meson_bin, args: meson_args + ['install', '--quiet', '--only-changed', '--no-rebuild'], + 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() + +if host_machine.system() == 'darwin' + library_path_var = 'DYLD_LIBRARY_PATH' +elif host_machine.system() == 'aix' + library_path_var = 'LIBPATH' +else + library_path_var = 'LD_LIBRARY_PATH' +endif + +test_env.prepend('PATH', test_install_location / get_option('bindir')) +test_env.prepend(library_path_var, test_install_location / get_option('libdir')) +test_env.set('PG_REGRESS', meson.build_root() / 'src/test/regress/pg_regress') +test_env.set('REGRESS_SHLIB', regress_module.full_path()) + + +############################################################### +# Test Generation +############################################################### + +# Define all 'pg_regress' style tests +foreach t : regress_tests + test_command = [ + pg_regress, + '--temp-instance', test_result_dir / t['name'] / 'pg_regress' / 'tmp_check', + '--inputdir', 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'],] + else + test_command += t['sql'] + endif + + test_kwargs = { + 'suite': ['pg_regress', t['name']], + 'priority': 10, + 'timeout': 300, + 'depends': test_deps + t.get('deps', []), + 'env': test_env, + 'workdir': t['sd'], + 'args': [ + meson.build_root(), + t['bd'], + t['name'], + 'pg_regress', + test_command, + ] + } + + # Allow test definition to override arguments + if t.has_key('test_kwargs') + test_kwargs += t['test_kwargs'] + endif + + test(t['name'] / 'pg_regress', + testwrap, + kwargs: test_kwargs, + ) + + testport = testport + 1 +endforeach + + +# Define all 'isolationtester' style tests +foreach t : isolation_tests + test_command = [ + pg_isolation_regress, + '--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 + + test_kwargs = { + 'suite': ['isolation', t['name']], + 'priority': 20, + 'timeout': 300, + 'depends': test_deps + t.get('deps', []), + 'workdir': t['sd'], + 'env': test_env, + 'args': [ + meson.build_root(), + t['bd'], + t['name'], + 'isolation', + test_command, + ] + } + + # Allow test definition to override arguments + if t.has_key('test_kwargs') + test_kwargs += t['test_kwargs'] + endif + + test(t['name'] / 'isolation', + testwrap, + kwargs: test_kwargs, + ) + + testport = testport + 1 +endforeach + + +# Define all 'tap' style tests +# FIXME: dependencies for each test +foreach t : tap_tests + env = test_env + + foreach name, value : t.get('env', {}) + if name == 'PATH' + # FIXME: manually setting PATH again, because repeated prepend didn't work + # before meson 0.58. + env.prepend('PATH', value, test_install_location / get_option('bindir')) + else + env.set(name, value) + endif + endforeach + + foreach onetap : t['tests'] + test(t['name'] / onetap, + testwrap, + workdir: t['sd'], + args: [ + meson.build_root(), + t['bd'], + t['name'], + onetap, + 'perl', + '-I', meson.source_root() / 'src/test/perl', + '-I', t['sd'], + t['sd'] / onetap + ], + protocol: 'tap', + suite: ['tap', t['name']], + env: env, + depends: test_deps + t.get('deps', []), + timeout: 300, + ) + endforeach +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') + }, section: 'Data Layout' + ) + + summary( + { + 'host system' : '@0@ @1@'.format(host_machine.system(), host_machine.cpu_family()), + 'build system' : '@0@ @1@'.format(build_machine.system(), build_machine.cpu_family()), + }, + section: 'System' + ) + + summary( + { + 'linker': '@0@'.format(cc.get_linker_id()), + 'C compiler': '@0@ @1@'.format(cc.get_id(), cc.version()), + }, + section: 'Compiler' + ) + + if llvm.found() + summary( + { + 'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version()) + }, + section: 'Compiler') + endif + + summary( + { + 'bison' : '@0@ @1@'.format(bison.full_path(), bison_version), + }, + section: 'Programs' + ) + + summary( + { + 'GSS': gssapi, + 'LDAP': ldap, + 'LLVM': llvm, + 'icu': icu, + 'libxml': libxml, + 'libxslt': libxslt, + 'lz4': lz4, + 'perl': perl_dep, + 'python3': python3, + 'readline': readline, + 'ssl': ssl, + 'zlib': zlib, + }, + section: 'External Libraries' + ) + +endif diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 00000000000..d4c7f717ff8 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,81 @@ +# Data layout influencing options +option('BLCKSZ', type : 'combo', choices : ['1', '2', '4', '8', '16', '32'], value : '8', + description: 'set table block size in kB') + + +# You get it +option('cassert', type : 'boolean', value: false, + description: 'enable assertion checks (for debugging)') + +option('atomics', type : 'boolean', value: true, + description: 'whether to use atomic operations') + + +# Compilation options + +option('extra_include_dirs', type : 'array', + description: 'non-default directories to be searched for headers') +option('extra_lib_dirs', type : 'array', + description: 'non-default directories to be searched for libs') + + +# External dependencies + +option('gssapi', type : 'feature', value: 'auto', + description: 'GSSAPI support') + +option('ldap', type : 'feature', value: 'auto', + description: 'LDAP support') + +option('llvm', type : 'feature', value: 'disabled', + description: 'whether to use llvm') + +option('icu', type : 'feature', value: 'auto', + description: 'ICU support') + +option('libxml', type : 'feature', value: 'auto', + description: 'XML support') + +option('libxslt', type : 'feature', value: 'auto', + description: 'XSLT support in contrib/xml2') + +option('lz4', type : 'feature', value: 'auto', + description: 'LZ4 support') + +option('perl', type : 'feature', value: 'auto', + description: 'build Perl modules (PL/Perl)') + +option('python', type : 'feature', value: 'auto', + description: 'build Python modules (PL/Python)') + +option('readline', type : 'feature', value : 'auto', + description: 'use GNU Readline or BSD Libedit for editing') + +option('ssl', type : 'combo', choices : ['none', 'openssl'], value : 'none', + description: 'use LIB for SSL/TLS support (openssl)') + +option('zlib', type : 'feature', value: 'auto', + description: 'whether to use zlib') + + +# Programs +option('BISON', type : 'string', value: 'bison', + description: 'path to bison binary') + +option('FLEX', type : 'string', value: 'flex', + description: 'path to flex binary') + +option('GZIP', type : 'string', value: 'gzip', + description: 'path to gzip binary') + +option('PERL', type : 'string', value: 'perl', + description: 'path to perl binary') + +option('PROVE', type : 'string', value: 'prove', + description: 'path to prove binary') + +option('SED', type : 'string', value: 'gsed', + description: 'path to sed binary') + +option('TAR', type : 'string', value: 'tar', + description: 'path to tar binary') 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..fe3703e0f21 --- /dev/null +++ b/src/backend/access/transam/meson.build @@ -0,0 +1,28 @@ +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', + 'xlogutils.c', +) + +# used by frontend programs to built a frontend xlogreader +xlogreader_sources = files( + 'xlogreader.c', +) + +backend_sources += xlogreader_sources diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build new file mode 100644 index 00000000000..55c0be68cc4 --- /dev/null +++ b/src/backend/bootstrap/meson.build @@ -0,0 +1,12 @@ +backend_sources += files( + 'bootstrap.c') + +bootscanner = custom_target('bootscanner', + input: ['bootscanner.l'], + output: ['bootscanner.c'], + command: [flex, '-o', '@OUTPUT@', '@INPUT@']) + +generated_backend_sources += custom_target('bootparse', + input: ['bootparse.y', bootscanner[0]], + output: ['bootparse.c'], + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build new file mode 100644 index 00000000000..2cc23582e35 --- /dev/null +++ b/src/backend/catalog/meson.build @@ -0,0 +1,41 @@ +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_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_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: 'share/') diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build new file mode 100644 index 00000000000..8e73b29a263 --- /dev/null +++ b/src/backend/commands/meson.build @@ -0,0 +1,50 @@ +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', + '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..83a90770bca --- /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 is 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': get_option('libdir') + } + ) + 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..49867647155 --- /dev/null +++ b/src/backend/libpq/meson.build @@ -0,0 +1,28 @@ +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: 'share/') 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..b84f947bc7e --- /dev/null +++ b/src/backend/meson.build @@ -0,0 +1,191 @@ +backend_build_deps = [backend_code] +backend_deps = [dl_dep, thread_dep] +backend_sources = [] +backend_link_with = [pgport_srv, common_srv] +backend_c_args = [] + +generated_backend_sources = [] + +subdir('access') +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') + + +if host_machine.system() == 'windows' + backend_deps += cc.find_library('secur32', required: true) +endif + + +postgres_link_args = [] +postgres_link_depends = [] + +# 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). +# +# +# 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 +# +# +# XXX: This needs to be improved. +# + +# NB: There's an outer and inner layer of == windows checks, to allow to +# exercise most of this on !windows, by widening the outer "layer". + +if cc.get_id() == 'msvc' # or true + + postgres_lib = static_library('postgres_lib', + backend_sources + timezone_sources + generated_backend_sources, + link_whole: backend_link_with, + c_pch: '../include/pch/postgres_pch.h', + c_args: backend_c_args, + implicit_include_directories: false, + dependencies: backend_build_deps, + build_by_default: false, + install: false, + ) + + postgres_def = custom_target('postgres.def', + command: [perl, files('../tools/msvc/gendef2.pl'), 'x64', '@OUTPUT@', '@PRIVATE_DIR@', '@INPUT@'], + input: [postgres_lib, common_srv, pgport_srv], + output: 'postgres.def', + depends: [postgres_lib, common_srv, pgport_srv], + install: false, + ) + + if cc.get_id() == 'msvc' + postgres_link_args += '/DEF:@0@'.format(postgres_def.full_path()) + postgres_link_args += '/STACK:@0@'.format(cdata.get('WIN32_STACK_RLIMIT')) + postgres_link_depends += postgres_def + endif + + # Unfortunately the msvc linker whines when building an executable with just + # libraries, hence the reuse of the 'main' object directly. + + postgres = executable('postgres', + objects: [postgres_lib.extract_objects(main_file)], + link_with: [postgres_lib], + link_args: postgres_link_args, + link_depends: postgres_link_depends, + dependencies: backend_deps, + export_dynamic: true, + implib: true, + kwargs: default_bin_args, + ) + +else + + postgres = executable('postgres', + backend_sources + generated_backend_sources + timezone_sources, + c_pch: '../include/pch/postgres_pch.h', + c_args: backend_c_args, + link_with: backend_link_with, + export_dynamic: true, + dependencies: [backend_build_deps, backend_deps], + kwargs: default_bin_args, + ) + +endif + +backend_targets += postgres + +pg_mod_args = default_mod_args + { + 'dependencies': [backend_mod_code], + 'c_args': [], + 'cpp_args': [], + } + +if cdata.has('HAVE_VISIBILITY_ATTRIBUTE') + pg_mod_args = pg_mod_args + { + 'c_args': pg_mod_args['c_args'] + ['-fvisibility=hidden'], + 'cpp_args': pg_mod_args['c_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_machine.system() == 'windows' or host_machine.system() == 'darwin' + pg_mod_args = pg_mod_args + {'link_with': [postgres]} +endif +if host_machine.system() == 'darwin' + pg_mod_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') + + +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 + # + # generator and custom_'t accept CustomTargetIndex as '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 + g_c_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('postgres.index.bc', + kwargs: llvm_irlink_kw + { + 'input': bc_backend_sources, + 'output': ['bitcode'], + }, + ) + + 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..9fca83fba44 --- /dev/null +++ b/src/backend/nodes/meson.build @@ -0,0 +1,17 @@ +backend_sources += files( + 'bitmapset.c', + 'copyfuncs.c', + 'equalfuncs.c', + 'extensible.c', + 'list.c', + 'makefuncs.c', + 'nodeFuncs.c', + 'nodes.c', + 'outfuncs.c', + 'params.c', + 'print.c', + 'read.c', + 'readfuncs.c', + 'tidbitmap.c', + 'value.c', +) 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..491eacf20bb --- /dev/null +++ b/src/backend/parser/meson.build @@ -0,0 +1,43 @@ +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_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, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT0@']) +parser_sources += backend_scanner[0] + +parser_sources += backend_parser_header[0] +parser_sources += backend_parser_header[1] + +parser = static_library('parser', + parser_sources + generated_headers, + c_pch: '../../include/pch/c_pch.h', + dependencies: [backend_code], + kwargs: default_lib_args + {'install': false}, +) +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/port/meson.build b/src/backend/port/meson.build new file mode 100644 index 00000000000..f1bf7f6d929 --- /dev/null +++ b/src/backend/port/meson.build @@ -0,0 +1,28 @@ +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_machine.system() == 'windows' + subdir('win32') +endif 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..803405683e2 --- /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', + 'pgstat.c', + 'postmaster.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..d08e21cd6d6 --- /dev/null +++ b/src/backend/regex/meson.build @@ -0,0 +1,15 @@ +backend_sources += files( + 'regcomp.c', + 'regerror.c', + 'regexec.c', + 'regexport.c', + 'regfree.c', + 'regprefix.c' +) + +#FIXME +# mark inclusion dependencies between .c files explicitly +#regcomp.o: regcomp.c regc_lex.c regc_color.c regc_nfa.c regc_cvec.c \ +# regc_locale.c regc_pg_locale.c +# +#regexec.o: regexec.c rege_dfa.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..2573f166d79 --- /dev/null +++ b/src/backend/replication/meson.build @@ -0,0 +1,42 @@ +backend_sources += files( + 'backup_manifest.c', + 'basebackup.c', + '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, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@'] +) + +generated_backend_sources += custom_target('repl_gram', + input: 'repl_gram.y', + output: 'repl_gram.c', + depends: repl_scanner, + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) + + +syncrep_scanner = custom_target('syncrep_scanner', + input: 'syncrep_scanner.l', + output: 'syncrep_scanner.c', + command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@']) + +generated_backend_sources += custom_target('syncrep_gram', + input: 'syncrep_gram.y', + output: 'syncrep_gram.c', + depends: syncrep_scanner, + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) + + +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..b1e52e9a0c3 --- /dev/null +++ b/src/backend/snowball/meson.build @@ -0,0 +1,83 @@ +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: '../../include/pch/postgres_pch.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@', '--input', '@CURRENT_SOURCE_DIR@', '--output', '@OUTDIR@'], + install: true, + install_dir: get_option('datadir')) + +# FIXME: check whether the logic to select languages currently in Makefile is needed +install_subdir('stopwords', + install_dir: get_option('datadir') / '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..938e7f89894 --- /dev/null +++ b/src/backend/storage/lmgr/meson.build @@ -0,0 +1,18 @@ +backend_sources += files( + 'condition_variable.c', + 'deadlock.c', + 'lmgr.c', + 'lock.c', + 'lwlock.c', + 'predicate.c', + 'proc.c', + 's_lock.c', + 'spin.c', +) + +lwlocknames_backend = custom_target('lwlocknames', + input : files('lwlocknames.txt'), + output : ['lwlocknames.c', 'lwlocknames.h'], + command : [perl, files('generate-lwlocknames.pl'), '-o', '@OUTDIR@', '@INPUT@'] +) +generated_backend_sources += lwlocknames_backend[0] 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..460036b6d4c --- /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: get_option('datadir') / '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..cef26eb564b --- /dev/null +++ b/src/backend/utils/activity/meson.build @@ -0,0 +1,5 @@ +backend_sources += files( + 'backend_progress.c', + 'backend_status.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..086fde8ff09 --- /dev/null +++ b/src/backend/utils/adt/meson.build @@ -0,0 +1,118 @@ +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', + '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, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@']) + +# 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, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build new file mode 100644 index 00000000000..92972db52ad --- /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', + 'relfilenodemap.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..ff0ae388263 --- /dev/null +++ b/src/backend/utils/error/meson.build @@ -0,0 +1,4 @@ +backend_sources += files( + 'assert.c', + 'elog.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..afb1c0346ba --- /dev/null +++ b/src/backend/utils/meson.build @@ -0,0 +1,13 @@ +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..5274c8aa1ae --- /dev/null +++ b/src/backend/utils/misc/meson.build @@ -0,0 +1,28 @@ +backend_sources += files( + '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.c', +) + +# guc-file.c.h is compiled as part of guc.c +guc_scan = custom_target('guc_scan', + input: ['guc-file.l'], + output: ['guc-file.c.h'], + command: [flex, '-CF', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@']) + +generated_backend_sources += guc_scan + +backend_build_deps += declare_dependency(sources: [guc_scan], + include_directories: include_directories('.')) + +install_data('postgresql.conf.sample', install_dir: 'share/') 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/mmgr/proxy.c b/src/backend/utils/mmgr/proxy.c new file mode 100644 index 00000000000..6e68fa9a557 --- /dev/null +++ b/src/backend/utils/mmgr/proxy.c @@ -0,0 +1,217 @@ +#include "postgres.h" + +#include "utils/memdebug.h" +#include "utils/memutils.h" +#include "lib/ilist.h" + +typedef struct ProxyContext +{ + MemoryContextData header; /* Standard memory-context fields */ + MemoryContext alloc_parent; + dlist_head allocations; +} ProxyContext; + +typedef struct ProxyChunk +{ + dlist_node node; + void *context; +} ProxyChunk; + +static void *ProxyContextAlloc(MemoryContext context, Size size); +static void ProxyContextFree(MemoryContext context, void *pointer); +static void *ProxyContextRealloc(MemoryContext context, void *pointer, Size size); +static void ProxyContextReset(MemoryContext context); +static void ProxyContextDelete(MemoryContext context); +static Size ProxyContextGetChunkSpace(MemoryContext context, void *pointer); +static bool ProxyContextIsEmpty(MemoryContext context); +static void ProxyContextStats(MemoryContext context, + MemoryStatsPrintFunc printfunc, void *passthru, + MemoryContextCounters *totals); + +#ifdef MEMORY_CONTEXT_CHECKING +static void ProxyContextCheck(MemoryContext context); +#endif + +/* + * This is the virtual function table for ProxyContext contexts. + */ +static const MemoryContextMethods ProxyContextMethods = { + ProxyContextAlloc, + ProxyContextFree, + ProxyContextRealloc, + ProxyContextReset, + ProxyContextDelete, + ProxyContextGetChunkSpace, + ProxyContextIsEmpty, + ProxyContextStats +#ifdef MEMORY_CONTEXT_CHECKING + ,ProxyContextCheck +#endif +}; + +MemoryContext +ProxyContextCreate(MemoryContext parent, + const char *name) +{ + ProxyContext *proxy; + MemoryContext alloc_parent; + + proxy = (ProxyContext *) malloc(sizeof(ProxyContext)); + if (proxy == NULL) + { + MemoryContextStats(TopMemoryContext); + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"), + errdetail("Failed while creating memory context \"%s\".", + name))); + } + + /* find node we can actually allocate in */ + alloc_parent = parent; + while (alloc_parent != NULL && IsA(alloc_parent, ProxyContext)) + alloc_parent = alloc_parent->parent; + if (alloc_parent == NULL) + elog(ERROR, "can't proxy forever"); + proxy->alloc_parent = parent; + + dlist_init(&proxy->allocations); + + /* Finally, do the type-independent part of context creation */ + MemoryContextCreate((MemoryContext) proxy, + T_ProxyContext, + &ProxyContextMethods, + parent, + name); + + return (MemoryContext) proxy; +} + +static void * +ProxyContextAlloc(MemoryContext context, Size size) +{ + ProxyContext *proxy = castNode(ProxyContext, context); + ProxyChunk *chunk; + Size alloc_size; + + alloc_size = size + MAXALIGN(sizeof(ProxyChunk)); + + chunk = MemoryContextAlloc(proxy->alloc_parent, alloc_size); + + dlist_push_tail(&proxy->allocations, &chunk->node); + chunk->context = context; + + return (char *) chunk + MAXALIGN(sizeof(ProxyChunk)); +} + +static void +ProxyContextFree(MemoryContext context, void *pointer) +{ + ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk))); + + dlist_delete(&chunk->node); + + pfree(chunk); +} + +static void * +ProxyContextRealloc(MemoryContext context, void *pointer, Size size) +{ + ProxyContext *proxy = castNode(ProxyContext, context); + ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk))); + + dlist_delete(&chunk->node); + + chunk =repalloc ((char *) chunk, size + MAXALIGN(sizeof(ProxyChunk))); + + dlist_push_tail(&proxy->allocations, &chunk->node); + chunk->context = context; + + return (char *) chunk + MAXALIGN(sizeof(ProxyChunk)); +} + +static void +ProxyContextReset(MemoryContext context) +{ + ProxyContext *proxy = castNode(ProxyContext, context); + dlist_mutable_iter iter; + + dlist_foreach_modify(iter, &proxy->allocations) + { + ProxyChunk *ptr = dlist_container(ProxyChunk, node, iter.cur); + + dlist_delete(iter.cur); + pfree(ptr); + } +} + +static void +ProxyContextDelete(MemoryContext context) +{ + ProxyContextReset(context); + free(context); +} + +static Size +ProxyContextGetChunkSpace(MemoryContext context, void *pointer) +{ + ProxyChunk *chunk = (ProxyChunk *) ((char *) pointer - MAXALIGN(sizeof(ProxyChunk))); + + return GetMemoryChunkSpace(chunk); +} + +static bool +ProxyContextIsEmpty(MemoryContext context) +{ + ProxyContext *proxy = castNode(ProxyContext, context); + + return dlist_is_empty(&proxy->allocations); +} + +static void +ProxyContextStats(MemoryContext context, + MemoryStatsPrintFunc printfunc, void *passthru, + MemoryContextCounters *totals) +{ + ProxyContext *proxy = castNode(ProxyContext, context); + Size nblocks = 0; + Size freechunks = 0; + Size totalspace = 0; + Size freespace = 0; + Size chunks = 0; + dlist_iter iter; + + dlist_foreach(iter, &proxy->allocations) + { + ProxyChunk *chunk = dlist_container(ProxyChunk, node, iter.cur); + + totalspace += GetMemoryChunkSpace((void *) chunk); + chunks++; + } + + if (printfunc) + { + char stats_string[200]; + + snprintf(stats_string, sizeof(stats_string), + "%zu chunks proxied to parent, totaling %zu bytes", + chunks, totalspace); + printfunc(context, passthru, stats_string); + } + + if (totals) + { + totals->nblocks += nblocks; + totals->freechunks += freechunks; + totals->totalspace += totalspace; + totals->freespace += freespace; + } +} + +#ifdef MEMORY_CONTEXT_CHECKING +static void +ProxyContextCheck(MemoryContext context) +{ + /* FIXME */ +} +#endif 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..b626bdc9d96 --- /dev/null +++ b/src/backend/utils/sort/meson.build @@ -0,0 +1,7 @@ +backend_sources += files( + 'logtape.c', + 'sharedtuplestore.c', + 'sortsupport.c', + 'tuplesort.c', + 'tuplestore.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/bin/initdb/meson.build b/src/bin/initdb/meson.build new file mode 100644 index 00000000000..52f679e3116 --- /dev/null +++ b/src/bin/initdb/meson.build @@ -0,0 +1,24 @@ +initdb_sources = files( + 'findtimezone.c', + 'initdb.c' +) + +initdb_sources += timezone_localtime_source + +#fixme: reimplement libpq_pgport logic + +executable('initdb', + initdb_sources, + include_directories: [timezone_inc], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'initdb', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_initdb.pl' + ] +} diff --git a/src/bin/meson.build b/src/bin/meson.build new file mode 100644 index 00000000000..3718fd0759a --- /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') +#TODO 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..69eaef8f141 --- /dev/null +++ b/src/bin/pg_amcheck/meson.build @@ -0,0 +1,22 @@ +pg_amcheck_sources = files( + 'pg_amcheck.c' +) + +pg_amcheck = executable('pg_amcheck', + pg_amcheck_sources, + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_amcheck', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl', + 't/002_nonesuch.pl', + 't/003_check.pl', + 't/004_verify_heapam.pl', + 't/005_opclass_damage.pl', + ] +} diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build new file mode 100644 index 00000000000..27742fafab7 --- /dev/null +++ b/src/bin/pg_archivecleanup/meson.build @@ -0,0 +1,14 @@ +pg_archivecleanup = executable('pg_archivecleanup', + ['pg_archivecleanup.c'], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_archivecleanup', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/010_pg_archivecleanup.pl' + ] +} diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build new file mode 100644 index 00000000000..a629b8b02f5 --- /dev/null +++ b/src/bin/pg_basebackup/meson.build @@ -0,0 +1,44 @@ +common_sources = files( + 'receivelog.c', + 'streamutil.c', + 'walmethods.c', +) + +pg_basebackup_common = static_library('pg_basebackup_common', + common_sources, + dependencies: [frontend_code, libpq, zlib], + kwargs: internal_lib_args, +) + +executable('pg_basebackup', + 'pg_basebackup.c', + link_with: [pg_basebackup_common], + dependencies: [frontend_code, libpq, zlib], + kwargs: default_bin_args, +) + +executable('pg_receivewal', + 'pg_receivewal.c', + link_with: [pg_basebackup_common], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +executable('pg_recvlogical', + 'pg_recvlogical.c', + link_with: [pg_basebackup_common], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name' : 'pg_basebackup', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'env': {'GZIP_PROGRAM': gzip.path(), 'TAR': tar.path()}, + 'tests': [ + 't/010_pg_basebackup.pl', + 't/020_pg_receivewal.pl', + 't/030_pg_recvlogical.pl', + ] +} diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build new file mode 100644 index 00000000000..bbf9582b904 --- /dev/null +++ b/src/bin/pg_checksums/meson.build @@ -0,0 +1,16 @@ +executable('pg_checksums', + ['pg_checksums.c'], + include_directories: [timezone_inc], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_checksums', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl', + 't/002_actions.pl' + ] +} diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build new file mode 100644 index 00000000000..df0eb13f636 --- /dev/null +++ b/src/bin/pg_config/meson.build @@ -0,0 +1,14 @@ +executable('pg_config', + ['pg_config.c'], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_config', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_pg_config.pl', + ] +} diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build new file mode 100644 index 00000000000..fa6057afa54 --- /dev/null +++ b/src/bin/pg_controldata/meson.build @@ -0,0 +1,14 @@ +executable('pg_controldata', + ['pg_controldata.c'], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_controldata', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_pg_controldata.pl' + ] +} diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build new file mode 100644 index 00000000000..ac0d4f18192 --- /dev/null +++ b/src/bin/pg_ctl/meson.build @@ -0,0 +1,17 @@ +executable('pg_ctl', + ['pg_ctl.c'], + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_ctl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_start_stop.pl', + 't/002_status.pl', + 't/003_promote.pl', + 't/004_logrotate.pl' + ] +} diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build new file mode 100644 index 00000000000..ce5ef11eaeb --- /dev/null +++ b/src/bin/pg_dump/meson.build @@ -0,0 +1,69 @@ +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', +) + +pg_dump_common = static_library('pg_dump_common', + pg_dump_common_sources, + c_pch: '../../include/pch/c_pch.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, +) + + +tap_tests += { + 'name': 'pg_dump', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl', + 't/002_pg_dump.pl', + 't/003_pg_dump_with_server.pl', + 't/010_dump_connstr.pl', + ] +} diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build new file mode 100644 index 00000000000..7450c0f6432 --- /dev/null +++ b/src/bin/pg_resetwal/meson.build @@ -0,0 +1,15 @@ +executable('pg_resetwal', + files('pg_resetwal.c'), + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_resetwal', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl', + 't/002_corrupted.pl' + ] +} diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build new file mode 100644 index 00000000000..c7c59e9e523 --- /dev/null +++ b/src/bin/pg_rewind/meson.build @@ -0,0 +1,34 @@ +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], + kwargs: default_bin_args, +) + + +tap_tests += { + 'name': 'pg_rewind', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ] +} diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build new file mode 100644 index 00000000000..527be88d125 --- /dev/null +++ b/src/bin/pg_test_fsync/meson.build @@ -0,0 +1,14 @@ +executable('pg_test_fsync', + ['pg_test_fsync.c'], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name' : 'pg_test_fsync', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests' :[ + 't/001_basic.pl', + ] +} diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build new file mode 100644 index 00000000000..c74577df493 --- /dev/null +++ b/src/bin/pg_test_timing/meson.build @@ -0,0 +1,14 @@ +pg_test_timing = executable('pg_test_timing', + ['pg_test_timing.c'], + dependencies: [frontend_code], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_test_timing', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl' + ] +} diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build new file mode 100644 index 00000000000..88d0e03446b --- /dev/null +++ b/src/bin/pg_upgrade/meson.build @@ -0,0 +1,26 @@ +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', + 'relfilenode.c', + 'server.c', + 'tablespace.c', + 'util.c', + 'version.c', +) + +pg_upgrade = executable('pg_upgrade', + pg_upgrade_sources, + c_pch: '../../include/pch/c_pch.h', + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) + +# FIXME: add test diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build new file mode 100644 index 00000000000..c7039ddcc49 --- /dev/null +++ b/src/bin/pg_verifybackup/meson.build @@ -0,0 +1,25 @@ +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, +) + +tap_tests += { + 'name': 'pg_verifybackup', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ] +} diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build new file mode 100644 index 00000000000..f89139f89f5 --- /dev/null +++ b/src/bin/pg_waldump/meson.build @@ -0,0 +1,23 @@ +pg_waldump_sources = files( + 'compat.c', + 'pg_waldump.c', + 'rmgrdesc.c', +) + +pg_waldump_sources += rmgr_desc_sources +pg_waldump_sources += xlogreader_sources + +pg_waldump = executable('pg_waldump', + pg_waldump_sources, + dependencies: [frontend_code, lz4], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'pg_waldump', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_basic.pl', + ] +} diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build new file mode 100644 index 00000000000..5c4a778ff32 --- /dev/null +++ b/src/bin/pgbench/meson.build @@ -0,0 +1,38 @@ +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, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@'] +) + +exprparse = custom_target('exprparse', + input: 'exprparse.y', + output: 'exprparse.c', + depends: exprscan, + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) +pgbench_sources += exprparse + +executable('pgbench', + pgbench_sources, + dependencies: [frontend_code, libpq, thread_dep], + include_directories: include_directories('.'), + kwargs: default_bin_args, +) + + +tap_tests += { + 'name' : 'pgbench', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..9b4642a69d0 --- /dev/null +++ b/src/bin/pgevent/meson.build @@ -0,0 +1 @@ +# FIXME: implement when I can test diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build new file mode 100644 index 00000000000..98921f801d7 --- /dev/null +++ b/src/bin/psql/meson.build @@ -0,0 +1,46 @@ +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', +) + +psql_sources += custom_target('psqlscanslash', + input: ['psqlscanslash.l'], + output: ['psqlscanslash.c'], + command: [flex, '-CFe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@']) + +psql_sources += custom_target('psql_help', + input: ['create_help.pl'], + output: ['sql_help.c', 'sql_help.h'], + depfile: 'sql_help.dep', + command: [perl, '@INPUT0@', '@SOURCE_ROOT@/doc/src/sgml/ref', '@OUTDIR@', 'sql_help']) + +executable('psql', + psql_sources, + c_pch: '../../include/pch/c_pch.h', + include_directories: include_directories('.'), + dependencies : [frontend_code, libpq, readline], + kwargs: default_bin_args, +) + +tap_tests += { + 'name': 'psql', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'env': {'with_readline': readline.found() ? 'yes' : 'no'}, + 'tests': [ + 't/010_tab_completion.pl', + 't/020_cancel.pl', + ], +} diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build new file mode 100644 index 00000000000..547a53500a4 --- /dev/null +++ b/src/bin/scripts/meson.build @@ -0,0 +1,46 @@ +scripts_common = static_library('scripts_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 + +tap_tests += { + 'name': 'scripts', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ] +} diff --git a/src/common/meson.build b/src/common/meson.build new file mode 100644 index 00000000000..6be70b0c5b3 --- /dev/null +++ b/src/common/meson.build @@ -0,0 +1,140 @@ +common_sources = files( + 'archive.c', + 'base64.c', + 'checksum_helper.c', + 'config_info.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', + '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', +) + +# FIXME: implement openssl +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_sources += 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@']) + + +# 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 + +ryu_srv = static_library('ryu_srv', + ryu_sources, + dependencies: [backend_port_code], + c_args: ryu_cflags, + kwargs: internal_lib_args +) + +ryu_shlib = static_library('ryu_shlib', + ryu_sources, + dependencies: [frontend_port_code], + c_args: ryu_cflags, + pic: true, + kwargs: internal_lib_args +) + +ryu_static = static_library('ryu_static', + ryu_sources, + dependencies: [frontend_port_code], + c_args: ryu_cflags, + kwargs: internal_lib_args +) + + +# 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', +) + +# XXX: in most environments we could probably link_whole pgcommon_shlib +# against pgcommon_static, instead of compiling twice. + +common_srv = static_library('pgcommon_srv', + common_sources, + c_pch: '../include/pch/c_pch.h', + link_with: [ryu_srv], + dependencies: [backend_common_code, ssl], + include_directories: include_directories('.'), + kwargs: internal_lib_args, +) + +common_shlib = static_library('pgcommon_shlib', + common_sources_frontend_shlib, + c_pch: '../include/pch/c_pch.h', + pic: true, + link_with: [ryu_shlib], + dependencies: [frontend_common_code, ssl], + include_directories: include_directories('.'), + kwargs: default_lib_args, +) + +common_static = static_library('pgcommon_static', + common_sources_frontend_static, + c_pch: '../include/pch/c_pch.h', + link_with: [ryu_static], + dependencies: [frontend_common_code, ssl], + include_directories: include_directories('.'), + kwargs: default_lib_args, +) diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build new file mode 100644 index 00000000000..b305727d967 --- /dev/null +++ b/src/fe_utils/meson.build @@ -0,0 +1,27 @@ +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', +) + +fe_utils_sources += custom_target('psqlscan', + input: ['psqlscan.l'], + output: ['psqlscan.c'], + command: [flex, '-Cfe', '-p', '-p', '-o', '@OUTPUT@', '@INPUT@']) + +fe_utils = static_library('fe_utils', + fe_utils_sources + generated_headers, + c_pch: '../include/pch/c_pch.h', + include_directories : [postgres_inc, libpq_inc], + c_args: ['-DFRONTEND'], + kwargs: default_lib_args, +) diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build new file mode 100644 index 00000000000..a86ac67eada --- /dev/null +++ b/src/include/catalog/meson.build @@ -0,0 +1,113 @@ +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_partitioned_table.h', + 'pg_range.h', + 'pg_transform.h', + 'pg_sequence.h', + 'pg_publication.h', + 'pg_publication_rel.h', + 'pg_subscription.h', + 'pg_subscription_rel.h', +] + +bki_data = files( + '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', + ) + + +input = [] +output_files = ['postgres.bki', 'schemapg.h', 'system_fk_info.h', 'system_constraints.sql'] +output_install = [get_option('datadir'), get_option('includedir'), get_option('includedir'), get_option('datadir')] + +foreach h : catalog_headers + fname = h.split('.h')[0]+'_d.h' + input += files(h) + output_files += fname + output_install += get_option('includedir') +endforeach + +generated_headers += custom_target('generated_catalog_headers', + input: input, + depend_files: bki_data, + build_by_default: true, + install: true, + output: output_files, + install_dir: output_install, + command: [perl, files('../../backend/catalog/genbki.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--set-version='+pg_version_major.to_string(), '--output=@OUTDIR@', '@INPUT@'] + ) diff --git a/src/include/meson.build b/src/include/meson.build new file mode 100644 index 00000000000..c3af4a2574f --- /dev/null +++ b/src/include/meson.build @@ -0,0 +1,50 @@ +configure_file(input : 'pg_config_ext.h.meson', + output : 'pg_config_ext.h', + configuration : cdata) + +system = host_machine.system() +if system == 'windows' + system = 'win32' +endif + +configure_file( + output : 'pg_config_os.h', + input: files('port/@0@.h'.format(system)), + install: true, + install_dir : get_option('includedir'), + copy : true) + +configure_file( + output : 'pg_config.h', + install : true, + install_dir : get_option('includedir'), + configuration : cdata) + + +config_paths_data = configuration_data() +config_paths_data.set_quoted('PGBINDIR', get_option('prefix') / get_option('bindir')) +config_paths_data.set_quoted('PGSHAREDIR', get_option('prefix') / get_option('datadir')) +config_paths_data.set_quoted('SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) +config_paths_data.set_quoted('INCLUDEDIR', get_option('prefix') / get_option('includedir')) +# FIXME: shouldn't be the same +config_paths_data.set_quoted('PKGINCLUDEDIR', get_option('prefix') / get_option('includedir')) +config_paths_data.set_quoted('INCLUDEDIRSERVER', get_option('prefix') / get_option('includedir')) +config_paths_data.set_quoted('LIBDIR', get_option('prefix') / get_option('libdir')) +# FIXME: figure out logic for pkglibdir +config_paths_data.set_quoted('PKGLIBDIR', get_option('prefix') / get_option('libdir')) +config_paths_data.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir')) +config_paths_data.set_quoted('DOCDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql') +config_paths_data.set_quoted('HTMLDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql') +config_paths_data.set_quoted('MANDIR', get_option('prefix') / get_option('datadir') / 'doc/postgresql') + +configure_file( + output: 'pg_config_paths.h', + configuration: config_paths_data, + install: false +) + + +subdir('utils') +subdir('storage') +subdir('catalog') +subdir('parser') diff --git a/src/include/parser/meson.build b/src/include/parser/meson.build new file mode 100644 index 00000000000..caf4c092909 --- /dev/null +++ b/src/include/parser/meson.build @@ -0,0 +1,10 @@ +backend_parser_header = custom_target('gram', + input: [files('../../backend/parser/gram.y')], + output: ['gram.c', 'gram.h'], + command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@'], + install: true, + # Only install gram.h, not gram.c + install_dir: [false, get_option('includedir')] +) + +#generated_backend_headers += backend_parser[1] 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/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..ce749169442 --- /dev/null +++ b/src/include/storage/meson.build @@ -0,0 +1,15 @@ +# FIXME: this creates an unnecessary lwlocknames.c - but it's not +# obvious how to avoid that: meson insist on output files being in the +# current dir. + +# FIXME: this leads to lwlocknames.c being installed. Bad. +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: get_option('includedir') +) + +generated_backend_headers += lwlocknames[0] diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build new file mode 100644 index 00000000000..b9c959b474d --- /dev/null +++ b/src/include/utils/meson.build @@ -0,0 +1,22 @@ +errcodes = custom_target('errcodes', + input : files('../../backend/utils/errcodes.txt'), + output : ['errcodes.h'], + command : [perl, files('../../backend/utils/generate-errcodes.pl'), '@INPUT@', '@OUTPUT@'] +) +generated_headers += errcodes + +generated_backend_headers += custom_target('probes.d', + input: files('../../backend/utils/probes.d'), + output : 'probes.h', + capture: true, + command : [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'] +) + +fmgrtab_target = custom_target('fmgrtab', + input: '../catalog/pg_proc.dat', + output : ['fmgroids.h', 'fmgrprotos.h', 'fmgrtab.c'], + command: [perl, '-I', '@SOURCE_ROOT@/src/backend/catalog/', files('../../backend/utils/Gen_fmgrtab.pl'), '--include-path=@SOURCE_ROOT@/src/include', '--output=@OUTDIR@', '@INPUT@'] +) + +generated_backend_headers += fmgrtab_target[0] +generated_backend_headers += fmgrtab_target[1] diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build new file mode 100644 index 00000000000..4b716f0e89d --- /dev/null +++ b/src/interfaces/libpq/meson.build @@ -0,0 +1,99 @@ +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_machine.system() == 'windows' + 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.list', + input: [files('exports.txt')], + output: ['@BASENAME@.list'], + command: [perl, files('../../tools/gen_versioning_script.pl'), + host_machine.system() == 'darwin' ? 'darwin' : 'gnu', + '@INPUT0@', '@OUTPUT0@'], + build_by_default: false, + install: false, +) + +libpq_def = custom_target('libpq.def', + command: [perl, files('../../tools/msvc/export2def.pl'), '@OUTPUT@', '@INPUT0@', 'libpq'], + input: files('exports.txt'), + output: 'libpq.def', + build_by_default: false, + install: false, +) + +# port needs to be in include path due to pthread-win32.h +libpq_inc = include_directories('.', '../../port') +libpq_deps = [frontend_shlib_code, thread_dep, ssl, ldap, gssapi] +libpq_link_depends = [] + +libpq_kwargs = default_lib_args + { + 'version': '5.'+pg_version_major.to_string(), +} + + +if host_machine.system() == 'darwin' + libpq_kwargs = libpq_kwargs + { + 'link_args': ['-exported_symbols_list', export_file.full_path()], + 'link_depends': export_file, + 'soversion': '5', + } +elif host_machine.system() == 'windows' + libpq_deps += cc.find_library('secur32', required: true) + + libpq_kwargs = libpq_kwargs + { + 'vs_module_defs': libpq_def, + 'soversion': '', + } +else + libpq_kwargs = libpq_kwargs + { + 'link_args': '-Wl,--version-script=' + export_file.full_path(), + 'link_depends': export_file, + 'soversion': '5', + } +endif + +libpq_so = shared_library('pq', + libpq_sources, + include_directories : [libpq_inc, postgres_inc], + c_args: ['-DFRONTEND'], + c_pch: '../../include/pch/c_pch.h', + dependencies: libpq_deps, + kwargs: libpq_kwargs, +) + +libpq = declare_dependency( + link_with: [libpq_so], + include_directories: [include_directories('.')] +) + +install_headers('libpq-fe.h', 'libpq-events.h') +# FIXME: adjust path +install_headers('libpq-int.h', 'pqexpbuffer.h') +install_data('pg_service.conf.sample', install_dir: get_option('datadir')) diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 00000000000..414be1db419 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,10 @@ +# libraries that other subsystems might depend uppon first, in their +# respective dependency order + +subdir('timezone') + +subdir('backend') + +subdir('bin') + +subdir('pl') diff --git a/src/pl/meson.build b/src/pl/meson.build new file mode 100644 index 00000000000..b720e922093 --- /dev/null +++ b/src/pl/meson.build @@ -0,0 +1,4 @@ +subdir('plpgsql') + +subdir('plperl') +subdir('plpython') diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build new file mode 100644 index 00000000000..a5a994e845f --- /dev/null +++ b/src/pl/plperl/meson.build @@ -0,0 +1,81 @@ +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(subppdir) + +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: '../../include/pch/postgres_pch.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: get_option('datadir') / 'extension' +) + +install_data( + 'plperlu.control', + 'plperlu--1.0.sql', + install_dir: get_option('datadir') / 'extension' +) + +regress_tests += { + 'name': 'plperl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'plperl_setup', + 'plperl', + 'plperl_lc', + 'plperl_trigger', + 'plperl_shared', + 'plperl_elog', + 'plperl_util', + 'plperl_init', + 'plperlu', + 'plperl_array', + 'plperl_call', + 'plperl_transaction', + ], +} 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..b040e5e8507 --- /dev/null +++ b/src/pl/plpgsql/src/meson.build @@ -0,0 +1,67 @@ +plpgsql_sources = files( + 'pl_comp.c', + 'pl_exec.c', + 'pl_funcs.c', + 'pl_handler.c', + 'pl_scanner.c', +) + +plpgsql_sources += custom_target('gram', + input: ['pl_gram.y'], + output: ['pl_gram.c', 'pl_gram.h'], + command: [bison, bisonflags, '-d', '-o', '@OUTPUT0@', '@INPUT0@']) + +gen_plerrcodes = files('generate-plerrcodes.pl') +plpgsql_sources += custom_target('plerrcodes', + input: ['../../../../src/backend/utils/errcodes.txt'], + output: ['plerrcodes.h'], + command: [perl, gen_plerrcodes, '@INPUT0@'], + capture: true) + +gen_keywordlist = files('../../../../src/tools/gen_keywordlist.pl') +plpgsql_sources += 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@'] +) + +plpgsql_sources += 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@'] +) + +shared_module('plpgsql', + plpgsql_sources, + c_pch: '../../../include/pch/postgres_pch.h', + include_directories: include_directories('.'), + kwargs: pg_mod_args, +) + +install_data('plpgsql.control', 'plpgsql--1.0.sql', + install_dir: get_option('datadir') / 'extension' +) + +install_headers('plpgsql.h', + install_dir: get_option('includedir') / 'server') + + +regress_tests += { + 'name': 'plpgsql', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ], +} diff --git a/src/pl/plpython/expected/meson.build b/src/pl/plpython/expected/meson.build new file mode 100644 index 00000000000..4172ced2208 --- /dev/null +++ b/src/pl/plpython/expected/meson.build @@ -0,0 +1,14 @@ +# FIXME: adding the variant files like this is an abysmal hack in an abysmal hack +foreach r2 : plpython_regress + ['plpython_error_5', 'plpython_types_3'] + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + + s2 = '@0@.out'.format(r2) + s3 = '@0@.out'.format(r3) + plpython3_test_deps += custom_target(s3, + input: '@0@.out'.format(r2), + output: '@0@.out'.format(r3), + capture: true, + command: plpython_regress_cmd, + ) +endforeach diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build new file mode 100644 index 00000000000..14fe8bd7c7f --- /dev/null +++ b/src/pl/plpython/meson.build @@ -0,0 +1,100 @@ +if not python3.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: '../../include/pch/postgres_pch.h', + include_directories: [plpython_inc, postgres_inc], + kwargs: pg_mod_args + { + 'dependencies': [python3, pg_mod_args['dependencies']], + }, +) + +# FIXME: Only install the relevant versions +install_data( + 'plpythonu.control', + 'plpython2u.control', + 'plpython3u.control', + 'plpythonu--1.0.sql', + 'plpython2u--1.0.sql', + 'plpython3u--1.0.sql', + install_dir: get_option('datadir') / 'extension' +) + +# FIXME: Think about python2 + + +plpython_regress_cmd = [ + sed, + '-f', files('regress-python3-mangle.sed'), + '@INPUT0@' +] + +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', +] + +plpython3_regress = [] +plpython3_test_deps = [] + +# FIXME: this is an abysmal hack +subdir('sql') +subdir('expected') + +regress_tests += { + 'name': 'plpython', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': plpython3_regress, + 'deps': plpython3_test_deps, + 'regress_args': ['--inputdir', meson.current_build_dir()], +} diff --git a/src/pl/plpython/sql/meson.build b/src/pl/plpython/sql/meson.build new file mode 100644 index 00000000000..9923425e5ff --- /dev/null +++ b/src/pl/plpython/sql/meson.build @@ -0,0 +1,15 @@ +# Convert plpython2 regression tests to plpython3 ones +foreach r2 : plpython_regress + # string.replace is only in meson 0.58 + r3 = 'plpython3' + r2.split('plpython')[1] + plpython3_regress += r3 + + s2 = '@0@.sql'.format(r2) + s3 = '@0@.sql'.format(r3) + plpython3_test_deps += custom_target(s3, + input: '@0@.sql'.format(r2), + output: '@0@.sql'.format(r3), + capture: true, + command: plpython_regress_cmd, + ) +endforeach diff --git a/src/port/meson.build b/src/port/meson.build new file mode 100644 index 00000000000..c6e4c788052 --- /dev/null +++ b/src/port/meson.build @@ -0,0 +1,146 @@ +pgport_sources = [ + 'bsearch_arg.c', + 'chklocale.c', + 'erand48.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_machine.system() == 'windows' + pgport_sources += files( + 'dirmod.c', + 'kill.c', + 'open.c', + 'system.c', + 'win32env.c', + 'win32error.c', + 'win32security.c', + 'win32setlocale.c', + 'win32stat.c', + ) +endif + +if cc.get_id() == 'msvc' + pgport_sources += files( + 'dirent.c', + ) +endif + +# Replacement functionality to be built if corresponding configure symbol +# is false +replace_funcs_neg = [ + ['dlopen'], + ['explicit_bzero'], + ['fls'], + ['getaddrinfo'], + ['getopt'], + ['getopt_long'], + ['getpeereid'], + ['getpeereid'], + ['getrusage'], + ['gettimeofday'], + ['inet_aton'], + ['link'], + ['mkdtemp'], + ['pread'], + ['preadv', 'HAVE_DECL_PREADV'], + ['pwrite'], + ['pwritev', 'HAVE_DECL_PWRITEV'], + ['random'], + ['srandom'], + ['strlcat'], + ['strlcpy'], + ['strnlen'], +] + +# Replacement functionality to be built if corresponding configure symbol +# is true +replace_funcs_pos = [ + ['pg_crc32c_sse42', 'USE_SSE42_CRC32C'], + ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'], + ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'], + ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'], + ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'], + ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'], + ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'], +] + +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' + pgport_sources += files(filename) + endif +endforeach + + +if (host_machine.system() == 'windows' or host_machine.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 the same replacement + # code we use with VS2013. That's not a perfect fix, since + # (unlike with VS2013) it doesn't avoid double-rounding, but + # we have no better options. To get that, though, we have to + # force the file to be compiled despite HAVE_STRTOF. + pgport_sources += files('strtof.c') + message('On @0@ with compiler @1@ @2@ we will use our strtof wrapper.'.format( + host_machine.system(), cc.get_id(), cc.version())) +endif + +if not cdata.has('HAVE_PTHREAD_BARRIER_WAIT') and host_machine.system() != 'windows' + pgport_sources += files('pthread_barrier_wait.c') +endif + + +pgport_srv = static_library('pgport_srv', + pgport_sources, + c_pch: '../include/pch/c_pch.h', + dependencies: [ssl, backend_port_code], + kwargs: internal_lib_args, +) + +pgport_static = static_library('pgport', + pgport_sources, + c_pch: '../include/pch/c_pch.h', + dependencies: [ssl, frontend_port_code], + kwargs: default_lib_args, +) + +pgport_shlib = static_library('pgport_shlib', + pgport_sources, + c_pch: '../include/pch/c_pch.h', + pic: true, + dependencies: [ssl, frontend_port_code], + kwargs: default_lib_args, +) diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build new file mode 100644 index 00000000000..be41fb314a5 --- /dev/null +++ b/src/test/authentication/meson.build @@ -0,0 +1,9 @@ +tap_tests += { + 'name': 'authentication', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_password.pl', + 't/002_saslprep.pl', + ], +} diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build new file mode 100644 index 00000000000..637b4807550 --- /dev/null +++ b/src/test/isolation/meson.build @@ -0,0 +1,49 @@ +# 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, '-CF', '-p', '-p', '-o', '@OUTPUT0@', '@INPUT@'] +) + +isolationtester_sources = files('isolationtester.c') +isolationtester_sources += custom_target('specparse', + input: 'specparse.y', + output: 'specparse.c', + depends: spec_scanner, + command: [bison, bisonflags, '-o', '@OUTPUT@', '@INPUT0@']) + +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': false + }, +) + +isolationtester = executable('isolationtester', + isolationtester_sources, + include_directories: include_directories('.'), + dependencies: [frontend_code, libpq], + kwargs: default_bin_args + { + 'install': false + }, +) + +isolation_tests += { + 'name': 'main', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..9f9957a3b4c --- /dev/null +++ b/src/test/kerberos/meson.build @@ -0,0 +1,12 @@ +tap_tests += { + 'name': 'kerberos', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..58eb9adc6f5 --- /dev/null +++ b/src/test/ldap/meson.build @@ -0,0 +1,9 @@ +tap_tests += { + 'name': 'ldap', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..f0b0d3d3b5e --- /dev/null +++ b/src/test/meson.build @@ -0,0 +1,19 @@ +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 diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build new file mode 100644 index 00000000000..99ccaac5b38 --- /dev/null +++ b/src/test/modules/brin/meson.build @@ -0,0 +1,19 @@ +isolation_tests += { + 'name': 'brin', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'specs': [ + 'summarization-and-inprogress-insertion', + ] +} + + +tap_tests += { + 'name': 'brin', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/01_workitems.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..2794d837c35 --- /dev/null +++ b/src/test/modules/commit_ts/meson.build @@ -0,0 +1,20 @@ +regress_tests += { + 'name': 'commit_ts', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'commit_timestamp', + ] +} + +tap_tests += { + 'name': 'commit_ts', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..58fe5a1a21d --- /dev/null +++ b/src/test/modules/delay_execution/meson.build @@ -0,0 +1,15 @@ +# FIXME: prevent install during main install, but not during test :/ +delay_execution = shared_module('delay_execution', + ['delay_execution.c'], + kwargs: pg_mod_args, +) + +isolation_tests += { + 'name': 'delay_execution', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..a9c49bd9554 --- /dev/null +++ b/src/test/modules/dummy_index_am/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'dummy_index_am', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..ed31d8f9530 --- /dev/null +++ b/src/test/modules/dummy_seclabel/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'dummy_seclabel', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..2f850215a6f --- /dev/null +++ b/src/test/modules/libpq_pipeline/meson.build @@ -0,0 +1,21 @@ +libpq_pipeline = executable('libpq_pipeline', + files( + 'libpq_pipeline.c', + ), + dependencies: [frontend_code, libpq], + kwargs: default_bin_args + { + 'install': false, + }, +) + +tap_tests += { + 'name': 'libpq_pipeline', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'env': { + 'PATH': meson.current_build_dir(), + }, + '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..c98225c6e7b --- /dev/null +++ b/src/test/modules/meson.build @@ -0,0 +1,25 @@ +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_misc') +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..3f70688fb89 --- /dev/null +++ b/src/test/modules/plsample/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'plsample', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..cdf4afd18b8 --- /dev/null +++ b/src/test/modules/snapshot_too_old/meson.build @@ -0,0 +1,11 @@ +isolation_tests += { + 'name': 'snapshot_too_old', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..19aa00892f1 --- /dev/null +++ b/src/test/modules/spgist_name_ops/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'spgist_name_ops', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..b9fa5ee1cdc --- /dev/null +++ b/src/test/modules/ssl_passphrase_callback/meson.build @@ -0,0 +1,45 @@ +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 + +tap_tests += { + 'name': 'ssl_passphrase_callback', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..2e995310876 --- /dev/null +++ b/src/test/modules/test_bloomfilter/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_bloomfilter', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..3618229594d --- /dev/null +++ b/src/test/modules/test_ddl_deparse/meson.build @@ -0,0 +1,40 @@ +# 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, +) + +regress_tests += { + 'name': 'test_ddl_deparse', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..2ca504f8588 --- /dev/null +++ b/src/test/modules/test_extensions/meson.build @@ -0,0 +1,38 @@ +# 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_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, +) + +regress_tests += { + 'name': 'test_extensions', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..e177e90019f --- /dev/null +++ b/src/test/modules/test_ginpostinglist/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_ginpostinglist', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..ccb8db725e5 --- /dev/null +++ b/src/test/modules/test_integerset/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_integerset', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'test_integerset', + ] +} diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build new file mode 100644 index 00000000000..4ee8c562ac0 --- /dev/null +++ b/src/test/modules/test_misc/meson.build @@ -0,0 +1,8 @@ +tap_tests += { + 'name': 'misc', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tests': [ + 't/001_constraint_validation.pl', + ], +} diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build new file mode 100644 index 00000000000..c43ae95cf2c --- /dev/null +++ b/src/test/modules/test_parser/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_parser', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..110b3876832 --- /dev/null +++ b/src/test/modules/test_pg_dump/meson.build @@ -0,0 +1,24 @@ +# 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, +) + +regress_tests += { + 'name': 'test_pg_dump', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'sql': [ + 'test_pg_dump', + ] +} + +tap_tests += { + 'name': 'test_pg_dump', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..9f9a9475c8b --- /dev/null +++ b/src/test/modules/test_predtest/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_predtest', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..6bbeca39ec9 --- /dev/null +++ b/src/test/modules/test_rbtree/meson.build @@ -0,0 +1,20 @@ +# 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, +) + +regress_tests += { + 'name': 'test_rbtree', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..c5fd92ee1c6 --- /dev/null +++ b/src/test/modules/test_regex/meson.build @@ -0,0 +1,21 @@ +# 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, +) + +regress_tests += { + 'name': 'test_regex', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..fb8b697e160 --- /dev/null +++ b/src/test/modules/test_rls_hooks/meson.build @@ -0,0 +1,19 @@ +# 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, +) + +install_data( + 'test_rls_hooks.control', + kwargs: contrib_data_args, +) + +regress_tests += { + 'name': 'test_rls_hooks', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..159943f861e --- /dev/null +++ b/src/test/modules/test_shm_mq/meson.build @@ -0,0 +1,24 @@ +# 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, +) + +regress_tests += { + 'name': 'test_shm_mq', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..9ed4d587721 --- /dev/null +++ b/src/test/modules/unsafe_tests/meson.build @@ -0,0 +1,9 @@ +regress_tests += { + 'name': 'unsafe_tests', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..a80bd493ea7 --- /dev/null +++ b/src/test/modules/worker_spi/meson.build @@ -0,0 +1,23 @@ +# 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, +) + +regress_tests += { + 'name': 'worker_spi', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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..5678e1d27ae --- /dev/null +++ b/src/test/recovery/meson.build @@ -0,0 +1,33 @@ +tap_tests += { + 'name': 'recovery', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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', + ] +} diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build new file mode 100644 index 00000000000..1a2f7675e87 --- /dev/null +++ b/src/test/regress/meson.build @@ -0,0 +1,57 @@ +# also used by isolationtester +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': false + }, +) + +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, + }, +) + + +regress_tests += { + 'name': 'main', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'schedule': files('parallel_schedule'), + 'regress_args': ['--make-testtablespace-dir'], + '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..42e34c9f632 --- /dev/null +++ b/src/test/ssl/meson.build @@ -0,0 +1,10 @@ +tap_tests += { + 'name': 'ssl', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'env' : {'with_ssl': get_option('ssl')}, + 'tests': [ + 't/001_ssltests.pl', + 't/002_scram.pl' + ], +} diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build new file mode 100644 index 00000000000..31580edd3d3 --- /dev/null +++ b/src/test/subscription/meson.build @@ -0,0 +1,33 @@ +tap_tests += { + 'name': 'subscription', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + '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/100_bugs.pl', + ], +} diff --git a/src/timezone/meson.build b/src/timezone/meson.build new file mode 100644 index 00000000000..c3703a5ec7d --- /dev/null +++ b/src/timezone/meson.build @@ -0,0 +1,50 @@ +# 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' +) + + +# 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('zic', native: true, required: false) +else + zic = executable('zic', zic_sources, + dependencies: [frontend_code], + kwargs: default_bin_args + {'install': false} + ) +endif + +# FIXME: this used to be sorted - but also isn't actually used +abbrevs_txt = custom_target('abbrevs.txt', + input: tzdata, + output: ['abbrevs.txt'], + command: [zic, '-P', '-b', 'fat', 'junkdir', '@INPUT@'], + capture: true) + +tzdata = custom_target('tzdata', + input: tzdata, + output: ['timezone'], + command: [zic, '-d', '@OUTPUT@', '@INPUT@'], + install: true, + install_dir: get_option('datadir')) + +subdir('tznames') diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build new file mode 100644 index 00000000000..effd2880ce7 --- /dev/null +++ b/src/timezone/tznames/meson.build @@ -0,0 +1,20 @@ +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, install_dir: get_option('datadir') / 'timezonesets') +install_data(tznames_sets, install_dir: get_option('datadir') / 'timezonesets') diff --git a/src/tools/find_meson b/src/tools/find_meson new file mode 100755 index 00000000000..2d75537374e --- /dev/null +++ b/src/tools/find_meson @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +import os +import shlex +import sys + +mesonintrospect = os.environ['MESONINTROSPECT'] +components = shlex.split(mesonintrospect) + +if len(components) < 2: + print(f'expected more, got: {components}') + sys.exit(1) + +if components[-1] != 'introspect': + print('expected introspection at the end') + sys.exit(1) + +print('\n'.join(components[:-1]), end='') + +sys.exit(0) diff --git a/src/tools/irlink b/src/tools/irlink new file mode 100644 index 00000000000..efc2c700277 --- /dev/null +++ b/src/tools/irlink @@ -0,0 +1,28 @@ +#!/bin/bash + +set -e + +srcdir="$1" +builddir="$2" +llvm_lto="$3" +outputdir=$(realpath "$5") +index="$outputdir/postgres.index.bc" +priv="$6" +shift 6 +numinput=$# + +if [ ! -d "$outputdir" ];then + mkdir -p "$outputdir/postgres" +fi + +cd $priv + +# fixme, remove old contents" +cp -r . "$outputdir/postgres" + +cd "$outputdir" + +filenames=$(for f in "$@";do echo "postgres/${f#$priv/}";done) +"$llvm_lto" -thinlto -thinlto-action=thinlink -o "$index" $filenames + +exit 0 diff --git a/src/tools/msvc/export2def.pl b/src/tools/msvc/export2def.pl new file mode 100644 index 00000000000..fb88e8b8ab9 --- /dev/null +++ b/src/tools/msvc/export2def.pl @@ -0,0 +1,22 @@ +# Copyright (c) 2021, PostgreSQL Global Development Group + +use strict; +use warnings; +use 5.8.0; +use List::Util qw(max); + +my ($deffile, $txtfile, $libname) = @ARGV; + +print STDERR "Generating $deffile...\n"; +open(my $if, '<', $txtfile) || die("Could not open $txtfile\n"); +open(my $of, '>', $deffile) || die("Could not open $deffile for writing\n"); +print $of "LIBRARY $libname\nEXPORTS\n"; +while (<$if>) +{ + next if (/^#/); + next if (/^\s*$/); + my ($f, $o) = split; + print $of " $f @ $o\n"; +} +close($of); +close($if); diff --git a/src/tools/msvc/gendef2.pl b/src/tools/msvc/gendef2.pl new file mode 100644 index 00000000000..3b905d6f5da --- /dev/null +++ b/src/tools/msvc/gendef2.pl @@ -0,0 +1,177 @@ + +# Copyright (c) 2021, PostgreSQL Global Development Group + +use strict; +use warnings; +use 5.8.0; +use List::Util qw(max); + +my @def; + +# +# Script that generates a .DEF file for all objects in a directory +# +# src/tools/msvc/gendef.pl +# + +# Given a symbol file path, loops over its contents +# and returns a list of symbols of interest as a dictionary +# of 'symbolname' -> symtype, where symtype is: +# +# 0 a CODE symbol, left undecorated in the .DEF +# 1 A DATA symbol, i.e. global var export +# +sub extract_syms +{ + my ($symfile, $def) = @_; + open(my $f, '<', $symfile) || die "Could not open $symfile: $!\n"; + while (<$f>) + { + + # Expected symbol lines look like: + # + # 0 1 2 3 4 5 6 + # IDX SYMBOL SECT SYMTYPE SYMSTATIC SYMNAME + # ------------------------------------------------------------------------ + # 02E 00000130 SECTA notype External | _standbyState + # 02F 00000009 SECT9 notype Static | _LocalRecoveryInProgress + # 064 00000020 SECTC notype () Static | _XLogCheckBuffer + # 065 00000000 UNDEF notype () External | _BufferGetTag + # + # See http://msdn.microsoft.com/en-us/library/b842y285.aspx + # + # We're not interested in the symbol index or offset. + # + # SECT[ION] is only examined to see whether the symbol is defined in a + # COFF section of the local object file; if UNDEF, it's a symbol to be + # resolved at link time from another object so we can't export it. + # + # SYMTYPE is always notype for C symbols as there's no typeinfo and no + # way to get the symbol type from name (de)mangling. However, we care + # if "notype" is suffixed by "()" or not. The presence of () means the + # symbol is a function, the absence means it isn't. + # + # SYMSTATIC indicates whether it's a compilation-unit local "static" + # symbol ("Static"), or whether it's available for use from other + # compilation units ("External"). We export all symbols that aren't + # static as part of the whole program DLL interface to produce UNIX-like + # default linkage. + # + # SYMNAME is, obviously, the symbol name. The leading underscore + # indicates that the _cdecl calling convention is used. See + # http://www.unixwiz.net/techtips/win32-callconv.html + # http://www.codeproject.com/Articles/1388/Calling-Conventions-Demystified + # + s/notype \(\)/func/g; + s/notype/data/g; + + my @pieces = split; + + # Skip file and section headers and other non-symbol entries + next unless defined($pieces[0]) and $pieces[0] =~ /^[A-F0-9]{3,}$/; + + # Skip blank symbol names + next unless $pieces[6]; + + # Skip externs used from another compilation unit + next if ($pieces[2] eq "UNDEF"); + + # Skip static symbols + next unless ($pieces[4] eq "External"); + + # Skip some more MSVC-generated crud + next if $pieces[6] =~ /^@/; + next if $pieces[6] =~ /^\(/; + + # __real and __xmm are out-of-line floating point literals and + # (for __xmm) their SIMD equivalents. They shouldn't be part + # of the DLL interface. + next if $pieces[6] =~ /^__real/; + next if $pieces[6] =~ /^__xmm/; + + # __imp entries are imports from other DLLs, eg __imp__malloc . + # (We should never have one of these that hasn't already been skipped + # by the UNDEF test above, though). + next if $pieces[6] =~ /^__imp/; + + # More under-documented internal crud + next if $pieces[6] =~ /NULL_THUNK_DATA$/; + next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/; + next if $pieces[6] =~ /^__NULL_IMPORT/; + + # Skip string literals + next if $pieces[6] =~ /^\?\?_C/; + + # We assume that if a symbol is defined as data, then as a function, + # the linker will reject the binary anyway. So it's OK to just pick + # whatever came last. + $def->{ $pieces[6] } = $pieces[3]; + } + close($f); + return; +} + +sub writedef +{ + my ($deffile, $platform, $def) = @_; + open(my $fh, '>', $deffile) || die "Could not write to $deffile\n"; + print $fh "EXPORTS\n"; + foreach my $f (sort keys %{$def}) + { + my $isdata = $def->{$f} eq 'data'; + + # Strip the leading underscore for win32, but not x64 + $f =~ s/^_// + unless ($platform eq "x64"); + + # Emit just the name if it's a function symbol, or emit the name + # decorated with the DATA option for variables. + if ($isdata) + { + print $fh " $f DATA\n"; + } + else + { + print $fh " $f\n"; + } + } + close($fh); + return; +} + + +sub usage +{ + die( "Usage: gendef.pl platform outputfile tempdir sourcelib\n" + . " modulepath: path to dir with obj files, no trailing slash" + . " platform: Win32 | x64"); +} + +usage() + unless scalar(@ARGV) >= 4; + +my $platform = $ARGV[0]; +shift; +my $deffile = $ARGV[0]; +shift; +my $tempdir = $ARGV[0]; +shift; + +print STDERR "Generating $deffile in tmp dir $tempdir from ".join(' ', @ARGV)."\n"; + +my %def = (); + +my $symfile = "$tempdir/all.sym"; +my $tmpfile = "$tempdir/tmp.sym"; +mkdir($tempdir); +print STDERR "dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV)."\n"; +system("dumpbin /symbols /out:$tmpfile ".join(' ', @ARGV)) + && die "Could not call dumpbin"; +rename($tmpfile, $symfile); +print "generated symfile to $symfile (via $tmpfile)\n"; +extract_syms($symfile, \%def); +print "\n"; + +writedef($deffile, $platform, \%def); + +print "Generated " . scalar(keys(%def)) . " symbols\n"; diff --git a/src/tools/testwrap b/src/tools/testwrap new file mode 100755 index 00000000000..aeb2019b099 --- /dev/null +++ b/src/tools/testwrap @@ -0,0 +1,22 @@ +#!/bin/sh +# +# FIXME: I should probably be a perl or python script +# + +# FIXME: argument parsing + +basedir=$1 +builddir=$2 +testgroup=$3 +testname=$(basename -s .pl $4) +shift 4 + +testdir="$basedir/testrun/$testgroup/$testname" +echo "# executing test in $testdir group $testgroup test $testname, builddir $builddir" +rm -rf "$testdir/" +mkdir -p "$testdir" + +export TESTOUTDIR="$testdir" +export TESTDIR="$builddir" + +exec "$@" -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0017-ci-Build-both-with-meson-and-as-before.patch" From 6567a246b7c98bf769b15f4544fb039d162dbe38 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 8 Oct 2021 17:29:10 -0700 Subject: [PATCH v3 17/17] ci: Build both with meson and as before. --- .cirrus.yml | 464 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 308 insertions(+), 156 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index f75bdce6dec..eace4602ea3 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -13,14 +13,13 @@ env: task: - name: FreeBSD only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' compute_engine_instance: image_project: pg-vm-images-aio image: family/pg-aio-freebsd-13-0 platform: freebsd - cpu: 2 - memory: 2G + cpu: 4 + memory: 4G disk: 50 env: CCACHE_DIR: "/tmp/ccache_dir" @@ -39,33 +38,52 @@ task: - mkdir -p /tmp/ccache_dir - chown -R postgres:postgres /tmp/ccache_dir - configure_script: | - su postgres -c './configure \ - --enable-cassert --enable-debug --enable-tap-tests \ - --enable-nls \ - \ - --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/ \ - --with-uuid=bsd \ - \ - --with-includes=/usr/local/include --with-libs=/usr/local/lib \ - CC="ccache cc"' - build_script: - - su postgres -c 'gmake -s -j3 && gmake -s -j3 -C contrib' - upload_caches: - - ccache + matrix: + - name: FreeBSD autoconf + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --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/ \ + --with-uuid=bsd \ + \ + --with-includes=/usr/local/include --with-libs=/usr/local/lib \ + CC="ccache cc"' + build_script: + - su postgres -c 'gmake -s -j4 && gmake -s -j4 -C contrib' + upload_caches: + - ccache + + tests_script: + - su postgres -c 'time gmake -s -j4 ${CHECK} ${CHECKFLAGS}' + + - name: FreeBSD meson + + configure_script: + - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build' + build_script: + - su postgres -c 'ninja -C build' + upload_caches: + - ccache + run_tests_script: + - su postgres -c 'meson test --no-rebuild -C build' - tests_script: - - su postgres -c 'time gmake -s -j2 ${CHECK} ${CHECKFLAGS}' + always: + meson_log_artifacts: + path: "build/meson-logs/*.txt" + type: text/plain on_failure: cores_script: | @@ -83,14 +101,16 @@ task: tap_artifacts: path: "**/regress_log_*" type: text/plain + meson_test_artifacts: + path: "build/meson-logs/testlog.junit.xml" + type: text/xml + format: junit task: - name: Linux only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' compute_engine_instance: image_project: pg-vm-images-aio - image: family/pg-aio-bullseye platform: linux cpu: 4 memory: 2G @@ -120,37 +140,78 @@ task: - su postgres -c 'ulimit -l -S' - echo '/tmp/%e-%s-%p.core' > /proc/sys/kernel/core_pattern - configure_script: | - su postgres -c './configure \ - --enable-cassert --enable-debug --enable-tap-tests \ - --enable-nls \ - \ - --with-gssapi \ - --with-icu \ - --with-ldap \ - --with-libxml \ - --with-libxslt \ - --with-llvm \ - --with-lz4 \ - --with-pam \ - --with-perl \ - --with-python \ - --with-ssl=openssl \ - --with-systemd \ - --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \ - --with-uuid=e2fs \ - \ - CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"' - build_script: - - su postgres -c 'make -s -j4 && make -s -j4 -C contrib' - upload_caches: - - ccache + matrix: + - name: Linux Autoconf + + compute_engine_instance: + image: family/pg-aio-bullseye + + configure_script: | + su postgres -c './configure \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-gssapi \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + --with-llvm \ + --with-lz4 \ + --with-pam \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-systemd \ + --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" CFLAGS="-O0 -ggdb"' + build_script: + - su postgres -c 'make -s -j4 && make -s -j4 -C contrib' + upload_caches: + - ccache + + tests_script: | + su postgres -c '\ + ulimit -c unlimited; \ + make -s ${CHECK} ${CHECKFLAGS} -j8 \ + ' + + - name: Linux Meson + + compute_engine_instance: + image: family/pg-aio-bullseye + + configure_script: + - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build' + build_script: + - su postgres -c 'ninja -C build' + upload_caches: + - ccache + + tests_script: + - su postgres -c 'meson test --no-rebuild -C build' + + - name: Linux Meson Sid + + compute_engine_instance: + image: family/pg-aio-sid + + configure_script: + - su postgres -c 'meson setup --buildtype debug -Dcassert=true -Dssl=openssl build' + build_script: + - su postgres -c 'ninja -C build' + upload_caches: + - ccache + + tests_script: + - su postgres -c 'meson test --no-rebuild -C build' - tests_script: | - su postgres -c '\ - ulimit -c unlimited; \ - make -s ${CHECK} ${CHECKFLAGS} -j8 \ - ' + always: + meson_log_artifacts: + path: "build/meson-logs/*.txt" + type: text/plain on_failure: cores_script: | @@ -168,10 +229,13 @@ task: tap_artifacts: path: "**/regress_log_*" type: text/plain + meson_test_artifacts: + path: "build/meson-logs/testlog.junit.xml" + type: text/xml + format: junit task: - name: macOS only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' osx_instance: image: big-sur-base @@ -201,55 +265,86 @@ task: - sudo chmod 777 /cores homebrew_install_script: - brew install make coreutils ccache icu4c lz4 tcl-tk openldap + - brew install meson ninja python@3.9 upload_caches: - homebrew - configure_script: | - LIBS="/usr/local/lib:$LIBS" - INCLUDES="/usr/local/include:$INCLUDES" - - INCLUDES="/usr/local/opt/openssl/include:$INCLUDES" - LIBS="/usr/local/opt/openssl/lib:$LIBS" - - PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH" - INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES" - LIBS="/usr/local/opt/icu4c/lib:$LIBS" - - LIBS="/usr/local/opt/openldap/lib:$LIBS" - INCLUDES="/usr/local/opt/openldap/include:$INCLUDES" - - export PKG_CONFIG_PATH - - ./configure \ - --prefix=$HOME/install \ - --with-includes="$INCLUDES" \ - --with-libs="$LIBS" \ - \ - --enable-cassert --enable-debug --enable-tap-tests \ - --enable-nls \ - \ - --with-icu \ - --with-ldap \ - --with-libxml \ - --with-libxslt \ - \ - --with-lz4 \ - --with-perl \ - --with-python \ - --with-ssl=openssl \ - --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \ - --with-uuid=e2fs \ - \ - CC="ccache gcc" CFLAGS="-O0 -ggdb" - build_script: - - gmake -s -j12 && gmake -s -j12 -C contrib - upload_caches: - - ccache + matrix: + - name: macOS autoconf + + configure_script: | + LIBS="/usr/local/lib:$LIBS" + INCLUDES="/usr/local/include:$INCLUDES" + + PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" + INCLUDES="/usr/local/opt/openssl/include:$INCLUDES" + LIBS="/usr/local/opt/openssl/lib:$LIBS" + + PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH" + INCLUDES="/usr/local/opt/icu4c/include:$INCLUDES" + LIBS="/usr/local/opt/icu4c/lib:$LIBS" + + PKG_CONFIG_PATH="/usr/local/opt/ldap/lib/pkgconfig:$PKG_CONFIG_PATH" + LIBS="/usr/local/opt/openldap/lib:$LIBS" + INCLUDES="/usr/local/opt/openldap/include:$INCLUDES" + + export PKG_CONFIG_PATH + + ./configure \ + --prefix=$HOME/install \ + --with-includes="$INCLUDES" \ + --with-libs="$LIBS" \ + \ + --enable-cassert --enable-debug --enable-tap-tests \ + --enable-nls \ + \ + --with-icu \ + --with-ldap \ + --with-libxml \ + --with-libxslt \ + \ + --with-lz4 \ + --with-perl \ + --with-python \ + --with-ssl=openssl \ + --with-tcl --with-tclconfig=/usr/local/opt/tcl-tk/lib/ \ + --with-uuid=e2fs \ + \ + CC="ccache gcc" CFLAGS="-O0 -ggdb" + build_script: + - gmake -s -j12 && gmake -s -j12 -C contrib + upload_caches: + - ccache + + tests_script: + - ulimit -c unlimited + - ulimit -n 1024 + - gmake -s -j12 ${CHECK} ${CHECKFLAGS} + + - name: macOS meson + + configure_script: | + PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" + PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH" + PKG_CONFIG_PATH="/usr/local/opt/openldap/lib/pkgconfig:$PKG_CONFIG_PATH" + + export PKG_CONFIG_PATH + + meson setup --buildtype debug -Dcassert=true -Dssl=openssl build + build_script: + - ninja -C build + upload_caches: + - ccache + + tests_script: + - ulimit -c unlimited + - ulimit -n 1024 + - meson test --no-rebuild -C build - tests_script: - - ulimit -c unlimited - - ulimit -n 1024 - - gmake -s -j12 ${CHECK} ${CHECKFLAGS} + always: + meson_log_artifacts: + path: "build/meson-logs/*.txt" + type: text/plain on_failure: cores_script: | @@ -265,10 +360,13 @@ task: tap_artifacts: path: "**/regress_log_*" type: text/plain + meson_test_artifacts: + path: "build/meson-logs/testlog.junit.xml" + type: text/xml + format: junit task: - name: Windows only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' windows_container: dockerfile: ci/docker/windows_vs_2019 @@ -281,6 +379,8 @@ task: TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/ci/pg_ci_base.conf # Avoid re-installing over and over NO_TEMP_INSTALL: 1 + # Try to hide git's tar + PATH: c:\windows\system32;${PATH} sysinfo_script: - chcp @@ -289,55 +389,103 @@ task: - ps: Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug' - set - configure_script: - - copy ci\windows_build_config.pl src\tools\msvc\config.pl - - vcvarsall x64 - - perl src/tools/msvc/mkvcbuild.pl - build_script: - - vcvarsall x64 - # Disable file tracker, we're never going to rebuild... - - msbuild -m /p:TrackFileAccess=false pgsql.sln - tempinstall_script: - # Installation on windows currently only completely works from src\tools\msvc - - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install - - check_test_script: - - perl src/tools/msvc/vcregress.pl check parallel - startcreate_test_script: - - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log - - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf - - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log - plcheck_test_script: - - perl src/tools/msvc/vcregress.pl plcheck - isolationcheck_test_script: - - perl src/tools/msvc/vcregress.pl isolationcheck - modulescheck_test_script: - - perl src/tools/msvc/vcregress.pl modulescheck - contribcheck_test_script: - - perl src/tools/msvc/vcregress.pl contribcheck - stop_test_script: - - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log - ssl_test_script: - - set with_ssl=openssl - - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\ - subscriptioncheck_test_script: - - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\ - authentication_test_script: - - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\ - recoverycheck_test_script: - - perl src/tools/msvc/vcregress.pl recoverycheck - bincheck_test_script: - - perl src/tools/msvc/vcregress.pl bincheck - upgradecheck_test_script: - - perl src/tools/msvc/vcregress.pl upgradecheck - ecpgcheck_test_script: - # tries to build additional stuff - - vcvarsall x64 - # References ecpg_regression.proj in the current dir - - cd src\tools\msvc - - perl vcregress.pl ecpgcheck + matrix: + - name: Windows homegrowns + + configure_script: + - copy ci\windows_build_config.pl src\tools\msvc\config.pl + - vcvarsall x64 + - perl src/tools/msvc/mkvcbuild.pl + build_script: + - vcvarsall x64 + # Disable file tracker, we're never going to rebuild... + - msbuild -m /p:TrackFileAccess=false pgsql.sln + tempinstall_script: + # Installation on windows currently only completely works from src\tools\msvc + - cd src\tools\msvc && perl .\install.pl %CIRRUS_WORKING_DIR%\tmp_install + + check_test_script: + - perl src/tools/msvc/vcregress.pl check parallel + startcreate_test_script: + - tmp_install\bin\pg_ctl.exe initdb -D tmp_check\db -l tmp_check\initdb.log + - echo include '%TEMP_CONFIG%' >> tmp_check\db\postgresql.conf + - tmp_install\bin\pg_ctl.exe start -D tmp_check\db -l tmp_check\postmaster.log + plcheck_test_script: + - perl src/tools/msvc/vcregress.pl plcheck + isolationcheck_test_script: + - perl src/tools/msvc/vcregress.pl isolationcheck + modulescheck_test_script: + - perl src/tools/msvc/vcregress.pl modulescheck + contribcheck_test_script: + - perl src/tools/msvc/vcregress.pl contribcheck + stop_test_script: + - tmp_install\bin\pg_ctl.exe stop -D tmp_check\db -l tmp_check\postmaster.log + ssl_test_script: + - set with_ssl=openssl + - perl src/tools/msvc/vcregress.pl taptest .\src\test\ssl\ + subscriptioncheck_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\subscription\ + authentication_test_script: + - perl src/tools/msvc/vcregress.pl taptest .\src\test\authentication\ + recoverycheck_test_script: + - perl src/tools/msvc/vcregress.pl recoverycheck + bincheck_test_script: + - perl src/tools/msvc/vcregress.pl bincheck + upgradecheck_test_script: + - perl src/tools/msvc/vcregress.pl upgradecheck + ecpgcheck_test_script: + # tries to build additional stuff + - vcvarsall x64 + # References ecpg_regression.proj in the current dir + - cd src\tools\msvc + - perl vcregress.pl ecpgcheck + + - name: Windows Meson+vs+Ninja + + meson_script: + - pip install meson + - pip install 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.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build + build_script: + - vcvarsall x64 + - ninja -C build + + check_script: + - vcvarsall x64 + - meson test --no-rebuild -C build + + - name: Windows Meson+vs+msbuild + + # Need a development version of meson for now + meson_dev_script: + - git clone https://github.com/mesonbuild/meson.git + + configure_script: + - vcvarsall x64 + - mkdir subprojects + - .\meson\meson.py wrap install lz4 + - .\meson\meson.py wrap install zlib + - .\meson\meson.py setup --buildtype debug --backend vs -Dcassert=true -Db_pch=true -Dssl=openssl -Dlz4=enabled -Dzlib=enabled -Dextra_lib_dirs=c:\openssl\1.1.1l\lib -Dextra_include_dirs=c:\openssl\1.1.1l\include build + + build_script: + - vcvarsall x64 + - msbuild -m /p:UseMultiToolTask=true build\postgresql.sln + + check_script: + - vcvarsall x64 + - .\meson\meson.py test --no-rebuild -C build always: + meson_log_artifacts: + path: "build/meson-logs/*.txt" + type: text/plain + cat_dumps_script: + cores_script: - cat crashlog.txt || true dump_artifacts: @@ -354,12 +502,16 @@ task: tap_artifacts: path: "**/regress_log_*" type: text/plain + meson_test_artifacts: + path: "build/meson-logs/testlog.junit.xml" + type: text/xml + format: junit task: name: CompilerWarnings depends_on: - - Linux + - Linux Autoconf # task that did not run count as a success, so we need to recheck Linux' condition here :/ only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' container: -- 2.23.0.385.gbc12974a89 --qozqt6hocm2wibt2--