wiki:DevWikiWinMingW64

Version 122 (modified by robe, 13 years ago) ( diff )

Compiling using MingGW-w64 for 64-bit

Back to Compiling in Windows If you want to get to the last step fast of just compiling PostGIS without having to compile the dependencies, you can download our prepared mingw64 bit chain which you can download from http://www.bostongis.com/postgisstuff/ming64.zip , extract to C:\ming64, and launch the c:\ming64\msys\msys.bat and you should be on your way

and edit the file in C:\ming64\projects\postgis\builds\makepostgis20w64.sh

for testing you'll want to initdb the postgres servers in C:\ming64\projects\pgx64 and then run the start stop scripts. Clicking the batch will start the postgres server and clicking enter will shut it down. With that you can jump straight to the section on compiling PostGIS

We are working on similar chaing for 32-bit installation.

1. Installing Minimalist GNU for Windows-w64 (MinGW-w64)

The objective will be to try to use the MingGW-w64 toolchain instead of the standard MingW since it has support for both 32-bit and 64-bit compiling. Note: We are not successful yet, but just writing down our steps as we go along.

Details of the prefixes of files can be found at What to download

MingW-w64 site is http://mingw-w64.sourceforge.net

starting with mingw-w64-1.0-bin_i686-mingw_

mingw-w32-1.0-bin_i686-mingw_ (for my purposes I used mingw-w32-1.0-bin_i686-mingw_20110408.zip) and for native 64-bit (currently using mingw-w64-1.0-bin_i686-mingw_20110516)

  • Extract your respective zip into a folder called C:\ming64\mingw64 or c:\ming32\mingw32

Geos fails to link if it picks up 32-bit dlls so to overcome this, I copied over the dlls from windows/sytem32 and renamed them as described in #linking errors seems to be caused by as described here http://www.gaia-gis.it/spatialite-3.0.0-BETA/mingw64_how_to.html#env mingw64 is picking up the 32-bit dlls from syswow64 instead of the 64-bit dlss from windows/system32 I only needed to copy ws2_32.dll for geos to compile without errors Others may be needed not sure. with windows explorer copy the files from windows/system32

ws2_32.dll

To your folder: C:\ming64\x86_64-w64-mingw32\lib and then rename them adding a lib extensions so you have

libws2_32.dll
# these ones didn't seem necessary for PostGIS: libmsimg32.dll,libgdi32.dll, libcrypt32.dll and libwldap32.dll

2. Installing Msys

MSys is 32-bit but you can use it with your 32-bit or 64-bit mingw-w64. Instructions are here mingw-w64 with MSYS and repeated here for completeness

  • download Msys MSYS-20110309.zip (update there is now a newer MSYS — MSYS-20110526.zip)
  • Extract into a folder called C:\Msys
  • launch msys.bat
  • type
sh /postinstall/pi.sh

When prompted type in C:/ming64/mingw64 or C:/ming32/mingw32 depending on which tool chain you chose Once done, type logout and the console should exit.

3a. Installing Autoconf, Automake and Libtool

Relaunch C:\mysy\msys.bat

Verify which versions of these you have with

autoconf —version

etc.

If they are not newer (or you get not found) than below then download and install. Download the source code from the GNU site and save to c:\projects

cd /c/projects
tar -xvf autoconf-2.65.tar.gz
cd autoconf-2.65
./configure --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw  (if you are building for 64-bit then use --host=x86_64-w64-mingw32)
make && make install
autoconf --version

repeat same exercise for automake

For libtool unzip tar -xvf libtool-2.4.10.tar.gz with 7zip into projects folder

cd /c/projects

cd libtool-2.4
./configure --host=x86_64-w64-mingw32 --disable-shared --prefix=/mingw
#if you are building on 32-bit then use --host=i686-w64-mingw32 for the host
#if you get a message that gcc is not usable, then you probably set your
# mingw setting wrong or did not install automake/autotools in /mingw
#try to fix by rerunning the sh /postinstall/pi.sh again
make clean && make && make install
libtool --version

3.b create project folders

 cd /c/projects
 mkdir pg
 mkdir postgresql
 mkdir geos
 mkdir proj
 ls

GDAL

cd /c/projects
mkdir gdal
cd gdal
wget http://download.osgeo.org/gdal/gdal-1.9.0.tar.gz
tar xvfz gdal-1.9.0.tar.gz
cd gdal-1.9.0

