This document describes the requirements and instructions to build ImageMagick
for Windows on your own machine.

Requirements

  o Visual Studio 2013 (or newer)
  o Git for Windows
  o AMD APP SDK (optional
  for OpenCL support)

Install Visual Studio dependencies

To build ImageMagick with Visual Studio the following components should
be installed:

  o Desktop development with C++ (workload)
  o Visual C++ ATL for x86 and x64
  o Visual C++ MFC for x86 and x64
  o Windows XP support for C++ (optional if the output needs to run on Windows
    XP)

Naming of these components might differ between version of Visual Studio. The
example above use the Visual Studio 2017 names.

Clone the dependencies

The ImageMagick library is build with a number of third party libraries. Run
CloneRepositories.cmd to clone these libraries and the ImageMagick library.

Build configure.exe

One of the folders that was created in the previous step is called VisualMagick
and this folder contains a folder called configure. This folder contains a
solution configure.sln. Open this solution with Visual Studio and start a
Release build of the project. This will create a file called configure.exe in
the folder. Running this program will start a Wizard that allows configuration
of ImageMagick and its individual components.

Build ImageMagick

Depending on which options where chosen when running configure.exe one of
the following solutions will be created in the VisualMagick folder:

  o VisualDynamicMT.sln (Dynamic Multi-threaded DLL runtimes)
  o VisualStaticMTD.sln (Static Multi-threaded DLL runtimes)
  o VisualStaticMT.sln (Static Multi-threaded runtimes)

Open the solution to start building ImageMagick. The binaries will be created
in the VisualMagick\bin folder.
