# Copyright (C) 1999-2016 ImageMagick Studio LLC
#
# This program is covered by multiple licenses, which are described in
# LICENSE.  You should have received a copy of LICENSE with this
# package; otherwise see https://imagemagick.org/script/license.php.
#
#  Makefile for building PerlMagick under Windows
#
#
#
use ExtUtils::MakeMaker;
use Config;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
#
# NOTE: The current ActiveState binary distribution does not completely setup
# the values in C:/Perl/lib/Config.pm. You must manually modify the values of
# libpth to add the VisualC++ library path. It should look similar to one of
# the following examples in order to work properly.
#
#  Random developer
#   libpth='"C:\Perl\lib\CORE" "D:\DevStudio\VC98\lib"'
#
#  Visual Studio 6.0 default install:
#   libpth='"C:\Program Files\Microsoft Visual Studio\VC98\lib" "C:\Perl\lib\CORE"'
#
#  Visual Studio 7.0 default install:
#   libpth='"C:\Program Files\Microsoft Visual Studio .NET\vc7\lib" "C:\Perl\lib\CORE"'
#
#  Visual Studio 7.1 default install:
#   libpth='"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib" "C:\Perl\lib\CORE"'
#
#  Visual Studio 9.0 default install (C:\Perl\lib\Config.pm):
#  libpth='"C:\Program Files\Microsoft Visual Studio 9.0\VC\lib" "C:\Perl\lib\CORE"'
#
WriteMakefile(
    'ABSTRACT'  => 'ImageMagick PERL Extension',
    'AUTHOR'    => 'ImageMagick Studio',
    'NAME'      => 'Image::Magick',
    'VERSION_FROM' => 'Magick.pm', # finds $VERSION
    'LIBS'      => ['-L..\..\VisualMagick\lib -L..\..\VisualMagick\bin -lCORE_RL_MagickCore_.lib -lCORE_DB_MagickCore_.lib'],
    'DEFINE'    => '-D_VISUALC_ -D_WINDOWS',     # e.g., '-DHAVE_SOMETHING' 
    'INC'       => '-I.. -I..\xlib\include',
    'BINARY_LOCATION'  => 'x86/Image-Magick.tar.gz',
    'dist' => {ZIP => "zip.exe", ZIPFLAGS=>"-r"},
    'clean' => {FILES => "Image-Magick.ppd Image-Magick.tar.gz PerlMagick.zip " },
    ($Config{'archname'} =~ /-object$/i ? ('CAPI' => 'TRUE') : ()),
);

#
# Add a targets for building ActiveState ppm distribution modules 
# Dylan Beattie <dylan@zepler.org>, April 2002
#
# Requires tar, gzip, and zip.  This produces PerlMagick.zip
# Get GNU tar and gzip from http://sourceware.cygnus.com/
# Get Win32 command line PKZIP from http://www.pkware.com/ 
# and rename PKZIP.EXE to ZIP.EXE and PKUNZIP.EXE to UNZIP.EXE
# Make sure tar.exe, gzip.exe and zip.exe are in your system path
#
# 'nmake ppm' will include only the PerlMagick module
# 'nmake ppm-full' also includes all ImageMagick DLLs and MGK files

sub MY::postamble
{
	'
Image-Magick.tar.gz: ppd pure_all #htmlifypods manifypods
	if exist Image-Magick.tar.gz del Image-Magick.tar.gz
	if exist Image-Magick.tar del Image-Magick.tar
	$(TAR) $(TARFLAGS) Image-Magick.tar blib
	$(COMPRESS) -q Image-Magick.tar

release: Image-Magick.tar.gz

ppm: ppd pure_all htmlifypods manifypods
	if exist PerlMagick.zip del PerlMagick.zip
	$(TAR) $(TARFLAGS) Image-Magick.tar blib
	$(COMPRESS) -q Image-Magick.tar
	if exist x86 del x86 /f /q
	if exist x86 rd x86
	md x86
	copy Image-Magick.tar$(SUFFIX) x86
	del Image-Magick.tar$(SUFFIX)
	if exist ppm-readme.txt copy ppm-readme.txt readme
	$(ZIP) $(ZIPFLAGS) PerlMagick.zip readme Image-Magick.ppd x86/Image-Magick.tar$(SUFFIX)
	del x86\Image-Magick.tar$(SUFFIX)
	rd x86

ppm-full: ppd pure_all htmlifypods manifypods
	if exist PerlMagick-full.zip del PerlMagick-full.zip
	copy ..\..\VisualMagick\bin\*.dll blib\arch\auto\Image\Magick
	copy ..\..\VisualMagick\bin\*.xml blib\arch\auto\Image\Magick
	$(TAR) $(TARFLAGS) Image-Magick.tar blib
	$(COMPRESS) -q Image-Magick.tar
	if exist x86 del x86 /f /q
	if exist x86 rd x86
	md x86
	copy Image-Magick.tar$(SUFFIX) x86
	del Image-Magick.tar$(SUFFIX)
	if exist ppm-readme.txt copy ppm-readme.txt readme
	$(ZIP) $(ZIPFLAGS) PerlMagick-full.zip readme Image-Magick.ppd x86/Image-Magick.tar$(SUFFIX)
	del x86\Image-Magick.tar$(SUFFIX)
	rd x86
	'
}

#
# Modify the MakeMaker test fragment
#
sub MY::test
{
   #
   # List any ImageMagick features derived from add-on libraries
   # or programs you would like to test.
   #
   # Valid choices are:
   #
   #  Feature   Formats Tested		Prerequisites
   #  =======   ======================	======================================
   #   bzlib    BZip compression	BZip library
   #   cgm	CGM format		'ralcgm' program
   #   hdf	HDF format		HDF library
   #   jbig	JBIG format		JBIG library
   #   jpeg 	JPEG format		JPEG library
   #   mpeg	MPEG format		'ffmpeg' program
   #   png	PNG format		PNG and Zlib libraries
   #   ps	Postscript format	'gs' program and/or DPS library
   #   rad	Radiance format		'ra_ppm' program
   #   tiff	TIFF format		TIFF library
   #   ttf	TrueType font format	FreeType library
   #   x	X11 support		X-windows libraries and server
   #   xfig	Xfig format		'transfig' program
   #   zlib	Zip compression		Zlib library
   #
   my @DELEGATES = qw/ bzlib cgm jbig jpeg mpeg png ps tiff wmf x xfig zlib/;

   package MY; # so that "SUPER" works right
   my $inherited = shift->SUPER::test(@_);
   my $delegate_tests=
    " t/setattribute.t" .
    " t/getattribute.t" .
    " t/filter.t" .
    " t/read.t" .
    " t/ping.t" .
    " t/montage.t" .
    " t/write.t" .
    " t/hpgl/read.t" .
    " t/jbig/read.t" .
    " t/jbig/write.t" .
    " t/jng/read.t" .
    " t/jng/write.t" .
    " t/openjp2/read.t" .
    " t/jpeg/read.t" .
    " t/jpeg/write.t" .
    " t/png/read.t" .
    " t/png/write.t" .
    " t/ps/read.t" .
    " t/ps/write.t" .
    " t/tiff/read.t" .
    " t/tiff/write.t" .
    " t/ttf/read.t" .
    " t/wmf/read.t" .
    " t/zlib/read.t" .
    " t/zlib/write.t";
   if ( defined $ENV{'DISPLAY'} ) {
    $delegate_tests .= " t/x11/write.t t/x11/read.t";
   }
   $inherited =~ s:^TEST_FILES =.*:TEST_FILES = ${delegate_tests}:m;
   $inherited;
}