./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --with-threads=no --prefix=/c/projects/gdal/rel-1.9.0w64 
make && make install
cd /c/projects/gdal/rel-1.9.0w64/bin
strip *.dll

4. Compiling GEOS

Download latest GEOS source from http://trac.osgeo.org/geos/ either the http://download.osgeo.org/geos/geos-3.3.2.tar.bz2 You can also use the trunk svn version https://svn.osgeo.org/geos/trunk. If you are using svn version, make sure to run:

sh autogen.sh

this fails at linker phase with a whole bunch of errors if you compile without doing #linking errors seems to be caused by as described here http://www.gaia-gis.it/spatialite-3.0.0-BETA/mingw64_how_to.html#env mingw64 is picking up the 32-bit dlls from syswow64 instead of the 64-bit dlss from windows/system32 I may have over-copied, but to remedy before evening starting configure with windows explorer copy the files from windows/system32

ws2_32.dll, kernel32.dll, advapi32.dll, mscvrt.dll, user32.dll

To your folder: C:\mingw\mingw64\x86_64-w64-mingw32\lib and then rename them adding a lib extensions so you have

libws2_32.dll, libkernel32.dll, libadvapi32.dll, libmscvrt.dll, libuser32.dll

# hack described in http://www.gaia-gis.it/spatialite-3.0.0-BETA/mingw64_how_to.html#libgeos

simplify/.libs/libsimplify.a(TopologyPreservingSimplifier.o):TopologyPreservingS
implifier.cpp:(.rdata+0x1f0): undefined reference to `geos::geom::util::GeometryTransformer::transformGeometryCollection(geos::geom::GeometryCollection const*,
geos::geom::Geometry const*)'

and bunch of other classes in util::GeometryTransformer..
the .la file gets created so seems to be at linker phase.

— follow instructions in http://www.gaia-gis.it/spatialite-3.0.0-BETA/mingw64_how_to.html#libgeos

cd /c/projects/geos
tar xjf geos-3.3.3.tar.bz2
cd geos-3.3.3
./configure --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --prefix=/c/projects/geos/rel-3.3.3w64 | tee /c/geos_configure_3.3.log 
make
make install

To strip all the debug info weight from the libgeos DLL files, run

strip /c/projects/bin/geos/rel-3.3.3/*.dll

Installing LibIconv

For iconv we are going to compile our own copy instead of installing from GNUWin.

Save the source in your C:\ming64\projects directory. Open up the MSYS terminal. Ignore the errors in the configure process.

cd /c/projects
tar xvfz libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/c/projects/rel-libiconv-1.13.1w64
make
make install

Copy rel-.. contents int c:\mingw\mingw64 folder. For some reason using libiconv-prefix did not work for configuring postgis. Verify if the version of iconv you are running is the same as the one you just compiled (1.13):

# iconv --version

Compiling Proj

Download Proj4 from the web site, and the datum shifts grid file.

and copy to c:\projects\proj The datum grid file must be unzipped into the "nad" subdirectory of the Proj4 source tree.

 cd /c/projects/proj
 wget http://download.osgeo.org/proj/proj-4.7.0.tar.gz
 wget http://download.osgeo.org/proj/proj-datumgrid-1.5.zip 
 tar xvfz proj-4.7.0.tar.gz
 cd proj-4.7.0
 cd nad
 unzip ../../proj-datumgrid-1.5.zip
 cd ..

Apply mutex patch in http://trac.osgeo.org/proj/ticket/72 to src/pj_mutex.c

#if you are building for 64-bit then use x86_64-w64-mingw32 for the build,host,target
#32 bit uses i686-w64-mingw32 for build, host, target
 ./configure --prefix=/c/projects/proj/rel-4.7.0w64 --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --enable-shared --disable-static

 make
 make install

Seems to give an error on make install (when trying to copy over the nad folder), but generates files in rel-4.7.0. Have to copy the nad folder manually. The .dll file is strangely called libproj-0.dll. of libproj.dll. Oh well.

Compiling and Installing C-Unit

Download from http://sourceforge.net/projects/cunit/ into c:\projects

cd /c/projects
wget http://iweb.dl.sourceforge.net/project/cunit/CUnit/2.1-2/CUnit-2.1-2-src.tar.bz2
tar -xvf CUnit-2.1-2-src.tar.bz2
cd CUnit-2.1.2
#if you are building for 64-bit then use x86_64-w64-mingw32 for the build,host,target
#32 bit uses i686-w64-mingw32 for build, host, target
./configure --host=x86_64-w64-mingw32 --prefix=/mingw
make && make install

For some reason, PostGIS couldn't find my cunit install. So I had to copy the files: from C:\ming64\mingw64\include\CUnit to C:\ming64\mingw64\x86_64-w64-mingw32\include\CUnit

7. Compiling LibXML2

mkdir /c/projects/libxml
cd /c/projects/libxml
wget ftp://xmlsoft.org/libxml2/libxml2-2.7.8.tar.gz 
 tar xvfz libxml2-2.7.8.tar.gz 
cd libxml2-2.7.8
#if you are building for 64-bit then use x86_64-w64-mingw32 for the build,host,target
#32 bit uses i686-w64-mingw32 for build, host, target
 ./configure --prefix=/c/projects/libxml/rel-libxml2-2.7.8w64 --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --enable-shared --with-threads=no  CFLAGS=-O2
#Note to self: used to have CCFLAGS=LDFLAGS="-Wl,-static"  in here will see how it goes without
#If you have pthreads installed, libxml picks it up and royally screws up thus the need for --with-threads=no
 make
 make install

You might get an error during the configure process

/bin/rm: cannot lstat `libtoolT': No such file or directory

