Table of Contents

Building NetCDF, HDF4 and HDF5 on Windows

There are binaries available, and they're probably fine, but the headers are not, because HDF4 / HDF5 install different headers depending on which compiler they were built with (which in itself is a bug). Luckily, building them from source is fairly easy.

Yeah, right. Actually, HDF4 is a nightmare, so we've left it out.

NetCDF

First, get the latest source (currently 4.0.1) from http://www.unidata.ucar.edu/software/netcdf/ and extract it in a convenient place, then configure, build and install:

$ LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include ./configure --prefix=/c/met.no --disable-f90 --disable-examples
$ make all install
$ cp COPYRIGHT /c/met.no/copyright/netcdf.txt

Note the --enable-shared part; you can leave out --disable-f90 and --disable-examples if you want, but keep --enable-shared.

HDF5

First, get the latest source (currently 1.8.3) from http://www.hdfgroup.org/HDF5/release/obtain5.html and extract it in a convenient place.

In HDF5 1.8.3, there are several issues we need to address before we can build the library.

note: the first two issues have been reported to the HDF Group and will be fixed in the next release.

The first is a bug in perform/sio_engine.c: on line 376, replace mkdir with HDmkdir.

The second is that the test scripts use Winsock (ws2_32.lib), but don't link against it. This can be fixed by running the following commands before configure:

$ echo 'libh5test_la_LIBADD=-lws2_32' >>test/Makefile.am

The third is that several HDF5 libraries have a dependency on libhdf5, but libtool isn't told about this. This can be fixed in the same manner as the ws2_32 issue:

$ echo 'libhdf5_cpp_la_LIBADD=$(LIBHDF5)' >>c++/src/Makefile.am
$ echo 'libhdf5_hl_la_LIBADD=$(LIBHDF5)' >>hl/src/Makefile.am
$ echo 'libhdf5_hl_cpp_la_LIBADD=$(LIBH5_HL)' >>hl/c++/src/Makefile.am

Finally, HDF5's configure.in uses the LT_INIT macro, which only works with very recent versions of automake. Edit configure.in and replace these two lines:

LT_PREREQ([2.2])
LT_INIT([dlopen])

with this:

AC_LIBTOOL_DLOPEN
AM_PROG_LIBTOOL

XXX alternative: use more recent autotools versions, but this has repercussions for all other components

Now we need to regenerate everything:

$ aclocal
$ libtoolize --copy --force
$ autoheader
$ automake --add-missing --copy --foreign
$ autoconf

The fourth and final issue is that C++ support is not enabled by default. To enable it, add –enable-cxx to the configure command line.

Finally:

$ LDFLAGS=-L/c/met.no/lib CPPFLAGS=-I/c/met.no/include ./configure --prefix=/c/met.no --enable-cxx
$ make all install
$ cp COPYING /c/met.no/copyright/hdf5.txt

TODO fix large file support!