rmagick 2.16.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rmagick might be problematic. Click here for more details.

Files changed (405) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +63 -0
  3. data/.devcontainer/Dockerfile +14 -0
  4. data/.devcontainer/ImageMagick6/devcontainer.json +11 -0
  5. data/.devcontainer/devcontainer.json +11 -0
  6. data/.devcontainer/setup-repo.sh +10 -0
  7. data/.devcontainer/setup-user.sh +45 -0
  8. data/.editorconfig +3 -0
  9. data/.github/ISSUE_TEMPLATE.md +17 -0
  10. data/.github/workflows/ci.yml +79 -0
  11. data/.gitignore +5 -1
  12. data/.rspec +1 -0
  13. data/.rubocop.yml +37 -340
  14. data/.rubocop_todo.yml +448 -0
  15. data/.yardopts +5 -0
  16. data/CHANGELOG.md +435 -0
  17. data/CODE_OF_CONDUCT.md +122 -7
  18. data/CONTRIBUTING.md +37 -6
  19. data/Gemfile +0 -6
  20. data/README.md +317 -0
  21. data/Rakefile +37 -35
  22. data/before_install_linux.sh +65 -28
  23. data/before_install_osx.sh +58 -2
  24. data/ext/RMagick/extconf.rb +286 -393
  25. data/ext/RMagick/rmagick.c +106 -111
  26. data/ext/RMagick/rmagick.h +235 -331
  27. data/ext/RMagick/rmagick_gvl.h +224 -0
  28. data/ext/RMagick/rmdraw.c +484 -842
  29. data/ext/RMagick/rmenum.c +316 -755
  30. data/ext/RMagick/rmfill.c +281 -191
  31. data/ext/RMagick/rmilist.c +450 -455
  32. data/ext/RMagick/rmimage.c +6247 -5289
  33. data/ext/RMagick/rminfo.c +721 -894
  34. data/ext/RMagick/rmkinfo.c +228 -0
  35. data/ext/RMagick/rmmain.c +727 -519
  36. data/ext/RMagick/rmmontage.c +127 -172
  37. data/ext/RMagick/rmpixel.c +638 -431
  38. data/ext/RMagick/rmstruct.c +102 -282
  39. data/ext/RMagick/rmutil.c +450 -363
  40. data/lib/rmagick/version.rb +5 -4
  41. data/lib/rmagick.rb +2 -0
  42. data/lib/rmagick_internal.rb +349 -413
  43. data/lib/rvg/clippath.rb +3 -4
  44. data/lib/rvg/container.rb +30 -22
  45. data/lib/rvg/deep_equal.rb +11 -11
  46. data/lib/rvg/describable.rb +2 -2
  47. data/lib/rvg/embellishable.rb +63 -68
  48. data/lib/rvg/misc.rb +136 -139
  49. data/lib/rvg/paint.rb +2 -1
  50. data/lib/rvg/pathdata.rb +7 -8
  51. data/lib/rvg/rvg.rb +47 -46
  52. data/lib/rvg/stretchable.rb +22 -28
  53. data/lib/rvg/stylable.rb +12 -10
  54. data/lib/rvg/text.rb +169 -165
  55. data/lib/rvg/transformable.rb +17 -16
  56. data/lib/rvg/units.rb +5 -5
  57. data/rmagick.gemspec +16 -39
  58. metadata +118 -395
  59. data/.hound.yml +0 -2
  60. data/.simplecov +0 -27
  61. data/.travis.yml +0 -74
  62. data/Doxyfile +0 -1514
  63. data/README.textile +0 -251
  64. data/deprecated/RMagick.rb +0 -6
  65. data/doc/.cvsignore +0 -1
  66. data/doc/comtasks.html +0 -287
  67. data/doc/constants.html +0 -1581
  68. data/doc/css/doc.css +0 -299
  69. data/doc/css/popup.css +0 -34
  70. data/doc/css/ref.css +0 -67
  71. data/doc/draw.html +0 -3272
  72. data/doc/ex/InitialCoords.rb +0 -22
  73. data/doc/ex/NewCoordSys.rb +0 -30
  74. data/doc/ex/OrigCoordSys.rb +0 -16
  75. data/doc/ex/PreserveAspectRatio.rb +0 -204
  76. data/doc/ex/RotateScale.rb +0 -36
  77. data/doc/ex/Skew.rb +0 -38
  78. data/doc/ex/Use01.rb +0 -15
  79. data/doc/ex/Use02.rb +0 -20
  80. data/doc/ex/Use03.rb +0 -16
  81. data/doc/ex/ViewBox.rb +0 -31
  82. data/doc/ex/adaptive_threshold.rb +0 -9
  83. data/doc/ex/add_noise.rb +0 -16
  84. data/doc/ex/affine.rb +0 -48
  85. data/doc/ex/affine_transform.rb +0 -20
  86. data/doc/ex/arc.rb +0 -49
  87. data/doc/ex/arcpath.rb +0 -32
  88. data/doc/ex/arcs01.rb +0 -28
  89. data/doc/ex/arcs02.rb +0 -59
  90. data/doc/ex/average.rb +0 -15
  91. data/doc/ex/axes.rb +0 -64
  92. data/doc/ex/baseline_shift01.rb +0 -17
  93. data/doc/ex/bilevel_channel.rb +0 -8
  94. data/doc/ex/blur_image.rb +0 -12
  95. data/doc/ex/border.rb +0 -10
  96. data/doc/ex/bounding_box.rb +0 -42
  97. data/doc/ex/cbezier1.rb +0 -41
  98. data/doc/ex/cbezier2.rb +0 -41
  99. data/doc/ex/cbezier3.rb +0 -41
  100. data/doc/ex/cbezier4.rb +0 -42
  101. data/doc/ex/cbezier5.rb +0 -42
  102. data/doc/ex/cbezier6.rb +0 -53
  103. data/doc/ex/channel.rb +0 -25
  104. data/doc/ex/charcoal.rb +0 -12
  105. data/doc/ex/chop.rb +0 -29
  106. data/doc/ex/circle.rb +0 -33
  107. data/doc/ex/circle01.rb +0 -16
  108. data/doc/ex/clip_path.rb +0 -60
  109. data/doc/ex/coalesce.rb +0 -57
  110. data/doc/ex/color_fill_to_border.rb +0 -29
  111. data/doc/ex/color_floodfill.rb +0 -28
  112. data/doc/ex/color_histogram.rb +0 -47
  113. data/doc/ex/color_reset.rb +0 -11
  114. data/doc/ex/colorize.rb +0 -16
  115. data/doc/ex/colors.rb +0 -64
  116. data/doc/ex/compose_mask.rb +0 -22
  117. data/doc/ex/composite.rb +0 -133
  118. data/doc/ex/composite_layers.rb +0 -53
  119. data/doc/ex/composite_tiled.rb +0 -21
  120. data/doc/ex/contrast.rb +0 -36
  121. data/doc/ex/crop.rb +0 -31
  122. data/doc/ex/crop_with_gravity.rb +0 -42
  123. data/doc/ex/cubic01.rb +0 -43
  124. data/doc/ex/cubic02.rb +0 -91
  125. data/doc/ex/cycle_colormap.rb +0 -21
  126. data/doc/ex/dissolve.rb +0 -12
  127. data/doc/ex/drawcomp.rb +0 -42
  128. data/doc/ex/drop_shadow.rb +0 -60
  129. data/doc/ex/edge.rb +0 -11
  130. data/doc/ex/ellipse.rb +0 -45
  131. data/doc/ex/ellipse01.rb +0 -21
  132. data/doc/ex/emboss.rb +0 -11
  133. data/doc/ex/enhance.rb +0 -28
  134. data/doc/ex/equalize.rb +0 -11
  135. data/doc/ex/evenodd.rb +0 -42
  136. data/doc/ex/fill_pattern.rb +0 -23
  137. data/doc/ex/flatten_images.rb +0 -36
  138. data/doc/ex/flip.rb +0 -11
  139. data/doc/ex/flop.rb +0 -11
  140. data/doc/ex/font_styles.rb +0 -32
  141. data/doc/ex/fonts.rb +0 -20
  142. data/doc/ex/frame.rb +0 -12
  143. data/doc/ex/gaussian_blur.rb +0 -11
  144. data/doc/ex/get_multiline_type_metrics.rb +0 -41
  145. data/doc/ex/get_pixels.rb +0 -47
  146. data/doc/ex/get_type_metrics.rb +0 -141
  147. data/doc/ex/gradientfill.rb +0 -27
  148. data/doc/ex/grav.rb +0 -45
  149. data/doc/ex/gravity.rb +0 -80
  150. data/doc/ex/group.rb +0 -26
  151. data/doc/ex/hatchfill.rb +0 -27
  152. data/doc/ex/image.rb +0 -44
  153. data/doc/ex/images/Apple.miff +0 -0
  154. data/doc/ex/images/Ballerina.jpg +0 -0
  155. data/doc/ex/images/Ballerina3.jpg +0 -0
  156. data/doc/ex/images/Button_0.gif +0 -0
  157. data/doc/ex/images/Button_1.gif +0 -0
  158. data/doc/ex/images/Button_2.gif +0 -0
  159. data/doc/ex/images/Button_3.gif +0 -0
  160. data/doc/ex/images/Button_4.gif +0 -0
  161. data/doc/ex/images/Button_5.gif +0 -0
  162. data/doc/ex/images/Button_6.gif +0 -0
  163. data/doc/ex/images/Button_7.gif +0 -0
  164. data/doc/ex/images/Button_8.gif +0 -0
  165. data/doc/ex/images/Button_9.gif +0 -0
  166. data/doc/ex/images/Button_A.gif +0 -0
  167. data/doc/ex/images/Button_B.gif +0 -0
  168. data/doc/ex/images/Button_C.gif +0 -0
  169. data/doc/ex/images/Button_D.gif +0 -0
  170. data/doc/ex/images/Button_E.gif +0 -0
  171. data/doc/ex/images/Button_F.gif +0 -0
  172. data/doc/ex/images/Button_G.gif +0 -0
  173. data/doc/ex/images/Button_H.gif +0 -0
  174. data/doc/ex/images/Button_I.gif +0 -0
  175. data/doc/ex/images/Button_J.gif +0 -0
  176. data/doc/ex/images/Button_K.gif +0 -0
  177. data/doc/ex/images/Button_L.gif +0 -0
  178. data/doc/ex/images/Button_M.gif +0 -0
  179. data/doc/ex/images/Button_N.gif +0 -0
  180. data/doc/ex/images/Button_O.gif +0 -0
  181. data/doc/ex/images/Button_P.gif +0 -0
  182. data/doc/ex/images/Button_Q.gif +0 -0
  183. data/doc/ex/images/Button_R.gif +0 -0
  184. data/doc/ex/images/Button_S.gif +0 -0
  185. data/doc/ex/images/Button_T.gif +0 -0
  186. data/doc/ex/images/Button_U.gif +0 -0
  187. data/doc/ex/images/Button_V.gif +0 -0
  188. data/doc/ex/images/Button_W.gif +0 -0
  189. data/doc/ex/images/Button_X.gif +0 -0
  190. data/doc/ex/images/Button_Y.gif +0 -0
  191. data/doc/ex/images/Button_Z.gif +0 -0
  192. data/doc/ex/images/Cheetah.jpg +0 -0
  193. data/doc/ex/images/Coffee.wmf +0 -0
  194. data/doc/ex/images/Flower_Hat.jpg +0 -0
  195. data/doc/ex/images/Gold_Statue.jpg +0 -0
  196. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  197. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  198. data/doc/ex/images/Leaf.miff +0 -0
  199. data/doc/ex/images/No.wmf +0 -0
  200. data/doc/ex/images/Polynesia.jpg +0 -0
  201. data/doc/ex/images/Red_Rocks.jpg +0 -0
  202. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  203. data/doc/ex/images/Shorts.jpg +0 -0
  204. data/doc/ex/images/Snake.wmf +0 -0
  205. data/doc/ex/images/Violin.jpg +0 -0
  206. data/doc/ex/images/Yellow_Rose.miff +0 -0
  207. data/doc/ex/images/big-duck.gif +0 -0
  208. data/doc/ex/images/duck.gif +0 -0
  209. data/doc/ex/images/duck0.gif +0 -0
  210. data/doc/ex/images/duck1.gif +0 -0
  211. data/doc/ex/images/duck10.gif +0 -0
  212. data/doc/ex/images/duck11.gif +0 -0
  213. data/doc/ex/images/duck12.gif +0 -0
  214. data/doc/ex/images/duck13.gif +0 -0
  215. data/doc/ex/images/duck14.gif +0 -0
  216. data/doc/ex/images/duck15.gif +0 -0
  217. data/doc/ex/images/duck2.gif +0 -0
  218. data/doc/ex/images/duck3.gif +0 -0
  219. data/doc/ex/images/duck4.gif +0 -0
  220. data/doc/ex/images/duck5.gif +0 -0
  221. data/doc/ex/images/duck6.gif +0 -0
  222. data/doc/ex/images/duck7.gif +0 -0
  223. data/doc/ex/images/duck8.gif +0 -0
  224. data/doc/ex/images/duck9.gif +0 -0
  225. data/doc/ex/images/graydient230x6.gif +0 -0
  226. data/doc/ex/images/image_with_profile.jpg +0 -0
  227. data/doc/ex/images/logo400x83.gif +0 -0
  228. data/doc/ex/images/model.miff +0 -0
  229. data/doc/ex/images/notimplemented.gif +0 -0
  230. data/doc/ex/images/smile.miff +0 -0
  231. data/doc/ex/images/spin.gif +0 -0
  232. data/doc/ex/implode.rb +0 -34
  233. data/doc/ex/level.rb +0 -11
  234. data/doc/ex/level_colors.rb +0 -11
  235. data/doc/ex/line.rb +0 -41
  236. data/doc/ex/line01.rb +0 -21
  237. data/doc/ex/mask.rb +0 -35
  238. data/doc/ex/matte_fill_to_border.rb +0 -39
  239. data/doc/ex/matte_floodfill.rb +0 -32
  240. data/doc/ex/matte_replace.rb +0 -39
  241. data/doc/ex/median_filter.rb +0 -28
  242. data/doc/ex/modulate.rb +0 -11
  243. data/doc/ex/mono.rb +0 -23
  244. data/doc/ex/morph.rb +0 -25
  245. data/doc/ex/mosaic.rb +0 -35
  246. data/doc/ex/motion_blur.rb +0 -11
  247. data/doc/ex/negate.rb +0 -11
  248. data/doc/ex/negate_channel.rb +0 -9
  249. data/doc/ex/nested_rvg.rb +0 -21
  250. data/doc/ex/nonzero.rb +0 -42
  251. data/doc/ex/normalize.rb +0 -11
  252. data/doc/ex/oil_paint.rb +0 -11
  253. data/doc/ex/opacity.rb +0 -37
  254. data/doc/ex/ordered_dither.rb +0 -11
  255. data/doc/ex/path.rb +0 -63
  256. data/doc/ex/pattern1.rb +0 -25
  257. data/doc/ex/pattern2.rb +0 -26
  258. data/doc/ex/polaroid.rb +0 -27
  259. data/doc/ex/polygon.rb +0 -23
  260. data/doc/ex/polygon01.rb +0 -21
  261. data/doc/ex/polyline.rb +0 -22
  262. data/doc/ex/polyline01.rb +0 -21
  263. data/doc/ex/posterize.rb +0 -8
  264. data/doc/ex/preview.rb +0 -8
  265. data/doc/ex/qbezierpath.rb +0 -52
  266. data/doc/ex/quad01.rb +0 -34
  267. data/doc/ex/quantize-m.rb +0 -25
  268. data/doc/ex/radial_blur.rb +0 -9
  269. data/doc/ex/raise.rb +0 -8
  270. data/doc/ex/random_threshold_channel.rb +0 -13
  271. data/doc/ex/rect01.rb +0 -14
  272. data/doc/ex/rect02.rb +0 -20
  273. data/doc/ex/rectangle.rb +0 -34
  274. data/doc/ex/reduce_noise.rb +0 -28
  275. data/doc/ex/remap.rb +0 -11
  276. data/doc/ex/remap_images.rb +0 -19
  277. data/doc/ex/resize_to_fill.rb +0 -8
  278. data/doc/ex/resize_to_fit.rb +0 -8
  279. data/doc/ex/roll.rb +0 -9
  280. data/doc/ex/rotate.rb +0 -44
  281. data/doc/ex/rotate_f.rb +0 -14
  282. data/doc/ex/roundrect.rb +0 -33
  283. data/doc/ex/rubyname.rb +0 -30
  284. data/doc/ex/rvg_clippath.rb +0 -12
  285. data/doc/ex/rvg_linecap.rb +0 -42
  286. data/doc/ex/rvg_linejoin.rb +0 -40
  287. data/doc/ex/rvg_opacity.rb +0 -18
  288. data/doc/ex/rvg_pattern.rb +0 -26
  289. data/doc/ex/rvg_stroke_dasharray.rb +0 -11
  290. data/doc/ex/segment.rb +0 -11
  291. data/doc/ex/sepiatone.rb +0 -7
  292. data/doc/ex/shade.rb +0 -11
  293. data/doc/ex/shadow.rb +0 -30
  294. data/doc/ex/shave.rb +0 -15
  295. data/doc/ex/shear.rb +0 -10
  296. data/doc/ex/sketch.rb +0 -17
  297. data/doc/ex/skewx.rb +0 -51
  298. data/doc/ex/skewy.rb +0 -47
  299. data/doc/ex/smile.rb +0 -125
  300. data/doc/ex/solarize.rb +0 -11
  301. data/doc/ex/sparse_color.rb +0 -54
  302. data/doc/ex/splice.rb +0 -8
  303. data/doc/ex/spread.rb +0 -11
  304. data/doc/ex/stegano.rb +0 -55
  305. data/doc/ex/stroke_dasharray.rb +0 -42
  306. data/doc/ex/stroke_fill.rb +0 -10
  307. data/doc/ex/stroke_linecap.rb +0 -44
  308. data/doc/ex/stroke_linejoin.rb +0 -48
  309. data/doc/ex/stroke_width.rb +0 -49
  310. data/doc/ex/swirl.rb +0 -17
  311. data/doc/ex/text.rb +0 -37
  312. data/doc/ex/text01.rb +0 -16
  313. data/doc/ex/text_align.rb +0 -36
  314. data/doc/ex/text_antialias.rb +0 -37
  315. data/doc/ex/text_styles.rb +0 -19
  316. data/doc/ex/text_undercolor.rb +0 -28
  317. data/doc/ex/texture_fill_to_border.rb +0 -34
  318. data/doc/ex/texture_floodfill.rb +0 -32
  319. data/doc/ex/texturefill.rb +0 -24
  320. data/doc/ex/threshold.rb +0 -13
  321. data/doc/ex/to_blob.rb +0 -13
  322. data/doc/ex/translate.rb +0 -39
  323. data/doc/ex/transparent.rb +0 -38
  324. data/doc/ex/transpose.rb +0 -9
  325. data/doc/ex/transverse.rb +0 -9
  326. data/doc/ex/tref01.rb +0 -24
  327. data/doc/ex/triangle01.rb +0 -15
  328. data/doc/ex/trim.rb +0 -23
  329. data/doc/ex/tspan01.rb +0 -17
  330. data/doc/ex/tspan02.rb +0 -17
  331. data/doc/ex/tspan03.rb +0 -19
  332. data/doc/ex/unsharp_mask.rb +0 -28
  333. data/doc/ex/viewex.rb +0 -33
  334. data/doc/ex/vignette.rb +0 -12
  335. data/doc/ex/watermark.rb +0 -27
  336. data/doc/ex/wave.rb +0 -9
  337. data/doc/ex/wet_floor.rb +0 -58
  338. data/doc/ex/writing_mode01.rb +0 -26
  339. data/doc/ex/writing_mode02.rb +0 -26
  340. data/doc/ilist.html +0 -2056
  341. data/doc/image1.html +0 -4680
  342. data/doc/image2.html +0 -3665
  343. data/doc/image3.html +0 -4522
  344. data/doc/imageattrs.html +0 -1638
  345. data/doc/imusage.html +0 -514
  346. data/doc/index.html +0 -416
  347. data/doc/info.html +0 -1499
  348. data/doc/magick.html +0 -565
  349. data/doc/optequiv.html +0 -2435
  350. data/doc/rvg.html +0 -975
  351. data/doc/rvgclip.html +0 -248
  352. data/doc/rvggroup.html +0 -305
  353. data/doc/rvgimage.html +0 -289
  354. data/doc/rvgpattern.html +0 -475
  355. data/doc/rvgshape.html +0 -406
  356. data/doc/rvgstyle.html +0 -270
  357. data/doc/rvgtext.html +0 -465
  358. data/doc/rvgtspan.html +0 -238
  359. data/doc/rvgtut.html +0 -530
  360. data/doc/rvguse.html +0 -145
  361. data/doc/rvgxform.html +0 -294
  362. data/doc/scripts/doc.js +0 -22
  363. data/doc/scripts/stripeTables.js +0 -23
  364. data/doc/struct.html +0 -1339
  365. data/doc/usage.html +0 -1621
  366. data/examples/constitute.rb +0 -7
  367. data/examples/crop_with_gravity.rb +0 -42
  368. data/examples/demo.rb +0 -324
  369. data/examples/describe.rb +0 -43
  370. data/examples/find_similar_region.rb +0 -34
  371. data/examples/histogram.rb +0 -321
  372. data/examples/identify.rb +0 -185
  373. data/examples/image_opacity.rb +0 -29
  374. data/examples/import_export.rb +0 -31
  375. data/examples/pattern_fill.rb +0 -38
  376. data/examples/rotating_text.rb +0 -44
  377. data/examples/spinner.rb +0 -49
  378. data/examples/thumbnail.rb +0 -64
  379. data/examples/vignette.rb +0 -78
  380. data/spec/rmagick/ImageList1_spec.rb +0 -24
  381. data/spec/rmagick/draw_spec.rb +0 -156
  382. data/spec/rmagick/image/blue_shift_spec.rb +0 -16
  383. data/spec/rmagick/image/composite_spec.rb +0 -140
  384. data/spec/rmagick/image/constitute_spec.rb +0 -15
  385. data/spec/rmagick/image/dispatch_spec.rb +0 -18
  386. data/spec/rmagick/image/from_blob_spec.rb +0 -14
  387. data/spec/rmagick/image/ping_spec.rb +0 -14
  388. data/spec/rmagick/image/properties_spec.rb +0 -29
  389. data/spec/spec_helper.rb +0 -4
  390. data/test/Image1.rb +0 -565
  391. data/test/Image2.rb +0 -1304
  392. data/test/Image3.rb +0 -1030
  393. data/test/ImageList1.rb +0 -806
  394. data/test/ImageList2.rb +0 -385
  395. data/test/Image_attributes.rb +0 -697
  396. data/test/Import_Export.rb +0 -121
  397. data/test/Info.rb +0 -345
  398. data/test/Magick.rb +0 -321
  399. data/test/Pixel.rb +0 -116
  400. data/test/Preview.rb +0 -57
  401. data/test/cmyk.icm +0 -0
  402. data/test/srgb.icm +0 -0
  403. data/test/test_all_basic.rb +0 -38
  404. data/test/tmpnam_test.rb +0 -50
  405. data/wercker.yml +0 -10
