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