Hi,

On 2024-12-06 18:54:25 +0100, Peter Eisentraut wrote:
> On 05.12.24 21:10, Andres Freund wrote:
> > On 2024-12-05 20:08:24 +0100, Peter Eisentraut wrote:
> > > On 03.12.24 17:01, Andres Freund wrote:
> > > > On 2024-12-02 11:10:56 +0100, Peter Eisentraut wrote:
> > > > That's unfortunately a very partial fix - because we insist on tests 
> > > > being run
> > > > against a temporary install, we don't just need to rebuild the code, we 
> > > > also
> > > > need to re-install it.  Without that you don't, e.g., see server 
> > > > changes.
> > >
> > > Right, I was willing to accept that as a compromise, but see below.
> > >
> > > > However, it looks like the tmp_install test *does* miss dependencies 
> > > > too and I
> > > > see no reason to not fix that.
> > >
> > > > diff --git i/meson.build w/meson.build
> > > > index ff3848b1d85..55b751a0c6b 100644
> > > > --- i/meson.build
> > > > +++ w/meson.build
> > > > @@ -3263,6 +3263,7 @@ test('tmp_install',
> > > >        priority: setup_tests_priority,
> > > >        timeout: 300,
> > > >        is_parallel: false,
> > > > +    depends: all_built,
> > > >        suite: ['setup'])
> > > >
> > > >    test('install_test_files',
> > >
> > > Yes, that addresses my cube example.
> >
> > Let's do that. I'm inclined to only do so on master, but I can also see
> > backpatching it. Arguments?
>
> master is enough for me.

This doesn't actually make that much difference. But only really kinda by
accident, so I'm still planning to apply a patch improving this.

If a test target does not have ay dependency 'meson test' treats it has having
a dependency on the project default test. Which in turn currently includes
everything that will be installed, i.e. everything that tmp_install might
need. But that's not something I think we should rely on going forward.


Attached is a series that:

- Reduces the dependencies of the 'install-quiet' target, to not build
  e.g. ecpg tests

- Fixes the dependencies of tmp_install test more precise

- Fixes dependencies for ecpg's tests

- Fixes dependencies for test_json_parser's (slightly evolved version of
  yours)

- Fixes dependencies for libpq_pipeline

- Fixes dependencies for libpq's tests


The last case was a bit less fun to fix.

To have correct dependencies, the libpq tests need a dependency on
libpq_uri_regress and libpq_testclient. But until now that was hard to do,
because src/interfaces/libpq/test is entered from the top-level:

  # test/ is entered via top-level meson.build, that way it can use the default
  # args for executables (which depend on libpq).

At the top-level we have:
  subdir('src/interfaces/libpq')
  # fe_utils depends on libpq
  subdir('src/fe_utils')

  # for frontend binaries
  frontend_code = declare_dependency(
    include_directories: [postgres_inc],
    link_with: [fe_utils, common_static, pgport_static],
    sources: generated_headers,
    dependencies: [os_deps, libintl],
  )

and the test binaries currently use frontend_code.


The least bad fix that I could see was to introduce, at the top-level,
frontend_no_fe_utils_code, which can be defined before we get to libpq/. That
in turn allows us to recurse into libpq/test from within libpq/meson.build,
which allows us to define the tests with proper dependencies.


With all of these applied
  ninja clean && ninja meson-test-prereq && m test --no-rebuild

passes, which doesn't guarantee that *all* dependencies are correctly
declared, but certainly is better than where we were before.

Greetings,

Andres Freund
>From dff957eb1b5f0c45e552affede99b3585bbcca00 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 14:33:29 -0500
Subject: [PATCH v1 1/6] meson: Narrow dependencies for 'install-quiet' target

Previously test dependencies, which are not actually installed, were
unnecessarily built.

Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
 meson.build | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index e5ce437a5c7..87ba82b27b0 100644
--- a/meson.build
+++ b/meson.build
@@ -3185,24 +3185,30 @@ if libintl.found() and meson.version().version_compare('>=0.60')
 endif
 
 
