Lessons learned on how to build 7.0.2 on AIX 4.x
Hi all- I've recently had to suffer a torturous process of building 7.0.2 on AIX 4.3.2. From my pouring through other newsgroups I've concluded that the problems I've hit exist at least on AIX 4.1.5 and 4.3.3 as well. This note describes the problems I've encountered and how to get around them, as well as a request for some fixes. Please accept my apology if this is known information- I couldn't find anything in this digest here. Some of this is in the document FAQ_AIX, but not all of it.
1) First of all, you can't use IBM's make utility, gotta use GNU make. So download gmake from http://www-frec.bull.com/docs/download.htm (where its put into an AIX installp package). Be sure to rename /usr/local/bin/make to /usr/local/bin/gmake so as not to confuse it with AIX's make.
2) Now, when you first download postgres and try to run the configure program, if you are using GCC instead of the AIX compiler (which is expensive), you have to use the command:
./configure --with-template=aix_gcc
This forces GCC. I used GCC 2.95.2.
2a) If you need to install GCC there are some AIX packages you need. I installed GCC and typed "gcc" and it responded "No input files found". Sounds good. But when I tried the configure command again it still fails to find a compiler. So I write a little test program and try to compile it and it gives me an error "installation problem, cannot exec `as'". Well, as it turns out, AIX doesn't install the assembler by default, you have to go and install the package "bos.adt.tools". That's a wonderful IBM brainchild. :) Ok, that's that mystery solved.
2b) Next, it gave me errors looking for a c++ compiler, so be sure to download gcc.g++.2.95.2 which installs AFTER gcc.2.95.2.
2c) Well, then I try compiling my test program with g++ and it complains about finding libm.a, so now we have to install the package "bos.adt.libm". So dumb. :)
3) Ok so we're finally ready to build, and as soon as I type 'gmake', I get this error:
Making postgres.imp
./backend/port/aix/mkldexport.sh postgres /usr/local/bin > postgres.imp nm: postgres: 0654-200 Cannot open the specified file.
nm: A file or directory in the path name does not exist.
This is apparently a bug in the make scripts for Postgres. I did find a workaround which was documented in one of the newsgroups. I went into the ./src/backend directory and did 'gmake', and even though it failed I then copied the ./src/backend/postgres.imp file to ./src, and that seemed to correct the problem.
4) So I continue my gmake'ing, and this time it fails badly trying to compile libpq++.so. The same person that suggested the postgres.imp workaround also said that they couldn't get the c++ portion to compile, so I hand edited the Makefile.global file in ./src and commented out the line "HAVE_Cplusplus=true"
This, finally, at long last (and after all the trouble of installing G++ and libm!), got the rest of Postgres 7.0.2 to compile.
Oh, and as the make output scrolled by, I see that it failed as well building some plpsql stuff, but it was non fatal. There were also a zillion warnings, many of them about multiple type declarations for int8, int32, etc.
Now on to the installation!!
5) The install worked pretty smoothly. The only trouble I had was installing the man pages, because it expected to use "zcat" to handle its .gz files, which AIX doesn't like. So I had to change zcat to "/usr/local/bin/gunzip -c" in the ./src/Makefile.global (of course implying that I had already installed GNU zip). I added the LD_PATH and MANPATH entries for pgsql to my /etc/environment.
I hope this information is helpful to any of you building this on AIX, and hopefully we can have someone from the Postgres team revisit the AIX installation process! The missing AIX packages stuff could be added to the FAQ_AIX file, and hopefully the error in the makefile and the problem linking libpq++.so can be fixed. If the latter is a G++ problem (would not surprise me!), keep in mind that many of us AIX users don't use xlC because IBM licenses the damned thing, so GCC is more more economical!
Best regards,
Richard Sand (rsand@vgalleries.com)
http://www.vgalleries.com
Hi all- I've recently had to suffer a torturous process of building
7.0.2 on AIX 4.3.2. From my pouring through other newsgroups I've
concluded that the problems I've hit exist at least on AIX 4.1.5 and
4.3.3 as well. This note describes the problems I've encountered and
how to get around them, as well as a request for some fixes. Please
accept my apology if this is known information- I couldn't find
anything in this digest here. Some of this is in the document
FAQ_AIX, but not all of it.
Great info. Would you have time to update FAQ_AIX? Or is there another
AIX partisan out there who would like to do the honors?
Regards.
- Thomas
I'd be honored to! I'll give it a shot- to whom should I submit it?
Could someone (at some point) take a look at the install bugs I (and others)
hit- i.e. the glitch in postgres.imp and the problem building libpq++ and
plpsql stuff?
Richard Sand (rsand@vgalleries.com)
http://www.vgalleries.com
-----Original Message-----
From: Thomas Lockhart <lockhart@alumni.caltech.edu>
To: Richard Sand <rsand@vgalleries.com>
Cc: pgsql-hackers@postgresql.org <pgsql-hackers@postgresql.org>
Date: Wednesday, July 05, 2000 11:43 PM
Subject: Re: [HACKERS] Lessons learned on how to build 7.0.2 on AIX 4.x
Show quoted text
Hi all- I've recently had to suffer a torturous process of building
7.0.2 on AIX 4.3.2. From my pouring through other newsgroups I've
concluded that the problems I've hit exist at least on AIX 4.1.5 and
4.3.3 as well. This note describes the problems I've encountered and
how to get around them, as well as a request for some fixes. Please
accept my apology if this is known information- I couldn't find
anything in this digest here. Some of this is in the document
FAQ_AIX, but not all of it.Great info. Would you have time to update FAQ_AIX? Or is there another
AIX partisan out there who would like to do the honors?Regards.
- Thomas
Import Notes
Resolved by subject fallback
Richard Sand writes:
1) First of all, you can't use IBM's make utility, gotta use GNU make.
Quoth the installation instructions:
"Building PostgreSQL requires GNU make. It will not work with other make
programs."
you have to use the command:
./configure --with-template=aix_gcc
That has got to be a bug. The configure script should look for gcc
first. Can you show the relevant lines of configure output (checking for
cc... etc), when you don't use that option?
Making postgres.imp
./backend/port/aix/mkldexport.sh postgres /usr/local/bin > postgres.imp nm: postgres: 0654-200 Cannot open the specified file.
nm: A file or directory in the path name does not exist.This is apparently a bug in the make scripts for Postgres.
Can you describe how to fix it? The AIX shared library stuff is an enigma
to me.
I hand edited the Makefile.global file in ./src and commented out the
line "HAVE_Cplusplus=true"
Quoth configure --help:
" --without-CXX prevent building C++ code"
Oh, and as the make output scrolled by, I see that it failed as well
building some plpsql stuff, but it was non fatal.
If it failed then it was fatal, and vice versa. Please elaborate.
There were also a zillion warnings, many of them about multiple type
declarations for int8, int32, etc.
I'll make a note of it.
installing the man pages, because it expected to use "zcat" to handle
its .gz files, which AIX doesn't like. So I had to change zcat to
"/usr/local/bin/gunzip -c" in the ./src/Makefile.global (of course
Noted.
--
Peter Eisentraut Sernanders v�g 10:115
peter_e@gmx.net 75262 Uppsala
http://yi.org/peter-e/ Sweden
1) First of all, you can't use IBM's make utility, gotta use GNU make.
Quoth the installation instructions:
"Building PostgreSQL requires GNU make. It will not work with other make
programs."
Yes I was just making sure all of the AIX instructions were combined. :)
you have to use the command:
./configure --with-template=aix_gcc
That has got to be a bug. The configure script should look for gcc
first. Can you show the relevant lines of configure output (checking for
cc... etc), when you don't use that option?
It hung up on line 1226. I just tested this again and can confirm, it will
not find gcc unless I explicitly use this switch. The output from
config.log is:
configure:1102: checking for gcc
configure:1215: checking whether the C compiler
(xlc -qmaxmem=16384 -qhalt=w -qs
rcmsg -qlanglvl=extended -qlonglong ) works
configure:1231: xlc -o
conftest -qmaxmem=16384 -qhalt=w -qsrcmsg -qlanglvl=exten
ded -qlonglong conftest.c 1>&5
./configure[1230]: xlc: not found
configure: failed program was:
#line 1226 "configure"
#include "confdefs.h"
main(){return(0);}
Making postgres.imp
./backend/port/aix/mkldexport.sh postgres /usr/local/bin > postgres.imp
nm: postgres: 0654-200 Cannot open the specified file.
nm: A file or directory in the path name does not exist.
This is apparently a bug in the make scripts for Postgres.
Can you describe how to fix it? The AIX shared library stuff is an enigma
to me.
Well, all I did was do gmake in another directory (./src/backend) and then I
copy the postgres.imp file from that directory back to ./src, and then the
make can continue OK. So its got to be a simple bug in the makefile for
./src that works when you build postgres.imp in another directory. I don't
know my way around makefiles except for the very basics, so I'm sorry I
can't help more... I'll run more tests if you'd like, let me know what you'd
like to see.
I hand edited the Makefile.global file in ./src and commented out the
line "HAVE_Cplusplus=true"Quoth configure --help:
" --without-CXX prevent building C++ code"
Ah, you are wise. :) Yes, that switch is better. BUT, since I do have g++
installed and working, why can't the C++ code be built in the first place?
Oh, and as the make output scrolled by, I see that it failed as well
building some plpsql stuff, but it was non fatal.If it failed then it was fatal, and vice versa. Please elaborate.
Here is an excerpt from stdout/err when I do a gmake all from ./src. You'll
notice that it starts to build plpgsql and then dies, but the make
continues. I don't know if this is vital (the procedure stuff?)- I haven't
tried actually doing anything with Postgres yet but I do have postmaster
running, I created a database, and I can connect to it. Of course, the
regression test failed because I don't have plpgsql! Anyway, here's the
except:
gmake[2]: Entering directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql'
gmake -C src all
gmake[3]: Entering directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql/src'
../../../backend/port/aix/mkldexport.sh libplpgsql.a /usr/local/pgsql/lib >
libp
lpgsql.exp
ld -H512 -bM:SRE -bI:../../../backend/postgres.imp -bE:libplpgsql.exp -o
libplpg
sql.so libplpgsql.a -lPW -lcrypt -lld -lnsl -ldl -lm -lcurses -lc
ld: 0711-327 WARNING: Entry point not found: __start
ld: 0711-317 ERROR: Undefined symbol: CurrentMemoryContext
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextAlloc
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextFree
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextRealloc
ld: 0711-317 ERROR: Undefined symbol: .elog
ld: 0711-317 ERROR: Undefined symbol: .SearchSysCacheTuple
ld: 0711-317 ERROR: Undefined symbol: .textout
ld: 0711-317 ERROR: Undefined symbol: .nameout
ld: 0711-317 ERROR: Undefined symbol: .fmgr_info
ld: 0711-317 ERROR: Undefined symbol: .int2in
ld: 0711-317 ERROR: Undefined symbol: .SPI_connect
ld: 0711-317 ERROR: Undefined symbol: CurrentTriggerData
ld: 0711-317 ERROR: Undefined symbol: .SPI_finish
ld: 0711-317 ERROR: Undefined symbol: Warn_restart
ld: 0711-317 ERROR: Undefined symbol: .SPI_palloc
ld: 0711-317 ERROR: Undefined symbol: .textin
ld: 0711-317 ERROR: Undefined symbol: .namein
ld: 0711-317 ERROR: Undefined symbol: .get_temp_rel_by_physicalname
ld: 0711-317 ERROR: Undefined symbol: .SPI_gettypeid
ld: 0711-317 ERROR: Undefined symbol: .SPI_copytuple
ld: 0711-317 ERROR: Undefined symbol: SPI_processed
ld: 0711-317 ERROR: Undefined symbol: SPI_tuptable
ld: 0711-317 ERROR: Undefined symbol: fmgr_pl_finfo
ld: 0711-317 ERROR: Undefined symbol: .SPI_fnumber
ld: 0711-317 ERROR: Undefined symbol: .SPI_getvalue
ld: 0711-317 ERROR: Undefined symbol: .SPI_prepare
ld: 0711-317 ERROR: Undefined symbol: .SPI_saveplan
ld: 0711-317 ERROR: Undefined symbol: .SPI_getbinval
ld: 0711-317 ERROR: Undefined symbol: .SPI_execp
ld: 0711-317 ERROR: Undefined symbol: .heap_formtuple
ld: 0711-317 ERROR: Undefined symbol: .newNode
ld: 0711-317 ERROR: Undefined symbol: .SPI_push
ld: 0711-317 ERROR: Undefined symbol: .ExecEvalExpr
ld: 0711-317 ERROR: Undefined symbol: .SPI_pop
ld: 0711-317 ERROR: Undefined symbol: .length
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more
information.
gmake[3]: *** [libplpgsql.so] Error 8
gmake[3]: Leaving directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql/src'
gmake[2]: [all] Error 2 (ignored)
gmake[2]: Leaving directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql'
gmake[1]: Leaving directory `/usr/src/postgresql-7.0.2/src/pl'
All of PostgreSQL is successfully made. Ready to install.
I hope this helps!
-Richard
Import Notes
Resolved by subject fallback
Richard Sand writes:
./configure --with-template=aix_gcc
It hung up on line 1226. I just tested this again and can confirm, it will
not find gcc unless I explicitly use this switch.
I see. The template matching logic preempts the choice of compiler. We'll
need to ponder a fix for that.
Making postgres.imp
./backend/port/aix/mkldexport.sh postgres /usr/local/bin > postgres.impnm: postgres: 0654-200 Cannot open the specified file.
nm: A file or directory in the path name does not exist.
So its got to be a simple bug in the makefile for ./src that works
when you build postgres.imp in another directory.
Let's see: The rule that invokes this is
src/backend/Makefile:
all: postgres $(POSTGRES_IMP) ...
The commands are in src/makefiles/Makefile.aix:
$(POSTGRES_IMP):
@echo Making $@
$(MKLDEXPORT) postgres $(BINDIR) > $@
$(CC) -Wl,-bE:$(SRCDIR)/backend/$@ -o postgres $(OBJS) ../utils/version.o $(LDFLAGS)
Now the error message seems to imply that it can't find the `postgres'
executable, but the postgres executable should exist before this rule
runs. Now you seems to be saying that you have to moving postgres.imp to
the src/ directory corrected this problem, but sorry, this doesn't make
sense to me. :-( You could maybe help rebuilding completely from scratch
and showing the complete make output so we can see what is being invoked
in what order.
BUT, since I do have g++ installed and working, why can't the C++ code
be built in the first place?
C++ is so wonderfully incompatible to itself, and the libpq++ interface is
not used so much that few people bother fixing it. Be our guest.
gmake[2]: Entering directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql'
gmake -C src all
gmake[3]: Entering directory `/usr/src/postgresql-7.0.2/src/pl/plpgsql/src'
../../../backend/port/aix/mkldexport.sh libplpgsql.a /usr/local/pgsql/lib >
libp
lpgsql.exp
ld -H512 -bM:SRE -bI:../../../backend/postgres.imp -bE:libplpgsql.exp -o
libplpg
sql.so libplpgsql.a -lPW -lcrypt -lld -lnsl -ldl -lm -lcurses -lc
ld: 0711-327 WARNING: Entry point not found: __start
ld: 0711-317 ERROR: Undefined symbol: CurrentMemoryContext
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextAlloc
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextFree
[more of that]
Well, yes, these symbols are undefined within plpgsql. They are supposed
to be resolved when you load plpgsql into the server at runtime. Now I am
venturing a guess here that this postgres.imp file is supposed to contain
a list of symbols that are defined by the postmaster and that the
dynamically loadable modules such as plpgsql should not worry about, but
as we saw, this file is not being created correctly. (Perhaps you should
try to move it back to src/backend for the purposes of building plpgsql.
That would at least give it a chance of finding the file.)
--
Peter Eisentraut Sernanders v�g 10:115
peter_e@gmx.net 75262 Uppsala
http://yi.org/peter-e/ Sweden
lpgsql.exp
ld -H512 -bM:SRE -bI:../../../backend/postgres.imp -bE:libplpgsql.exp -o
libplpg
sql.so libplpgsql.a -lPW -lcrypt -lld -lnsl -ldl -lm -lcurses -lc
ld: 0711-327 WARNING: Entry point not found: __start
ld: 0711-317 ERROR: Undefined symbol: CurrentMemoryContext
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextAlloc
ld: 0711-317 ERROR: Undefined symbol: .MemoryContextFree[more of that]
Well, yes, these symbols are undefined within plpgsql. They are supposed
to be resolved when you load plpgsql into the server at runtime. Now I am
venturing a guess here that this postgres.imp file is supposed to contain
a list of symbols that are defined by the postmaster and that the
dynamically loadable modules such as plpgsql should not worry about, but
as we saw, this file is not being created correctly. (Perhaps you should
try to move it back to src/backend for the purposes of building plpgsql.
That would at least give it a chance of finding the file.)
Exactly that...postgres.imp contains a list of symbols that are available
for modules to use to resolve in their code.
The script src/backend/port/aix/mkldexport.sh gathers the symbols from
postgres.o. Then that list is given to the linker via -bE when making the
executable to allow those symbols to be used by external modules. When
compiling the other modules, the linker needs to get that file with -bI to
tell it that any unresolved symbols that are in postgres.imp will be in the
postgres exectable.
Did you get it to compile without munging the order of the #includes? On my
4.1.5 system, postgres.h has to the first #include file. Seems there are
two different prototypes for getopt in the aix system includes. If unistd.h
or math.h are included *before* postgres.h, the bogus prototype is
encountered first. There's also a function somewhere in libpq that has an
unsigned char parameter that is at odds with the -qchars=signed flag in the
aix compile.
These are really only problems because I put in -qhalt=w to cause the
compile to treat warnings as errors and stop the compile. I believe Andreas
wanted to turn this off a while back, but I had always found it useful and
rather cool that a project as large as postgres could compile without any
warnings whatsoever.
darrenk
Richard Sand writes:
1) First of all, you can't use IBM's make utility, gotta
use GNU make.
Quoth the installation instructions:
"Building PostgreSQL requires GNU make. It will not work with
other make
programs."you have to use the command:
./configure --with-template=aix_gcc
That has got to be a bug. The configure script should look for gcc
first. Can you show the relevant lines of configure output
(checking for
cc... etc), when you don't use that option?Making postgres.imp
./backend/port/aix/mkldexport.sh postgres /usr/local/bin >postgres.imp nm: postgres: 0654-200 Cannot open the specified file.
nm: A file or directory in the path name does not exist.
This is apparently a bug in the make scripts for Postgres.
Can you describe how to fix it? The AIX shared library stuff
is an enigma
to me.
The problem here is simply that the postgres.imp target has no dependency in
the Makefile.aix and thus gmake thinks it can start with this step.
I hand edited the Makefile.global file in ./src and
commented out the
line "HAVE_Cplusplus=true"
Quoth configure --help:
" --without-CXX prevent building C++ code"
This is now the default. The c++ check using gcc is busted, since the
test code is C only and is compiled with gcc. gcc does not switch to C++
mode.
Oh, and as the make output scrolled by, I see that it failed as well
building some plpsql stuff, but it was non fatal.If it failed then it was fatal, and vice versa. Please elaborate.
There were also a zillion warnings, many of them about multiple type
declarations for int8, int32, etc.I'll make a note of it.
installing the man pages, because it expected to use "zcat"
to handle
its .gz files, which AIX doesn't like. So I had to change zcat to
"/usr/local/bin/gunzip -c" in the ./src/Makefile.global (of courseNoted.
Don't rely on gunzip, use gzip -cd instead.
Andreas
Import Notes
Resolved by subject fallback
All other points you noted can be fixed.
The list of lpp's you named is only part of the truth, you
seemed to have the others already installed. Since I do not
know the full list of additional lpp's compared to a default AIX install
I did not name any in the FAQ. I am pretty sure, that some header file
lpp's are not in the standard AIX runtime installation.
Maybe we can start with your list and add other lpp's when people
report that they where needed.
Andreas
Import Notes
Resolved by subject fallback