From fcad56e3133c8d2e829f125c3d051eeb98474879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 5 Apr 2023 17:07:58 +0200 Subject: [PATCH 1/3] meson: Add glib_valgrind_suppressions variable to glib pkg-config file Various projects are running tests under valgrind, and they are using the GLib suppresions to avoid false-positive results. While this is stored in a well-known path for some years, and easy to figure out from the GLib prefix, it's better to expose it through a proper pkgconfig variable so that it's easy to get it from any build system. --- glib/meson.build | 7 ++++++- meson.build | 9 ++++++--- tools/meson.build | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/glib/meson.build b/glib/meson.build index da76fc005..71427012a 100644 --- a/glib/meson.build +++ b/glib/meson.build @@ -441,9 +441,14 @@ pkg.generate(libglib, subdirs : ['glib-2.0'], extra_cflags : ['-I${libdir}/glib-2.0/include'] + win32_cflags, variables : ['bindir=' + join_paths('${prefix}', get_option('bindir')), + 'datadir=' + join_paths('${prefix}', get_option('datadir')), 'glib_genmarshal=' + join_paths('${bindir}', 'glib-genmarshal'), 'gobject_query=' + join_paths('${bindir}', 'gobject-query'), - 'glib_mkenums=' + join_paths('${bindir}', 'glib-mkenums')], + 'glib_mkenums=' + join_paths('${bindir}', 'glib-mkenums'), + 'glib_valgrind_suppressions=' + join_paths('${datadir}', + valgrind_suppression_file_install_subdir, + fs.name(valgrind_suppression_file)), + ], version : glib_version, install_dir : glib_pkgconfigreldir, filebase : 'glib-2.0', diff --git a/meson.build b/meson.build index 3576c5e6f..f1a959fb1 100644 --- a/meson.build +++ b/meson.build @@ -9,6 +9,8 @@ project('glib', 'c', ] ) +fs = import('fs') + cc = meson.get_compiler('c') c_standards = {} @@ -175,9 +177,10 @@ add_test_setup('unstable_tests', # Allow the tests to be easily run under valgrind using --setup=valgrind valgrind = find_program('valgrind', required: false) -if valgrind.found() - suppression_file = files('tools' / 'glib.supp') +valgrind_suppression_file = files('tools' / 'glib.supp')[0] +valgrind_suppression_file_install_subdir = 'glib-2.0' / 'valgrind' +if valgrind.found() add_test_setup('valgrind', exclude_suites: [ 'no-valgrind', 'flaky' ], exe_wrapper: [ @@ -191,7 +194,7 @@ if valgrind.found() '--show-leak-kinds=definite,possible', '--show-error-list=yes', '--suppressions=@0@'.format(meson.project_source_root() / - '@0@'.format(suppression_file[0])), + '@0@'.format(valgrind_suppression_file)), ], env: common_test_env, timeout_multiplier: 20, diff --git a/tools/meson.build b/tools/meson.build index 2d4192e46..e80d4be98 100644 --- a/tools/meson.build +++ b/tools/meson.build @@ -17,8 +17,8 @@ endif if host_system != 'windows' # Install Valgrind suppression file (except on Windows, # as Valgrind is currently not supported on Windows) - install_data('glib.supp', - install_dir : get_option('datadir') / 'glib-2.0' / 'valgrind', + install_data(fs.name(valgrind_suppression_file), + install_dir : get_option('datadir') / valgrind_suppression_file_install_subdir, install_tag : 'devel', ) endif From ade79bcb5006c33d6f644cfe41d22d14728e585f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 14 Apr 2023 19:56:32 +0200 Subject: [PATCH 2/3] meson: Add tests for generated pkg-config files Ensure things are generated as we expect and avoid we regress on that. --- gio/tests/meson.build | 68 +++++++++++++++++++++++++++++++++++++++ glib/tests/meson.build | 31 ++++++++++++++++++ gmodule/tests/meson.build | 28 ++++++++++++++++ gthread/tests/meson.build | 19 +++++++++++ meson.build | 4 ++- 5 files changed, 149 insertions(+), 1 deletion(-) diff --git a/gio/tests/meson.build b/gio/tests/meson.build index b4a64926e..751bd6e9b 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -1096,4 +1096,72 @@ if installed_tests_enabled ) endif +if have_bash and have_pkg_config + prefix = get_option('prefix') + if prefix.endswith(':/') + prefix += '/' + endif + + pkg_config_tests = [ + 'pkg-config --validate gio-2.0', + 'test "$(pkg-config --modversion gio-2.0)" = "@0@"'.format(glib_version), + 'test "$(pkg-config --variable=prefix gio-2.0)" = "@0@"'.format( + get_option('prefix')), + 'test "$(pkg-config --variable=datadir gio-2.0)" = "@0@"'.format( + prefix / get_option('datadir')), + 'test "$(pkg-config --variable=schemasdir gio-2.0)" = "@0@"'.format( + prefix / get_option('datadir') / schemas_subdir), + 'test "$(pkg-config --variable=giomoduledir gio-2.0)" = "@0@"'.format( + get_option('gio_module_dir') != '' ? + prefix / get_option('gio_module_dir') : + prefix / get_option('libdir') / 'gio' / 'modules'), + ] + + gio_binaries = [ + 'gio', + 'gio-querymodules', + 'glib-compile-schemas', + 'glib-compile-resources', + 'gdbus', + 'gdbus-codegen', + 'gresource', + 'gsettings', + ] + + foreach binary: gio_binaries + pkg_config_tests += [ + 'test "$(pkg-config --variable=@0@ gio-2.0)" = "@1@"'.format( + binary.underscorify(), + prefix / get_option('bindir') / binary) + ] + endforeach + + test('gio-2.0-pkg-config', + bash, + args: [ '-xe', '-c', '\n'.join(pkg_config_tests) ], + suite: ['gio', 'no-valgrind', 'pkg-config'], + env: { + 'PKG_CONFIG_PATH': meson.project_build_root() / 'meson-private', + }, + ) + + platform_module = host_system == 'windows' ? 'gio-windows-2.0' : 'gio-unix-2.0' + pkg_config_tests = [ + 'pkg-config --validate ' + platform_module, + 'test "$(pkg-config --modversion @0@)" = "@1@"'.format(platform_module, + glib_version), + 'test "$(pkg-config --variable=prefix @0@)" = "@1@"'.format(platform_module, + get_option('prefix')), + ] + + test(platform_module + '-pkg-config', + bash, + args: [ '-xe', '-c', '\n'.join(pkg_config_tests) ], + suite: ['gio', 'no-valgrind', 'pkg-config'], + env: { + 'PKG_CONFIG_PATH': meson.project_build_root() / 'meson-private', + }, + ) +endif + subdir('services') diff --git a/glib/tests/meson.build b/glib/tests/meson.build index a90051076..2443bd4b0 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -490,3 +490,34 @@ if not meson.is_cross_build() and host_system != 'windows' endif endif +if have_bash and have_pkg_config + prefix = get_option('prefix') + if prefix.endswith(':/') + prefix += '/' + endif + test('glib-2.0-pkg-config', + bash, + args: [ + '-xe', '-c', + '\n'.join([ + 'pkg-config --validate glib-2.0', + 'test "$(pkg-config --modversion glib-2.0)" = "@0@"'.format(glib_version), + 'test "$(pkg-config --variable=prefix glib-2.0)" = "@0@"'.format( + get_option('prefix')), + 'test "$(pkg-config --variable=datadir glib-2.0)" = "@0@"'.format( + prefix / get_option('datadir')), + 'test "$(pkg-config --variable=gobject_query glib-2.0)" = "@0@"'.format( + prefix / get_option('bindir') / 'gobject-query'), + 'test "$(pkg-config --variable=glib_mkenums glib-2.0)" = "@0@"'.format( + prefix / get_option('bindir') / 'glib-mkenums'), + 'test "$(pkg-config --variable=glib_valgrind_suppressions glib-2.0)" = "@0@"'.format( + prefix / get_option('datadir') / + valgrind_suppression_file_install_subdir / fs.name(valgrind_suppression_file)), + ]), + ], + suite: ['glib', 'core', 'no-valgrind', 'pkg-config'], + env: { + 'PKG_CONFIG_PATH': meson.project_build_root() / 'meson-private', + }, + ) +endif diff --git a/gmodule/tests/meson.build b/gmodule/tests/meson.build index ec7eb68fd..5374c1c2a 100644 --- a/gmodule/tests/meson.build +++ b/gmodule/tests/meson.build @@ -124,3 +124,31 @@ foreach test_name, extra_args : gmodule_tests suite : suite, ) endforeach + +if have_bash and have_pkg_config + modules = [ + 'gmodule-no-export-2.0', + 'gmodule-export-2.0', + 'gmodule-2.0', + ] + + foreach module: modules + test(module + '-pkg-config', + bash, + args: [ + '-xe', '-c', + '\n'.join([ + 'pkg-config --validate ' + module, + 'test "$(pkg-config --modversion @0@)" = "@1@"'.format( + module, glib_version), + 'test "$(pkg-config --variable=prefix @0@)" = "@1@"'.format( + module, get_option('prefix')), + ]), + ], + suite: ['gmodule', 'no-valgrind', 'pkg-config'], + env: { + 'PKG_CONFIG_PATH': meson.project_build_root() / 'meson-private', + }, + ) + endforeach +endif diff --git a/gthread/tests/meson.build b/gthread/tests/meson.build index 53fb78e18..41fad1de4 100644 --- a/gthread/tests/meson.build +++ b/gthread/tests/meson.build @@ -52,3 +52,22 @@ foreach test_name, extra_args : gthread_tests suite : suite, ) endforeach + +if have_bash and have_pkg_config + test('gthread-2.0-pkg-config', + bash, + args: [ + '-xe', '-c', + '\n'.join([ + 'pkg-config --validate gthread-2.0', + 'test "$(pkg-config --modversion gthread-2.0)" = "@0@"'.format(glib_version), + 'test "$(pkg-config --variable=prefix gthread-2.0)" = "@0@"'.format( + get_option('prefix')), + ]), + ], + suite: ['gthread', 'no-valgrind', 'pkg-config'], + env: { + 'PKG_CONFIG_PATH': meson.project_build_root() / 'meson-private', + }, + ) +endif diff --git a/meson.build b/meson.build index f1a959fb1..e404a7faa 100644 --- a/meson.build +++ b/meson.build @@ -2287,9 +2287,11 @@ if not python_version.version_compare(python_version_req) endif # Determine which user environment-dependent files that we want to install -have_bash = find_program('bash', required : false).found() # For completion scripts +bash = find_program('bash', required : false) +have_bash = bash.found() # For completion scripts bash_comp_dep = dependency('bash-completion', version: '>=2.0', required: false) have_sh = find_program('sh', required : false).found() # For glib-gettextize +have_pkg_config = find_program('pkg-config', required: false).found() # Some installed tests require a custom environment env_program = find_program('env', required: installed_tests_enabled) From c2e46b37896a33bda1305694a47bf694b13bdf80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 14 Apr 2023 20:04:22 +0200 Subject: [PATCH 3/3] meson: cleanup pkg-config variables definitions Use more readable and shorter syntax --- gio/meson.build | 26 ++++++++++++++------------ glib/meson.build | 17 +++++++++-------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/gio/meson.build b/gio/meson.build index 462606f3b..b056546ed 100644 --- a/gio/meson.build +++ b/gio/meson.build @@ -877,18 +877,20 @@ libgio_dep = declare_dependency(link_with : libgio, pkg.generate(libgio, requires : ['glib-2.0', 'gobject-2.0'], - variables : ['datadir=' + join_paths('${prefix}', get_option('datadir')), - 'schemasdir=' + join_paths('${datadir}', schemas_subdir), - 'bindir=' + join_paths('${prefix}', get_option('bindir')), - 'giomoduledir=' + pkgconfig_giomodulesdir, - 'gio=' + join_paths('${bindir}', 'gio'), - 'gio_querymodules=@0@'.format(pkgconfig_multiarch_bindir / 'gio-querymodules'), - 'glib_compile_schemas=@0@'.format(pkgconfig_multiarch_bindir / 'glib-compile-schemas'), - 'glib_compile_resources=' + join_paths('${bindir}', 'glib-compile-resources'), - 'gdbus=' + join_paths('${bindir}', 'gdbus'), - 'gdbus_codegen=' + join_paths('${bindir}', 'gdbus-codegen'), - 'gresource=' + join_paths('${bindir}', 'gresource'), - 'gsettings=' + join_paths('${bindir}', 'gsettings')], + variables : [ + 'datadir=' + '${prefix}' / get_option('datadir'), + 'schemasdir=' + '${datadir}' / schemas_subdir, + 'bindir=' + '${prefix}' / get_option('bindir'), + 'giomoduledir=' + pkgconfig_giomodulesdir, + 'gio=' + '${bindir}' / 'gio', + 'gio_querymodules=' + pkgconfig_multiarch_bindir / 'gio-querymodules', + 'glib_compile_schemas=' + pkgconfig_multiarch_bindir / 'glib-compile-schemas', + 'glib_compile_resources=' + '${bindir}' / 'glib-compile-resources', + 'gdbus=' + '${bindir}' /'gdbus', + 'gdbus_codegen=' + '${bindir}' / 'gdbus-codegen', + 'gresource=' + '${bindir}' / 'gresource', + 'gsettings=' + '${bindir}' / 'gsettings', + ], version : glib_version, install_dir : glib_pkgconfigreldir, filebase : 'gio-2.0', diff --git a/glib/meson.build b/glib/meson.build index 71427012a..c62f94565 100644 --- a/glib/meson.build +++ b/glib/meson.build @@ -440,14 +440,15 @@ pkg.generate(libglib, libraries_private : [win32_ldflags], subdirs : ['glib-2.0'], extra_cflags : ['-I${libdir}/glib-2.0/include'] + win32_cflags, - variables : ['bindir=' + join_paths('${prefix}', get_option('bindir')), - 'datadir=' + join_paths('${prefix}', get_option('datadir')), - 'glib_genmarshal=' + join_paths('${bindir}', 'glib-genmarshal'), - 'gobject_query=' + join_paths('${bindir}', 'gobject-query'), - 'glib_mkenums=' + join_paths('${bindir}', 'glib-mkenums'), - 'glib_valgrind_suppressions=' + join_paths('${datadir}', - valgrind_suppression_file_install_subdir, - fs.name(valgrind_suppression_file)), + variables : [ + 'bindir=' + '${prefix}' / get_option('bindir'), + 'datadir=' + '${prefix}' / get_option('datadir'), + 'glib_genmarshal=' + '${bindir}' / 'glib-genmarshal', + 'gobject_query=' + '${bindir}' / 'gobject-query', + 'glib_mkenums=' + '${bindir}' / 'glib-mkenums', + 'glib_valgrind_suppressions=' + '${datadir}' / + valgrind_suppression_file_install_subdir / + fs.name(valgrind_suppression_file), ], version : glib_version, install_dir : glib_pkgconfigreldir,