@@ -2,47 +2,89 @@ lib_dir = File.expand_path('../../lib', File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
3
3
  require 'rubygems'
4
4
  require 'mkmf'
5
- require 'date'
5
+ require 'pkg-config'
6
6
 
7
7
  module RMagick
8
8
  class Extconf
9
9
  require 'rmagick/version'
10
10
  RMAGICK_VERS = ::Magick::VERSION
11
11
  MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
12
- MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr('.','').to_i
12
+
13
+ # ImageMagick 6.7 package
14
+ IM6_7_PACKAGES = ['ImageMagick'].freeze
15
+
16
+ # ImageMagick 6.8+ packages
17
+ IM6_PACKAGES = %w[
18
+ ImageMagick-6.Q64HDRI
19
+ ImageMagick-6.Q32HDRI
20
+ ImageMagick-6.Q16HDRI
21
+ ImageMagick-6.Q8HDRI
22
+ ImageMagick-6.Q64
23
+ ImageMagick-6.Q32
24
+ ImageMagick-6.Q16
25
+ ImageMagick-6.Q8
26
+ ].freeze
27
+
28
+ # ImageMagick 7 packages
29
+ IM7_PACKAGES = %w[
30
+ ImageMagick-7.Q64HDRI
31
+ ImageMagick-7.Q32HDRI
32
+ ImageMagick-7.Q16HDRI
33
+ ImageMagick-7.Q8HDRI
34
+ ImageMagick-7.Q64
35
+ ImageMagick-7.Q32
36
+ ImageMagick-7.Q16
37
+ ImageMagick-7.Q8
38
+ ].freeze
13
39
 
14
40
  attr_reader :headers
41
+
15
42
  def initialize
16
- configure_compile_options
43
+ @stdout = $stdout.dup
44
+
45
+ setup_pkg_config_path
17
46
  assert_can_compile!
47
+ configure_compile_options
18
48
  configure_headers
19
49
  end
20
50
 
51
+ def setup_pkg_config_path
52
+ return if RUBY_PLATFORM =~ /mswin|mingw/
53
+
54
+ if find_executable('brew')
55
+ pkg_config_path = "#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig"
56
+ elsif find_executable('pacman')
57
+ pkg_config_path = '/usr/lib/imagemagick6/pkgconfig'
58
+ else
59
+ return
60
+ end
61
+
62
+ pkg_config_paths = ENV['PKG_CONFIG_PATH'].to_s.split(':')
63
+ if File.exist?(pkg_config_path) && !pkg_config_paths.include?(pkg_config_path)
64
+ ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], pkg_config_path].compact.join(':')
65
+ end
66
+ end
67
+
21
68
  def configured_compile_options
