This package contains every library CDO needs for full functionality including automated tasks for building and installing:

Repository: source:/branches/libs4cdo

Download: Files

Installation of libraries

After unpacking the tarball, there are two main targets ready to use for building and installing all libs:

  1. libs4cdo: build and install all libraries, that are currently supported by the unix version of CDO.
  2. win32libs4cdo: build and install all libraries, that are currently supported by the windows version of CDO. For the list of supported libraries, see the windows page.
Besides the natural dependecies of the libraries settings for each of the targets can be found in config files:
  1. libs4cdo:
  2. win32libs4cdo:

The default actions on a UNIX-based machine after extraction are:

cd libs4cdo-x.x.x
make libs4cdo

The default installation directory is called build. Please set the PREFIX variable on the command line for a different location, e.g. make libs4cdo PREFIX=/usr/local. Relative paths are possible, because most version of make can figure out the absolute path. Be sure that PREFIX has really made it into the configure call. Variable handling depends on your version of make. Therefor each call of make starts with a short log message, which displays some settings, e.g. make libs4cdo PREFIX=/usr/local/trash prints

make config all install LIB="zlib-1.2.3 szip-2.1 proj-4.6.1" PREFIX=/usr/local/trash
make[1]: Entering directory `/home/ram/src/cdo/branches/libs4cdo'
Global Target: config
LIB: zlib-1.2.3 szip-2.1 proj-4.6.1
DEFAULT_LIBS: grib_api-1.8.0 hdf5-1.8.4 jasper-1.900.1 netcdf-3.6.3 netcdf-4.0.1 proj-4.6.1 pthreads-w32-2-8-0-release szip-2.1 win32/hdf5-1.8.4 zlib-1.2.3
if test -z "zlib-1.2.3 szip-2.1 proj-4.6.1"; then for lib in grib_api-1.8.0 hdf5-1.8.4 jasper-1.900.1 netcdf-3.6.3 netcdf-4.0.1 proj-4.6.1 pthreads-w32-2-8-0-release szip-2.1 win32/hdf5-1.8.4 zlib-1.2.3; do make $lib  ACTION=config CROSS= PREFIX=/usr/local/trash; done; else make zlib-1.2.3 szip-2.1 proj-4.6.1 ACTION=config CROSS= PREFIX=/usr/local/trash; fi;
make[2]: Entering directory `/home/ram/src/cdo/branches/libs4cdo'
LIBTARGET: zlib-1.2.3
LIBENV   : --prefix=/usr/local/trash
ACTION   : config
Start configuring zlib-1.2.3: 
Checking for gcc...

Use the CROSS variable for different cross compiler. The Makefile uses both variables, so just have a look into it if you need examples. For most recent documentation use make help.
It is highly recommended, that the windows emulator Wine is installed and configured to handle exe files automatically. On Ubunutu systems, this is done by the package management system via setting mime-type rules. Otherwise, cross compiling will fail, e.g. hdf5 uses a self created binary to create further source code.

Avoid a library

If one of the libraries is not neccessary for you (e.g. zlib, which might already be installed), it can be removed from building stage (see Makefile,


The configuration file must be updated:
$(NETCDF3_6_3)_CONFIGURE_OPTS +=  --enable-c-only --enable-shared
$(NETCDF4)_CONFIGURE_OPTS     +=  --enable-c-only --enable-shared --with-hdf5=$(PREFIX) --with-szlib=$(PREFIX) --enable-netcdf-4
$(HDF5)_CONFIGURE_OPTS        +=  --with-zlib=/usr --with-szlib=$(PREFIX) --enable-shared --enable-hl --disable-cxx --disable-fortran --enable-threadsafe --with-pthread
$(PROJ)_CONFIGURE_OPTS        +=  --without-mutex --disable-jni
$(JASPER)_CONFIGURE_OPTS      +=  --enable-shared
$(GRIBAPI)_CONFIGURE_OPTS     +=  --with-jasper=$(PREFIX) --disable-fortran

Adding new library/Use Makefile for other library

The Makefile is designed for easy extension of libs4cdo or reuse for other projects. Most targets are generated on the fly, depending on how you call it. Lets say lib-fancy is your project to impress your boss. It uses autoconf and supports different configuration settings for different purposes. Testing all theses settings can be a hard and you do not want to retype the configure statements all the time. Of course you could write a shell script, maybe you could write in assembler, Visual Basic, xslt or latex, but this is about dependencies. And that's what make was designed for.
Put the Makefile in the parent directory of you lib-fancy code. Without changing the Makefile

make config LIB=lib-fancy
run the default configure settings inside the lib-fancy directory. This could also be done by make lib-fancy ACTION=config. Both variants have their purpose, but let's get back to that later.

To run a complete fresh build on lib-fancy, type

 make config clean all install LIB=lib-fancy
or with a different prefix
 make config all install LIB=lib-fancy PREFIX=/usr/local/lib-fancy-default

If you need to check lib-fancy with different compilers or configure options, create a file, let's say, that contains
$(LIB)_CONFIGURE_OPTS := --with-netcdf=$(PREFIX) --prefix=$(PREFIX)
$(LIB)_CONFIGURE_ENV  := CC='suncc'

and call
make config LIB=lib-fancy

for applying that change. Need a separate PREFIX for this setting? Add this to
      make config LIB=$(LIB) PREFIX=/usr/local/lib-fancy-sun

and call the target: make fancySun LIB=lib-fancy Like predefined targets, additional ones can be combined with other targets:
 make fancySun all install LIB=lib-fancy

The variable PREFIX is a used for presets in the Makefile, that's why it cannot be overwritten entirely by setting it in a config file. It has to be given on the command line (which can be saved in the config file).

And now for all, who love the command line too much to creating a file, here is the call which does the above in a single line:

make config all install LIB=lib-fancy  lib-fancy_CONFIGURE_OPTS="--with-netcdf=$(pwd)/build-sun --prefix=$(pwd)/build-sun" lib-fancy_CONFIGURE_ENV="CC=suncc"

Building CDO against libs4cdo

make libs4cdo installs all libraries in the same directory. If the PREFIX variable was not set on the command line, this directory is /path-to-libs4cdo/build. If you extracted libs4cdo into you home directory, this would be $HOME/libs4cdo-0.0.7/build.
Building CDO with libs4cdo is fairly easy now: Every of the configure options --with-szlib, --with-hdf5, --with-netcdf and --with-proj get the same directory as their argument:

 ./configure --with-szlib=$HOME/libs4cdo-0.0.7/build --with-hdf5=$HOME/libs4cdo-0.0.7/build --with-netcdf=$HOME/libs4cdo-0.0.7/build --with-proj=$HOME/libs4cdo-0.0.7/build 

Same holds true for the grip_api and jasper libraries.

The options --with-zlib and --with-threads should not be necessary on most unix platforms and cygwin, because zlib and posix threads are available on almost every unix-like system. That's why these two things are not installed by default, when

 make libs4cdo
is called.