-all_built = [
+# all targets that 'meson install' needs
+installed_targets = [
   backend_targets,
   bin_targets,
   libpq_st,
   pl_targets,
   contrib_targets,
   nls_mo_targets,
-  testprep_targets,
   ecpg_targets,
 ]
 
+# all targets that require building code
+all_built = [
+  installed_targets,
+  testprep_targets,
+]
+
 # Meson's default install target is quite verbose. Provide one that is quiet.
 install_quiet = custom_target('install-quiet',
   output: 'install-quiet',
   build_always_stale: true,
   build_by_default: false,
   command: [meson_bin, meson_args, 'install', '--quiet', '--no-rebuild'],
-  depends: all_built,
+  depends: installed_targets,
 )
 
 # Target to install files used for tests, which aren't installed by default
-- 
2.45.2.746.g06e570c0df.dirty

>From fdf058d1b9255ee76dfa7129d4e7d9c4e9a726b6 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 14:29:03 -0500
Subject: [PATCH v1 2/6] meson: Improve dependencies for tmp_install test
 target

The missing dependency was, e.g., visible when doing
  ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite cube
because meson (and thus its internal meson-test-prereq target) did not know
about a lot of the required targets.

Previously tmp_install did not actually depend on the relevant files being
built. That was mostly not visible, because "meson test" currently uses the
'default' targets as a test's dependency if no dependency is specified.
However, there are plans to narrow that on the meson side, to make it quicker
to run tests.

Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a...@eisentraut.org
---
 meson.build | 1 +
 1 file changed, 1 insertion(+)

diff --git a/meson.build b/meson.build
index 87ba82b27b0..e74b1b9b161 100644
--- a/meson.build
+++ b/meson.build
@@ -3263,6 +3263,7 @@ test('tmp_install',
     priority: setup_tests_priority,
     timeout: 300,
     is_parallel: false,
+    depends: installed_targets,
     suite: ['setup'])
 
 test('install_test_files',
-- 
2.45.2.746.g06e570c0df.dirty

>From d6e6e0a23638d7860545c9ff2bf0ccd752885e83 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 14:22:18 -0500
Subject: [PATCH v1 3/6] meson: Add pg_regress_ecpg to ecpg test dependencies

This is required to ensure correct test dependencies, previously
pg_regress_ecpg would not necessarily be built.

The missing dependency was, e.g., visible when doing
  ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite ecpg

Author:
Reviewed-by:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/interfaces/ecpg/test/meson.build | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build
index 8fd284071f2..c10c653cd82 100644
--- a/src/interfaces/ecpg/test/meson.build
+++ b/src/interfaces/ecpg/test/meson.build
@@ -5,6 +5,8 @@ if meson.is_cross_build()
   subdir_done()
 endif
 
+ecpg_test_dependencies = []
+
 pg_regress_ecpg_sources = pg_regress_c + files(
   'pg_regress_ecpg.c',
 )
@@ -23,7 +25,7 @@ pg_regress_ecpg = executable('pg_regress_ecpg',
     'install': false
   },
 )
-testprep_targets += pg_regress_ecpg
+ecpg_test_dependencies += pg_regress_ecpg
 
 # create .c files and executables from .pgc files
 ecpg_test_exec_kw = {
@@ -51,8 +53,6 @@ ecpg_preproc_test_command_end = [
   '-o', '@OUTPUT@', '@INPUT@'
 ]
 
-ecpg_test_dependencies = []
-
 subdir('compat_informix')
 subdir('compat_oracle')
 subdir('connect')
-- 
2.45.2.746.g06e570c0df.dirty

>From 88c0e3f9f6ea1f1aad4c5de4436ebde40a9c4c7e Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 15:00:35 -0500
Subject: [PATCH v1 4/6] meson: Add test dependencies for test_json_parser

This is required to ensure correct test dependencies, previously
the test binaries would not necessarily be built.

The missing dependency was, e.g., visible when doing
  ninja clean && ninja meson-test-prereq && m test --no-rebuild --suite setup --suite test_json_parser

Author: Peter Eisentraut <pe...@eisentraut.org>
Author: Andres Freund <and...@anarazel.de>
Discussion: https://postgr.es/m/bdba588f-69a9-4f3e-9b95-62d07210a...@eisentraut.org
---
 src/test/modules/test_json_parser/meson.build | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/test/modules/test_json_parser/meson.build b/src/test/modules/test_json_parser/meson.build
index 059a8b71bde..1bc10f11bbf 100644
--- a/src/test/modules/test_json_parser/meson.build
+++ b/src/test/modules/test_json_parser/meson.build
@@ -61,5 +61,10 @@ tests += {
       't/003_test_semantic.pl',
       't/004_test_parser_perf.pl'
     ],
+    'deps': [
+      test_json_parser_incremental,
+      test_json_parser_incremental_shlib,
+      test_json_parser_perf,
+    ],
   },
 }
-- 
2.45.2.746.g06e570c0df.dirty

>From 23e9200b266093cd65f895b647af76b867d71d86 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 14:41:20 -0500
Subject: [PATCH v1 5/6] meson: Add missing dependencies to libpq_pipeline test

The missing dependency was, e.g., visible when doing
  ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite libpq_pipeline
---
 src/test/modules/libpq_pipeline/meson.build | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build
