

                             Installing Magick++

General

In order to compile Magick++ you must have access to a standard C++
implementation. The author uses  gcc 3.1 (GNU C++) which is available under
UNIX and under the Cygwin UNIX-emulation environment for Windows. Standards
compliant commercial C++ compilers should also work fine. Most modern C++
compilers for Microsoft Windows or the Mac should work (project files are
provided for Microsoft Visual C++ 6.0).

It was decided that Magick++ will be around for the long-haul, so its API
definition depends on valuable C++ features which should be common in all
current and future C++ compilers. The compiler must support the following
C++ standard features:

   * templates
   * static constructors
   * C++-style casts (e.g. static_cast)
   * bool type
   * string class (<string>)
   * exceptions (<exception>)
   * namespaces
   * Standard Template Library (STL) (e.g. <list>, <vector>)

The author has personally verified that Magick++ compiles and runs using the
following compiler/platform combinations:

                            Tested Configurations

       Operating System         Architecture             Compiler
 SunOS 5.6, 5.7, 5.8
 ("Solaris 2.6, 7, & 8)      SPARC             GCC 3.0.4
 SunOS 5.7 ("Solaris 7")     SPARC             Sun Workshop 5.0 C++

 SunOS 5.8 ("Solaris 8")     SPARC             Sun WorkShop 6 update 2 C++
                                               5.3
 FreeBSD 4.0                 Intel Pentium II  GCC 2.95

 Windows NT 4.0 SP6a         Intel Pentium II  Visual C++ 6.0 Standard
                                               Edition

 Windows XP                  Intel Pentium IV  Visual C++ 6.0 Standard
                                               Edition Service Pack 5
 Windows '98 + Cygwin 1.3.10 Intel Pentium III GCC 2.95.3-5
 Windows NT 4.0 SP6a         Intel Pentium II  GCC 2.95.3-5
 Windows XP + Cygwin 1.3.10  Intel Pentium IV  GCC 2.95.3-5

Users of Magick++ have reported that the following configurations work with
Magick++:

                      Other Known Working Configurations

 Operating
  System  Architecture    Compiler   Reported By
 Red Hat  i386 & alpha EGCS 1.1.2    Dr. Alexander Zimmermann
 Linux 6.0                           <Alexander.Zimmermann@fmi.uni-passau.de>
 Red Hat  i386         GCC 2.95.2    Dr. Alexander Zimmermann
 Linux 7.0                           <Alexander.Zimmermann@fmi.uni-passau.de>
 Red Hat  i386         GCC "2.96"    ???
 Linux 7.0             snapshot
 Red Hat                             Dr. Alexander Zimmermann
 Linux 7.Xi386 & alpha GCC 3.0       <Alexander.Zimmermann@fmi.uni-passau.de>
 SGI IRIX MIPS         IRIX C++      Albert Chin-A-Young
 6.2, 6.5              7.3.1.2m      <china@thewrittenword.com>
 SunOS                 Sun WorkShop  Albert Chin-A-Young
 5.5.1    SPARC        CC 5.0        <china@thewrittenword.com>
 SunOS
 5.6, 5.7,SPARC        Sun Forte CC  Albert Chin-A-Young
 5.8                   5.3           <china@thewrittenword.com>
 HP-UX    PA-RISC      HP-UX aCC     Albert Chin-A-Young
 11.00                 A.03.30       <china@thewrittenword.com>
 Mac OS 9 PowerPC      CodeWarrior   Leonard Rosenthol <leonardr@digapp.com>
                       Professional
                       Release 6
 Mac OS X              GCC 2.95.2
 10.1     PowerPC      (apple gcc    Cristy
 "Darwin"              -926)

Please let me know if you have successfully built and executed Magick++
using a different configuration so that I can add to the table of verified
configurations.

  ------------------------------------------------------------------------

                                 Unix/Linux

Building From Source

Magick++ is now built using the ImageMagick configure script and Makefiles.
Please follow the installation instructions provided by its README.txt file.
The following instructions pertain to the Magick++ specific configuration
and build options.

To install ImageMagick plus Magick++ under Unix, installation should be
similar to

./configure [ --prefix=/prefix ]
make
make install

The library is currently named similar to 'libMagick++.a' (and/or
libMagick++.so.5.0.39) and is installed under prefix/lib while the headers
are installed with Magick++.h being installed in prefix/include and the
remaining headers in prefix/include/Magick++.

To influence the options the configure script chooses, you may specify
'make' option variables when running the configure script. For example, the
command


     ./configure CXX=CC CXXFLAGS=-O2 LIBS=-lposix

specifies additional options to the configure script.  The following table
shows the available options.

             Environment Variables That Effect Configure

     Make Option
      Variable                         Description

         CXX         Name of C++ compiler (e.g. 'CC -Xa') to use
                     compiler 'CC -Xa'
      CXXFLAGS       Compiler flags (e.g. '-g -O2') to compile with

      CPPFLAGS       Include paths (-I/somedir) to look for header
                     files
                     Library paths (-L/somedir) to look for
                     libraries. Systems that support the notion of a
       LDFLAGS       library run-path may additionally require
                     -R/somedir or '-rpath /somedir' in order to
                     find shared libraries at run time.
        LIBS         Extra libraries (-lsomelib) required to link

Installing Linux RPMs

Please note that the default version of the C++ compiler delivered with the
system may not be sufficient to support Magick++. Use of GCC 2.95 or later is
strongly recommended under Linux.
  ------------------------------------------------------------------------

                       Windows '9X, NT, 2000, ME, & XP

Visual C++

Windows '95 through Windows XP are supported by the ImageMagick source
package for NT available in the 'win2k' subdirectory of the ImageMagick ftp
site (and mirrors).  The ImageMagick source package for NT provides sources
to ImageMagick, Magick++, add-on libraries (e.g. JPEG), and a ready-made
Visual C++ 6.0 build environment. Please read the configuration and build
instructions in README.txt (under the heading "Windows Win2K/95 VISUAL C++
6.0 COMPILATION") in order to build Magick++.

Cygwin & GCC

It is possible to build both ImageMagick and Magick++ under the Cygwin
Unix-emulation environment for Windows NT. Obtain and install Cgywin from
http://www.cygwin.com/ .   An X11R6 environment for Cygwin is available
from  http://www.cygwin.com/xfree/ .To build using Cygwin and GCC, follow
the instructions for building under Unix. ImageMagick and Magick++ do not
yet include support for building Windows DLLs under Cygwin so do not enable
dynamic libraries when building ImageMagick.