That error seems safe to ignore.

8. Compiling PostgreSQL 9.1

Download source from: http://ftp.postgresql.org/pub/source/v9.1.3/postgresql-9.1.3.tar.bz2

mkdir /c/projects/pgx64
cd postgresql
tar -xvjf postgresql-9.1.3.tar.bz2
cd postgresql-9.1.3
#if you are building for 64-bit then use x86_64-w64-mingw32 for the build,host,target
#32 bit uses i686-w64-mingw32 for build, host, target
#EnterpriseDb VC++ 64-bit builds are compiled with disable float8 by val. 
#If we don't include this line, the modules compiled against mingw64 will be incompatible with edb builds
./configure --prefix=/c/projects/pgx64/pg91 \
 --build=x86_64-w64-mingw32 \
 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 \
 --with-pgport=5441 --enable-cassert --enable-debug \
 --enable-integer-datetimes --disable-float8-byval --without-zlib

 make
 make install
#initialize the database cluster
/c/projects/pgx64/pg91/bin/initdb -U postgres -D /c/projects/pgx64/pg91/data -A trust

Compiling JSON-C

This is needed if you want ST_GeomFromGeoJSON to be functional. Download http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz and save to c:\projects\json-c

cd /c/projects/json-c
tar xvfz json-c-0.9.tar.gz
cd json-c-0.9
## had to compile with -w (disable warnings otherwise it gave errors
./configure --build=x86_64-w64-mingw32 \
 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 \
 --prefix=/c/projects/json-c/rel-0.9w64 CFLAGS=-w
make clean
make
make install

Copy over needed dlls to PostgreSQL folders