index 727963ee686..43beda411ce 100644
--- a/src/test/modules/libpq_pipeline/meson.build
+++ b/src/test/modules/libpq_pipeline/meson.build
@@ -27,5 +27,6 @@ tests += {
     'tests': [
       't/001_libpq_pipeline.pl',
     ],
+    'deps': [libpq_pipeline],
   },
 }
-- 
2.45.2.746.g06e570c0df.dirty

>From 14aefeae08975198abc73a073b15559e73ac3774 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 7 Dec 2024 15:30:21 -0500
Subject: [PATCH v1 6/6] meson: Add missing dependencies for libpq tests

The missing dependency was, e.g., visible when doing
  ninja clean && ninja meson-test-prereq && meson test --no-rebuild --suite setup --suite libpq

This is a bit more complicated than other related fixes, because until now
libpq's tests depended on 'frontend_code', which includes a dependency on
fe_utils, which in turns on libpq. That in turn required
src/interfaces/libpq/test to be entered from the top-level, not from
libpq/meson.build.  Because of that the test definitions in libpq/meson.build
could not declare a dependency on the binaries defined in
libpq/test/meson.build.

To fix this, this commit creates frontend_no_fe_utils_code, which allows us to
recurse into libpq/test from withing libpq/meson.build.
---
 meson.build                           | 11 ++++++++++-
 src/interfaces/libpq/meson.build      |  5 ++---
 src/interfaces/libpq/test/meson.build | 12 ++++++++----
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/meson.build b/meson.build
index e74b1b9b161..d25070979a1 100644
--- a/meson.build
+++ b/meson.build
@@ -3024,6 +3024,16 @@ frontend_shlib_code = declare_dependency(
   dependencies: [shlib_code, os_deps, libintl],
 )
 
+# for frontend code that doesn't use fe_utils - this mainly exists for libpq's
+# tests, which are defined before fe_utils is defined, as fe_utils depends on
+# libpq.
+frontend_no_fe_utils_code = declare_dependency(
+  include_directories: [postgres_inc],
+  link_with: [common_static, pgport_static],
+  sources: generated_headers,
+  dependencies: [os_deps, libintl],
+)
+
 # Dependencies both for static and shared libpq
 libpq_deps += [
   thread_dep,
@@ -3091,7 +3101,6 @@ subdir('src')
 subdir('contrib')
 
 subdir('src/test')
-subdir('src/interfaces/libpq/test')
 subdir('src/interfaces/ecpg/test')
 
 subdir('doc/src/sgml')
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index ed2a4048d18..57fe8c3eaec 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -1,8 +1,5 @@
 # Copyright (c) 2022-2024, PostgreSQL Global Development Group
 
-# test/ is entered via top-level meson.build, that way it can use the default
-# args for executables (which depend on libpq).
-
 libpq_sources = files(
   'fe-auth-scram.c',
   'fe-auth.c',
@@ -107,6 +104,7 @@ install_data('pg_service.conf.sample',
   install_dir: dir_data,
 )
 
+subdir('test')
 
 tests += {
   'name': 'libpq',
@@ -125,6 +123,7 @@ tests += {
       'with_gssapi': gssapi.found() ? 'yes' : 'no',
       'with_krb_srvnam': 'postgres',
     },
+    'deps': libpq_test_deps,
   },
 }
 
diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build
index 21dd37f69bc..16c0c00b6bc 100644
--- a/src/interfaces/libpq/test/meson.build
+++ b/src/interfaces/libpq/test/meson.build
@@ -1,5 +1,7 @@
 # Copyright (c) 2022-2024, PostgreSQL Global Development Group
 
+libpq_test_deps = []
+
 libpq_uri_regress_sources = files(
   'libpq_uri_regress.c',
 )
@@ -10,9 +12,9 @@ if host_system == 'windows'
     '--FILEDESC', 'libpq test program',])
 endif
 
-testprep_targets += executable('libpq_uri_regress',
+libpq_test_deps += executable('libpq_uri_regress',
   libpq_uri_regress_sources,
-  dependencies: [frontend_code, libpq],
+  dependencies: [frontend_no_fe_utils_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
@@ -29,10 +31,12 @@ if host_system == 'windows'
     '--FILEDESC', 'libpq test program',])
 endif
 
-testprep_targets += executable('libpq_testclient',
+libpq_test_deps += executable('libpq_testclient',
   libpq_testclient_sources,
-  dependencies: [frontend_code, libpq],
+  dependencies: [frontend_no_fe_utils_code, libpq],
   kwargs: default_bin_args + {
     'install': false,
   }
 )
+
+testprep_targets += libpq_test_deps
-- 
2.45.2.746.g06e570c0df.dirty

Reply via email to