Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
diana:windows:building:sql [2010-02-18 16:11:54]
dages
diana:windows:building:sql [2022-05-31 09:29:31] (current)
Line 1: Line 1:
 ====== Building the MySQL and PostgreSQL libraries on Windows ====== ====== Building the MySQL and PostgreSQL libraries on Windows ======
 +
 +===== MySQL =====
  
 MySQL does not support gcc on Windows, only MSVC.  Moved to a [[windows:building:mysql|separate page]]. MySQL does not support gcc on Windows, only MSVC.  Moved to a [[windows:building:mysql|separate page]].
Line 5: Line 7:
 ===== PostgreSQL ===== ===== PostgreSQL =====
  
-http://www.postgresql.org/ftp/source/v8.3.9/+Both the C and C++ interfaces build fine "out of the box" (except for the ''LDFLAGS'' issue mentioned below) when building shared libraries.
  
-  $ LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include ./configure --prefix=/c/met.no +There is a problem when building static libraries, though The C interface uses the Win32 SSPI authentication interface (''secur32.dll'') This library is //not// linked in by default when linking statically, and the Makefiles don't know that.  Furthermore, any configure script that uses ''AC_CHECK_LIB'' or similar instead of ''pg_config'' to look for ''libpq'' will also need to link with ''secur32.dll'' There are two solutions: either fix the Makefile and all downstream consumers, or disable SSPI.
-  $ make +
-  $ make -C src/interfaces/libpq install +
-  $ make -C src/bin/pg_config install +
-  $ make -C src/include install+
  
-http://pqxx.org/development/libpqxx/wiki/DownloadPage+Keeping SSPI means a little more work right now (to build ''libpq'' and ''libpqxx'') but potentially less pain down the line (as long as downstream consumers use ''pg_config'' and or ''pkg-config'' so you don't have to specify ''-lsecur32'' manually).
  
