/build-extras/2007-10Oct/Cairo-1.043/Makefile.PL

https://code.google.com/p/camelbox/ · Perl · 375 lines · 315 code · 44 blank · 16 comment · 4 complexity · 3c8aedbeac10ba81a872f5ecf331dee2 MD5 · raw file

  1. #
  2. # Copyright (c) 2004-2006 by the cairo perl team (see the file README)
  3. #
  4. # Licensed under the LGPL, see LICENSE file for more information.
  5. #
  6. # $Header: /cvs/cairo/cairo-perl/Makefile.PL,v 1.28 2007-10-13 21:23:16 tsch Exp $
  7. #
  8. BEGIN { require 5.006; }
  9. use strict;
  10. use warnings;
  11. use ExtUtils::MakeMaker;
  12. use MakeHelper;
  13. my %extreqs = (
  14. 'cairo' => '1.0.0',
  15. );
  16. # Unfortunately we already need these prereqs for writing the Makefile ...
  17. my %prereqs = (
  18. 'ExtUtils::Depends' => 0.2,
  19. 'ExtUtils::PkgConfig' => 1.0,
  20. );
  21. # ... thus we have to make sure they are installed.
  22. while ((my $module, my $version) = each(%prereqs)) {
  23. unless (eval "use $module $version; 1" ) {
  24. print "This module requires $module to install itself.\n";
  25. my $yn = ExtUtils::MakeMaker::prompt(" Install $module from CPAN?", 'y');
  26. unless ($yn =~ /^y/i) {
  27. die " *** Cannot install without $module. Exiting ...\n";
  28. }
  29. require Cwd;
  30. require File::Spec;
  31. require CPAN;
  32. # Save this 'cause CPAN will chdir all over the place.
  33. my $cwd = Cwd::cwd();
  34. my $makefile = File::Spec->rel2abs($0);
  35. CPAN::Shell->install($module);
  36. chdir $cwd
  37. or die "Cannot chdir() back to $cwd: $!";
  38. }
  39. eval "use $module $version; 1" or die $@;
  40. }
  41. # Add this now since it's not required to generate a Makefile.
  42. $prereqs{'Test::Number::Delta'} = 1.00;
  43. my $autogen_dir = 'build';
  44. mkdir $autogen_dir unless (-d $autogen_dir);
  45. $MakeHelper::autogen_dir = $autogen_dir;
  46. my %cairo_cfg = ExtUtils::PkgConfig->find ("cairo >= $extreqs{cairo}");
  47. my %backend_guards = (
  48. 'cairo_pdf_surface_t' => 'CAIRO_HAS_PDF_SURFACE',
  49. 'cairo_ps_surface_t' => 'CAIRO_HAS_PS_SURFACE',
  50. 'cairo_svg_surface_t' => 'CAIRO_HAS_SVG_SURFACE',
  51. );
  52. my %objects = (
  53. 'cairo_t *' => 'Cairo::Context',
  54. 'cairo_font_face_t *' => 'Cairo::FontFace',
  55. 'cairo_pattern_t *' => 'Cairo::Pattern',
  56. 'cairo_scaled_font_t *' => 'Cairo::ScaledFont',
  57. 'cairo_surface_t *' => 'Cairo::Surface',
  58. );
  59. my %structs = (
  60. 'cairo_font_options_t *' => 'Cairo::FontOptions',
  61. 'cairo_matrix_t *' => 'Cairo::Matrix',
  62. );
  63. my %enums = (
  64. cairo_antialias_t => [qw/
  65. CAIRO_ANTIALIAS_
  66. CAIRO_ANTIALIAS_DEFAULT
  67. CAIRO_ANTIALIAS_NONE
  68. CAIRO_ANTIALIAS_GRAY
  69. CAIRO_ANTIALIAS_SUBPIXEL
  70. /],
  71. cairo_content_t => [qw/
  72. CAIRO_CONTENT_
  73. CAIRO_CONTENT_COLOR
  74. CAIRO_CONTENT_ALPHA
  75. CAIRO_CONTENT_COLOR_ALPHA
  76. /],
  77. cairo_extend_t => [qw/
  78. CAIRO_EXTEND_
  79. CAIRO_EXTEND_NONE
  80. CAIRO_EXTEND_REPEAT
  81. CAIRO_EXTEND_REFLECT
  82. /],
  83. cairo_fill_rule_t => [qw/
  84. CAIRO_FILL_RULE_
  85. CAIRO_FILL_RULE_WINDING
  86. CAIRO_FILL_RULE_EVEN_ODD
  87. /],
  88. cairo_filter_t => [qw/
  89. CAIRO_FILTER_
  90. CAIRO_FILTER_FAST
  91. CAIRO_FILTER_GOOD
  92. CAIRO_FILTER_BEST
  93. CAIRO_FILTER_NEAREST
  94. CAIRO_FILTER_BILINEAR
  95. CAIRO_FILTER_GAUSSIAN
  96. /],
  97. cairo_font_slant_t => [qw/
  98. CAIRO_FONT_SLANT_
  99. CAIRO_FONT_SLANT_NORMAL
  100. CAIRO_FONT_SLANT_ITALIC
  101. CAIRO_FONT_SLANT_OBLIQUE
  102. /],
  103. cairo_font_weight_t => [qw/
  104. CAIRO_FONT_WEIGHT_
  105. CAIRO_FONT_WEIGHT_NORMAL
  106. CAIRO_FONT_WEIGHT_BOLD
  107. /],
  108. cairo_format_t => [qw/
  109. CAIRO_FORMAT_
  110. CAIRO_FORMAT_ARGB32
  111. CAIRO_FORMAT_RGB24
  112. CAIRO_FORMAT_A8
  113. CAIRO_FORMAT_A1
  114. /],
  115. cairo_hint_metrics_t => [qw/
  116. CAIRO_HINT_METRICS_
  117. CAIRO_HINT_METRICS_DEFAULT
  118. CAIRO_HINT_METRICS_OFF
  119. CAIRO_HINT_METRICS_ON
  120. /],
  121. cairo_hint_style_t => [qw/
  122. CAIRO_HINT_STYLE_
  123. CAIRO_HINT_STYLE_DEFAULT
  124. CAIRO_HINT_STYLE_NONE
  125. CAIRO_HINT_STYLE_SLIGHT
  126. CAIRO_HINT_STYLE_MEDIUM
  127. CAIRO_HINT_STYLE_FULL
  128. /],
  129. cairo_line_cap_t => [qw/
  130. CAIRO_LINE_CAP_
  131. CAIRO_LINE_CAP_BUTT
  132. CAIRO_LINE_CAP_ROUND
  133. CAIRO_LINE_CAP_SQUARE
  134. /],
  135. cairo_line_join_t => [qw/
  136. CAIRO_LINE_JOIN_
  137. CAIRO_LINE_JOIN_MITER
  138. CAIRO_LINE_JOIN_ROUND
  139. CAIRO_LINE_JOIN_BEVEL
  140. /],
  141. cairo_operator_t => [qw/
  142. CAIRO_OPERATOR_
  143. CAIRO_OPERATOR_CLEAR
  144. CAIRO_OPERATOR_SOURCE
  145. CAIRO_OPERATOR_OVER
  146. CAIRO_OPERATOR_IN
  147. CAIRO_OPERATOR_OUT
  148. CAIRO_OPERATOR_ATOP
  149. CAIRO_OPERATOR_DEST
  150. CAIRO_OPERATOR_DEST_OVER
  151. CAIRO_OPERATOR_DEST_IN
  152. CAIRO_OPERATOR_DEST_OUT
  153. CAIRO_OPERATOR_DEST_ATOP
  154. CAIRO_OPERATOR_XOR
  155. CAIRO_OPERATOR_ADD
  156. CAIRO_OPERATOR_SATURATE
  157. /],
  158. cairo_path_data_type_t => [qw/
  159. CAIRO_PATH_
  160. CAIRO_PATH_MOVE_TO
  161. CAIRO_PATH_LINE_TO
  162. CAIRO_PATH_CURVE_TO
  163. CAIRO_PATH_CLOSE_PATH
  164. /],
  165. cairo_status_t => [qw/
  166. CAIRO_STATUS_
  167. CAIRO_STATUS_SUCCESS
  168. CAIRO_STATUS_NO_MEMORY
  169. CAIRO_STATUS_INVALID_RESTORE
  170. CAIRO_STATUS_INVALID_POP_GROUP
  171. CAIRO_STATUS_NO_CURRENT_POINT
  172. CAIRO_STATUS_INVALID_MATRIX
  173. CAIRO_STATUS_INVALID_STATUS
  174. CAIRO_STATUS_NULL_POINTER
  175. CAIRO_STATUS_INVALID_STRING
  176. CAIRO_STATUS_INVALID_PATH_DATA
  177. CAIRO_STATUS_READ_ERROR
  178. CAIRO_STATUS_WRITE_ERROR
  179. CAIRO_STATUS_SURFACE_FINISHED
  180. CAIRO_STATUS_SURFACE_TYPE_MISMATCH
  181. CAIRO_STATUS_PATTERN_TYPE_MISMATCH
  182. CAIRO_STATUS_INVALID_CONTENT
  183. CAIRO_STATUS_INVALID_FORMAT
  184. CAIRO_STATUS_INVALID_VISUAL
  185. CAIRO_STATUS_FILE_NOT_FOUND
  186. CAIRO_STATUS_INVALID_DASH
  187. /],
  188. cairo_subpixel_order_t => [qw/
  189. CAIRO_SUBPIXEL_ORDER_
  190. CAIRO_SUBPIXEL_ORDER_DEFAULT
  191. CAIRO_SUBPIXEL_ORDER_RGB
  192. CAIRO_SUBPIXEL_ORDER_BGR
  193. CAIRO_SUBPIXEL_ORDER_VRGB
  194. CAIRO_SUBPIXEL_ORDER_VBGR
  195. /],
  196. );
  197. # --------------------------------------------------------------------------- #
  198. my $have_cairo_1_2 = ExtUtils::PkgConfig->atleast_version("cairo", "1.2.0");
  199. my $have_cairo_1_4 = ExtUtils::PkgConfig->atleast_version("cairo", "1.4.0");
  200. if ($have_cairo_1_2) {
  201. my %new = (
  202. cairo_extend_t => [qw/CAIRO_EXTEND_PAD/],
  203. cairo_format_t => [qw/CAIRO_FORMAT_RGB16_565/],
  204. cairo_status_t => [qw/CAIRO_STATUS_INVALID_DSC_COMMENT/],
  205. );
  206. foreach my $enum (keys %new) {
  207. foreach my $value (@{$new{$enum}}) {
  208. push @{$enums{$enum}}, $value;
  209. }
  210. }
  211. $enums{cairo_font_type_t} = [qw/
  212. CAIRO_FONT_TYPE_
  213. CAIRO_FONT_TYPE_TOY
  214. CAIRO_FONT_TYPE_FT
  215. CAIRO_FONT_TYPE_WIN32
  216. CAIRO_FONT_TYPE_ATSUI
  217. /];
  218. $enums{cairo_pattern_type_t} = [qw/
  219. CAIRO_PATTERN_TYPE_
  220. CAIRO_PATTERN_TYPE_SOLID
  221. CAIRO_PATTERN_TYPE_SURFACE
  222. CAIRO_PATTERN_TYPE_LINEAR
  223. CAIRO_PATTERN_TYPE_RADIAL
  224. /];
  225. $enums{cairo_surface_type_t} = [qw/
  226. CAIRO_SURFACE_TYPE_
  227. CAIRO_SURFACE_TYPE_IMAGE
  228. CAIRO_SURFACE_TYPE_PDF
  229. CAIRO_SURFACE_TYPE_PS
  230. CAIRO_SURFACE_TYPE_XLIB
  231. CAIRO_SURFACE_TYPE_XCB
  232. CAIRO_SURFACE_TYPE_GLITZ
  233. CAIRO_SURFACE_TYPE_QUARTZ
  234. CAIRO_SURFACE_TYPE_WIN32
  235. CAIRO_SURFACE_TYPE_BEOS
  236. CAIRO_SURFACE_TYPE_DIRECTFB
  237. CAIRO_SURFACE_TYPE_SVG
  238. /];
  239. $enums{cairo_svg_version_t} = [qw/
  240. CAIRO_SVG_VERSION_
  241. CAIRO_SVG_VERSION_1_1
  242. CAIRO_SVG_VERSION_1_2
  243. /];
  244. } else {
  245. # We need to create empty enum entries for new types so that typemaps
  246. # are generated for them. xsubpp demands typemaps even if the code is
  247. # #if'd out.
  248. $enums{cairo_font_type_t} = [];
  249. $enums{cairo_pattern_type_t} = [];
  250. $enums{cairo_surface_type_t} = [];
  251. $enums{cairo_svg_version_t} = [];
  252. }
  253. if ($have_cairo_1_4) {
  254. my %new = (
  255. cairo_status_t => [qw/CAIRO_STATUS_INVALID_INDEX
  256. CAIRO_STATUS_CLIP_NOT_REPRESENTABLE/],
  257. );
  258. foreach my $enum (keys %new) {
  259. foreach my $value (@{$new{$enum}}) {
  260. push @{$enums{$enum}}, $value;
  261. }
  262. }
  263. }
  264. # --------------------------------------------------------------------------- #
  265. my %enum_guards = (
  266. cairo_svg_version_t => $backend_guards{cairo_svg_surface_t},
  267. );
  268. MakeHelper::do_enums (\%enums, \%enum_guards);
  269. my @xs_files = <*.xs>;
  270. MakeHelper::write_boot (
  271. xs_files => \@xs_files,
  272. ignore => '^Cairo$',
  273. );
  274. my @typemaps = MakeHelper::do_typemaps (\%objects, \%structs, \%enums,
  275. \%backend_guards, \%enum_guards);
  276. push @typemaps, 'cairo-perl.typemap';
  277. my $dep = ExtUtils::Depends->new ('Cairo');
  278. $dep->set_inc ('-I. -I'.$autogen_dir.' '.$cairo_cfg{cflags});
  279. $dep->set_libs ($cairo_cfg{libs});
  280. $dep->add_xs (@xs_files);
  281. $dep->add_c ('cairo-perl-enums.c');
  282. $dep->add_pm ('Cairo.pm' => '$(INST_LIBDIR)/Cairo.pm');
  283. $dep->add_typemaps (@typemaps);
  284. $dep->install (qw(cairo-perl.h
  285. cairo-perl.typemap
  286. doctypes
  287. build/cairo-perl-auto.h
  288. build/cairo-perl-auto.typemap));
  289. $dep->save_config ('build/IFiles.pm');
  290. my @exports = qw(
  291. cairo_font_type_from_sv
  292. cairo_font_type_to_sv
  293. cairo_object_from_sv
  294. cairo_object_to_sv
  295. cairo_pattern_to_sv
  296. cairo_struct_from_sv
  297. cairo_struct_to_sv
  298. cairo_surface_to_sv
  299. newSVCairoFontExtents
  300. newSVCairoTextExtents
  301. newSVCairoGlyph
  302. SvCairoGlyph
  303. newSVCairoPath
  304. SvCairoPath
  305. );
  306. WriteMakefile (
  307. NAME => 'Cairo',
  308. VERSION_FROM => 'Cairo.pm',
  309. ABSTRACT_FROM => 'Cairo.pm',
  310. PREREQ_PM => \%prereqs,
  311. XSPROTOARG => '-noprototypes',
  312. FUNCLIST => \@exports,
  313. DL_FUNCS => { Cairo=> [] },
  314. $dep->get_makefile_vars,
  315. EXTRA_META => qq(
  316. configure_requires:
  317. ExtUtils::Depends: $prereqs{'ExtUtils::Depends'}
  318. ExtUtils::PkgConfig: $prereqs{'ExtUtils::PkgConfig'}
  319. build_requires:
  320. Test::Number::Delta: $prereqs{'Test::Number::Delta'}
  321. no_index:
  322. file:
  323. - MakeHelper.pm
  324. ),
  325. );
  326. sub MY::postamble
  327. {
  328. my $autogen_dir = $MakeHelper::autogen_dir;
  329. "realclean ::
  330. -\$(RM_RF) $autogen_dir cairo-perl-enums.*";
  331. }