VPATH builds fail

Started by Tom Laneabout 24 years ago6 messages
#1Tom Lane
tgl@sss.pgh.pa.us

I experimented today (for the first time in a long time) with building
Postgres outside the source tree. Didn't work:

make[3]: Entering directory `/home/users/t/tg/tgl/builddir/src/backend/bootstrap'
gcc -O1 -g -Wall -Wmissing-prototypes -Wmissing-declarations -g -I../../../src/include -I/home/users/t/tg/tgl/pgsql/src/include -c -o bootparse.o /home/users/t/tg/tgl/pgsql/src/backend/bootstrap/bootparse.c
gcc -O1 -g -Wall -Wmissing-prototypes -Wmissing-declarations -g -I../../../src/include -I/home/users/t/tg/tgl/pgsql/src/include -c -o bootscanner.o /home/users/t/tg/tgl/pgsql/src/backend/bootstrap/bootscanner.c
bootscanner.l:43: bootstrap_tokens.h: No such file or directory
make[3]: *** [bootscanner.o] Error 1

and similarly in src/interfaces/ecpg/preproc.

The problem was that I already had bison output files built in the
source tree. If I remove those, the build goes through (with bison
output files built in the object tree). However, since our source
distribution tarballs come with prebuilt bison outputs, this means
that a VPATH build from a source tarball won't work.

The simplest fix is probably to add
override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
to the Makefiles in these two directories. (I observe that plpgsql
already has this, which is why it fails to fail; backend/parser gets
around the same problem by installing symlinks.) Any objections?

regards, tom lane

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#1)
Re: VPATH builds fail

I said:

The problem was that I already had bison output files built in the
source tree. If I remove those, the build goes through (with bison
output files built in the object tree).

I have to take that back: the bison outputs are rebuilt in the source
tree, as indeed they should be. I'm now fairly confused about why
the first build attempt failed and the second succeeded. The failure
occurred on a machine running gmake 3.78.1 ... maybe this is some
bug in that version of make? I can't reproduce any problem on a machine
running gmake 3.79.1...

regards, tom lane

#3Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#2)
Re: VPATH builds fail

Tom Lane writes:

I have to take that back: the bison outputs are rebuilt in the source
tree, as indeed they should be. I'm now fairly confused about why
the first build attempt failed and the second succeeded. The failure
occurred on a machine running gmake 3.78.1 ... maybe this is some
bug in that version of make? I can't reproduce any problem on a machine
running gmake 3.79.1...

I can't reproduce this with either version of gmake, and the rules look
fairly bullet-proof. Possibly you didn't distclean the source tree before
configuring in the build tree. In that case it might have picked up the
wrong Makefile.global for part of the build.

--
Peter Eisentraut peter_e@gmx.net

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#2)
Re: VPATH builds fail

I said:

I have to take that back: the bison outputs are rebuilt in the source
tree, as indeed they should be. I'm now fairly confused about why
the first build attempt failed and the second succeeded.

The difference appears to be that when bison is run in the source dir,
its output contains lines like

#line 121 "bootscanner.l"

However, when it's run during a VPATH build, its output contains lines
like

#line 121 "/home/postgres/pgsql/src/backend/bootstrap/bootscanner.l"

evidently because bison is invoked with a full path to the .y file in
this case.

There is *no* difference in the #include commands, but apparently the
#line directives affect gcc's default search path for include files.

Net result: I'm back to my original statement: VPATH builds will not
work with a source distribution tarball. Any objections to the
-I$(srcdir) trick?

regards, tom lane

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#3)
Re: VPATH builds fail

Peter Eisentraut <peter_e@gmx.net> writes:

I can't reproduce this with either version of gmake, and the rules look
fairly bullet-proof. Possibly you didn't distclean the source tree before
configuring in the build tree.

Yes, I certainly did distclean. The difference is in the bison output
files, which are not removed by distclean; see followup message.
AFAICT it is not really make's fault, but an obscure gcc behavior that
creates the problem.

regards, tom lane

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#4)
Re: VPATH builds fail

Tom Lane writes:

There is *no* difference in the #include commands, but apparently the
#line directives affect gcc's default search path for include files.

I was kind of baffled myself why it worked at all.

Net result: I'm back to my original statement: VPATH builds will not
work with a source distribution tarball. Any objections to the
-I$(srcdir) trick?

Nope.

--
Peter Eisentraut peter_e@gmx.net