# graphviz build notes

## External packages

The full build requires external libraries that you must obtain elsewhere. Most, if not all of these are optional, and configure will build graphviz with reduced functionality if an external library is not found. Newer versions of these libraries should be fine - if not, please let us know.

A list of these external libraries can be found on the Graphviz source download page.

### Notes:

- GD (generic raster graphics driver for PNG, GIF, JPEG)
  Graphviz contains a copy of libgd, but we hope to remove it eventually so the external library is preferred.
- ZLIB (raster image compression)
  NB: Use "./configure -s" to build shared libraries. (See notes in zlib-1.2.3/Makefile)

These libraries (either static or dynamic) and their interface header files must already be on your system. It's OK if you install your own copies of these packages, though you may need to tell make or configure where to find them. Run "configure --help" for details.

On most Linux distributions these packages are already installed or installable from packages included in the distribution. You might need to install some -devel packages to get the include header files. Also, some of these packages require other packages, so for sanity, you should use some automated install mechanism such as rpms or macports, or look for complete packages.

## Abbreviated Build Instructions

The recommended method for building graphviz from a downloaded source package is the usual:

    	./configure
    	make
    	make install

If you are building from Git sources, then you must have recent versions of "libtool", "automake", and "autoconf". Build with:

    	./autogen.sh
    	./configure
    	make
    	make install

If you are not building with GNU tools, then there are some tried-and-true old-style Makefiles that can be used instead. Details below.

## Detailed Build Instructions

The preferred image renderer is cairo, with support from pango for fonts. This handles various bitmap formats as well as svg, pdf and PostScript.

The generic raster driver is `gd` and it can be configured to generate GIF (no compression), PNG (lossless compression), JPEG (lossy compression), and wireless bitmap (WBMP) files. The compressors all need `zlib`. In the current build, we use a top-level config.h file that defines various symbols, such as:

HAVE_JPEG
HAVE_PNG

This file is typically generated by configure based on how you invoke it and what it finds on your system. If you don't enable the `gd` based drivers, graphviz will still have the `printf` style drivers for PostScript and SVG. (However, even these benefit from better text size estimation via Freetype, when it is available.)

## Build tools for Unix

You have several choices.

1. (Recommended - requires gmake) Use configure generated by GNU autoconf. This comes with the source packages. This often works well on a vanilla Linux distribution with Tcl/Tk, freetype-devel and libjpeg already installed by root under /usr. It works OK with other versions of Unix, but some adjusting of command line arguments to `configure` may be needed. For Linux you can also just pick up the source tarball or RPMs here.

First, if you are using sources from Git, run "./autogen.sh" to generate the "configure" script. If you are using sources from graphviz-<version>.tar.gz this autogen.sh step should not be needed.

Next, run configure. For help on possible configure options, run:

    ./configure --help

For example, I use

    ./configure  --prefix=$HOME/arch/sgi.mips3 \
    	--with-freetypeincludedir=$HOME/arch/$ARCH/include/freetype2 \
    	--with-freetypelibdir=$HOME/arch/$ARCH/lib \
    	--with-tcl=/usr/common/tcl8.3.3

Obviously you would change the pathnames to reflect your installation.

Note that the directory ${prefix}/include is automatically searched for headers, and ${prefix}/lib for libraries.

If you have problems with one or more of the optional script language bindings, they can be disabled with e.g. --disable-perl.

When configure is finished, it reports which optional packages were found and which Graphviz features are enabled. If some package or feature you expected is not shown as used, you may need to check the config.log file or configure.ac or configure files to see what went wrong. Usually, any problem can be resolved using environment variables or the command-line flags of configure.

Once configure has finished, complete the build with

    gmake
    gmake install

2. To avoid the use of configure and gmake, the source package comes with a collection of simple non-GNU makefiles. As above, you need the external packages to be installed somewhere. Then

- Run configure.old from the root graphviz directory.
- Edit Config.mk for your architecture, tools, and installation directory. In particular, set the ARCH make variable.
- If desired, check settings in makearch/$(ARCH).
- Run make and make install.

## Build tools for win32

See separate build notes for Microsoft Windows.

With some persistence you can likely get Graphviz to build on UWIN or Cygwin installed on Microsoft Windows. You will still need various third-party packages to enable all the Graphviz drivers. We haven't tried to build tcldot or webdot in win32.

## Unix platform-specific build notes

## AIX

