Meson rebuilds and reinstalls autoinc and refint libraries during regression tests.
Hello!
Accidentally I found that shared libraries autoinc.so and refint.so
rewrites in the "tmp_install" folder during the regression tests.
This happens because these libraries builds again for regression tests
purposes and rewrites by the "install_test_files" test [0]https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/src/test/regress/meson.build#L46.
I tried to change this bahavior, but there are few problems:
It seems, Meson doesn't have a function to just copy a file from one
build directory to another.
There is no way to install the product of the "shared_module()" function
into the two different locations.
"configure_file()" function in "copy mode" runs at setup time and cannot
be used.
"fs.copyfile()" function runs at build time, but I couldn't find the way
to start it after the building of necessary modules. So this function
fails with the "file not found" error. Also it needs the Meson version
= 0.64
And also there is no single cross platform copy program. I tried to use
"cp" on Linux and "cmd /c copy..." on Windows, but the code has
increased in size very much. Especially, after fixing the slash in the
return value of the "meson.current_build_dir()" function on Windows.
That slash arrives from the "subdir('src/test')" call [1]https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/meson.build#L3095.
To avoid double building of autoinc and refint libraries I suggest to
use the "custom_target()" Meson function and own copy program. The
"custom_target()" function can depends on contrib modules and use any
script to just a copy libraries to the regression tests build directory.
I included the patch which adds copy.py script into the regression tests
directory and uses it to "build" autoinc and refint modules.
What do you think?
Thanks!
Best regards, Roman Zharkov.
[0]: https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/src/test/regress/meson.build#L46
https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/src/test/regress/meson.build#L46
[1]: https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/meson.build#L3095
https://github.com/postgres/postgres/blob/f95da9f0e091ddbc5d50ec6c11be772da009b24e/meson.build#L3095
Attachments:
Avoid-rebuilding-of-spi-modules.patchtext/x-diff; name=Avoid-rebuilding-of-spi-modules.patchDownload
diff --git a/src/test/regress/copy.py b/src/test/regress/copy.py
new file mode 100644
index 0000000000000000000000000000000000000000..9996e64474649855606a8968cf2f3129e792042f
--- /dev/null
+++ b/src/test/regress/copy.py
@@ -0,0 +1,9 @@
+#! /usr/bin/env python3
+
+import sys
+import shutil
+
+if len(sys.argv) == 3:
+ shutil.copy(sys.argv[1], sys.argv[2])
+else:
+ raise Exception("this homemade copy program accepts two arguments")
diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build
index 5a9be73531e9c38595d7aabbd1b17d0d94c2a8fd..df010b7dc02bf46cfb2bc8c1a2df47fd83f1b598 100644
--- a/src/test/regress/meson.build
+++ b/src/test/regress/meson.build
@@ -43,23 +43,19 @@ regress_module = shared_module('regress',
)
test_install_libs += regress_module
-# Get some extra C modules from contrib/spi but mark them as not to be
-# installed.
-# FIXME: avoid the duplication.
-
-autoinc_regress = shared_module('autoinc',
- ['../../../contrib/spi/autoinc.c'],
- kwargs: pg_test_mod_args,
+autoinc_regress = custom_target('autoinc',
+ command: ['copy.py', autoinc.full_path(), meson.current_build_dir()],
+ output: fs.name(autoinc.full_path()),
+ depends: [autoinc],
+ build_by_default: true,
)
-test_install_libs += autoinc_regress
-refint_regress = shared_module('refint',
- ['../../../contrib/spi/refint.c'],
- c_args: refint_cflags,
- kwargs: pg_test_mod_args,
+refint_regress = custom_target('refint',
+ command: ['copy.py', refint.full_path(), meson.current_build_dir()],
+ output: fs.name(refint.full_path()),
+ depends: [refint],
+ build_by_default: true,
)
-test_install_libs += refint_regress
-
tests += {
'name': 'regress',
Hi,
On 2024-11-21 13:40:18 +0700, Zharkov Roman wrote:
What do you think?
What's the problem with the current approach? It's hard to believe the build
time of these modules is meaningful in any sort of way.
Greetings,
Andres Freund
Hello,
On 2024-11-21 22:59, Andres Freund wrote:
What's the problem with the current approach? It's hard to believe the
build
time of these modules is meaningful in any sort of way.
Thank you for your question! There are no real problems except my own
small trouble with checksums of installed binaries, which I have already
fixed.
I just tried to find a way to put these two libraries into the regress
build dir without rebuilding them. It seems to me, using the
"custom_target()" function is a litle bit pretty than calling the
"shared_module()" with hardcoded paths to the libraries sources. But I
don't like additional "copy.py" script and wonder if there is an
acceptable universal method to just copy a file?
Best regards, Roman Zharkov.