22
69
  {
23
- :magick_config => $magick_config,
24
- :with_magick_wand => $with_magick_wand,
25
- :pkg_config => $pkg_config,
26
- :magick_version => $magick_version,
27
- :local_libs => $LOCAL_LIBS,
28
- :cflags => $CFLAGS,
29
- :cppflags => $CPPFLAGS,
30
- :ldflags => $LDFLAGS,
31
- :defs => $defs,
32
- :config_h => $config_h,
70
+ magick_version: $magick_version,
71
+ local_libs: $LOCAL_LIBS,
72
+ cppflags: $CPPFLAGS,
73
+ ldflags: $LDFLAGS,
74
+ defs: $defs,
75
+ config_h: $config_h
33
76
  }
34
77
  end
35
78
 
36
79
  def configure_headers
37
- #headers = %w{assert.h ctype.h errno.h float.h limits.h math.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h time.h}
38
- @headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h}
39
- headers << 'stdint.h' if have_header('stdint.h') # defines uint64_t
40
- headers << 'sys/types.h' if have_header('sys/types.h')
80
+ @headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h sys/types.h]
41
81
 
42
- if have_header('wand/MagickWand.h')
43
- headers << 'wand/MagickWand.h'
82
+ if have_header('MagickCore/MagickCore.h')
83
+ headers << 'MagickCore/MagickCore.h'
84
+ elsif have_header('magick/MagickCore.h')
85
+ headers << 'magick/MagickCore.h'
44
86
  else
