{"id":19913,"date":"2022-10-19T21:41:29","date_gmt":"2022-10-19T19:41:29","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=19913"},"modified":"2022-10-19T21:41:31","modified_gmt":"2022-10-19T19:41:31","slug":"meson-vs-make-postgresql-build-and-test-times","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/","title":{"rendered":"Meson vs. make: PostgreSQL build and test times"},"content":{"rendered":"\n<p>In the <a href=\"https:\/\/www.dbi-services.com\/blog\/building-postgresql-with-meson\/\" target=\"_blank\" rel=\"noreferrer noopener\">last post<\/a> we&#8217;ve looked into how you can build PostgreSQL with <a href=\"https:\/\/mesonbuild.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Meson<\/a> instead of the traditional way using configure\/make. The reason for this was a <a href=\"https:\/\/www.postgresql.org\/message-id\/flat\/20220809071055.rgikv3qn74ypnnbb%40awork3.anarazel.de#3c52f0debb4da1ff2c85cf2543bd8a4c\" target=\"_blank\" rel=\"noreferrer noopener\">thread on hackers<\/a> which described the downsides of the traditional approach and explained the advantages of using Meson. Some of the advantages mentioned were the time required for the build, readability of the output and decreased time to run the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/regress.html\" target=\"_blank\" rel=\"noreferrer noopener\">regression tests<\/a>. In this post we&#8217;ll run a few tests and check if this really improves the situation.<\/p>\n\n\n\n<p>All the test we&#8217;ll run are executed on an <a href=\"https:\/\/aws.amazon.com\/ec2\/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS EC2 instance<\/a>, the instance type is <a href=\"https:\/\/aws.amazon.com\/ec2\/instance-types\/\" target=\"_blank\" rel=\"noreferrer noopener\">c5.xlarge<\/a>. The operating system used is <a href=\"https:\/\/www.opensuse.org\/#Leap\" target=\"_blank\" rel=\"noreferrer noopener\">openSUSE Leap 15.4<\/a>. You might ask yourself: Why <a href=\"https:\/\/www.opensuse.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">openSUSE<\/a>? Because there are not only <a href=\"https:\/\/www.redhat.com\/en\" target=\"_blank\" rel=\"noreferrer noopener\">Red Hat<\/a> based distributions like <a href=\"https:\/\/www.redhat.com\/en\" target=\"_blank\" rel=\"noreferrer noopener\">Red Hat<\/a> itself, <a href=\"https:\/\/rockylinux.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rocky Linux<\/a>, <a href=\"https:\/\/almalinux.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Alma Linux<\/a>, or <a href=\"https:\/\/www.oracle.com\/linux\/\" target=\"_blank\" rel=\"noreferrer noopener\">Oracle Linux<\/a>. Because there are not only <a href=\"https:\/\/www.debian.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Debian<\/a> based distribution such as <a href=\"https:\/\/www.debian.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Debian<\/a> itself, <a href=\"https:\/\/ubuntu.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ubuntu<\/a> and all the other flavors. There is much more to choose from, and <a href=\"https:\/\/www.opensuse.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">openSUSE<\/a> is another great distribution, which usually is underrated. <\/p>\n\n\n\n<p>All the required packages have already been installed, we&#8217;ll not go into the details of this. The only preparations that have been done are this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&gt; git clone http:\/\/git.postgresql.org\/git\/postgresql.git\npostgres@opensuse-leap:~&gt; mv postgresql\/ postgresql-meson\npostgres@opensuse-leap:~&gt; cp -pr postgresql-meson postgresql-traditional\npostgres@opensuse-leap:~&gt; ls -l\ntotal 8\ndrwxr-xr-x 2 postgres postgres    6 Mar 15  2022 bin\ndrwxr-xr-x 7 postgres postgres 4096 Oct 18 19:30 postgresql-meson\ndrwxr-xr-x 7 postgres postgres 4096 Oct 18 19:30 postgresql-traditional\n<\/pre><\/div>\n\n\n<p>No magic here: The PostgreSQL source code was cloned and duplicated. There is no real reason to have the source code twice, this is just for readability of the scripts that follow. We can do the very same with just one copy of the source code. Note that the source code of PostgreSQL used here is the development version of PostgreSQL, <a href=\"https:\/\/www.postgresql.org\/ftp\/snapshot\/dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">currently 16devel<\/a>.<\/p>\n\n\n\n<p>We&#8217;ll start with the traditional way of building PostgreSQL, this is the script:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&gt; cat build-traditional.sh \n#!\/bin\/bash\n\ncd\n\nBUILD_SOURCE=&quot;\/home\/postgres\/postgresql-traditional&quot;\nBUILD_DIR=&quot;\/home\/postgres\/build-traditional&quot;\nPGHOME=&quot;\/home\/postgres\/\/pgsql-traditional&quot;\nSEGSIZE=2\nBLOCKSIZE=8\n\nrm -rf ${PGHOME}\nrm -rf ${BUILD_DIR}\nmkdir ${BUILD_DIR}\ncd ${BUILD_DIR}\n${BUILD_SOURCE}\/configure --prefix=${PGHOME} \\\n                          --exec-prefix=${PGHOME} \\\n                          --bindir=${PGHOME}\/bin \\\n                          --libdir=${PGHOME}\/lib \\\n                          --sysconfdir=${PGHOME}\/etc \\\n                          --includedir=${PGHOME}\/include \\\n                          --datarootdir=${PGHOME}\/share \\\n                          --datadir=${PGHOME}\/share \\\n                          --with-pgport=5432 \\\n                          --with-perl \\\n                          --with-python \\\n                          --with-openssl \\\n                          --with-pam \\\n                          --with-ldap \\\n                          --with-libxml \\\n                          --with-libxslt \\\n                          --with-segsize=${SEGSIZE} \\\n                          --with-blocksize=${BLOCKSIZE} \\\n                          --with-llvm LLVM_CONFIG=&#039;\/usr\/bin\/llvm-config&#039; \\\n                          --with-uuid=ossp \\\n                          --with-lz4 \\\n                          --with-zstd \\\n                          --with-gssapi \\\n                          --with-systemd \\\n                          --with-icu \\\n                          --with-system-tzdata=\/usr\/share\/zoneinfo\nmake -j 6 all\nmake -j 6 install\ncd contrib\nmake -j 6 install\n<\/pre><\/div>\n\n\n<p>The reason we go for 6 jobs is, that <a href=\"https:\/\/ninja-build.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ninja<\/a>, which is used later by Meson, defaults to 6 jobs on this system as well:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,13]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&gt; ninja --help\nusage: ninja &#x5B;options] &#x5B;targets...]\n\nif targets are unspecified, builds the &#039;default&#039; target (see manual).\n\noptions:\n  --version      print ninja version (&quot;1.10.0&quot;)\n  -v, --verbose  show all command lines while building\n\n  -C DIR   change to DIR before doing anything else\n  -f FILE  specify input build file &#x5B;default=build.ninja]\n\n  -j N     run N jobs in parallel (0 means infinity) &#x5B;default=6 on this system]\n  -k N     keep going until N jobs fail (0 means infinity) &#x5B;default=1]\n  -l N     do not start new jobs if the load average is greater than N\n  -n       dry run (don&#039;t run commands but act like they succeeded)\n\n  -d MODE  enable debugging (use &#039;-d list&#039; to list modes)\n  -t TOOL  run a subtool (use &#039;-t list&#039; to list subtools)\n    terminates toplevel options; further flags are passed to the tool\n  -w FLAG  adjust warnings (use &#039;-w list&#039; to list warnings)\n<\/pre><\/div>\n\n\n<p>Lets execute this three times and record the time it took for each build:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2,5,6,9,10]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&gt; time .\/build-traditional.sh\nreal    3m13.077s\nuser    9m54.203s\nsys     1m0.454s\npostgres@opensuse-leap:~&gt; time .\/build-traditional.sh\nreal    3m12.056s\nuser    9m55.699s\nsys     1m0.765s\npostgres@opensuse-leap:~&gt; time .\/build-traditional.sh\nreal    3m12.199s\nuser    9m57.002s\nsys     1m0.192s\n<\/pre><\/div>\n\n\n<p>Quite consistent at 3 minutes and 12\/13 seconds. This already is not so bad.<\/p>\n\n\n\n<p>Lets see how Meson is performing. This is the script:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&amp;gt; cat build-meson.sh \n#!\/bin\/bash\n\ncd\n\nBUILD_SOURCE=&quot;\/home\/postgres\/postgresql-meson&quot;\nBUILD_DIR=&quot;\/home\/postgres\/build-meson&quot;\nPGHOME=&quot;\/home\/postgres\/\/pgsql-meson&quot;\nSEGSIZE=2\nBLOCKSIZE=8\n\nrm -rf ${PGHOME}\nrm -rf ${BUILD_DIR}\nmkdir ${BUILD_DIR}\ncd ${BUILD_DIR}\n\nmeson setup . ${BUILD_SOURCE}\nmeson configure -Dprefix=${PGHOME} \\\n                -Dbindir=${PGHOME}\/bin \\\n                -Ddatadir=${PGHOME}\/share \\\n                -Dincludedir=${PGHOME}\/include \\\n                -Dlibdir=${PGHOME}\/lib \\\n                -Dsysconfdir=${PGHOME}\/etc \\\n                -Dpgport=5432 \\\n                -Dplperl=enabled \\\n                -Dplpython=enabled \\\n                -Dssl=openssl \\\n                -Dpam=enabled \\\n                -Dldap=enabled \\\n                -Dlibxml=enabled \\\n                -Dlibxslt=enabled \\\n                -Dsegsize=${SEGSIZE} \\\n                -Dblocksize=${BLOCKSIZE} \\\n                -Dllvm=enabled \\\n                -Duuid=ossp \\\n                -Dzstd=enabled \\\n                -Dlz4=enabled \\\n                -Dgssapi=enabled \\\n                -Dsystemd=enabled \\\n                -Dicu=enabled \\\n                -Dsystem_tzdata=\/usr\/share\/zoneinfo\nninja\nninja install\n<\/pre><\/div>\n\n\n<p>Same procedure, three times in a row:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,2,5,6,9,10]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~&gt; time .\/build-meson.sh \nreal    2m15.689s\nuser    7m14.784s\nsys     0m38.827s\npostgres@opensuse-leap:~&gt; time .\/build-meson.sh \nreal    2m14.565s\nuser    7m13.626s\nsys     0m39.631s\npostgres@opensuse-leap:~&gt; time .\/build-meson.sh \nreal    2m15.287s\nuser    7m14.789s\nsys     0m39.323s\n<\/pre><\/div>\n\n\n<p>Almost a minute less, which is a nice improvement. This does not seem to be much if you only build once in a while, but if you build often I am sure you&#8217;ll appreciate the time savings. What makes it even more impressive is that you can change build options without re-configuring the whole tree. Lets say you want to rebuild with <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linux_PAM\" target=\"_blank\" rel=\"noreferrer noopener\">PAM<\/a> disabled. All you need to do is this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [12]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~\/build-meson&gt; time meson configure \\\n&gt;      -Dprefix=${PGHOME} \\\n&gt;      -Dbindir=${PGHOME}\/bin \\\n&gt;      -Ddatadir=${PGHOME}\/share \\\n&gt;      -Dincludedir=${PGHOME}\/include \\\n&gt;      -Dlibdir=${PGHOME}\/lib \\\n&gt;      -Dsysconfdir=${PGHOME}\/etc \\\n&gt;      -Dpgport=5432 \\\n&gt;      -Dplperl=enabled \\\n&gt;      -Dplpython=enabled \\\n&gt;      -Dssl=openssl \\\n&gt;      -Dpam=disabled \\\n&gt;      -Dldap=enabled \\\n&gt;      -Dlibxml=enabled \\\n&gt;      -Dlibxslt=enabled \\\n&gt;      -Dsegsize=${SEGSIZE} \\\n&gt;      -Dblocksize=${BLOCKSIZE} \\\n&gt;      -Dllvm=enabled \\\n&gt;      -Duuid=ossp \\\n&gt;      -Dzstd=enabled \\\n&gt;      -Dlz4=enabled \\\n&gt;      -Dgssapi=enabled \\\n&gt;      -Dsystemd=enabled \\\n&gt;      -Dicu=enabled \\\n&gt;      -Dsystem_tzdata=\/usr\/share\/zoneinfo\n\nreal    0m0.331s\nuser    0m0.307s\nsys     0m0.021s\n\n<\/pre><\/div>\n\n\n<p>This is an almost immediate change and after rebuilding you have what you want:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,14,16,17,18]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~\/build-meson&gt; ninja\n...\n  External libraries\n    bonjour                  : NO\n    bsd_auth                 : NO\n    gss                      : YES 1.19.2\n    icu                      : YES 65.1\n    ldap                     : YES\n    libxml                   : YES 2.9.14\n    libxslt                  : YES 1.1.34\n    llvm                     : YES 13.0.1\n    lz4                      : YES 1.9.3\n    nls                      : YES\n    pam                      : NO\n...\npostgres@opensuse-leap:~\/build-meson&gt; ninja install\npostgres@opensuse-leap:~&gt; cd\npostgres@opensuse-leap:~&gt; pgsql-meson\/bin\/pg_config | grep -i pam\npostgres@opensuse-leap:~&gt; \n<\/pre><\/div>\n\n\n<p>This save the whole &#8220;configure&#8221; phase of the traditional build process.<\/p>\n\n\n\n<p>Finally, lets look at the regression tests. With the traditional build system it goes like this (again, three times in a row):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,5,9,11,15,17]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~\/build-traditional&gt; pwd\n\/home\/postgres\/build-traditional\npostgres@opensuse-leap:~\/build-traditional&gt; time make -j 6 check-world &gt;\/dev\/null\n...\nreal    1m7.388s\nuser    1m8.953s\nsys     0m23.537s\n\npostgres@opensuse-leap:~\/build-traditional&gt; time make -j 6 check-world &gt;\/dev\/null\n...\nreal    0m59.688s\nuser    0m59.238s\nsys     0m21.616s\n\npostgres@opensuse-leap:~\/build-traditional&gt; time make -j 6 check-world&gt;\/dev\/null\n...\nreal    1m2.093s\nuser    0m59.820s\nsys     0m21.880s\n<\/pre><\/div>\n\n\n<p>For the Meson build it looks like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,7,9,13,15]; title: ; notranslate\" title=\"\">\npostgres@opensuse-leap:~\/build-meson&gt; time meson test\n...\nreal    1m5.175s\nuser    0m48.452s\nsys     0m18.157s\n\npostgres@opensuse-leap:~\/build-meson&gt; time meson test\n...\nreal    1m4.979s\nuser    0m49.441s\nsys     0m18.468s\n\npostgres@opensuse-leap:~\/build-meson&gt; time meson test\n...\nreal    1m4.494s\nuser    0m49.510s\nsys     0m17.946s\n<\/pre><\/div>\n\n\n<p>There is not much difference here, but the important point is the readability of the output. For make it looks like this all over the output:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n...\nrunning on port 61696 with PID 8991\n============== creating database &quot;contrib_regression&quot; ==============\nCREATE DATABASE\nALTER DATABASE\nALTER DATABASE\nALTER DATABASE\nALTER DATABASE\nALTER DATABASE\nALTER DATABASE\n============== installing ltree                       ==============\nCREATE EXTENSION\n============== running regression test queries        ==============\ntest ltree_plpython               ... ok           31 ms\n============== shutting down postmaster               ==============\n============== removing temporary instance            ==============\n\n=====================\n All 1 tests passed. \n=====================\n\nmake&#x5B;2]: Leaving directory &#039;\/home\/postgres\/build-traditional\/contrib\/ltree_plpython&#039;\nok          407 ms\ntest concurrent_ddl_dml           ... ok          392 ms\ntest oldest_xmin                  ... ok          220 ms\ntest snapshot_transfer            ... ok           23 ms\ntest subxact_without_top          ... ok           21 ms\ntest concurrent_stream            ... ok          172 ms\ntest twophase_snapshot            ... ok          406 ms\ntest slot_creation_error          ... ok          204 ms\ntest catalog_change_snapshot      ... ok           35 ms\n============== shutting down postmaster               ==============\n============== removing temporary instance            ==============\n\n======================\n All 11 tests passed. \n======================\n...\n<\/pre><\/div>\n\n\n<p>Compare that to the output of Meson:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n 1\/80 postgresql:setup \/ tmp_install                                       OK                0.60s\n 2\/80 postgresql:plpgsql \/ plpgsql\/regress                                 OK                3.53s\n 3\/80 postgresql:plperl \/ plperl\/regress                                   OK                2.90s\n 4\/80 postgresql:plpython \/ plpython\/regress                               OK                4.61s\n 5\/80 postgresql:adminpack \/ adminpack\/regress                             OK                2.03s\n 6\/80 postgresql:amcheck \/ amcheck\/regress                                 OK                3.63s\n 7\/80 postgresql:basic_archive \/ basic_archive\/regress                     OK                1.93s\n 8\/80 postgresql:snapshot_too_old \/ snapshot_too_old\/isolation             OK               20.24s\n 9\/80 postgresql:bloom \/ bloom\/regress                                     OK                3.03s\n10\/80 postgresql:main \/ main\/regress                                       OK               22.59s\n11\/80 postgresql:bool_plperl \/ bool_plperl\/regress                         OK                2.49s\n12\/80 postgresql:btree_gin \/ btree_gin\/regress                             OK                2.43s\n13\/80 postgresql:citext \/ citext\/regress                                   OK                1.99s\n14\/80 postgresql:btree_gist \/ btree_gist\/regress                           OK                2.94s\n15\/80 postgresql:cube \/ cube\/regress                                       OK                2.01s\n16\/80 postgresql:dblink \/ dblink\/regress                                   OK                1.95s\n17\/80 postgresql:dict_int \/ dict_int\/regress                               OK                1.81s\n18\/80 postgresql:dict_xsyn \/ dict_xsyn\/regress                             OK                1.84s\n19\/80 postgresql:earthdistance \/ earthdistance\/regress                     OK                1.93s\n20\/80 postgresql:file_fdw \/ file_fdw\/regress                               OK                1.86s\n21\/80 postgresql:fuzzystrmatch \/ fuzzystrmatch\/regress                     OK                1.80s\n22\/80 postgresql:hstore_plperl \/ hstore_plperl\/regress                     OK                1.92s\n23\/80 postgresql:hstore \/ hstore\/regress                                   OK                2.56s\n24\/80 postgresql:hstore_plpython \/ hstore_plpython\/regress                 OK                1.91s\n25\/80 postgresql:isn \/ isn\/regress                                         OK                2.07s\n26\/80 postgresql:jsonb_plperl \/ jsonb_plperl\/regress                       OK                1.91s\n27\/80 postgresql:main \/ main\/isolation                                     OK               34.31s\n28\/80 postgresql:intarray \/ intarray\/regress                               OK                3.43s\n29\/80 postgresql:jsonb_plpython \/ jsonb_plpython\/regress                   OK                1.95s\n30\/80 postgresql:lo \/ lo\/regress                                           OK                2.04s\n31\/80 postgresql:ltree_plpython \/ ltree_plpython\/regress                   OK                1.82s\n32\/80 postgresql:ltree \/ ltree\/regress                                     OK                2.17s\n33\/80 postgresql:pageinspect \/ pageinspect\/regress                         OK                2.09s\n34\/80 postgresql:passwordcheck \/ passwordcheck\/regress                     OK                1.82s\n35\/80 postgresql:pg_buffercache \/ pg_buffercache\/regress                   OK                1.79s\n36\/80 postgresql:pg_freespacemap \/ pg_freespacemap\/regress                 OK                1.77s\n37\/80 postgresql:pgcrypto \/ pgcrypto\/regress                               OK                2.70s\n38\/80 postgresql:pgrowlocks \/ pgrowlocks\/isolation                         OK                1.83s\n39\/80 postgresql:pg_stat_statements \/ pg_stat_statements\/regress           OK                1.84s\n40\/80 postgresql:pgstattuple \/ pgstattuple\/regress                         OK                1.90s\n41\/80 postgresql:pg_surgery \/ pg_surgery\/regress                           OK                1.90s\n42\/80 postgresql:pg_visibility \/ pg_visibility\/regress                     OK                1.83s\n43\/80 postgresql:pg_trgm \/ pg_trgm\/regress                                 OK                2.60s\n44\/80 postgresql:pg_walinspect \/ pg_walinspect\/regress                     OK                1.87s\n45\/80 postgresql:seg \/ seg\/regress                                         OK                1.86s\n46\/80 postgresql:tablefunc \/ tablefunc\/regress                             OK                1.85s\n47\/80 postgresql:tcn \/ tcn\/isolation                                       OK                1.86s\n48\/80 postgresql:postgres_fdw \/ postgres_fdw\/regress                       OK                4.41s\n49\/80 postgresql:tsm_system_rows \/ tsm_system_rows\/regress                 OK                1.80s\n50\/80 postgresql:tsm_system_time \/ tsm_system_time\/regress                 OK                1.84s\n51\/80 postgresql:test_decoding \/ test_decoding\/isolation                   OK                4.39s\n52\/80 postgresql:unaccent \/ unaccent\/regress                               OK                1.92s\n53\/80 postgresql:uuid-ossp \/ uuid-ossp\/regress                             OK                1.79s\n54\/80 postgresql:test_decoding \/ test_decoding\/regress                     OK                5.70s\n55\/80 postgresql:xml2 \/ xml2\/regress                                       OK                1.84s\n56\/80 postgresql:brin \/ brin\/isolation                                     OK                1.89s\n57\/80 postgresql:commit_ts \/ commit_ts\/regress                             OK                1.79s\n58\/80 postgresql:dummy_index_am \/ dummy_index_am\/regress                   OK                1.75s\n59\/80 postgresql:delay_execution \/ delay_execution\/isolation               OK                2.33s\n60\/80 postgresql:dummy_seclabel \/ dummy_seclabel\/regress                   OK                1.80s\n61\/80 postgresql:plsample \/ plsample\/regress                               OK                1.75s\n62\/80 postgresql:spgist_name_ops \/ spgist_name_ops\/regress                 OK                1.84s\n63\/80 postgresql:test_bloomfilter \/ test_bloomfilter\/regress               OK                1.96s\n64\/80 postgresql:test_copy_callbacks \/ test_copy_callbacks\/regress         OK                1.83s\n65\/80 postgresql:test_ddl_deparse \/ test_ddl_deparse\/regress               OK                2.11s\n66\/80 postgresql:test_extensions \/ test_extensions\/regress                 OK                1.91s\n67\/80 postgresql:test_ginpostinglist \/ test_ginpostinglist\/regress         OK                1.91s\n68\/80 postgresql:test_lfind \/ test_lfind\/regress                           OK                1.74s\n69\/80 postgresql:test_oat_hooks \/ test_oat_hooks\/regress                   OK                1.83s\n70\/80 postgresql:test_parser \/ test_parser\/regress                         OK                1.89s\n71\/80 postgresql:test_pg_dump \/ test_pg_dump\/regress                       OK                1.79s\n72\/80 postgresql:test_integerset \/ test_integerset\/regress                 OK                4.88s\n73\/80 postgresql:test_predtest \/ test_predtest\/regress                     OK                1.88s\n74\/80 postgresql:test_rbtree \/ test_rbtree\/regress                         OK                1.94s\n75\/80 postgresql:test_regex \/ test_regex\/regress                           OK                2.16s\n76\/80 postgresql:test_rls_hooks \/ test_rls_hooks\/regress                   OK                1.81s\n77\/80 postgresql:unsafe_tests \/ unsafe_tests\/regress                       OK                1.97s\n78\/80 postgresql:worker_spi \/ worker_spi\/regress                           OK                2.11s\n79\/80 postgresql:test_shm_mq \/ test_shm_mq\/regress                         OK                4.38s\n80\/80 postgresql:ecpg \/ ecpg\/ecpg                                          OK                3.49s\n\n\nOk:                 80  \nExpected Fail:      0   \nFail:               0   \nUnexpected Pass:    0   \nSkipped:            0   \nTimeout:            0   \n<\/pre><\/div>\n\n\n<p>This gives a much better overview. Instead of grepping through the individual test results, failed tests can easily be identified.<\/p>\n\n\n\n<p>There for sure is much more to explore with Meson, but that&#8217;s it for now.<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last post we&#8217;ve looked into how you can build PostgreSQL with Meson instead of the traditional way using configure\/make. The reason for this was a thread on hackers which described the downsides of the traditional approach and explained the advantages of using Meson. Some of the advantages mentioned were the time required for [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198],"tags":[2727,2602],"type_dbi":[],"class_list":["post-19913","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","tag-meson","tag-postgresql-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Meson vs. make: PostgreSQL build and test times - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Meson vs. make: PostgreSQL build and test times\" \/>\n<meta property=\"og:description\" content=\"In the last post we&#8217;ve looked into how you can build PostgreSQL with Meson instead of the traditional way using configure\/make. The reason for this was a thread on hackers which described the downsides of the traditional approach and explained the advantages of using Meson. Some of the advantages mentioned were the time required for [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-19T19:41:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-19T19:41:31+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Meson vs. make: PostgreSQL build and test times\",\"datePublished\":\"2022-10-19T19:41:29+00:00\",\"dateModified\":\"2022-10-19T19:41:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\"},\"wordCount\":548,\"commentCount\":0,\"keywords\":[\"Meson\",\"postgresql\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\",\"name\":\"Meson vs. make: PostgreSQL build and test times - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2022-10-19T19:41:29+00:00\",\"dateModified\":\"2022-10-19T19:41:31+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Meson vs. make: PostgreSQL build and test times\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Meson vs. make: PostgreSQL build and test times - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/","og_locale":"en_US","og_type":"article","og_title":"Meson vs. make: PostgreSQL build and test times","og_description":"In the last post we&#8217;ve looked into how you can build PostgreSQL with Meson instead of the traditional way using configure\/make. The reason for this was a thread on hackers which described the downsides of the traditional approach and explained the advantages of using Meson. Some of the advantages mentioned were the time required for [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/","og_site_name":"dbi Blog","article_published_time":"2022-10-19T19:41:29+00:00","article_modified_time":"2022-10-19T19:41:31+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Meson vs. make: PostgreSQL build and test times","datePublished":"2022-10-19T19:41:29+00:00","dateModified":"2022-10-19T19:41:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/"},"wordCount":548,"commentCount":0,"keywords":["Meson","postgresql"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/","url":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/","name":"Meson vs. make: PostgreSQL build and test times - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2022-10-19T19:41:29+00:00","dateModified":"2022-10-19T19:41:31+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/meson-vs-make-postgresql-build-and-test-times\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Meson vs. make: PostgreSQL build and test times"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/19913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=19913"}],"version-history":[{"count":23,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/19913\/revisions"}],"predecessor-version":[{"id":19979,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/19913\/revisions\/19979"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=19913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=19913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=19913"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=19913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}