Thread: Re: [HACKERS] pgxs/windows
OK, I found the cause. Using tests from Magnus and Andrew, I could reproduce Magnus's success and Andrew's failure in an 8.1.2 pginstaller install using MinGW. The difference between Magnus's and Andrew's is that Magnus used MODULE_big (which means create a shared library), while Andrew used MODULES. So, Magnus's only worked because he was creating a DLL and that brought in the -L from MODULE_big. I have applied the following patch to change /bin to /lib for Cygwin and Win32. Looking at Darwin and AIX, both those are pointing to the postgres binary, so they should be using /bin, so we are OK on those. I patched CVS HEAD, and 8.1.X and 8.0.X. Earlier releases didn't support pgxs. --------------------------------------------------------------------------- Andrew Dunstan wrote: > > > Bruce Momjian wrote: > > >> > >>OK, thanks. Next question --- are the installed file locations the same > >>for a MinGW install and a pginstaller install? I don't think > >>pginstaller does a MinGW install because it doesn't have the build > >>environment in the tarball. > >> > >>However, the big difference seems to be that Magnus has -Llib and -Lbin, > >>while you have only the -Lbin. I have MinGW and pginstaller installed > >>here. How can I set things up to test this? > >> > >> > > > >Now looking at the Makefile.global in the 8.1.2 pginstaller install, in > >Makefile.global, $libdir is set in a pgxs-specific block: > > > > libdir := $(shell pg_config --libdir) > > > >and that seems to work: > > > > C:\Program Files\PostgreSQL\8.1\bin>pg_config --libdir > > C:/PROGRA~1/POSTGR~1/8.1/lib > > > >and that is set to LDFLAGS, which is later propogated to SHLIB_LINK, > >though SHLIB_LINK moves all the -L flags to the front, so what you see > >on the link line is not the ordering used to create the value. > > > >Andrew, can you try echoing $libdir and $SHLIB_LINK in the Makefile to > >find those values? > > > > > > > > here is a test case log (including a test makefile). I ran the tests as > you can see with both installer 8.1 and mingw installed CVS tip, with > the same results. > > > cheers > > andrew > > $ touch foo.c > $ cat Makefile > > MODULES = foo > SRCS += foo.c > OBJS = $(SRCS:.c=.o) > PGXS := $(shell pg_config --pgxs) > include $(PGXS) > override CFLAGS := $(filter-out -Wendif-labels > -Wdeclaration-after-statement, $(shell pg_config --cflags)) > showme: > @echo libdir = $(libdir) > @echo SHLIB_LINK = $(SHLIB_LINK) > $ which pg_config > /c/Program Files/PostgreSQL/8.1/bin/pg_config > $ rm -f foo.dll > $ make > gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline > -fno-strict-aliasing -I. -Ic:/PROGRA~1/POSTGR~1/8.1/include/server > -Ic:/PROGRA~1/POSTGR~1/8.1/include/internal -I./src/include/port/win32 > -DEXEC_BACKEND -I/mingw/include/krb5 > "-Ic:/PROGRA~1/POSTGR~1/8.1/lib/pgxs/src/MAKEFI~1/../../src/include/port/win32" > -Ic:/PROGRA~1/POSTGR~1/8.1/include/server/port/win32 -c -o foo.o foo.c > dlltool --export-all --output-def foo.def foo.o > dllwrap -o foo.dll --def foo.def foo.o > c:/PROGRA~1/POSTGR~1/8.1/lib/pgxs/src/MAKEFI~1/../../src/utils/dllinit.o > -Lc:/PROGRA~1/POSTGR~1/8.1/bin -lpostgres > c:\mingw\bin\..\lib\gcc-lib\mingw32\3.2.3\..\..\..\..\mingw32\bin\ld.exe: > cannot find -lpostgres > c:\mingw\bin\dllwrap.exe: c:\mingw\bin\gcc exited with status 1 > make: *** [foo.dll] Error 1 > rm foo.o > $ make showme > libdir = c:/PROGRA~1/POSTGR~1/8.1/lib > SHLIB_LINK = -Lc:/PROGRA~1/POSTGR~1/8.1/bin -lpostgres > $ export PATH=/usr/local/pgsql/bin:$PATH > $ which pg_config > /usr/local/pgsql/bin/pg_config > $ rm -f foo.dll > $ make > gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline > -fno-strict-aliasing -I. -IC:/msys/1.0/local/pgsql/include/server > -IC:/msys/1.0/local/pgsql/include/internal -I./src/include/port/win32 > -DEXEC_BACKEND > "-IC:/msys/1.0/local/pgsql/lib/pgxs/src/MAKEFI~1/../../src/include/port/win32" > -IC:/msys/1.0/local/pgsql/include/server/port/win32 -c -o foo.o foo.c > dlltool --export-all --output-def foo.def foo.o > dllwrap -o foo.dll --def foo.def foo.o > C:/msys/1.0/local/pgsql/lib/pgxs/src/MAKEFI~1/../../src/utils/dllinit.o > -LC:/msys/1.0/local/pgsql/bin -lpostgres > c:\mingw\bin\..\lib\gcc-lib\mingw32\3.2.3\..\..\..\..\mingw32\bin\ld.exe: > cannot find -lpostgres > c:\mingw\bin\dllwrap.exe: c:\mingw\bin\gcc exited with status 1 > make: *** [foo.dll] Error 1 > rm foo.o > $ make showme > libdir = C:/msys/1.0/local/pgsql/lib > SHLIB_LINK = -LC:/msys/1.0/local/pgsql/bin -lpostgres > > > ---------------------------(end of broadcast)--------------------------- > TIP 1: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: src/makefiles/Makefile.cygwin =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.cygwin,v retrieving revision 1.6 diff -c -c -r1.6 Makefile.cygwin *** src/makefiles/Makefile.cygwin 17 Dec 2004 03:52:48 -0000 1.6 --- src/makefiles/Makefile.cygwin 19 Jan 2006 19:09:50 -0000 *************** *** 2,8 **** DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(bindir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif --- 2,8 ---- DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif Index: src/makefiles/Makefile.win32 =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.win32,v retrieving revision 1.7 diff -c -c -r1.7 Makefile.win32 *** src/makefiles/Makefile.win32 17 Dec 2004 03:52:49 -0000 1.7 --- src/makefiles/Makefile.win32 19 Jan 2006 19:09:50 -0000 *************** *** 6,12 **** DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(bindir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif --- 6,12 ---- DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif
Bruce Momjian <pgman@candle.pha.pa.us> writes: > The difference between Magnus's and Andrew's is > that Magnus used MODULE_big (which means create a shared library), while > Andrew used MODULES. So, Magnus's only worked because he was creating a > DLL and that brought in the -L from MODULE_big. Ah, good catch. > I have applied the following patch to change /bin to /lib for Cygwin and > Win32. What about the question of whether $(DESTDIR) belongs there or not? I think we had concluded that PGXS shouldn't ever use $(DESTDIR), because that's only for install-time stuff. regards, tom lane
Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > The difference between Magnus's and Andrew's is > > that Magnus used MODULE_big (which means create a shared library), while > > Andrew used MODULES. So, Magnus's only worked because he was creating a > > DLL and that brought in the -L from MODULE_big. > > Ah, good catch. > > > I have applied the following patch to change /bin to /lib for Cygwin and > > Win32. > > What about the question of whether $(DESTDIR) belongs there or not? > I think we had concluded that PGXS shouldn't ever use $(DESTDIR), > because that's only for install-time stuff. I considered that a separate issue and didn't explore it, but I think you are right that $(DESTDIR) makes no sense so I will remove it. Patch attached. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: src/makefiles/Makefile.cygwin =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.cygwin,v retrieving revision 1.7 diff -c -c -r1.7 Makefile.cygwin *** src/makefiles/Makefile.cygwin 19 Jan 2006 20:00:54 -0000 1.7 --- src/makefiles/Makefile.cygwin 19 Jan 2006 20:42:50 -0000 *************** *** 2,8 **** DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif --- 2,8 ---- DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif Index: src/makefiles/Makefile.win32 =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.win32,v retrieving revision 1.8 diff -c -c -r1.8 Makefile.win32 *** src/makefiles/Makefile.win32 19 Jan 2006 20:00:54 -0000 1.8 --- src/makefiles/Makefile.win32 19 Jan 2006 20:42:50 -0000 *************** *** 6,12 **** DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(DESTDIR)$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif --- 6,12 ---- DLLTOOL= dlltool DLLWRAP= dllwrap ifdef PGXS ! BE_DLLLIBS= -L$(libdir) -lpostgres else BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres endif
On Thu, 2006-01-19 at 15:33 -0500, Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > The difference between Magnus's and Andrew's is > > that Magnus used MODULE_big (which means create a shared library), while > > Andrew used MODULES. So, Magnus's only worked because he was creating a > > DLL and that brought in the -L from MODULE_big. > > Ah, good catch. As I understand the docs, one can use either to produce a dll. The difference is how it processes the name. > > > I have applied the following patch to change /bin to /lib for Cygwin and > > Win32. > > What about the question of whether $(DESTDIR) belongs there or not? > I think we had concluded that PGXS shouldn't ever use $(DESTDIR), > because that's only for install-time stuff. Looks that way to me - IIRC it's only used by the regression suite. cheers andrew
Bruce Momjian <pgman@candle.pha.pa.us> writes: > Tom Lane wrote: >> What about the question of whether $(DESTDIR) belongs there or not? >> I think we had concluded that PGXS shouldn't ever use $(DESTDIR), >> because that's only for install-time stuff. > I considered that a separate issue and didn't explore it, but I think > you are right that $(DESTDIR) makes no sense so I will remove it. > Patch attached. If these are bogus then so are the uses in Makefile.aix and Makefile.darwin. I'm a bit bothered by the ones in pgxs.mk, too, although I suspect we have to leave those there for the benefit of contrib? regards, tom lane
Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Tom Lane wrote: > >> What about the question of whether $(DESTDIR) belongs there or not? > >> I think we had concluded that PGXS shouldn't ever use $(DESTDIR), > >> because that's only for install-time stuff. > > > I considered that a separate issue and didn't explore it, but I think > > you are right that $(DESTDIR) makes no sense so I will remove it. > > > Patch attached. > > If these are bogus then so are the uses in Makefile.aix and > Makefile.darwin. Done, and backpatched. > I'm a bit bothered by the ones in pgxs.mk, too, although I suspect we > have to leave those there for the benefit of contrib? No idea, sorry. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: src/makefiles/Makefile.aix =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.aix,v retrieving revision 1.23 diff -c -c -r1.23 Makefile.aix *** src/makefiles/Makefile.aix 28 Oct 2005 17:32:22 -0000 1.23 --- src/makefiles/Makefile.aix 19 Jan 2006 21:16:36 -0000 *************** *** 22,28 **** POSTGRES_IMP= postgres$(IMPSUFF) ifdef PGXS ! BE_DLLLIBS= -Wl,-bI:$(DESTDIR)$(bindir)/postgres/$(POSTGRES_IMP) else BE_DLLLIBS= -Wl,-bI:$(top_builddir)/src/backend/$(POSTGRES_IMP) endif --- 22,28 ---- POSTGRES_IMP= postgres$(IMPSUFF) ifdef PGXS ! BE_DLLLIBS= -Wl,-bI:$(bindir)/postgres/$(POSTGRES_IMP) else BE_DLLLIBS= -Wl,-bI:$(top_builddir)/src/backend/$(POSTGRES_IMP) endif Index: src/makefiles/Makefile.darwin =================================================================== RCS file: /cvsroot/pgsql/src/makefiles/Makefile.darwin,v retrieving revision 1.8 diff -c -c -r1.8 Makefile.darwin *** src/makefiles/Makefile.darwin 17 Dec 2004 03:52:48 -0000 1.8 --- src/makefiles/Makefile.darwin 19 Jan 2006 21:16:36 -0000 *************** *** 5,11 **** CFLAGS_SL = ifdef PGXS ! BE_DLLLIBS= -bundle_loader $(DESTDIR)$(bindir)/postgres else BE_DLLLIBS= -bundle_loader $(top_builddir)/src/backend/postgres endif --- 5,11 ---- CFLAGS_SL = ifdef PGXS ! BE_DLLLIBS= -bundle_loader $(bindir)/postgres else BE_DLLLIBS= -bundle_loader $(top_builddir)/src/backend/postgres endif