45
- exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h."
87
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find magick/MagickCore.h."
46
88
  end
47
89
  end
48
90
 
@@ -50,159 +92,117 @@ module RMagick
50
92
  # Magick-config is not available on Windows
51
93
  if RUBY_PLATFORM !~ /mswin|mingw/
52
94
 
53
- # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
54
- config = defined?(RbConfig) ? ::RbConfig : ::Config
55
- cc = (ENV['CC'] || config::CONFIG['CC'] || 'gcc').split(' ').first
56
- unless find_executable(cc)
57
- exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details."
58
- end
59
-
60
- # ugly way to handle which config tool we're going to use...
61
- $with_magick_wand = false
62
- $magick_config = false
63
- $pkg_config = false
64
-
65
- # Check for Magick-config
66
- if find_executable('Magick-config') && !has_graphicsmagick_libmagick_dev_compat?
67
- $magick_config = true
68
- $magick_version = `Magick-config --version`[/^(\d+\.\d+\.\d+)/]
69
- elsif find_executable('pkg-config')
70
- $pkg_config = true
71
- $magick_version = `pkg-config MagickCore --modversion`[/^(\d+\.\d+\.\d+)/]
72
- else
73
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config or pkg-config in #{ENV['PATH']}\n"
74
- end
75
-
76
95
  check_multiple_imagemagick_versions
77
96
  check_partial_imagemagick_versions
78
97
 
79
- # Ensure minimum ImageMagick version
80
- # Check minimum ImageMagick version if possible
81
- checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
82
- Logging.message("Detected ImageMagick version: #{$magick_version}\n")
98
+ original_ldflags = $LDFLAGS.dup
83
99
 