-  $ LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include PG_CONFIG=/c/met.no/bin/pg_config.exe ./configure --prefix=/c/met.no +Another issue is that ''libpq'' includes its own implementation of certain POSIX or BSD functions that are missing on Windows, such as ''inet_aton()'' This can conflict with other libraries (e.g. FFmpeg's ''libavformat'') which also include their own private copies of these functions.
-  $ make all install+
  
 +==== libpq (C interface) ====
 +
 +PostgreSQL includes its own implementations of certain functions which are not available in Win32, such as ''inet_aton()'' and ''strlcat()'' Unfortunately, so do the [[ffmpeg|ffmpeg libraries]].  We resolve this conflict by using macros to transparently add a ''pq_'' prefix to each of these functions.
 +
 +**NOTE:** The PostgreSQL developers have [[http://thread.gmane.org/gmane.comp.db.postgresql.devel.general/137878|stated quite unambiguously]] that they do not support static linking and will disable it completely in future releases.  If / when that happens, it will be necessary to link ''libpq'' (and possibly also the ffmpeg libraries) dynamically.
 +
 +First, get the latest source (currently 8.3.9 for the 8.3 branch) from http://www.postgresql.org/ftp/source/v8.3.9/ and extract it in a convenient place. 
 +
 +Next, apply the patch below.  The easiest way is to just ''cd'' into the source directory and type
 +
 +  $ patch -b -l -p0
 +
 +then copy & paste the patch.
 +
 +  
 +  --- src/include/port.h.orig 2009-11-14 16:39:41.000000000 +0100
 +  +++ src/include/port.h 2010-03-10 13:17:27.000000000 +0100
 +  @@ -337,6 +337,7 @@
 +    * When necessary, these routines are provided by files in src/port/.
 +    */
 +   #ifndef HAVE_CRYPT
 +  +#define crypt pq_crypt
 +   extern char *crypt(const char *key, const char *setting);
 +   #endif
 +   
 +  @@ -351,44 +352,60 @@
 +   #endif
 +   
 +   #ifndef HAVE_GETOPT
 +  +#define getopt pq_getopt
 +   extern int getopt(int nargc, char *const * nargv, const char *ostr);
 +   #endif
 +   
 +   #ifndef HAVE_ISINF
 +  +#define isinf pq_isinf
 +   extern int isinf(double x);
 +   #endif
 +   
 +   #ifndef HAVE_RINT
 +  +#define rint pq_rint
 +   extern double rint(double x);
 +   #endif
 +   
 +   #ifndef HAVE_INET_ATON
 +   #include <netinet/in.h>
 +   #include <arpa/inet.h>
 +  +#define inet_aton pq_inet_aton
 +   extern int inet_aton(const char *cp, struct in_addr * addr);
 +   #endif
 +   
 +   #ifndef HAVE_STRDUP
 +  +#define strdup pq_strdup
 +   extern char *strdup(const char *str);
 +   #endif
 +   
 +  +#ifndef HAVE_STRLCAT
 +  +#define strlcat pq_strlcat
 +  +#endif
 +  +
 +   #if !HAVE_DECL_STRLCAT
 +   extern size_t strlcat(char *dst, const char *src, size_t siz);
 +   #endif
 +   
 +  +#ifndef HAVE_STRLCPY
 +  +#define strlcpy pq_strlcpy
 +  +#endif
 +  +
 +   #if !HAVE_DECL_STRLCPY
 +   extern size_t strlcpy(char *dst, const char *src, size_t siz);
 +   #endif
 +   
 +   #if !defined(HAVE_RANDOM) && !defined(__BORLANDC__)
 +  +#define random pq_random
 +   extern long random(void);
 +   #endif
 +   
 +   #ifndef HAVE_UNSETENV
 +  +#define unsetenv pq_unsetenv
 +   extern void unsetenv(const char *name);
 +   #endif
 +   
 +   #ifndef HAVE_SRANDOM
 +  +#define srandom pq_srandom
 +   extern void srandom(unsigned int seed);
 +   #endif
 +   
 +  --- src/Makefile.global.in.orig 2007-11-13 01:13:19.000000000 +0100
 +  +++ src/Makefile.global.in 2010-03-10 13:42:04.000000000 +0100
 +  @@ -435,9 +435,10 @@
 +   endif
 +   
 +   # to make ws2_32.lib the last library, and always link with shfolder,
 +  -# so SHGetFolderName isn't picked up from shell32.dll
 +  +# so SHGetFolderName isn't picked up from shell32.dll.  Also link
 +  +# with secur32 for SSPI.
 +   ifeq ($(PORTNAME),win32)
 +  -LIBS += -lws2_32 -lshfolder
 +  +LIBS += -lws2_32 -lshfolder -lsecur32
 +   endif
 +   
 +   # Not really standard libc functions, used by the backend.
 +  --- src/template/win32.orig 2004-11-08 06:23:26.000000000 +0100
 +  +++ src/template/win32 2010-03-10 13:40:59.000000000 +0100
 +  @@ -1,4 +1,4 @@
 +   # This is required to link pg_dump because it finds pg_toupper() in
 +   # libpq and pgport
 +  -LDFLAGS="-Wl,--allow-multiple-definition"
 +  +LDFLAGS="${LDFLAGS} -Wl,--allow-multiple-definition"
 +   
 +
 +Then configure:
 +
 +  $ LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include ./configure --prefix=/c/met.no --disable-shared
 +
 +We don't want to install the entire package (server and all); we'll just install the library and headers and the ''pg_config'' tool which is used by other packages (such as ''libpqxx'') that link against ''libpq'' This complicates the build process a little, but saves a lot of time:
 +
 +  $ make -C src/port all
 +  $ make -C src/backend utils/fmgroids.h
 +  $ make -C src/backend ../../src/include/utils/fmgroids.h
 +  $ make -C src/include all install
 +  $ make -C src/interfaces/libpq all install
 +  $ make -C src/bin/pg_config all install
 +  $ cp COPYRIGHT /c/met.no/copyright/libpq.txt
 +
 +==== libpqxx (C++ interface) ====
 +
 +First, get the latest source (currently 3.0.2) from http://pqxx.org/development/libpqxx/wiki/DownloadPage and extract it in a convenient place. 
 +
 +Then configure:
 +
 +  $ LIBS=-lsecur32 LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include PG_CONFIG=/c/met.no/bin/pg_config.exe ./configure --prefix=/c/met.no --disable-shared
 +
 +The ''LIBS=-lsecur32'' part is necessary because ''libpqxx'''s configure script uses a plain ''AC_CHECK_LIB'' instead of ''pg_config'' (which would have told it that it needed ''-lsecur32'').
 +
 +Finally, build and install:
 +
 +  $ make all install
 +  $ cp AUTHORS /c/met.no/copyright/libpqxx.txt
 +  $ cat COPYING >>/c/met.no/copyright/libpqxx.txt
  • diana/windows/building/sql.1266509514.txt.gz
  • Last modified: 2022-05-31 09:23:14
  • (external edit)