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,
 subdir('contrib')
 
 subdir('src/test')
-subdir('src/interfaces/libpq/test')
 subdir('src/interfaces/ecpg/test')
 
 subdir('doc/src/sgml')
 
 # Copyright (c) 2022-2025, 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',
   install_dir: dir_data,
 )
 
+subdir('test')
 
 tests += {
   'name': 'libpq',
       'with_gssapi': gssapi.found() ? 'yes' : 'no',
       'with_krb_srvnam': 'postgres',
     },
+    'deps': libpq_test_deps,
   },
 }
 
 
 # Copyright (c) 2022-2025, PostgreSQL Global Development Group
 
+libpq_test_deps = []
+
 libpq_uri_regress_sources = files(
   'libpq_uri_regress.c',
 )
     '--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,
   }
     '--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