84
- if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
85
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
86
- end
87
- end
100
+ libdir = PKGConfig.libs_only_L($magick_package).chomp.sub('-L', '')
101
+ ldflags = "#{ENV['LDFLAGS']} " + PKGConfig.libs($magick_package).chomp
102
+ rpath = libdir.empty? ? '' : "-Wl,-rpath,#{libdir}"
88
103
 
89
- # From ImageMagick 6.9 binaries are split to two and we have to use
90
- # MagickWand instead of MagickCore
91
- checking_for("presence of MagickWand API (ImageMagick version >= #{Magick::MIN_WAND_VERSION})") do
92
- $with_magick_wand = Gem::Version.new($magick_version) >= Gem::Version.new(Magick::MIN_WAND_VERSION)
93
- if $with_magick_wand
94
- Logging.message('Detected 6.9+ version, using MagickWand API')
95
- else
96
- Logging.message('Older version detected, using MagickCore API')
97
- end
98
- end
104
+ # Save flags
105
+ $CPPFLAGS += " #{ENV['CPPFLAGS']} " + PKGConfig.cflags($magick_package).chomp
106
+ $LOCAL_LIBS += " #{ENV['LIBS']} " + PKGConfig.libs($magick_package).chomp
107
+ $LDFLAGS += " #{ldflags} #{rpath}"
99
108
 
100
- # either set flags using Magick-config, MagickWand-config or pkg-config (new Debian default)
101
- if $with_magick_wand
102
- if $magick_config
103
- # Save flags
104
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `MagickWand-config --cflags`.chomp
105
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `MagickWand-config --cppflags`.chomp
106
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `MagickWand-config --ldflags`.chomp
107
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `MagickWand-config --libs`.chomp
108
- end
109
+ unless try_link("int main() { }")
110
+ # if linker does not recognizes '-Wl,-rpath,somewhere' option, it revert to original option
111
+ $LDFLAGS = "#{original_ldflags} #{ldflags}"
112
+ end
109
113
 
110
- if $pkg_config
111
- # Save flags
112
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
113
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
114
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
115
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
116
- end
117
- else
118
- if $magick_config
119
- # Save flags
120
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `Magick-config --cflags`.chomp
121
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `Magick-config --cppflags`.chomp
122
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `Magick-config --ldflags`.chomp
123
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `Magick-config --libs`.chomp
124
- end
114
+ configure_archflags_for_osx($magick_package) if RUBY_PLATFORM =~ /darwin/ # osx
125
115
 
126
- if $pkg_config
127
- # Save flags
128
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
129
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
130
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
131
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
132
- end
133
- end
116
+ elsif RUBY_PLATFORM =~ /mingw/ # mingw
134
117
 
135
- if RUBY_PLATFORM =~ /darwin/ # osx
136
- set_archflags_for_osx
137
- end
118
+ dir_paths = search_paths_for_library_for_windows
119
+ $CPPFLAGS += %( -I"#{dir_paths[:include]}")
120
+ $LDFLAGS += %( -L"#{dir_paths[:lib]}")
121
+ $LDFLAGS << ' -lucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
138
122
 
