Thread: Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.hheaders.

Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.hheaders.

From
Michael Paquier
Date:
On Sun, Apr 08, 2018 at 06:35:39PM +0000, Tom Lane wrote:
> Merge catalog/pg_foo_fn.h headers back into pg_foo.h headers.
>
> Traditionally, include/catalog/pg_foo.h contains extern declarations
> for functions in backend/catalog/pg_foo.c, in addition to its function
> as the authoritative definition of the pg_foo catalog's rowtype.
> In some cases, we'd been forced to split out those extern declarations
> into separate pg_foo_fn.h headers so that the catalog definitions
> could be #include'd by frontend code.  That problem is gone as of
> commit 9c0a0de4c, so let's undo the splits to make things less
> confusing.

This patch or one of its relatives has visibly broken parallel builds
for me. "make -j 4 install" directly called after a configure complains:
In file included from ../../src/include/catalog/catalog.h:22:0,
                 from relpath.c:21:
../../src/include/catalog/pg_class.h:22:10: fatal error: catalog/pg_class_d.h: No such file or directory
 #include "catalog/pg_class_d.h"
          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

I did not take the time to look into the problem, that's just a head's
up.  I am on HEAD at b3b7f789 so it is not like I lack any fixes.
Please note that "make -j 4" directly called works.
--
Michael

Attachment
Michael Paquier <michael@paquier.xyz> writes:
> On Sun, Apr 08, 2018 at 06:35:39PM +0000, Tom Lane wrote:
>> Merge catalog/pg_foo_fn.h headers back into pg_foo.h headers.

> This patch or one of its relatives has visibly broken parallel builds
> for me. "make -j 4 install" directly called after a configure complains:

Hm.  I'd tested "make -j all", but not going directly to "install".
Does it help if you add

$(SUBDIRS:%=install-%-recurse): | submake-generated-headers

to src/Makefile?

(That seems like a bit of a brute-force solution, though.  Anybody
have a better answer?)

            regards, tom lane


Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.hheaders.

From
Michael Paquier
Date:
On Sun, Apr 08, 2018 at 11:05:09PM -0400, Tom Lane wrote:
> Hm.  I'd tested "make -j all", but not going directly to "install".
> Does it help if you add
>
> $(SUBDIRS:%=install-%-recurse): | submake-generated-headers
>
> to src/Makefile?
>
> (That seems like a bit of a brute-force solution, though.  Anybody
> have a better answer?)

That takes care of the problem from the root of the directory, but when
doing the same from src/bin/ then the same issue shows up even if
src/Makefile is patched to handle install targets.

At the same time, trying to trigger a parallel install from src/backend
makes the build unhappy:
make: *** No rule to make target '../../src/common/libpgcommon_srv.a',
needed by 'postgres'.  Stop.
make: *** Waiting for unfinished jobs....

That may not be worth bothering, just mentioning.
--
Michael

Attachment
Michael Paquier <michael@paquier.xyz> writes:
> On Sun, Apr 08, 2018 at 11:05:09PM -0400, Tom Lane wrote:
>> Hm.  I'd tested "make -j all", but not going directly to "install".
>> Does it help if you add
>> $(SUBDIRS:%=install-%-recurse): | submake-generated-headers
>> to src/Makefile?

> That takes care of the problem from the root of the directory, but when
> doing the same from src/bin/ then the same issue shows up even if
> src/Makefile is patched to handle install targets.

Hm.  Not sure how far we want to go in that direction.  It's never really
been the case that you could configure a maintainer-clean tree and then
go and build in any random subdirectory without taking care of the
generated headers.  In principle, we could do something like the hack
Peter did with temp-install, where it's basically forced to be a
prerequisite of "make check" in EVERY subdirectory and then we buy back
some of the inefficiency by making it a no-op in child make runs.  Not
sure that's a good thing though.

Independently of that, though, I noticed that part of the issue in your
"make install" example is that relpath.c, along with some other frontend
code, includes catalog/catalog.h which includes pg_class.h (and thereby
now pg_class_d.h).  Since src/common/Makefile thinks the only generated
header it needs to worry about is errcodes.h, building src/common first
now falls over.  But allowing frontend code to include catalog.h is
pretty insane: that pulls in relcache.h as well, and surely we don't
want to tie our hands to the point that relcache.h has to be frontend
clean.

