Thread: Re: [HACKERS] pgxs/windows

Re: [HACKERS] pgxs/windows

From
Bruce Momjian
Date:
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

Re: [HACKERS] pgxs/windows

From
Tom Lane
Date:
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

Re: [HACKERS] pgxs/windows

From
Bruce Momjian
Date:
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

Re: [HACKERS] pgxs/windows

From
Andrew Dunstan
Date:
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


Re: [HACKERS] pgxs/windows

From
Tom Lane
Date:
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

Re: [HACKERS] pgxs/windows

From
Bruce Momjian
Date:
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