139
- elsif RUBY_PLATFORM =~ /mingw/ # mingw
123
+ have_library(im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_' : 'CORE_RL_magick_')
140
124
 
141
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
142
- abort 'Unable to get ImageMagick version' unless $1
143
- $magick_version = $1
144
- unless have_library('CORE_RL_magick_')
145
- search_paths_for_library_for_mingw
146
- end
147
- have_library('X11')
125
+ else # mswin
148
126
 
149
- else # mswin
127
+ dir_paths = search_paths_for_library_for_windows
128
+ $CPPFLAGS << %( -I"#{dir_paths[:include]}")
129
+ $LDFLAGS << %( -libpath:"#{dir_paths[:lib]}")
130
+ $LDFLAGS << ' -libpath:ucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
150
131
 
151
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
152
- abort 'Unable to get ImageMagick version' unless $1
153
- $magick_version = $1
154
- $CFLAGS = '-W3'
155
- $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}
156
- # The /link option is required by the Makefile but causes warnings in the mkmf.log file.
157
- $LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"}
158
- $LOCAL_LIBS = 'CORE_RL_magick_.lib'
159
- have_library('X11')
132
+ $LOCAL_LIBS += ' ' + (im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
160
133
 
161
134
  end
135
+
136
+ $CPPFLAGS << if have_macro('__GNUC__')
137
+ ' -std=gnu99 -Wno-void-pointer-to-int-cast -Wno-void-pointer-to-enum-cast -Wno-pointer-to-int-cast'
138
+ else
139
+ ' -std=c99'
140
+ end
162
141
  end
163
142
 
164
- # Test for a specific value in an enum type
165
- def have_enum_value(enum, value, headers=nil, &b)
166
- checking_for "#{enum}.#{value}" do
167
- if try_compile(<<"SRC", &b)
168
- #{COMMON_HEADERS}
169
- #{cpp_include(headers)}
170
- /*top*/
171
- int main() { #{enum} t = #{value}; t = t; return 0; }
172
- SRC
173
- $defs.push(format('-DHAVE_ENUM_%s', value.upcase))
174
- true
175
- else
176
- false
177
- end
143
+ def exit_failure(msg)
144
+ msg = "ERROR: #{msg}"
145
+
146
+ Logging.message msg
147
+
148
+ @stdout.puts "\n\n"
149
+ if ENV['NO_COLOR']
150
+ @stdout.puts msg
151
+ else
152
+ @stdout.print "\e[31m\e[1m#{msg}\e[0m"
178
153
  end
154
+ @stdout.puts "\n\n"
155
+ @stdout.flush
156
+
157
+ exit(1)
179
158
  end
180
159
 
181
- # Test for multiple values of the same enum type
182
- def have_enum_values(enum, values, headers=nil, &b)
183
- values.each do |value|
184
- have_enum_value(enum, value, headers, &b)
160
+ def detect_imagemagick_packages(packages)
161
+ packages.select do |package|
162
+ PKGConfig.exist?(package)
185
163
  end
186
164
  end
187
165
 
188
- def has_graphicsmagick_libmagick_dev_compat?
189
- config_path = `which Magick-config`.chomp
190
- if File.exist?(config_path) &&
191
- File.symlink?(config_path) &&
192
- File.readlink(config_path) =~ /GraphicsMagick/
193
- msg = 'Found a graphicsmagick-libmagick-dev-compat installation.'
166
+ def installed_im6_packages
167
+ @installed_im6_packages ||= detect_imagemagick_packages(IM6_PACKAGES)
168
+ end
169
+
170
+ def installed_im7_packages
171
+ @installed_im7_packages ||= detect_imagemagick_packages(IM7_PACKAGES)
172
+ end
173
+
174
+ def determine_imagemagick_package
175
+ packages = [installed_im7_packages, installed_im6_packages].flatten
176
+
177
+ if packages.empty?
178
+ # ImageMagick 6.7 does not have package file like ImageMagick-6.Q16.pc
179
+ packages = detect_imagemagick_packages(IM6_7_PACKAGES)
180
+ end
181
+
182
+ if packages.empty?
183
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find ImageMagick with pkg-config\n"
184
+ end
185
+
186
+ if installed_im6_packages.any? && installed_im7_packages.any?
187
+ checking_for('forced use of ImageMagick 6') do
188
+ if ENV['USE_IMAGEMAGICK_6']
189
+ packages = installed_im6_packages
190
+ true
191
+ else
192
+ packages = installed_im7_packages
193
+ false
194
+ end
195
+ end
196
+ end
197
+
198
+ if packages.length > 1
199
+ package_lines = packages.map { |package| " - #{package}" }.join("\n")
200
+ msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n#{package_lines}\n\n"
194
201
  Logging.message msg
195
- message msg+"\n"
196
- true
197
- else
198
- false
202
+ message msg
199
203
  end
200
- end
201
204
 
202
- def exit_failure(msg)
203
- Logging.message msg
204
- message msg+"\n"
205
- exit(1)
205
+ packages.first
206
206
  end
207
207
 
208
208
  # Seems like lots of people have multiple versions of ImageMagick installed.
@@ -211,22 +211,22 @@ SRC
211
211
  path = ENV['PATH'].split(File::PATH_SEPARATOR)
212
212
  path.each do |dir|
213
213
  file = File.join(dir, 'Magick-config')
214
- if File.executable? file
215
- vers = `#{file} --version`.chomp.strip
216
- prefix = `#{file} --prefix`.chomp.strip
217
- versions << [vers, prefix, dir]
218
- end
214
+ next unless File.executable? file
215
+
216
+ vers = `#{file} --version`.chomp.strip
217
+ prefix = `#{file} --prefix`.chomp.strip
218
+ versions << [vers, prefix, dir]
219
219
  end
220
220
  versions.uniq!
221
- if versions.size > 1
222
- msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
223
- versions.each do |vers, prefix, dir|
224
- msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
225
- end
226
- msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
227
- Logging.message msg
228
- message msg
221
+ return unless versions.size > 1
222
+
223
+ msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
224
+ versions.each do |vers, prefix, dir|
225
+ msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
229
226
  end
227
+ msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
228
+ Logging.message msg
229
+ message msg
230
230
  end
231
231
 
232
232
  # Ubuntu (maybe other systems) comes with a partial installation of
@@ -236,308 +236,201 @@ SRC
236
236
  def check_partial_imagemagick_versions
237
237
  prefix = config_string('prefix') || ''
238
238
  matches = [
239
- prefix+'/lib/lib?agick*',
240
- prefix+'/include/ImageMagick',
241
- prefix+'/bin/Magick-config',
239
+ prefix + '/lib/lib?agick*',
240
+ prefix + '/include/ImageMagick',
241
+ prefix + '/bin/Magick-config'
242
242
  ].map do |file_glob|
243
243
  Dir.glob(file_glob)
244
244
  end
245
- matches.delete_if { |arr| arr.empty? }
246
- if 0 < matches.length && matches.length < 3
247
- msg = "\nWarning: Found a partial ImageMagick installation. Your operating system likely has some built-in ImageMagick libraries but not all of ImageMagick. This will most likely cause problems at both compile and runtime.\nFound partial installation at: "+prefix+"\n"
248
- Logging.message msg
249
- message msg
250
- end
245
+ matches.delete_if(&:empty?)
246
+ return unless !matches.empty? && matches.length < 3
247
+
248
+ msg = <<~MESSAGE
249
+
250
+ Warning: Found a partial ImageMagick installation. Your operating
251
+ system likely has some built-in ImageMagick libraries but not all of
252
+ ImageMagick. This will most likely cause problems at both compile and
253
+ runtime.
254
+ Found partial installation at: #{prefix}
255
+
256
+ MESSAGE
257
+
258
+ Logging.message msg
259
+ message msg
251
260
  end
252
261
 
253
262
  # issue #169
254
263
  # set ARCHFLAGS appropriately for OSX
255
- def set_archflags_for_osx
256
- archflags = []
257
- fullpath = `which convert`
258
- fileinfo = `file #{fullpath}`
264
+ def configure_archflags_for_osx(magick_package)
265
+ return unless PKGConfig.libs_only_L(magick_package).match(%r{-L(.+)/lib})
266
+
267
+ imagemagick_dir = Regexp.last_match(1)
268
+ command = Dir.glob(File.join(imagemagick_dir, "bin/*")).select { |file| File.executable? file }.first
269
+ fileinfo = `file #{command}`
259
270
 
260
271
  # default ARCHFLAGS
261
272
  archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten
262
273
 
274
+ archflags = []
263
275
  archs.each do |arch|
264
- if fileinfo.include?(arch)
265
- archflags << "-arch #{arch}"
266
- end
276
+ archflags << "-arch #{arch}" if fileinfo.include?(arch)
267
277
  end
268
278
 
269
- if archflags.length != 0
270
- $ARCH_FLAG = archflags.join(' ')
271
- end
279
+ $ARCH_FLAG = archflags.join(' ') unless archflags.empty?
272
280
  end
273
281
 
274
- def search_paths_for_library_for_mingw
282
+ def search_paths_for_library_for_windows
275
283
  msg = 'searching PATH for the ImageMagick library...'
276
284
  Logging.message msg
277
- message msg+"\n"
285
+ message msg + "\n"
278
286
 
279
287
  found_lib = false
288
+ dir_paths = {}
280
289
 
281
290
  paths = ENV['PATH'].split(File::PATH_SEPARATOR)
282
291
  paths.each do |dir|
283
292
  lib = File.join(dir, 'lib')
284
- lib_file = File.join(lib, 'CORE_RL_magick_.lib')
285
- if File.exist?(lib_file)
286
- $CPPFLAGS = %Q{-I"#{File.join(dir, 'include')}"}
287
- $LDFLAGS = %Q{-L"#{lib}"}
288
- found_lib = have_library('CORE_RL_magick_')
289
- break if found_lib
290
- end
291
- end
293
+ lib_file = File.join(lib, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
294
+ next unless File.exist?(lib_file)
292
295
 
293
- unless found_lib
294
- exit_failure <<END_MINGW
295
- Can't install RMagick #{RMAGICK_VERS}.
296
- Can't find the ImageMagick library.
297
- Retry with '--with-opt-dir' option.
298
- Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
299
- e.g.
300
- gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
301
- END_MINGW
296
+ dir_paths[:include] = File.join(dir, 'include')
297
+ dir_paths[:lib] = lib
298
+
299
+ found_lib = true
300
+ break
302
301
  end
302
+
303
+ return dir_paths if found_lib
304
+
305
+ exit_failure <<~END_MINGW
306
+ Can't install RMagick #{RMAGICK_VERS}.
307
+ Can't find the ImageMagick library.
308
+ Retry with '--with-opt-dir' option.
309
+ Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
310
+ e.g.
311
+ gem install rmagick -- '--with-opt-dir=\"C:\\Program Files\\ImageMagick-6.9.1-Q16\"'
312
+ END_MINGW
303
313
  end
304
314
 
305
315
  def assert_can_compile!
306
- assert_not_windows!
307
316
  assert_minimum_ruby_version!
308
317
  assert_has_dev_libs!
309
- end
310
318
 
311
- def assert_not_windows!
312
- if RUBY_PLATFORM =~ /mswin/
313
- abort <<END_MSWIN
314
- +----------------------------------------------------------------------------+
315
- | This rmagick gem is for use only on Linux, BSD, OS X, and similar systems |
316
- | that have a gnu or similar toolchain installed. The rmagick-win32 gem is a |
317
- | pre-compiled version of RMagick bundled with ImageMagick for use on |
318
- | Microsoft Windows systems. The rmagick-win32 gem is available on RubyForge.|
319
- | See http://rmagick.rubyforge.org/install-faq.html for more information. |
320
- +----------------------------------------------------------------------------+
321
- END_MSWIN
322
- end
319
+ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
320
+ cc = (ENV['CC'] || RbConfig::CONFIG['CC'] || 'gcc').split(' ').first
321
+ exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cc)
323
322
  end
324
323
 
325
324
  def assert_minimum_ruby_version!
326
- unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
327
- version = RUBY_VERSION.tr('.','').to_i
328
- version >= MIN_RUBY_VERS_NO
329
- end
330
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
325
+ supported = checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
326
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(MIN_RUBY_VERS)
331
327
  end
328
+
329
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n" unless supported
332
330
  end
333
331
 
334
332
  def assert_has_dev_libs!
335
- if RUBY_PLATFORM !~ /mswin|mingw/
333
+ failure_message = <<~END_FAILURE
334
+ Can't install RMagick #{RMAGICK_VERS}.
335
+ Can't find the ImageMagick library or one of the dependent libraries.
336
+ Check the mkmf.log file for more detailed information.
337
+ END_FAILURE
336
338
 
337
- # check for pkg-config if Magick-config doesn't exist
338
- if $magick_config && `Magick-config --libs`[/\bl\s*(MagickCore|Magick)6?\b/]
339
- elsif $pkg_config && `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
340
- else
341
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. " \
342
- "Can't find the ImageMagick library or one of the dependent libraries. " \
343
- "Check the mkmf.log file for more detailed information.\n"
339
+ if RUBY_PLATFORM !~ /mswin|mingw/
340
+ unless PKGConfig.libs('MagickCore')[/\bl\s*(MagickCore|Magick)6?\b/]
341
+ exit_failure failure_message
344
342
  end
343
+
344
+ $magick_package = determine_imagemagick_package
345
+ $magick_version = PKGConfig.modversion($magick_package)[/^(\d+\.\d+\.\d+)/]
346
+ else
347
+ `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
348
+ $magick_version = Regexp.last_match(1)
349
+ exit_failure failure_message unless $magick_version
350
+ end
351
+
352
+ # Ensure minimum ImageMagick version
353
+ # Check minimum ImageMagick version if possible
354
+ checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
355
+ Logging.message("Detected ImageMagick version: #{$magick_version}\n")
356
+
357
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n" if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
345
358
  end
346
359
  end
347
360
 
348
361
  def create_header_file
349
- have_func('snprintf', headers)
350
- ['AcquireImage', # 6.4.1
351
- 'AffinityImage', # 6.4.3-6
352
- 'AffinityImages', # 6.4.3-6
353
- 'AutoGammaImageChannel', # 6.5.5-1
354
- 'AutoLevelImageChannel', # 6.5.5-1
355
- 'BlueShiftImage', # 6.5.4-3
356
- 'ColorMatrixImage', # 6.6.1-0
357
- 'ConstituteComponentTerminus', # 6.5.7-9
358
- 'DeskewImage', # 6.4.2-5
359
- 'DestroyConstitute', # 6.5.7-9(deprecated)
360
- 'EncipherImage', # 6.3.8-6
361
- 'EqualizeImageChannel', # 6.3.6-9
362
- 'EvaluateImages', # 6.8.6-4
363
- 'FloodfillPaintImage', # 6.3.7
364
- 'FunctionImageChannel', # 6.4.8-8
365
- 'GetAuthenticIndexQueue', # 6.4.5-6
366
- 'GetAuthenticPixels', # 6.4.5-6
367
- 'GetImageAlphaChannel', # 6.3.9-2
368
- 'GetMagickFeatures', # 6.5.7-1
369
- 'GetVirtualPixels', # 6.4.5-6
370
- 'LevelImageColors', # 6.4.2
371
- 'LevelColorsImageChannel', # 6.5.6-4
372
- 'LevelizeImageChannel', # 6.4.2
373
- 'LiquidRescaleImage', # 6.3.8-2
374
- 'MagickLibAddendum', # 6.5.9-1
375
- 'OpaquePaintImageChannel', # 6.3.7-10
376
- 'QueueAuthenticPixels', # 6.4.5-6
377
- 'RemapImage', # 6.4.4-0
378
- 'RemapImages', # 6.4.4-0
379
- 'RemoveImageArtifact', # 6.3.6
380
- 'RotationalBlurImage', # 6.8.8-9
381
- 'RotationalBlurImageChannel', # 6.8.8-9
382
- 'SelectiveBlurImageChannel', # 6.5.0-3
383
- 'SetImageAlphaChannel', # 6.3.6-9
384
- 'SetImageArtifact', # 6.3.6
385
- 'SetMagickMemoryMethods', # 6.4.1
386
- 'SparseColorImage', # 6.3.6-?
387
- 'StatisticImage', # 6.6.8-6
388
- 'SyncAuthenticPixels', # 6.4.5-6
389
- 'TransformImageColorspace', # 6.5.1
390
- 'TransparentPaintImage', # 6.3.7-10
391
- 'TransparentPaintImageChroma' # 6.4.5-6
392
- ].each do |func|
362
+ ruby_api = [
363
+ 'rb_gc_adjust_memory_usage' # Ruby 2.4.0
364
+ ]
365
+ memory_api = %w[
366
+ posix_memalign
367
+ malloc_usable_size
368
+ malloc_size
369
+ _aligned_msize
370
+ ]
371
+ imagemagick_api = [
372
+ 'GetImageChannelEntropy', # 6.9.0-0
373
+ 'SetImageGray', # 6.9.1-10
374
+ 'SetMagickAlignedMemoryMethods' # 7.0.9-0
375
+ ]
376
+
377
+ check_api = ruby_api + memory_api + imagemagick_api
378
+ check_api.each do |func|
393
379
  have_func(func, headers)
394
380
  end
395
381
 
396
- checking_for('QueryMagickColorname() new signature') do
397
- if try_compile(<<"SRC")
398
- #{COMMON_HEADERS}
399
- #{cpp_include(headers)}
400
- /*top*/
401
- int main() {
402
- MagickBooleanType okay;
403
- Image *image;
404
- MagickPixelPacket *color;
405
- char *name;
406
- ExceptionInfo *exception;
407
- okay = QueryMagickColorname(image, color, SVGCompliance, name, exception);
408
- return 0;
409
- }
410
- SRC
411
- $defs.push('-DHAVE_NEW_QUERYMAGICKCOLORNAME')
412
- true
413
- else
414
- false
415
- end
416
- end
417
-
418
- have_struct_member('Image', 'type', headers) # ???
419
- have_struct_member('DrawInfo', 'kerning', headers) # 6.4.7-8
420
- have_struct_member('DrawInfo', 'interline_spacing', headers) # 6.5.5-8
421
- have_struct_member('DrawInfo', 'interword_spacing', headers) # 6.4.8-0
422
- have_type('DitherMethod', headers) # 6.4.2
423
- have_type('MagickFunction', headers) # 6.4.8-8
424
- have_type('ImageLayerMethod', headers) # 6.3.6 replaces MagickLayerMethod
425
- have_type('long double', headers)
426
- #have_type("unsigned long long", headers)
427
- #have_type("uint64_t", headers)
428
- #have_type("__int64", headers)
429
- #have_type("uintmax_t", headers)
430
- #check_sizeof("unsigned long", headers)
431
- #check_sizeof("Image *", headers)
432
-
433
- have_enum_values('AlphaChannelType', ['CopyAlphaChannel', # 6.4.3-7
434
- 'BackgroundAlphaChannel', # 6.5.2-5
435
- 'RemoveAlphaChannel'], headers) # 6.7.5-1
436
- have_enum_values('CompositeOperator', ['BlurCompositeOp', # 6.5.3-7
437
- 'DistortCompositeOp', # 6.5.3-10
438
- 'LinearBurnCompositeOp', # 6.5.4-3
439
- 'LinearDodgeCompositeOp', # 6.5.4-3
440
- 'MathematicsCompositeOp', # 6.5.4-3
441
- 'PegtopLightCompositeOp', # 6.5.4-3
442
- 'PinLightCompositeOp', # 6.5.4-3
443
- 'VividLightCompositeOp'], headers) # 6.5.4-3
444
- have_enum_values('CompressionType', ['DXT1Compression', # 6.3.9-3
445
- 'DXT3Compression', # 6.3.9-3
446
- 'DXT5Compression', # 6.3.9-3
447
- 'ZipSCompression', # 6.5.5-4
448
- 'PizCompression', # 6.5.5-4
449
- 'Pxr24Compression', # 6.5.5-4
450
- 'B44Compression', # 6.5.5-4
451
- 'B44ACompression'], headers) # 6.5.5-4
452
-
453
- have_enum_values('DistortImageMethod', ['BarrelDistortion', # 6.4.2-5
454
- 'BarrelInverseDistortion', # 6.4.3-8
455
- 'BilinearForwardDistortion', # 6.5.1-2
456
- 'BilinearReverseDistortion', # 6.5.1-2
457
- 'DePolarDistortion', # 6.4.2-6
458
- 'PolarDistortion', # 6.4.2-6
459
- 'PolynomialDistortion', # 6.4.2-4
460
- 'ShepardsDistortion'], headers) # 6.4.2-4
461
- have_enum_value('DitherMethod', 'NoDitherMethod', headers) # 6.4.3
462
- have_enum_values('FilterTypes', ['KaiserFilter', # 6.3.6
463
- 'WelshFilter', # 6.3.6-4
464
- 'ParzenFilter', # 6.3.6-4
465
- 'LagrangeFilter', # 6.3.7-2
466
- 'BohmanFilter', # 6.3.7-2
467
- 'BartlettFilter', # 6.3.7-2
468
- 'SentinelFilter'], headers) # 6.3.7-2
469
- have_enum_values('MagickEvaluateOperator', ['PowEvaluateOperator', # 6.4.1-9
470
- 'LogEvaluateOperator', # 6.4.2
471
- 'ThresholdEvaluateOperator', # 6.4.3
472
- 'ThresholdBlackEvaluateOperator', # 6.4.3
473
- 'ThresholdWhiteEvaluateOperator', # 6.4.3
474
- 'GaussianNoiseEvaluateOperator', # 6.4.3
475
- 'ImpulseNoiseEvaluateOperator', # 6.4.3
476
- 'LaplacianNoiseEvaluateOperator', # 6.4.3
477
- 'MultiplicativeNoiseEvaluateOperator', # 6.4.3
478
- 'PoissonNoiseEvaluateOperator', # 6.4.3
479
- 'UniformNoiseEvaluateOperator', # 6.4.3
480
- 'CosineEvaluateOperator', # 6.4.8-5
481
- 'SineEvaluateOperator', # 6.4.8-5
482
- 'AddModulusEvaluateOperator'], # 6.4.8-5
483
- headers)
484
- have_enum_values('MagickFunction', ['ArcsinFunction', # 6.5.2-8
485
- 'ArctanFunction', # 6.5.2-8
486
- 'PolynomialFunction', # 6.4.8-8
487
- 'SinusoidFunction'], headers) # 6.4.8-8
488
- have_enum_values('ImageLayerMethod', ['FlattenLayer', # 6.3.6-2
489
- 'MergeLayer', # 6.3.6
490
- 'MosaicLayer', # 6.3.6-2
491
- 'TrimBoundsLayer' ], headers) # 6.4.3-8
492
- have_enum_values('VirtualPixelMethod', ['HorizontalTileVirtualPixelMethod', # 6.4.2-6
493
- 'VerticalTileVirtualPixelMethod', # 6.4.2-6
494
- 'HorizontalTileEdgeVirtualPixelMethod', # 6.5.0-1
495
- 'VerticalTileEdgeVirtualPixelMethod', # 6.5.0-1
496
- 'CheckerTileVirtualPixelMethod'], # 6.5.0-1
497
- headers)
498
-
499
- # Now test Ruby 1.9.0 features.
500
- headers = ['ruby.h']
501
- if have_header('ruby/io.h')
502
- headers << 'ruby/io.h'
503
- else
504
- headers << 'rubyio.h'
382
+ unless have_header('malloc.h')
383
+ have_header('malloc/malloc.h')
505
384
  end
506
385
 
507
- have_func('rb_frame_this_func', headers)
508
-
509
386
  # Miscellaneous constants
510
387
  $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
511
388
  $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
512
389
 
390
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1') if im_version_at_least?('6.8.9')
391
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1') if im_version_at_least?('6.9.0')
392
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_10=1') if im_version_at_least?('6.9.10')
393
+ $defs.push('-DIMAGEMAGICK_7=1') if im_version_at_least?('7.0.0')
394
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_8=1') if im_version_at_least?('7.0.8')
395
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_10=1') if im_version_at_least?('7.0.10')
396
+
513
397
  create_header
514
398
  end
515
399
 
516
400
  def create_makefile_file
517
401
  create_header_file
518
- # Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the
519
- # extconf.h header. Suppress that behavior by removing the symbol array.
520
- $defs = []
521
402
 
522
403
  # Force re-compilation if the generated Makefile changed.
523
- $config_h = 'Makefile rmagick.h'
404
+ $config_h = 'Makefile'
524
405
 
525
406
  create_makefile('RMagick2')
526
407
  print_summary
527
408
  end
528
409
 
529
- def print_summary
530
- summary = <<"END_SUMMARY"
410
+ def magick_command
411
+ @magick_command ||= if find_executable('magick')
412
+ 'magick'
413
+ elsif find_executable('identify')
414
+ 'identify'
415
+ else
416
+ raise NotImplementedError, "no executable found for ImageMagick"
417
+ end
418
+ end
531
419
 
420
+ def im_version_at_least?(version)
421
+ Gem::Version.new($magick_version) >= Gem::Version.new(version)
422
+ end
532
423
 
533
- #{'=' * 70}
534
- #{DateTime.now.strftime('%a %d%b%y %T')}
535
- This installation of RMagick #{RMAGICK_VERS} is configured for
536
- Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
537
- #{'=' * 70}
424
+ def print_summary
425
+ summary = <<~"END_SUMMARY"
426
+ #{'=' * 70}
427
+ #{Time.now.strftime('%a %d %b %y %T')}
428
+ This installation of RMagick #{RMAGICK_VERS} is configured for
429
+ Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
430
+ #{'=' * 70}
538
431
 
539
432
 
540
- END_SUMMARY
433
+ END_SUMMARY
541
434
 
542
435
  Logging.message summary
543
436
  message summary
@@ -549,6 +442,6 @@ extconf = RMagick::Extconf.new
549
442
  at_exit do
550
443
  msg = "Configured compile options: #{extconf.configured_compile_options}"
551
444
  Logging.message msg
552
- message msg+"\n"
445
+ message msg + "\n"
553
446
  end
554
447
  extconf.create_makefile_file