What we need to do is take OIDCHARS and TABLESPACE_VERSION_DIRECTORY
out of catalog.h and put them in some more frontend-friendly header.
My first thought was pg_tablespace_d.h, but my second one is relpath.h.
Comments?

            regards, tom lane


I wrote:
> Michael Paquier <michael@paquier.xyz> writes:
>> That takes care of the problem from the root of the directory, but when
>> doing the same from src/bin/ then the same issue shows up even if
>> src/Makefile is patched to handle install targets.

> Hm.  Not sure how far we want to go in that direction.  It's never really
> been the case that you could configure a maintainer-clean tree and then
> go and build in any random subdirectory without taking care of the
> generated headers.  In principle, we could do something like the hack
> Peter did with temp-install, where it's basically forced to be a
> prerequisite of "make check" in EVERY subdirectory and then we buy back
> some of the inefficiency by making it a no-op in child make runs.  Not
> sure that's a good thing though.

After further contemplation I decided that that was, in fact, the only
reasonable way to improve matters.  If we have multiple subdirectories
independently firing the "make generated-headers" action, then we have
parallel make hazards of just the same sort I was trying to prevent.
So it's really an all-or-nothing proposition.  The MAKELEVEL hack
plus wiring the prerequisite into the recursion rules is the best way
to make that happen.

Hence, done that way.

            regards, tom lane


Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.hheaders.

From
Michael Paquier
Date:
On Mon, Apr 09, 2018 at 04:46:34PM -0400, Tom Lane wrote:
> After further contemplation I decided that that was, in fact, the only
> reasonable way to improve matters.  If we have multiple subdirectories
> independently firing the "make generated-headers" action, then we have
> parallel make hazards of just the same sort I was trying to prevent.
> So it's really an all-or-nothing proposition.  The MAKELEVEL hack
> plus wiring the prerequisite into the recursion rules is the best way
> to make that happen.

Oh.  Good idea.  Thanks for the fix.  Hopefully that won't cause much
noise when bisecting bugs, this got in pretty quickly..

No more complains from here.
--
Michael

Attachment

Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.h headers.

From
Julien Rouhaud
Date:
Hi,

On Mon, Apr 9, 2018 at 10:46 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> After further contemplation I decided that that was, in fact, the only
> reasonable way to improve matters.  If we have multiple subdirectories
> independently firing the "make generated-headers" action, then we have
> parallel make hazards of just the same sort I was trying to prevent.
> So it's really an all-or-nothing proposition.  The MAKELEVEL hack
> plus wiring the prerequisite into the recursion rules is the best way
> to make that happen.
>
> Hence, done that way.

Compilation of external extensions using PGXS appears to be broken
since this commit:

make[1]: *** /tmp/pgbuild/lib/postgresql/pgxs/src/makefiles/../../src/backend:
No such file or directory.  Stop.
make: *** [/tmp/pgbuild/lib/postgresql/pgxs/src/makefiles/../../src/Makefile.global:370:
submake-generated-headers] Error 2


I think the best fix if to define NO_GENERATED_HEADERS in pgxs.mk,
patch attached.

Attachment

Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.hheaders.

From
Michael Paquier
Date:
On Tue, Apr 10, 2018 at 10:08:16AM +0200, Julien Rouhaud wrote:
> Compilation of external extensions using PGXS appears to be broken
> since this commit:
>
> make[1]: *** /tmp/pgbuild/lib/postgresql/pgxs/src/makefiles/../../src/backend:
> No such file or directory.  Stop.
> make: *** [/tmp/pgbuild/lib/postgresql/pgxs/src/makefiles/../../src/Makefile.global:370:
> submake-generated-headers] Error 2

Indeed.  Any external module is blowing up...
--
Michael

Attachment
Julien Rouhaud <rjuju123@gmail.com> writes:
> Compilation of external extensions using PGXS appears to be broken
> since this commit:

Ouch, sorry.