Matt Fago tells us that "--enable-shared=no" is required or the executables segfault after seemingly correct compiles. (Bug #421)

## SGI

The default Irix libjpeg is obsolescent. We need at least version 62. It wasn't at all clear to me where to get sources for this - eventually I found the source for v61 and patches for v62 using a search engine. We may eventually remove JPEG support (lossy compression seems good for photos, not technical diagrams) so if you can't get this to work, the loss of -Tjpeg is no big deal.

We found that on some platforms (Solaris?) gd/dotneato and freetype MUST be compiled with the same C compiler (e.g. gcc, or the native cc). Otherwise there are are weird stack argument errors in the call to TT_Open_Face. I don't have time to try to figure out what's wrong.

## Solaris

Put /usr/ccs/bin in PATH

## HP-UX

The X11 package must include /usr/contrib/X11R6 as well as the base stuff. For some reason GNU autoconf doesn't seem to find X11 in this location so you may need to add the following to the ./configure line:

    --with-Xawincludedir=/usr/contrib/X11R6/include --with-Xawlibdir=/usr/contrib/X11R6/lib

## Apple Mac OS/X

Currently, Glen Low provides a full-featured port of Graphviz. Also, Ryan Schmidt maintains versions of Graphviz for macports.

We recommend using macports to install the desired third-party libraries. Once these have been installed, the standard build using configure and make works fine. The only caveat is that sometimes, an incompatible, non-GNU tool is picked up rather than the needed GNU version.

Compiling Smyrna for OS X, Snow Leopard (Amanda Stent)

Xcode:
First if you updated from Leopard you have to reinstall developer tools. No getting around it, I tried, you just have to do it.

Macports:
Then you have to uninstall and clean up the Macports ports, all of them. Take the opportunity to reinstall Macports itself. There are migration instructions on the web, but it's a little hairier than they make it out to be because some of the links (e.g. hs-ports) will not be there and you will have to get over those hurdles manually.

Briefly, to do a clean install of macports do:

    sudo port -f uninstall installed
    sudo port clean --work --archive all
    and then new macports
    and then sudo port install the things you need now
    and possibly sudo port selfupdate and sudo port upgrade outdated at the end

Then you have to install all the tools needed for Smyrna, glut, glade, etc., and all their dependencies. This takes days.

Now macports doesn't do glut separately. It's sneaky because if you say install glut, something will happen, but actually glut now comes with mesa. This will mess up your head. (The real meat of glut is part of the mesa package - ed.)

Graphviz:
Then you get your graphviz and you configure with --with-smyrna. I used the following:

    configure --with-smyrna --with-glutincludedir=/opt/local/var/macports/software/mesa/7.6.1_1+hw_render/opt/local/include --with-glutlibdir=/opt/local/var/macports/software/mesa/7.6.1_1+hw_render/opt/local/lib --prefix=/usr/local/share/graphviz

(I use

    configure --with-smyrna --with-glutincludedir=/opt/local/include  --with-glutlibdir=/opt/local/lib

- ed.)

On the webs they say to use -framework commandline option to gcc; however I couldn't figure out how to make this work with the makefile and configure file for graphviz.

Now, I got to a certain point and it grumbled about permissions and refused to go any further. So you may have to chmod in the source directory.

And I got to the point where it was building gv_perl.cpp and it refused to go any further. I got around this eventually by changing the call to XS to XSPROTO, thus obviating the need for XSUB.h (what does it do for you? nothing!).

And then it said it was done but when I went to run it it wouldn't start due to some missing template.dot so then you make clean, and make install again because by now you are confused as well.

And then it should work!

By the way making by sneakily cd'ing into the macosx folder and using the makefile labeled with your OS *does not work*.

## GNU style building

    To produce graphviz-(ver).tar.gz from GIT sources using cogito.

        cg clone https://gitlab.com/graphviz/graphviz.git
    	cd graphviz
    or to update from GIT
    	cd graphviz
    	cg update
    then
    	./autogen.sh
    	make dist

    (Cogito & GIT are available from http://www.kernel.org/pub/software/scm/
    or as binary packages in Fedora-Extras )

    To build source and binary rpms (results are left in /usr/src/redhat/ ):

    	rpm -ta graphviz-(ver).tar.gz

    To build locally:

    	zcat graphviz-(ver).tar.gz | tar xfvo -
    	cd graphviz-(ver)
    	./configure
    	make
    	make install