export PATHOLD=$PATH
export PATH=$PATH:/c/projects/pgx64/pg91edb/bin:/mingw
export PGHOST=localhost
export PGPORT=5441
export PGUSER=postgres
cp /c/projects/geos/rel-3.3.3w64/bin/*.dll /c/projects/pgx64/pg91edb/bin
cp /c/projects/gdal/rel-1.9.0w64/bin/*.dll /c/projects/pgx64/pg91edb/bin
cp /c/projects/proj/rel-4.7.0w64/bin/*.dll  /c/projects/pgx64/pg91edb/bin
cp /c/mingw/mingw64/bin/libgcc_s_sjlj-1.dll /c/projects/pgx64/pg91edb/bin
cp /c/projects/geos/rel-3.3.3w64/bin/*.dll /c/projects/pgx64/pg91/bin
cp /c/projects/gdal/rel-1.9.0w64/bin/*.dll /c/projects/pgx64/pg91/bin
cp /c/projects/proj/rel-4.7.0w64/bin/*.dll  /c/projects/pgx64/pg91/bin
cp /c/mingw/mingw64/bin/libgcc_s_sjlj-1.dll /c/projects/pgx64/pg91/bin

Getting GTK

If you want to build the shp2pgsql-gui loader in 64-bit, you can use the pre-compiled gtk bundle which already has the needed headers

export PORJECTS=/c/ming64/projects/gtk
cd ${PROJECTS}
mkdir gtk
cd gtk
wget 
http://ftp.gnome.org/pub/gnome/binaries/win64/gtk+/2.22/gtk+-bundle_2.22.1-20101229_win64.zip
unzip gtk+-bundle_2.22.1-20101229_win64.zip

Compiling PostGIS 2.0

export PROJECTS=/c/ming64/projects
export PG_VER=91
export PGWINVER=${PG_VER}edb
# had to override the paths since cunit was picking up 32-bit junk and crashing
export PATHOLD=".:/bin:/include:/mingw/bin:/mingw/include:/c/Windows/system32:/c/Windows:/c/ming64/mingw64/include"
export PATH="${PATHOLD}:${PROJECTS}/pgx64/pg${PG_VER}/bin:${PROJECTS}/pgx64/pg${PG_VER}/lib"
#needed to build comments and shp2pgsql-gui
export PATH="${PATH}:${PROJECTS}/xsltproc:${PROJECTS}/gtk/bin"
export POSTGIS_SRC=${PROJECTS}/postgis/postgis-${POSTGIS_MICRO_VER}
cd /c/ming64/projects
mkdir postgis
cd postgis
wget http://www.postgis.org/download/postgis-${POSTGIS_MICRO_VER}.tar.gz
tar xvf postgis-${POSTGIS_MICRO_VER}.tar.gz
cd ${POSTGIS_SRC}

CPPFLAGS="-I${PROJECTS}/pgx64/pg${PG_VER}/include -I${PROJECTS}/gettextrel-gettext-0.18.1/include -I${PROJECTS}/rel-libiconv-1.13.1w64/include" \
LDFLAGS="-L${PROJECTS}/pgx64/pg${PG_VER}/lib -L${PROJECTS}/gdal/rel-${GDAL_VER}/lib -L${PROJECTS}/gettext/rel-gettext-0.18.1/lib -L${PROJECTS}/rel-libiconv-1.13.1w64/lib" ./configure \
 --build=x86_64-w64-mingw32  \
  --with-xml2config=${PROJECTS}/libxml/rel-libxml2-2.7.8w64/bin/xml2-config \
  --with-pgconfig=${PROJECTS}/pgx64/pg${PG_VER}/bin/pg_config \
  --with-geosconfig=${PROJECTS}/geos/rel-${GEOSVER}/bin/geos-config \
  --with-projdir=${PROJECTS}/proj/rel-4.7.0w64 \
  --with-gdalconfig=${PROJECTS}/gdal/rel-${GDAL_VER}/bin/gdal-config \
  --with-jsondir=${PROJECTS}/json-c/rel-0.9w64 \
  --with-libiconv=${PROJECTS}/rel-libiconv-1.13.1w64 \
  --with-gui --with-gettext=no

#this part is a hack, but again didn't work without it #you can try without doing this, but if you get errors about # conflicting type def boolean during PostGIS compile, you need this. #In my case I got this:

In file included from c:/ming64/projects/json-c/rel-0.9w64/include/json/json_util.h:1

                 from c:/projects/json-c/rel-0.9w64/include/json/json.h:23,
                 from lwgeom_in_geojson.c:31:
c:/ming64/projects/json-c/rel-0.9w64/include/json/json_object.h:32: error: conflictin
types for 'boolean'
c:\mingw\mingw64\bin\../lib/gcc/x86_64-w64-mingw32/4.4.7/../../../../x86_64-w6
mingw32/include/rpcndr.h:52: note: previous declaration of 'boolean' was here
make[1]: *** [lwgeom_in_geojson.o] Error 1
  • Open up /c/projects/json-c/rel-0.9/include/json/json_object.h
  • remark out line 32 that reads

typedef int boolean

  • so it should now read

/** typedef int boolean; **/

  • During the PostGIS configure process, you have to put this back the way it was otherwise configure complains json.h or something is not usable and refuses to configure with JSON-C support. Then you remark the line out again during compile. Crazy I know, but json-c won't compile without that line so can't take it out before json-c compile.

If you run into problems with your build, pipe the output into a file for further analysis. The GUI requires that pkg-config be on your PATH, check that it is there by running 'which pkg-config'.

make 2>&1 | tee /c/build.log
make check
make install
Note: See TracWiki for help on using the wiki.