- add limited tests for Imager::ExtUtils
[imager.git] / lib / Imager / ExtUtils.pm
1 package Imager::ExtUtils;
2 use strict;
3 use File::Spec;
4
5 use vars qw($VERSION);
6
7 $VERSION = "1.002";
8
9 =head1 NAME
10
11 Imager::ExtUtils - functions handy in writing Imager extensions
12
13 =head1 SYNOPSIS
14
15   # make Imager easier to use with Inline
16   # perldoc Imager::Inline
17   use Inline with => 'Imager';
18
19 =head1 DESCRIPTION
20
21 =over
22
23 =item base_dir
24
25 Returns the base directory where Imager is installed.
26
27 =cut
28
29 # figure out where Imager is installed
30 sub base_dir {
31   for my $inc_dir (@INC) {
32     if (-e "$inc_dir/Imager.pm") {
33       my $base_dir = $inc_dir;
34       unless (File::Spec->file_name_is_absolute($base_dir)) {
35         $base_dir = File::Spec->rel2abs($base_dir);
36       }
37       return $base_dir;
38     }
39   }
40
41   die "Cannot locate an installed Imager!";
42 }
43
44 =item inline_config
45
46 Implements Imager's Inline::C C<with> hook.
47
48 =cut
49
50 sub inline_config {
51   my ($class) = @_;
52   my $base = base_dir();
53
54   return
55     {
56      INC => $class->includes,
57      TYPEMAPS => $class->typemap,
58      AUTO_INCLUDE => <<CODE,
59 /* Inserted by Imager $Imager::VERSION */
60 #include "imext.h"
61 #include "imperl.h"
62 DEFINE_IMAGER_CALLBACKS;
63 CODE
64      BOOT => 'PERL_INITIALIZE_IMAGER_CALLBACKS;',
65      FILTERS => \&_inline_filter,
66     };
67 }
68
69 my @inline_replace =
70   qw(
71    Imager::ImgRaw
72    Imager::Color::Float
73    Imager::Color
74    Imager::IO
75   );
76
77 my %inline_replace =
78   map { (my $tmp = $_) =~ s/::/__/g; $_ => $tmp } @inline_replace;
79
80 my $inline_replace_re = "\\b(" . join('|', @inline_replace) . ")\\b";
81
82 sub _inline_filter {
83   my $code = shift;
84
85   $code =~ s/$inline_replace_re/$inline_replace{$1}/g;
86
87   $code;
88 }
89
90 =item includes
91
92 Returns -I options suitable for use with ExtUtils::MakeMaker's INC
93 option.
94
95 =cut
96
97 sub includes {
98   my $class = shift;
99   my $base = $class->base_dir();
100
101   "-I" . $base . '/Imager/include',
102 }
103
104 =item typemap
105
106 Returns the full path to Imager's installed typemap.
107
108 =cut
109
110 sub typemap {
111   my $class = shift;
112   my $base = $class->base_dir();
113
114   $base . '/Imager/typemap';
115 }
116
117 1;
118
119 __END__
120
121 =back
122
123 =head1 AUTHOR
124
125 Tony Cook <tony@imager.perl.org>
126
127 =head1 REVISION
128
129 $Revision$
130
131 =head1 SEE ALSO
132
133 Imager, Imager::API, Imager::Inline, Imager::APIRef.
134
135 =cut