3 use ExtUtils::MakeMaker;
8 use vars qw(%Recommends);
9 use ExtUtils::Manifest qw(maniread);
10 use vars qw(%formats $VERBOSE $INCPATH $LIBPATH $NOLOG $DEBUG_MALLOC $MANUAL $CFLAGS $LFLAGS $DFLAGS);
13 # IM_INCPATH colon seperated list of paths to extra include paths
14 # IM_LIBPATH colon seperated list of paths to extra library paths
16 # IM_VERBOSE turns on verbose mode for the library finding and such
17 # IM_MANUAL to manually select which libraries are used and which not
18 # IM_ENABLE to programmatically select which libraries are used
20 # IM_NOLOG if true logging will not be compiled into the module
21 # IM_DEBUG_MALLOC if true malloc debbuging will be compiled into the module
22 # do not use IM_DEBUG_MALLOC in production - this slows
23 # everything down by alot
24 # IM_CFLAGS Extra flags to pass to the compiler
25 # IM_LFLAGS Extra flags to pass to the linker
26 # IM_DFLAGS Extra flags to pass to the preprocessor
27 # IM_SUPPRESS_PROMPT Suppress the prompt asking about gif support
29 getenv(); # get environment variables
31 my $lext=$Config{'so'}; # Get extensions of libraries
32 my $aext=$Config{'_a'};
34 my $help; # display help if set
35 my @enable; # list of drivers to enable
36 my @disable; # or list of drivers to disable
37 my @incpaths; # places to look for headers
38 my @libpaths; # places to look for libraries
39 my $noexif; # non-zero to disable EXIF parsing of JPEGs
40 my $no_gif_set_version; # disable calling EGifSetGifVersion
41 my $coverage; # build for coverage testing
42 GetOptions("help" => \$help,
43 "enable=s" => \@enable,
44 "disable=s" => \@disable,
45 "incpath=s", \@incpaths,
46 "libpath=s" => \@libpaths,
47 "verbose|v" => \$VERBOSE,
50 "nogifsetversion" => \$no_gif_set_version,
51 'coverage' => \$coverage);
54 print "Verbose mode\n";
56 import Data::Dumper qw(Dumper);
65 if ($NOLOG) { print "Logging not compiled into module\n"; }
67 push @defines, [ IMAGER_LOG => 1, "Logging system" ];
71 push @defines, [ IMAGER_DEBUG_MALLOC => 1, "Use Imager's DEBUG malloc()" ];
72 print "Malloc debugging enabled\n";
75 if (@enable && @disable) {
76 print STDERR "Only --enable or --disable can be used, not both, try --help\n";
82 my @incs; # all the places to look for headers
83 my @libs; # all the places to look for libraries
85 init(); # initialize global data
86 pathcheck(); # Check if directories exist
88 if (exists $ENV{IM_ENABLE}) {
89 my %en = map { $_, 1 } split ' ', $ENV{IM_ENABLE};
90 for my $key (keys %formats) {
91 delete $formats{$key} unless $en{$key};
95 my %en = map { $_ => 1 } map { split /,/ } @enable;
96 for my $key (keys %formats) {
97 delete $formats{$key} unless $en{$key};
101 delete @formats{map { split /,/ } @disable};
104 # Pick what libraries are used
111 # Make sure there isn't a clash between the gif libraries.
118 for my $frmkey (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
119 my $frm = $formats{$frmkey};
120 push @defines, [ $frm->{def}, 1, "$frmkey available" ];
121 $F_OBJECT .= ' ' .$frm->{objfiles};
122 if ($frm->{cflags}) {
123 $lib_cflags .= ' ' .$frm->{cflags};
124 ++$definc{$_} for map { /^-I(.*)$/ ? ($1) : () }
125 grep /^-I./, split ' ', $frm->{cflags};
127 if ($frm->{lflags}) {
128 $lib_lflags .= ' ' . $frm->{lflags};
131 $F_LIBS .= ' ' .$frm->{libfiles};
137 print "EXIF support enabled\n";
138 push @defines, [ 'IMEXIF_ENABLE', 1, "Enable experimental EXIF support" ];
139 $F_OBJECT .= ' imexif.o';
142 my $F_INC = join ' ', map "-I$_", map / / ? qq{"$_"} : $_,
143 grep !$definc{$_}, @incs;
144 $F_LIBS = join(' ',map "-L$_", map / / ? qq{"$_"} : $_,
145 grep !$deflib{$_}++, @libs) . $F_LIBS;
148 my $OSDEF = "-DOS_$^O";
150 if ($^O eq 'hpux') { $OSLIBS .= ' -ldld'; }
151 if (defined $Config{'d_dlsymun'}) { $OSDEF .= ' -DDLSYMUN'; }
153 my @objs = qw(Imager.o draw.o polygon.o image.o io.o iolayer.o
154 log.o gaussian.o conv.o pnm.o raw.o feat.o font.o
155 filters.o dynaload.o stackmach.o datatypes.o
156 regmach.o trans2.o quant.o error.o convert.o
157 map.o tags.o palimg.o maskimg.o img16.o rotate.o
158 bmp.o tga.o color.o fills.o imgdouble.o limits.o hlines.o
159 imext.o scale.o rubthru.o render.o paste.o compose.o);
161 $Recommends{Imager} =
162 { 'Parse::RecDescent' => 0 };
166 'VERSION_FROM' => 'Imager.pm',
167 'LIBS' => "$LFLAGS -lm $lib_lflags $OSLIBS $F_LIBS",
168 'DEFINE' => "$OSDEF $CFLAGS",
169 'INC' => "$lib_cflags $DFLAGS $F_INC",
170 'OBJECT' => join(' ', @objs, $F_OBJECT),
171 clean => { FILES=>'testout meta.tmp rubthru.c scale.c conv.c filters.c gaussian.c render.c rubthru.c' },
173 PREREQ_PM => { 'Test::More' => 0.47 },
177 if ($Config{gccversion}) {
178 push @ARGV, 'OPTIMIZE=-ftest-coverage -fprofile-arcs';
179 #$opts{dynamic_lib} = { OTHERLDFLAGS => '-ftest-coverage -fprofile-arcs' };
182 die "Don't know the coverage C flags for your compiler\n";
186 # eval to prevent warnings about versions with _ in them
187 my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
188 if ($MM_ver > 6.06) {
189 $opts{AUTHOR} = 'Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson';
190 $opts{ABSTRACT} = 'Perl extension for Generating 24 bit Images';
192 if ($MM_ver > 6.10) {
196 make_imconfig(\@defines);
198 if ($VERBOSE) { print Dumper(\%opts); }
199 mkdir('testout',0777); # since we cannot include it in the archive.
201 make_metafile(\%opts);
203 WriteMakefile(%opts);
210 my $perl = $self->{PERLRUN} ? '$(PERLRUN)' : '$(PERL)';
213 my @ims = grep /\.im$/, keys %$mani;
215 dyntest.$(MYEXTLIB) : dynfilt/Makefile
216 cd dynfilt && $(MAKE) $(PASTHRU)
218 lib/Imager/Regops.pm : regmach.h regops.perl
219 $(PERL) regops.perl regmach.h lib/Imager/Regops.pm
221 imconfig.h : Makefile.PL
222 $(ECHO) "imconfig.h out-of-date with respect to $?"
223 $(PERLRUN) Makefile.PL
224 $(ECHO) "==> Your Makefile has been rebuilt - re-run your make command <=="
226 lib/Imager/APIRef.pod : \$(C_FILES) apidocs.perl
227 $perl apidocs.perl lib/Imager/APIRef.pod
229 !.join('', map _im_rule($perl, $_), @ims)
234 my ($perl, $im) = @_;
236 (my $c = $im) =~ s/\.im$/.c/;
239 $c: $im lib/Imager/Preprocess.pm
240 $perl -Ilib -MImager::Preprocess -epreprocess $im $c
246 # manual configuration of helper libraries
251 Please answer the following questions about
252 which formats are avaliable on your computer
254 press <return> to continue
257 <STDIN>; # eat one return
259 for my $frm(sort { $formats{$b}{order} <=> $formats{$a}{order} } keys %formats) {
261 if ($formats{$frm}{docs}) { print "\n",$formats{$frm}{docs},"\n\n"; }
262 print "Enable $frm support: ";
265 if ($gz =~ m/^(y|yes|n|no)/i) {
266 $gz=substr(lc($gz),0,1);
268 delete $formats{$frm};
275 # automatic configuration of helper libraries
278 print "Automatic probing:\n" if $VERBOSE;
279 for my $frm (sort { $formats{$a}{order} <=> $formats{$b}{order} } keys %formats) {
280 delete $formats{$frm} if !checkformat($frm);
286 if ($formats{'gif'} and $formats{'ungif'}) {
287 print "ungif and gif can not coexist - removing ungif support\n";
288 delete $formats{'ungif'};
291 for my $frm (qw(gif ungif)) {
292 checkformat($frm) if ($MANUAL and $formats{$frm});
296 for my $frm (grep $formats{$_}, qw(gif ungif)) {
297 push(@dirs, @{$formats{$frm}{incdir}}) if $formats{$frm}{incdir};
301 FILES: for my $dir (@dirs) {
302 my $h = "$dir/gif_lib.h";
303 open H, "< $h" or next;
305 if (/GIF_LIB_VERSION\s+"\s*version\s*(\d+)\.(\d+)/i) {
315 # we need the version in a #ifdefable form
317 push @defines, [ IM_GIFMAJOR => $major, "Parsed giflib version" ];
318 push @defines, [ IM_GIFMINOR => $minor ];
319 push @defines, [ IM_NO_SET_GIF_VERSION => 1, "Disable EGifSetGifVersion" ]
320 if $no_gif_set_version;
327 # print "checking path $path\n";
328 if ( !opendir(DH,$path) ) {
329 warn "Cannot open dir $path: $!\n";
332 my @l=grep { $chk->($_) } readdir(DH);
335 return map $path, @l;
342 print " checkformat($frm)\n" if $VERBOSE;
344 my $probe_array = $formats{$frm}{'code'};
346 print " Calling probe function\n" if $VERBOSE;
347 if (ref $probe_array ne 'ARRAY') {
348 $probe_array = [ $probe_array ];
350 for my $func (@$probe_array) {
351 return 1 if $func->($formats{$frm}, $frm);
355 my $lib_check=$formats{$frm}{'libcheck'};
356 my $inc_check=$formats{$frm}{'inccheck'};
361 push(@l, grep_directory($lp,$lib_check));
366 push(@i, $ip) if $inc_check->($ip,$frm);
369 printf("%10s: includes %s - libraries %s\n",$frm,(@i?'found':'not found'),(@l?'found':'not found'));
370 $formats{$frm}{incdir} = \@i;
371 $formats{$frm}{libdir} = \@l;
372 return 1 if scalar(@i && @l);
375 printf("%10s: not available\n", $frm);
385 print " Include paths:\n";
386 for (@incs) { print $_,"\n"; }
388 @incs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @incs;
391 print "\nLibrary paths:\n";
392 for (@libs) { print $_,"\n"; }
394 @libs=grep { -d $_ && -r _ && -x _ or ( print(" $_ doesnt exist or is unaccessible - removed.\n"),0) } @libs;
399 # Format data initialization
401 # format definition is:
403 # default include path
404 # files needed for include (boolean perl code)
407 # files needed for link (boolean perl code)
408 # object files needed for the format
413 my @definc = qw(/usr/include);
414 @definc{@definc}=(1) x @definc;
417 split(/\Q$Config{path_sep}/, $INCPATH),
418 map _tilde_expand($_), map { split /\Q$Config{path_sep}/ } @incpaths
420 if ($Config{locincpth}) {
421 push @incs, grep -d, split ' ', $Config{locincpth};
423 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
424 push(@incs, split /;/, $ENV{INCLUDE}) if exists $ENV{INCLUDE};
426 if ($Config{incpath}) {
427 push @incs, grep -d, split /\Q$Config{path_sep}/, $Config{incpath};
431 /usr/include/freetype2
432 /usr/local/include/freetype2
433 /usr/local/include/freetype1/freetype
434 /usr/include /usr/local/include /usr/include/freetype
435 /usr/local/include/freetype);
436 if ($Config{ccflags}) {
437 my @hidden = map { /^-I(.*)$/ ? ($1) : () } split ' ', $Config{ccflags};
439 @definc{@hidden} = (1) x @hidden;
442 @libs= ( split(/\Q$Config{path_sep}/,$LIBPATH),
443 map _tilde_expand($_), map { split /\Q$Config{path_sep}/} @libpaths );
444 if ($Config{loclibpth}) {
445 push @libs, grep -d, split ' ', $Config{loclibpth};
448 push @libs, grep -d, qw(/sw/lib), split(/ /, $Config{'libpth'});
449 push @libs, grep -d, split / /, $Config{libspath} if $Config{libspath};
450 if ($^O =~ /win32/i && $Config{cc} =~ /\bcl\b/i) {
451 push(@libs, split /;/, $ENV{LIB}) if exists $ENV{LIB};
453 if ($^O eq 'cygwin') {
454 push(@libs, '/usr/lib/w32api') if -d '/usr/lib/w32api';
455 push(@incs, '/usr/include/w32api') if -d '/usr/include/w32api';
457 if ($Config{ldflags}) {
458 # some builds of perl put -Ldir into ldflags without putting it in
459 # loclibpth, let's extract them
460 my @hidden = grep -d, map { /^-L(.*)$/ ? ($1) : () }
461 split ' ', $Config{ldflags};
463 # don't mark them as seen - EU::MM will remove any libraries
464 # it can't find and it doesn't look for -L in ldflags
465 #@deflib{@hidden} = @hidden;
467 push @libs, grep -d, qw(/usr/local/lib);
472 inccheck=>sub { -e catfile($_[0], 'jpeglib.h') },
473 libcheck=>sub { $_[0] eq "libjpeg$aext" or $_ eq "libjpeg.$lext" },
477 In order to use jpeg with this module you need to have libjpeg
478 installed on your computer}
484 inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
485 libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
489 In order to use tiff with this module you need to have libtiff
490 installed on your computer}
496 inccheck=>sub { -e catfile($_[0], 'png.h') },
497 libcheck=>sub { $_[0] eq "libpng$aext" or $_[0] eq "libpng.$lext" },
498 libfiles=>$^O eq 'MSWin32' ? '-lpng -lzlib' : '-lpng -lz',
501 Png stands for Portable Network Graphics and is intended as
502 a replacement for gif on the web. It is patent free and
503 is recommended by the w3c, you need libpng to use these formats},
510 inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
511 libcheck=>sub { $_[0] eq "libgif$aext" or $_[0] eq "libgif.$lext" },
515 gif is the de facto standard for webgraphics at the moment,
516 it does have some patent problems. If you have giflib and
517 are not in violation with the unisys patent you should use
518 this instead of the 'ungif' option. Note that they cannot
519 be in use at the same time}
525 inccheck=>sub { -e catfile($_[0], 'gif_lib.h') },
526 libcheck=>sub { $_[0] eq "libungif$aext" or $_[0] eq "libungif.$lext" },
530 gif is the de facto standard for webgraphics at the moment,
531 it does have some patent problems. If you have libungif and
532 want to create images free from LZW patented compression you
533 should use this option instead of the 'gif' option}
536 $formats{'T1-fonts'}={
539 inccheck=>sub { -e catfile($_[0], 't1lib.h') },
540 libcheck=>sub { $_[0] eq "libt1$aext" or $_[0] eq "libt1.$lext" },
544 postscript t1 fonts are scalable fonts. They can include
545 ligatures and kerning information and generally yield good
546 visual quality. We depend on libt1 to rasterize the fonts
550 $formats{'TT-fonts'}=
554 inccheck=>sub { -e catfile($_[0], 'freetype.h')
555 && !-e catfile($_[0], 'fterrors.h') },
556 libcheck=>sub { $_[0] eq "libttf$aext" or $_[0] eq "libttf.$lext" },
559 code => \&freetype1_probe,
561 Truetype fonts are scalable fonts. They can include
562 kerning and hinting information and generally yield good
563 visual quality esp on low resultions. The freetype library is
564 used to rasterize for us. The only drawback is that there
565 are alot of badly designed fonts out there.}
570 inccheck=>sub { -e catfile($_[0], 'windows.h') },
571 libcheck=>sub { lc $_[0] eq 'gdi32.lib'
572 || lc $_[0] eq 'libgdi32.a' },
573 libfiles=>$^O eq 'cygwin' ? '-lgdi32' : '',
576 Uses the Win32 GDI for rendering text.
578 This currently only works on under normal Win32 and cygwin.
581 $formats{'freetype2'} =
585 # we always use a probe function
586 #inccheck=>sub { -e catfile($_[0], 'ft2build.h') },
587 #libcheck=>sub { $_[0] eq "libfreetype$aext" or $_[0] eq "libfreetype.$lext" },
588 libfiles=>'-lfreetype',
589 objfiles=>'freetyp2.o',
591 Freetype 2 supports both Truetype and Type 1 fonts, both of which are
592 scalable. It also supports a variety of other fonts.
596 \&freetype2_probe_ftconfig,
597 \&freetype2_probe_scan
602 for (keys %formats) { $formats{$_}->{docs} =~ s/^\s+/ /mg; }
609 defined($V) ? $V : "";
613 # Get information from environment variables
625 $DFLAGS) = map { gen $_ } qw(IM_VERBOSE
640 open CONFIG, "> imconfig.h"
641 or die "Cannot create imconfig.h: $!\n";
643 /* This file is automatically generated by Makefile.PL.
644 Don't edit this file, since any changes will be lost */
646 #ifndef IMAGER_IMCONFIG_H
647 #define IMAGER_IMCONFIG_H
649 for my $define (@$defines) {
651 print CONFIG "\n/*\n $define->[2]\n*/\n\n";
653 print CONFIG "#define $define->[0] $define->[1]\n";
655 print CONFIG "\n#endif\n";
659 # use pkg-config to probe for libraries
660 # works around the junk that pkg-config dumps on FreeBSD
664 is_exe('pkg-config') or return;
666 my $redir = $^O eq 'MSWin32' ? '' : '2>/dev/null';
668 !system("pkg-config $pkg --exists $redir");
671 # probes for freetype1 by scanning @incs for the includes and
672 # @libs for the libs. This is done separately because freetype's headers
673 # are stored in a freetype or freetype1 directory under PREFIX/include.
675 # we could find the files with the existing mechanism, but it won't set
676 # -I flags correctly.
678 # This could be extended to freetype2 too, but freetype-config catches
680 sub freetype1_probe {
681 my ($frm, $frmkey) = @_;
685 for my $inc (@incs) {
686 for my $subdir (qw/freetype freetype1/) {
687 my $path = File::Spec->catfile($inc, $subdir, 'freetype.h');
689 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
692 $found_inc = File::Spec->catdir($inc, $subdir);
699 for my $lib (@libs) {
700 my $a_path = File::Spec->catfile($lib, "libttf$aext");
701 my $l_path = File::Spec->catfile($lib, "libttf.$lext");
702 if (-e $a_path || -e $l_path) {
708 return unless $found_inc && $found_lib;
709 printf("%10s: includes %s - libraries %s\n", $frmkey,
710 ($found_inc ? 'found' : 'not found'),
711 ($found_lib ? 'found' : 'not found'));
713 $frm->{cflags} = "-I$found_inc";
714 $frm->{libfiles} = "-lttf";
719 # probes for freetype2 by trying to run freetype-config
720 sub freetype2_probe_ftconfig {
721 my ($frm, $frmkey) = @_;
723 is_exe('freetype-config') or return;
725 my $cflags = `freetype-config --cflags`
729 my $lflags = `freetype-config --libs`
733 # before 2.1.5 freetype-config --cflags could output
734 # the -I options in the wrong order, causing a conflict with
735 # freetype1.x installed with the same --prefix
738 # - both -Iprefix/include and -Iprefix/include/freetype2 are in cflags
740 # - freetype 1.x headers are in prefix/include/freetype
741 my @incdirs = map substr($_, 2), grep /^-I/, split ' ', $cflags;
743 && $incdirs[1] eq "$incdirs[0]/freetype2"
744 && -e "$incdirs[0]/freetype/freetype.h"
745 && -e "$incdirs[0]/freetype/fterrid.h") {
746 print "** freetype-config provided -I options out of order, correcting\n"
748 $cflags = join(' ', grep(!/-I/, split ' ', $cflags),
749 map "-I$_", reverse @incdirs);
751 $frm->{cflags} = $cflags;
752 $frm->{lflags} = $lflags;
754 printf "%10s: configured via freetype-config\n", $frmkey;
759 # attempt to probe for freetype2 by scanning directories
760 # we can't use the normal scan since we need to find the directory
761 # containing most of the includes
762 sub freetype2_probe_scan {
763 my ($frm, $frmkey) = @_;
768 for my $inc (@incs) {
769 my $path = File::Spec->catfile($inc, 'ft2build.h');
772 # try to find what it's including
774 open FT2BUILD, "< $path"
777 if (m!^\s*\#\s*include\s+<([\w/.]+)>!
778 || m!^\s*\#\s*include\s+"([\w/.]+)"!) {
786 # non-Unix installs put this directly under the same directory in
788 if (-e File::Spec->catfile($inc, $ftheader)) {
792 for my $subdir (qw/freetype2 freetype/) {
793 $path = File::Spec->catfile($inc, $subdir, 'fterrors.h');
797 $found_inc2 = File::Spec->catdir($inc, $subdir);
804 for my $lib (@libs) {
805 my $a_path = File::Spec->catfile($lib, "libfreetype$aext");
806 my $l_path = File::Spec->catfile($lib, "libfreetype.$lext");
807 if (-e $a_path || -e $l_path) {
813 printf("%10s: includes %s - libraries %s\n", $frmkey,
814 ($found_inc ? 'found' : 'not found'),
815 ($found_lib ? 'found' : 'not found'));
817 return unless $found_inc && $found_lib;
819 $frm->{cflags} = _make_I($found_inc);
820 $frm->{cflags} .= " " . _make_I($found_inc2) if $found_inc2;
821 $frm->{libfiles} = "-lfreetype";
832 $inc_dir =~ / / ? qq!-I"$inc_dir"! : "-I$inc_dir";
835 # probes for libpng via pkg-config
837 my ($frm, $frmkey) = @_;
839 is_exe('pkg-config') or return;
842 for my $check_conf (qw(libpng libpng12 libpng10)) {
843 if (_pkg_probe($check_conf)) {
844 $config = $check_conf;
850 my $cflags = `pkg-config $config --cflags`
853 my $lflags = `pkg-config $config --libs`
858 $frm->{cflags} = $cflags;
859 $frm->{lflags} = $lflags;
861 printf "%10s: configured via `pkg-config $config ...`\n", $frmkey;
867 return File::Spec->catfile(@_);
873 my @exe_suffix = $Config{_exe};
874 if ($^O eq 'MSWin32') {
875 push @exe_suffix, qw/.bat .cmd/;
878 for my $dir (File::Spec->path) {
879 for my $suffix (@exe_suffix) {
880 -x catfile($dir, "$name$suffix")
890 Usage: $0 [--enable feature1,feature2,...] [other options]
891 $0 [--disable feature1,feature2,...] [other options]
893 Possible feature names are:
894 png gif ungif jpeg tiff T1-fonts TT-fonts freetype2
897 Verbose library probing (or set IM_VERBOSE in the environment)
899 Disable logging (or set IM_NOLOG in the environment)
901 Add to the include search path
903 Add to the library search path
909 # generate the PM MM argument
910 # I'd prefer to modify the public version, but there doesn't seem to be
911 # a public API to do that
914 my $instbase = '$(INST_LIBDIR)';
916 # first the basics, .pm and .pod files
917 $pm{"Imager.pm"} = "$instbase/Imager.pm";
919 my $mani = maniread();
921 for my $filename (keys %$mani) {
922 if ($filename =~ m!^lib/! && $filename =~ /\.(pm|pod)$/) {
923 (my $work = $filename) =~ s/^lib//;
924 $pm{$filename} = $instbase . $work;
929 $pm{typemap} = $instbase . '/Imager/typemap';
931 # and the core headers
932 for my $filename (keys %$mani) {
933 if ($filename =~ /^\w+\.h$/) {
934 $pm{$filename} = $instbase . '/Imager/include/' . $filename;
938 # and the generated header
939 $pm{"imconfig.h"} = $instbase . '/Imager/include/imconfig.h';
947 # extract the version
948 my $version = MM->parse_version($opts->{VERSION_FROM})
949 or die "Could not extract version number from $opts->{VERSION_FROM}\n";
951 # we don't set this on older EU::MM and it corrupts META.yml
952 # so don't generate it
953 return unless $opts->{AUTHOR};
959 version_from: $opts->{VERSION_FROM}
962 for my $author (split /,\s*/, $opts->{AUTHOR}) {
963 $meta .= " - $author\n";
966 abstract: $opts->{ABSTRACT}
969 if (keys %{$Recommends{$opts->{NAME}}}) {
970 $meta .= "recommends:\n";
971 while (my ($module, $version) = each %{$Recommends{$opts->{NAME}}}) {
972 $meta .= " $module: $version\n";
975 if ($opts->{PREREQ_PM}) {
976 $meta .= "requires:\n";
977 while (my ($module, $version) = each %{$opts->{PREREQ_PM}}) {
978 $meta .= " $module: $version\n";
984 distribution_type: module
987 url: http://module-build.sourceforge.net/META-spec-v1.3.html
988 generated_by: $opts->{NAME} version $version
991 if (open META, "< META.yml") {
992 my $old_meta = do { local $/; <META> };
995 $save_meta = $old_meta ne $meta;
1001 print "Updating META.yml\n";
1002 open META, "> META.yml" or die "Cannot create META.yml: $!";
1012 if ($path =~ m!^~[/\\]!) {
1013 defined $home or $home = $ENV{HOME};
1014 if (!defined $home && $^O eq 'MSWin32'
1015 && defined $ENV{HOMEDRIVE} && defined $ENV{HOMEPATH}) {
1016 $home = $ENV{HOMEDRIVE} . $ENV{HOMEPATH};
1018 unless (defined $home) {
1019 $home = eval { (getpwuid($<))[7] };
1021 defined $home or die "You supplied $path, but I can't find your home directory\n";
1023 $path = File::Spec->catdir($home, $path);
1029 # This isn't a module, but some broken tools, like
1030 # Module::Depends::Instrusive insist on treating it like one.
1032 # http://rt.cpan.org/Public/Bug/Display.html?id=21229