> I think the best fix if to define NO_GENERATED_HEADERS in pgxs.mk,
> patch attached.

Hm.  I wonder if we don't also want NO_TEMP_INSTALL, like the doc/src/sgml
makefile.  I don't know whether "make check" could be useful in a PGXS
build, but certainly that recipe for making a temp install isn't gonna
work.

            regards, tom lane


Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.h headers.

From
Julien Rouhaud
Date:
On Tue, Apr 10, 2018 at 3:46 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> Julien Rouhaud <rjuju123@gmail.com> writes:
>> I think the best fix if to define NO_GENERATED_HEADERS in pgxs.mk,
>> patch attached.
>
> Hm.  I wonder if we don't also want NO_TEMP_INSTALL, like the doc/src/sgml
> makefile.  I don't know whether "make check" could be useful in a PGXS
> build, but certainly that recipe for making a temp install isn't gonna
> work.

If I understand correctly, PGXS.mk already forbids a "make check" if
PGXS is defined.  And it seems that postgres' contribs rely on
including PGXS.mk, setting NO_PGXS and doing a "make check", so
NO_TEMP_INSTALL shouldn't be needed.


Julien Rouhaud <rjuju123@gmail.com> writes:
> On Tue, Apr 10, 2018 at 3:46 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Hm.  I wonder if we don't also want NO_TEMP_INSTALL, like the doc/src/sgml
>> makefile.  I don't know whether "make check" could be useful in a PGXS
>> build, but certainly that recipe for making a temp install isn't gonna
>> work.

> If I understand correctly, PGXS.mk already forbids a "make check" if
> PGXS is defined.  And it seems that postgres' contribs rely on
> including PGXS.mk, setting NO_PGXS and doing a "make check", so
> NO_TEMP_INSTALL shouldn't be needed.

Well, the question that's bothering me is how come "make check" in
an external build doesn't try to execute the temp-install rule before
printing that error message.  Experimentation shows that it doesn't,
but it sure looks to me like it should: there's nothing conditional
about the "check: temp-install" dependency in Makefile.global.  And
none of the three if-guards in the temp-install rule itself should
prevent this, so what is preventing it?  I don't see it.

For this reason, I thought that adding NO_TEMP_INSTALL would be a good
safety factor in case somebody changes/breaks whatever unobvious
thing is keeping this from failing, and so I went ahead and did it.

            regards, tom lane


Re: pgsql: Merge catalog/pg_foo_fn.h headers back into pg_foo.h headers.

From
Julien Rouhaud
Date:
On Tue, Apr 10, 2018 at 6:58 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> Well, the question that's bothering me is how come "make check" in
> an external build doesn't try to execute the temp-install rule before
> printing that error message.  Experimentation shows that it doesn't,
> but it sure looks to me like it should: there's nothing conditional
> about the "check: temp-install" dependency in Makefile.global.  And
> none of the three if-guards in the temp-install rule itself should
> prevent this, so what is preventing it?  I don't see it.

I just checked, and for the record the second rule (ifneq
($(abs_top_builddir),) is actually preventing it.  On top of
Makefile.global:

# Set top_srcdir, srcdir, and VPATH.
ifdef PGXS
top_srcdir = $(top_builddir)
[...]
else # not PGXS
[...]
abs_top_builddir = @abs_top_builddir@
[...]
endif # not PGXS

>
> For this reason, I thought that adding NO_TEMP_INSTALL would be a good
> safety factor in case somebody changes/breaks whatever unobvious
> thing is keeping this from failing, and so I went ahead and did it.

It makes sense.  Thanks for correcting and pushing!


Julien Rouhaud <rjuju123@gmail.com> writes:
> On Tue, Apr 10, 2018 at 6:58 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> none of the three if-guards in the temp-install rule itself should
>> prevent this, so what is preventing it?  I don't see it.

> I just checked, and for the record the second rule (ifneq
> ($(abs_top_builddir),) is actually preventing it.

Ah-hah.  I'd misread that maze of twisty little ifdefs that
sets up abs_top_builddir et al.  Thanks for clarifying!

            regards, tom lane