[bugfix]"make installcheck" could not work in PGXS

Started by Ryo Matsumura (Fujitsu)about 6 years ago3 messageshackers
Beta feature

Hackorum builds and tests every patch posted to the lists, not only commitfest submissions. This is Hackorum's own CI rather than the PostgreSQL project's, and it is still under testing - please report anything that looks wrong.

won't retrysuccessCI history

You can run a PostgreSQL built from this patch straight from Docker, with no checkout and no build:

docker run --rm -p 5432:5432 ghcr.io/hackorum-dev/postgres-patch:t42740
psql -h localhost -U postgres

Built from patchset v3 (message #3), July 28, 2026 at 02:30 AM.

Every patchset is also pushed to a branch of our PostgreSQL fork, so you can check out the same tree CI built. Without a PostgreSQL checkout:

git clone --branch t42740_3 https://github.com/hackorum-dev/postgres.git

In a checkout you already have, add the fork once:

git remote add hackorum https://github.com/hackorum-dev/postgres.git

then, for this patchset and every later one:

git fetch hackorum t42740_3 && git checkout t42740_3

Patchset v3 (message #3) is on t42740_3

Jump to latest
#1Ryo Matsumura (Fujitsu)
matsumura.ryo@fujitsu.com

Hello,

I found that "make installcheck" could not work in PGXS.

--[/src/foo_project/Makefile]--
SUBDIRS = foo

TAP_TESTS = 1

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)

include $(PGXS)

$(recurse)
$(recurse_always)

--[/src/foo_project/t/001_foo_test.pl]
use strict;
use warnings;
use PostgresNode;
use TestLib;

# Replace with the number of tests to execute:
use Test::More tests => 1;

my $node = PostgresNode->get_new_node('primary');
$node->init; ## --> Bailout called in PostgresNode.pm that refers PG_REGRESS environment variable.

--[log]--
cd /src/foo_project
make installcheck
:
:
rm -rf '/src/foo_project'/tmp_check
/bin/mkdir -p '/src/foo_project'/tmp_check
cd ./ && TESTDIR='/src/foo_project' PATH="/installdir/bin:$PATH" PGPORT='65432' top_builddir='/src/foo_project//installdir/lib/pgxs/src/makefiles/../..' PG_REGRESS='/src/foo_project//installdir/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress' REGRESS_SHLIB='/src/test/regress/regress.so' /bin/prove -I /installdir/lib/pgxs/src/makefiles/../../src/test/perl/ -I ./ t/*.pl
t/001_foo_test.pl .... Bailout called. Further testing stopped: system /src/foo_project//installdir/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress failed
FAILED--Further testing stopped: system /src/foo_project//installdir/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress failed
make: *** [installcheck] Error 255

The cause is in [Makefile.global.in].
Althogh $(CURDIR) is '/src/foo_project' and $(top_builddir) is '/installdir/lib/pgxs',
the code concatenates them for setting PG_REGRESS.

``
define prove_installcheck
rm -rf '$(CURDIR)'/tmp_check
$(MKDIR_P) '$(CURDIR)'/tmp_check
cd $(srcdir) && TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' REGRESS_SHLIB='$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX)' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) $(if $(PROVE_TESTS),$(PROVE_TESTS),t/*.pl)
endef
``

In non-PGXS environment, top_builddir is a relative path against the top of postgresql source tree.
But, in PGXS, top_builddir is a absolute path like /installdir/lib/pgxs/src/makefiles intentionally.
The existing code of [Makefile.global.in] does not consider it.

I make a patch. (It may not to be smart.)
Please your comments.

Regards
Ryo Matsumura

Attachments:

bug_pgxs_installcheck.v1.patchapplication/octet-stream; name=bug_pgxs_installcheck.v1.patchDownload+7-0
#2Michael Paquier
michael@paquier.xyz
In reply to: Ryo Matsumura (Fujitsu) (#1)
Re: [bugfix]"make installcheck" could not work in PGXS

On Fri, Jul 31, 2020 at 08:31:56AM +0000, matsumura.ryo@fujitsu.com wrote:

I found that "make installcheck" could not work in PGXS.

Yeah, that's a known problem. One way to counter that is for example
to grab the path of pg_regress from pg_config --libdir and set
$ENV{PG_REGRESS} to it, but that's hacky. So I agree that it would be
good to do something.

In non-PGXS environment, top_builddir is a relative path against the top of postgresql source tree.
But, in PGXS, top_builddir is a absolute path like /installdir/lib/pgxs/src/makefiles intentionally.
The existing code of [Makefile.global.in] does not consider it.

I make a patch. (It may not to be smart.)
Please your comments.

Not sure that this goes completely to the right direction. It seems
to me that we should have room to set and use PG_REGRESS also for
pg_regress_check and pg_regress_installcheck.
--
Michael

#3Ryo Matsumura (Fujitsu)
matsumura.ryo@fujitsu.com
In reply to: Michael Paquier (#2)
RE: [bugfix]"make installcheck" could not work in PGXS

Hello,

On Fri, Aug 5, 2020 at 10:57:56 +0000, Michael Paquier <michael(at)paquier(dot)xyz> wrote:

Yeah, that's a known problem. One way to counter that is for example
to grab the path of pg_regress from pg_config --libdir and set
$ENV{PG_REGRESS} to it, but that's hacky. So I agree that it would be
good to do something.

Thank you.
I attach a new patch.

Not sure that this goes completely to the right direction. It seems
to me that we should have room to set and use PG_REGRESS also for
pg_regress_check and pg_regress_installcheck.

I understand that PG_REGRESS is an environment variable for each test program.
So I add a gmake variable PG_REGRESS_PATH.

The followings are other changings.
- Change REGRESS_SHLIB like as PG_REGRESS.
- Replace $(CURDIR)/$(top_builddir) to $(abs_top_builddir).
- Remove setting of environment variable 'top_builddir' in command line for prove_installcheck.
I wonder what I should set to it and then I remove it.
Because top_builddir is used for gmake genellaly not for test programs and PostgreSQL's test framework doesn't use it.
Is it going too far?

Regards
Ryo Matsumura

Attachments:

t42740_3
bug_pgxs_installcheck.v1.1.patchapplication/octet-stream; name=bug_pgxs_installcheck.v1.1.patchDownload+12-3