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

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

From
"matsumura.ryo@fujitsu.com"
Date:
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_regressfailed 
FAILED--Further testing stopped: system
/src/foo_project//installdir/lib/pgxs/src/makefiles/../../src/test/regress/pg_regressfailed 
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

Attachment

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

From
Michael Paquier
Date:
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

Attachment

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

From
"matsumura.ryo@fujitsu.com"
Date:
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

Attachment