Wed May 6 08:15:01 2020 UTC ()
devel/ruby-redmine: fix build problem of rmagick
Fix build problem of rmagick with newer ImageMagick6.
(taca)
diff -r1.9 -r1.10 pkgsrc/devel/ruby-redmine/distinfo
diff -r0 -r1.1 pkgsrc/devel/ruby-redmine/patches/patch-rmagick-2.16.0_ext_RMagick_extconf.rb
diff -r0 -r1.1 pkgsrc/devel/ruby-redmine/patches/patch-rmagick-2.16.0_ext_RMagick_rmpixel.c
--- pkgsrc/devel/ruby-redmine/Attic/distinfo 2020/03/15 16:00:55 1.9
+++ pkgsrc/devel/ruby-redmine/Attic/distinfo 2020/05/06 08:15:01 1.10
| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | $NetBSD: distinfo,v 1.9 2020/03/15 16:00:55 taca Exp $ | | 1 | $NetBSD: distinfo,v 1.10 2020/05/06 08:15:01 taca Exp $ |
2 | | | 2 | |
3 | SHA1 (actioncable-5.2.4.1.gem) = 71ad415759312c7194ae717137177f0da8247eae | | 3 | SHA1 (actioncable-5.2.4.1.gem) = 71ad415759312c7194ae717137177f0da8247eae |
4 | RMD160 (actioncable-5.2.4.1.gem) = ed89210c5d2095a9f24116ed947b11fee3b46c43 | | 4 | RMD160 (actioncable-5.2.4.1.gem) = ed89210c5d2095a9f24116ed947b11fee3b46c43 |
5 | SHA512 (actioncable-5.2.4.1.gem) = d84dc73398c930bdd35f7efe18c405029627b1d755b73cc00ab350bc227ea353be95b1fd8a845d67c7c6613de906ac839686be7674c5a98b9322d8db1b7ca613 | | 5 | SHA512 (actioncable-5.2.4.1.gem) = d84dc73398c930bdd35f7efe18c405029627b1d755b73cc00ab350bc227ea353be95b1fd8a845d67c7c6613de906ac839686be7674c5a98b9322d8db1b7ca613 |
6 | Size (actioncable-5.2.4.1.gem) = 41472 bytes | | 6 | Size (actioncable-5.2.4.1.gem) = 41472 bytes |
7 | SHA1 (actionmailer-5.2.4.1.gem) = 29608c1712f5faca8b183a4e080ef53482edc4e1 | | 7 | SHA1 (actionmailer-5.2.4.1.gem) = 29608c1712f5faca8b183a4e080ef53482edc4e1 |
8 | RMD160 (actionmailer-5.2.4.1.gem) = c4098392c50095d20213e597697dc4d3d288d92c | | 8 | RMD160 (actionmailer-5.2.4.1.gem) = c4098392c50095d20213e597697dc4d3d288d92c |
9 | SHA512 (actionmailer-5.2.4.1.gem) = b8a1c9fb3965499ffef559c6efcef5ce70d965452d8630db0adcfa7383f56b38494f06821d5f91d54b45543e9f245def773f072b6035055d7f2df8ef83caabd6 | | 9 | SHA512 (actionmailer-5.2.4.1.gem) = b8a1c9fb3965499ffef559c6efcef5ce70d965452d8630db0adcfa7383f56b38494f06821d5f91d54b45543e9f245def773f072b6035055d7f2df8ef83caabd6 |
10 | Size (actionmailer-5.2.4.1.gem) = 29184 bytes | | 10 | Size (actionmailer-5.2.4.1.gem) = 29184 bytes |
11 | SHA1 (actionpack-5.2.4.1.gem) = 9752c1cea5c486dd4925c5ce4d04349abbf58cc8 | | 11 | SHA1 (actionpack-5.2.4.1.gem) = 9752c1cea5c486dd4925c5ce4d04349abbf58cc8 |
12 | RMD160 (actionpack-5.2.4.1.gem) = 533a2deaacbd15c03e93028cc84664f87bac48f1 | | 12 | RMD160 (actionpack-5.2.4.1.gem) = 533a2deaacbd15c03e93028cc84664f87bac48f1 |
13 | SHA512 (actionpack-5.2.4.1.gem) = 62ae9e12af87e0dd75e2fe2bcdac28c9fb1271faba00e14695a2cc54b1c1ad2dae19640ca2108de292d7a6efac37e31bf291f0917ce06d7b6eb6d3d132c116e6 | | 13 | SHA512 (actionpack-5.2.4.1.gem) = 62ae9e12af87e0dd75e2fe2bcdac28c9fb1271faba00e14695a2cc54b1c1ad2dae19640ca2108de292d7a6efac37e31bf291f0917ce06d7b6eb6d3d132c116e6 |
14 | Size (actionpack-5.2.4.1.gem) = 212480 bytes | | 14 | Size (actionpack-5.2.4.1.gem) = 212480 bytes |
| @@ -302,13 +302,15 @@ SHA512 (unicorn-5.5.3.gem) = 86ee90d8c10 | | | @@ -302,13 +302,15 @@ SHA512 (unicorn-5.5.3.gem) = 86ee90d8c10 |
302 | Size (unicorn-5.5.3.gem) = 222208 bytes | | 302 | Size (unicorn-5.5.3.gem) = 222208 bytes |
303 | SHA1 (websocket-driver-0.7.1.gem) = 2f27afd937edef023be05cd20810cea0e596daa9 | | 303 | SHA1 (websocket-driver-0.7.1.gem) = 2f27afd937edef023be05cd20810cea0e596daa9 |
304 | RMD160 (websocket-driver-0.7.1.gem) = bde2aebb6e326c42bf6d6cf6c467263f6ca5ffd7 | | 304 | RMD160 (websocket-driver-0.7.1.gem) = bde2aebb6e326c42bf6d6cf6c467263f6ca5ffd7 |
305 | SHA512 (websocket-driver-0.7.1.gem) = 595ccf336844eb92018fa04c10cb7a333f5adcfa362d1605d5b96f0d81af43a1ebe2344abc95d541c49b34e16314ef230f3f1f2f2bfd681f59a97038fdd62651 | | 305 | SHA512 (websocket-driver-0.7.1.gem) = 595ccf336844eb92018fa04c10cb7a333f5adcfa362d1605d5b96f0d81af43a1ebe2344abc95d541c49b34e16314ef230f3f1f2f2bfd681f59a97038fdd62651 |
306 | Size (websocket-driver-0.7.1.gem) = 22016 bytes | | 306 | Size (websocket-driver-0.7.1.gem) = 22016 bytes |
307 | SHA1 (websocket-extensions-0.1.4.gem) = 3a4e6c171ecc660dafb2ecbd28a08ff7efdd8ad2 | | 307 | SHA1 (websocket-extensions-0.1.4.gem) = 3a4e6c171ecc660dafb2ecbd28a08ff7efdd8ad2 |
308 | RMD160 (websocket-extensions-0.1.4.gem) = 6306f9addac999aa6014bac852c0bf4932f24bd0 | | 308 | RMD160 (websocket-extensions-0.1.4.gem) = 6306f9addac999aa6014bac852c0bf4932f24bd0 |
309 | SHA512 (websocket-extensions-0.1.4.gem) = abc46b0e86c181b16787720582cfc2d1d362648159b4ff08a271a2a93020dab6fa89a19fc313f859d7f23c8fc1529a25e47bc5e81c4e193f4625f5e2f4f068ad | | 309 | SHA512 (websocket-extensions-0.1.4.gem) = abc46b0e86c181b16787720582cfc2d1d362648159b4ff08a271a2a93020dab6fa89a19fc313f859d7f23c8fc1529a25e47bc5e81c4e193f4625f5e2f4f068ad |
310 | Size (websocket-extensions-0.1.4.gem) = 10752 bytes | | 310 | Size (websocket-extensions-0.1.4.gem) = 10752 bytes |
311 | SHA1 (yard-0.9.20.gem) = 86ff7f1064a21b21957b92efc700b705f970f49b | | 311 | SHA1 (yard-0.9.20.gem) = 86ff7f1064a21b21957b92efc700b705f970f49b |
312 | RMD160 (yard-0.9.20.gem) = fa7f80200c7aa66a642de137b26c227f836297c1 | | 312 | RMD160 (yard-0.9.20.gem) = fa7f80200c7aa66a642de137b26c227f836297c1 |
313 | SHA512 (yard-0.9.20.gem) = 4269037ba61185c999df9f1195825ec92a76b32ccb18fc2b86b54e34ff2e5efd22a536c3e207304ef47a52905215103a2094634d1bb8d8ab722b11488cf04e13 | | 313 | SHA512 (yard-0.9.20.gem) = 4269037ba61185c999df9f1195825ec92a76b32ccb18fc2b86b54e34ff2e5efd22a536c3e207304ef47a52905215103a2094634d1bb8d8ab722b11488cf04e13 |
314 | Size (yard-0.9.20.gem) = 640512 bytes | | 314 | Size (yard-0.9.20.gem) = 640512 bytes |
| | | 315 | SHA1 (patch-rmagick-2.16.0_ext_RMagick_extconf.rb) = 227e2f02855019fb8750130af6cb8b10baee5bbf |
| | | 316 | SHA1 (patch-rmagick-2.16.0_ext_RMagick_rmpixel.c) = ef9243b90961bdb2435176e70facc4eb89d66b9a |
$NetBSD: patch-rmagick-2.16.0_ext_RMagick_extconf.rb,v 1.1 2020/05/06 08:15:01 taca Exp $
* Partly use rmagick 4.1.2's extconf.rb to build with newer ImageMagick6.
--- rmagick-2.16.0/ext/RMagick/extconf.rb.orig 2020-04-28 14:51:55.125428720 +0000
+++ rmagick-2.16.0/ext/RMagick/extconf.rb
@@ -2,27 +2,43 @@ lib_dir = File.expand_path('../../lib',
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
require 'rubygems'
require 'mkmf'
-require 'date'
module RMagick
class Extconf
require 'rmagick/version'
RMAGICK_VERS = ::Magick::VERSION
MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
- MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr('.','').to_i
attr_reader :headers
+
def initialize
- configure_compile_options
+ @stdout = $stdout.dup
+
+ setup_pkg_config_path
assert_can_compile!
+ configure_compile_options
configure_headers
end
+ def setup_pkg_config_path
+ return if RUBY_PLATFORM =~ /mswin|mingw/
+
+ if find_executable('brew')
+ pkg_config_path = "#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig"
+ elsif find_executable('pacman')
+ pkg_config_path = '/usr/lib/imagemagick6/pkgconfig'
+ else
+ return
+ end
+
+ pkg_config_paths = ENV['PKG_CONFIG_PATH'].to_s.split(':')
+ if File.exist?(pkg_config_path) && !pkg_config_paths.include?(pkg_config_path)
+ ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], pkg_config_path].compact.join(':')
+ end
+ end
+
def configured_compile_options
{
- :magick_config => $magick_config,
- :with_magick_wand => $with_magick_wand,
- :pkg_config => $pkg_config,
:magick_version => $magick_version,
:local_libs => $LOCAL_LIBS,
:cflags => $CFLAGS,
@@ -34,15 +50,19 @@ module RMagick
end
def configure_headers
- #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}
+ @headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h sys/types.h]
@headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h}
headers << 'stdint.h' if have_header('stdint.h') # defines uint64_t
headers << 'sys/types.h' if have_header('sys/types.h')
if have_header('wand/MagickWand.h')
headers << 'wand/MagickWand.h'
+ elsif have_header('MagickCore/MagickCore.h')
+ headers << 'MagickCore/MagickCore.h'
+ elsif have_header('magick/MagickCore.h')
+ headers << 'magick/MagickCore.h'
else
- exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h."
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find magick/MagickCore.h."
end
end
@@ -50,159 +70,94 @@ module RMagick
# Magick-config is not available on Windows
if RUBY_PLATFORM !~ /mswin|mingw/
- # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
- config = defined?(RbConfig) ? ::RbConfig : ::Config
- cc = (ENV['CC'] || config::CONFIG['CC'] || 'gcc').split(' ').first
- unless find_executable(cc)
- exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details."
- end
-
- # ugly way to handle which config tool we're going to use...
- $with_magick_wand = false
- $magick_config = false
- $pkg_config = false
-
- # Check for Magick-config
- if find_executable('Magick-config') && !has_graphicsmagick_libmagick_dev_compat?
- $magick_config = true
- $magick_version = `Magick-config --version`[/^(\d+\.\d+\.\d+)/]
- elsif find_executable('pkg-config')
- $pkg_config = true
- $magick_version = `pkg-config MagickCore --modversion`[/^(\d+\.\d+\.\d+)/]
- else
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config or pkg-config in #{ENV['PATH']}\n"
- end
-
check_multiple_imagemagick_versions
check_partial_imagemagick_versions
- # Ensure minimum ImageMagick version
- # Check minimum ImageMagick version if possible
- checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
- Logging.message("Detected ImageMagick version: #{$magick_version}\n")
+ # Save flags
+ $CFLAGS = "#{ENV['CFLAGS']} " + `pkg-config --cflags #{$magick_package}`.chomp
+ $CPPFLAGS = "#{ENV['CPPFLAGS']} " + `pkg-config --cflags #{$magick_package}`.chomp
+ $LDFLAGS = "#{ENV['LDFLAGS']} " + `pkg-config --libs #{$magick_package}`.chomp
+ $LOCAL_LIBS = "#{ENV['LIBS']} " + `pkg-config --libs #{$magick_package}`.chomp
- if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
- end
- end
+ configure_archflags_for_osx($magick_package) if RUBY_PLATFORM =~ /darwin/ # osx
- # From ImageMagick 6.9 binaries are split to two and we have to use
- # MagickWand instead of MagickCore
- checking_for("presence of MagickWand API (ImageMagick version >= #{Magick::MIN_WAND_VERSION})") do
- $with_magick_wand = Gem::Version.new($magick_version) >= Gem::Version.new(Magick::MIN_WAND_VERSION)
- if $with_magick_wand
- Logging.message('Detected 6.9+ version, using MagickWand API')
- else
- Logging.message('Older version detected, using MagickCore API')
- end
- end
+ elsif RUBY_PLATFORM =~ /mingw/ # mingw
- # either set flags using Magick-config, MagickWand-config or pkg-config (new Debian default)
- if $with_magick_wand
- if $magick_config
- # Save flags
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `MagickWand-config --cflags`.chomp
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `MagickWand-config --cppflags`.chomp
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `MagickWand-config --ldflags`.chomp
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `MagickWand-config --libs`.chomp
- end
+ dir_paths = search_paths_for_library_for_windows
+ $CPPFLAGS = %(-I"#{dir_paths[:include]}")
+ $LDFLAGS = %(-L"#{dir_paths[:lib]}")
+ $LDFLAGS << ' -lucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
- if $pkg_config
- # Save flags
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
- end
- else
- if $magick_config
- # Save flags
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `Magick-config --cflags`.chomp
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `Magick-config --cppflags`.chomp
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `Magick-config --ldflags`.chomp
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `Magick-config --libs`.chomp
- end
+ have_library(im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_' : 'CORE_RL_magick_')
- if $pkg_config
- # Save flags
- $CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
- $CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
- $LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
- $LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
- end
- end
+ else # mswin
- if RUBY_PLATFORM =~ /darwin/ # osx
- set_archflags_for_osx
- end
+ dir_paths = search_paths_for_library_for_windows
+ $CPPFLAGS << %( -I"#{dir_paths[:include]}")
+ $LDFLAGS << %( -libpath:"#{dir_paths[:lib]}")
+ $LDFLAGS << ' -libpath:ucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
- elsif RUBY_PLATFORM =~ /mingw/ # mingw
+ $LOCAL_LIBS = im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib'
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
- abort 'Unable to get ImageMagick version' unless $1
- $magick_version = $1
- unless have_library('CORE_RL_magick_')
- search_paths_for_library_for_mingw
- end
- have_library('X11')
+ end
+
+ $CFLAGS << (have_macro('__GNUC__') ? ' -std=gnu99' : ' -std=c99')
+ end
- else # mswin
+ def exit_failure(msg)
+ msg = "ERROR: #{msg}"
- `identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
- abort 'Unable to get ImageMagick version' unless $1
- $magick_version = $1
- $CFLAGS = '-W3'
- $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}
- # The /link option is required by the Makefile but causes warnings in the mkmf.log file.
- $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"}
- $LOCAL_LIBS = 'CORE_RL_magick_.lib'
- have_library('X11')
+ Logging.message msg
+ @stdout.puts "\n\n"
+ if ENV['NO_COLOR']
+ @stdout.puts msg
+ else
+ @stdout.print "\e[31m\e[1m#{msg}\e[0m"
end
+ @stdout.puts "\n\n"
+ @stdout.flush
+
+ exit(1)
end
- # Test for a specific value in an enum type
- def have_enum_value(enum, value, headers=nil, &b)
- checking_for "#{enum}.#{value}" do
- if try_compile(<<"SRC", &b)
-#{COMMON_HEADERS}
-#{cpp_include(headers)}
-/*top*/
-int main() { #{enum} t = #{value}; t = t; return 0; }
-SRC
- $defs.push(format('-DHAVE_ENUM_%s', value.upcase))
- true
- else
- false
- end
+ def determine_imagemagick_package
+ packages = `pkg-config --list-all`.scan(/(ImageMagick\-[\.A-Z0-9]+) .*/).flatten
+
+ # For ancient version of ImageMagick 6 we need a different regex
+ if packages.empty?
+ packages = `pkg-config --list-all`.scan(/(ImageMagick) .*/).flatten
end
- end
- # Test for multiple values of the same enum type
- def have_enum_values(enum, values, headers=nil, &b)
- values.each do |value|
- have_enum_value(enum, value, headers, &b)
+ if packages.empty?
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find ImageMagick with pkg-config\n"
+ end
+
+ if packages.length > 1
+
+ im7_packages = packages.grep(/\AImageMagick-7/)
+
+ if im7_packages.any?
+ checking_for('forced use of ImageMagick 6') do
+ if ENV['USE_IMAGEMAGICK_6']
+ packages -= im7_packages
+ true
+ else
+ packages = im7_packages
+ false
+ end
+ end
+ end
end
- end
- def has_graphicsmagick_libmagick_dev_compat?
- config_path = `which Magick-config`.chomp
- if File.exist?(config_path) &&
- File.symlink?(config_path) &&
- File.readlink(config_path) =~ /GraphicsMagick/
- msg = 'Found a graphicsmagick-libmagick-dev-compat installation.'
+ if packages.length > 1
+ package_lines = packages.map { |package| " - #{package}" }.join("\n")
+ msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n#{package_lines}\n\n"
Logging.message msg
- message msg+"\n"
- true
- else
- false
+ message msg
end
- end
- def exit_failure(msg)
- Logging.message msg
- message msg+"\n"
- exit(1)
+ packages.first
end
# Seems like lots of people have multiple versions of ImageMagick installed.
@@ -211,22 +166,22 @@ SRC
path = ENV['PATH'].split(File::PATH_SEPARATOR)
path.each do |dir|
file = File.join(dir, 'Magick-config')
- if File.executable? file
- vers = `#{file} --version`.chomp.strip
- prefix = `#{file} --prefix`.chomp.strip
- versions << [vers, prefix, dir]
- end
+ next unless File.executable? file
+
+ vers = `#{file} --version`.chomp.strip
+ prefix = `#{file} --prefix`.chomp.strip
+ versions << [vers, prefix, dir]
end
versions.uniq!
- if versions.size > 1
- msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
- versions.each do |vers, prefix, dir|
- msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
- end
- msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
- Logging.message msg
- message msg
+ return unless versions.size > 1
+
+ msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
+ versions.each do |vers, prefix, dir|
+ msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
end
+ msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
+ Logging.message msg
+ message msg
end
# Ubuntu (maybe other systems) comes with a partial installation of
@@ -236,280 +191,165 @@ SRC
def check_partial_imagemagick_versions
prefix = config_string('prefix') || ''
matches = [
- prefix+'/lib/lib?agick*',
- prefix+'/include/ImageMagick',
- prefix+'/bin/Magick-config',
+ prefix + '/lib/lib?agick*',
+ prefix + '/include/ImageMagick-6',
+ prefix + '/bin/Magick-config6'
].map do |file_glob|
Dir.glob(file_glob)
end
- matches.delete_if { |arr| arr.empty? }
- if 0 < matches.length && matches.length < 3
- 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"
- Logging.message msg
- message msg
- end
+ matches.delete_if(&:empty?)
+ return unless !matches.empty? && matches.length < 3
+
+ msg = <<~MESSAGE
+
+ Warning: 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.
+ Found partial installation at: #{prefix}
+
+ MESSAGE
+
+ Logging.message msg
+ message msg
end
# issue #169
# set ARCHFLAGS appropriately for OSX
- def set_archflags_for_osx
- archflags = []
- fullpath = `which convert`
- fileinfo = `file #{fullpath}`
+ def configure_archflags_for_osx(magick_package)
+ return unless `pkg-config #{magick_package} --libs-only-L`.match(%r{-L(.+)/lib})
+
+ imagemagick_dir = Regexp.last_match(1)
+ command = Dir.glob(File.join(imagemagick_dir, "bin/*")).select { |file| File.executable? file }.first
+ fileinfo = `file #{command}`
# default ARCHFLAGS
archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten
+ archflags = []
archs.each do |arch|
- if fileinfo.include?(arch)
- archflags << "-arch #{arch}"
- end
+ archflags << "-arch #{arch}" if fileinfo.include?(arch)
end
- if archflags.length != 0
- $ARCH_FLAG = archflags.join(' ')
- end
+ $ARCH_FLAG = archflags.join(' ') unless archflags.empty?
end
- def search_paths_for_library_for_mingw
+ def search_paths_for_library_for_windows
msg = 'searching PATH for the ImageMagick library...'
Logging.message msg
- message msg+"\n"
+ message msg + "\n"
found_lib = false
+ dir_paths = {}
paths = ENV['PATH'].split(File::PATH_SEPARATOR)
paths.each do |dir|
lib = File.join(dir, 'lib')
- lib_file = File.join(lib, 'CORE_RL_magick_.lib')
- if File.exist?(lib_file)
- $CPPFLAGS = %Q{-I"#{File.join(dir, 'include')}"}
- $LDFLAGS = %Q{-L"#{lib}"}
- found_lib = have_library('CORE_RL_magick_')
- break if found_lib
- end
- end
+ lib_file = File.join(lib, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
+ next unless File.exist?(lib_file)
+
+ dir_paths[:include] = File.join(dir, 'include')
+ dir_paths[:lib] = lib
- unless found_lib
- exit_failure <<END_MINGW
-Can't install RMagick #{RMAGICK_VERS}.
-Can't find the ImageMagick library.
-Retry with '--with-opt-dir' option.
-Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
-e.g.
- gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
-END_MINGW
+ found_lib = true
+ break
end
+
+ return dir_paths if found_lib
+
+ exit_failure <<~END_MINGW
+ Can't install RMagick #{RMAGICK_VERS}.
+ Can't find the ImageMagick library.
+ Retry with '--with-opt-dir' option.
+ Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
+ e.g.
+ gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
+ END_MINGW
end
def assert_can_compile!
- assert_not_windows!
assert_minimum_ruby_version!
assert_has_dev_libs!
- end
- def assert_not_windows!
- if RUBY_PLATFORM =~ /mswin/
- abort <<END_MSWIN
-+----------------------------------------------------------------------------+
-| This rmagick gem is for use only on Linux, BSD, OS X, and similar systems |
-| that have a gnu or similar toolchain installed. The rmagick-win32 gem is a |
-| pre-compiled version of RMagick bundled with ImageMagick for use on |
-| Microsoft Windows systems. The rmagick-win32 gem is available on RubyForge.|
-| See http://rmagick.rubyforge.org/install-faq.html for more information. |
-+----------------------------------------------------------------------------+
-END_MSWIN
- end
+ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
+ cc = (ENV['CC'] || RbConfig::CONFIG['CC'] || 'gcc').split(' ').first
+ exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cc)
end
def assert_minimum_ruby_version!
- unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
- version = RUBY_VERSION.tr('.','').to_i
- version >= MIN_RUBY_VERS_NO
- end
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
+ supported = checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(MIN_RUBY_VERS)
end
+
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n" unless supported
end
def assert_has_dev_libs!
+ failure_message = <<~END_FAILURE
+ Can't install RMagick #{RMAGICK_VERS}.
+ Can't find the ImageMagick library or one of the dependent libraries.
+ Check the mkmf.log file for more detailed information.
+ END_FAILURE
+
if RUBY_PLATFORM !~ /mswin|mingw/
+ unless find_executable('pkg-config')
+ exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find pkg-config in #{ENV['PATH']}\n"
+ end
- # check for pkg-config if Magick-config doesn't exist
- if $magick_config && `Magick-config --libs`[/\bl\s*(MagickCore|Magick)6?\b/]
- elsif $pkg_config && `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
- else
- exit_failure "Can't install RMagick #{RMAGICK_VERS}. " \
- "Can't find the ImageMagick library or one of the dependent libraries. " \
- "Check the mkmf.log file for more detailed information.\n"
+ unless `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
+ exit_failure failure_message
end
+
+ $magick_package = determine_imagemagick_package
+ $magick_version = `pkg-config #{$magick_package} --modversion`[/^(\d+\.\d+\.\d+)/]
+ else
+ `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
+ $magick_version = Regexp.last_match(1)
+ exit_failure failure_message unless $magick_version
+ end
+
+ # Ensure minimum ImageMagick version
+ # Check minimum ImageMagick version if possible
+ checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
+ Logging.message("Detected ImageMagick version: #{$magick_version}\n")
+
+ 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)
end
end
def create_header_file
- have_func('snprintf', headers)
- ['AcquireImage', # 6.4.1
- 'AffinityImage', # 6.4.3-6
- 'AffinityImages', # 6.4.3-6
- 'AutoGammaImageChannel', # 6.5.5-1
- 'AutoLevelImageChannel', # 6.5.5-1
- 'BlueShiftImage', # 6.5.4-3
- 'ColorMatrixImage', # 6.6.1-0
- 'ConstituteComponentTerminus', # 6.5.7-9
- 'DeskewImage', # 6.4.2-5
- 'DestroyConstitute', # 6.5.7-9(deprecated)
- 'EncipherImage', # 6.3.8-6
- 'EqualizeImageChannel', # 6.3.6-9
- 'EvaluateImages', # 6.8.6-4
- 'FloodfillPaintImage', # 6.3.7
- 'FunctionImageChannel', # 6.4.8-8
- 'GetAuthenticIndexQueue', # 6.4.5-6
- 'GetAuthenticPixels', # 6.4.5-6
- 'GetImageAlphaChannel', # 6.3.9-2
- 'GetMagickFeatures', # 6.5.7-1
- 'GetVirtualPixels', # 6.4.5-6
- 'LevelImageColors', # 6.4.2
- 'LevelColorsImageChannel', # 6.5.6-4
- 'LevelizeImageChannel', # 6.4.2
- 'LiquidRescaleImage', # 6.3.8-2
- 'MagickLibAddendum', # 6.5.9-1
- 'OpaquePaintImageChannel', # 6.3.7-10
- 'QueueAuthenticPixels', # 6.4.5-6
- 'RemapImage', # 6.4.4-0
- 'RemapImages', # 6.4.4-0
- 'RemoveImageArtifact', # 6.3.6
- 'RotationalBlurImage', # 6.8.8-9
- 'RotationalBlurImageChannel', # 6.8.8-9
- 'SelectiveBlurImageChannel', # 6.5.0-3
- 'SetImageAlphaChannel', # 6.3.6-9
- 'SetImageArtifact', # 6.3.6
- 'SetMagickMemoryMethods', # 6.4.1
- 'SparseColorImage', # 6.3.6-?
- 'StatisticImage', # 6.6.8-6
- 'SyncAuthenticPixels', # 6.4.5-6
- 'TransformImageColorspace', # 6.5.1
- 'TransparentPaintImage', # 6.3.7-10
- 'TransparentPaintImageChroma' # 6.4.5-6
- ].each do |func|
- have_func(func, headers)
- end
+ ruby_api = [
+ 'rb_gc_adjust_memory_usage' # Ruby 2.4.0
+ ]
+ memory_api = %w[
+ posix_memalign
+ malloc_usable_size
+ malloc_size
+ _aligned_msize
+ ]
+ imagemagick_api = [
+ 'GetImageChannelEntropy', # 6.9.0-0
+ 'SetImageGray', # 6.9.1-10
+ 'SetMagickAlignedMemoryMethods' # 7.0.9-0
+ ]
- checking_for('QueryMagickColorname() new signature') do
- if try_compile(<<"SRC")
-#{COMMON_HEADERS}
-#{cpp_include(headers)}
-/*top*/
-int main() {
- MagickBooleanType okay;
- Image *image;
- MagickPixelPacket *color;
- char *name;
- ExceptionInfo *exception;
- okay = QueryMagickColorname(image, color, SVGCompliance, name, exception);
- return 0;
- }
-SRC
- $defs.push('-DHAVE_NEW_QUERYMAGICKCOLORNAME')
- true
- else
- false
- end
+ check_api = ruby_api + memory_api + imagemagick_api
+ check_api.each do |func|
+ have_func(func, headers)
end
- have_struct_member('Image', 'type', headers) # ???
- have_struct_member('DrawInfo', 'kerning', headers) # 6.4.7-8
- have_struct_member('DrawInfo', 'interline_spacing', headers) # 6.5.5-8
- have_struct_member('DrawInfo', 'interword_spacing', headers) # 6.4.8-0
- have_type('DitherMethod', headers) # 6.4.2
- have_type('MagickFunction', headers) # 6.4.8-8
- have_type('ImageLayerMethod', headers) # 6.3.6 replaces MagickLayerMethod
- have_type('long double', headers)
- #have_type("unsigned long long", headers)
- #have_type("uint64_t", headers)
- #have_type("__int64", headers)
- #have_type("uintmax_t", headers)
- #check_sizeof("unsigned long", headers)
- #check_sizeof("Image *", headers)
-
- have_enum_values('AlphaChannelType', ['CopyAlphaChannel', # 6.4.3-7
- 'BackgroundAlphaChannel', # 6.5.2-5
- 'RemoveAlphaChannel'], headers) # 6.7.5-1
- have_enum_values('CompositeOperator', ['BlurCompositeOp', # 6.5.3-7
- 'DistortCompositeOp', # 6.5.3-10
- 'LinearBurnCompositeOp', # 6.5.4-3
- 'LinearDodgeCompositeOp', # 6.5.4-3
- 'MathematicsCompositeOp', # 6.5.4-3
- 'PegtopLightCompositeOp', # 6.5.4-3
- 'PinLightCompositeOp', # 6.5.4-3
- 'VividLightCompositeOp'], headers) # 6.5.4-3
- have_enum_values('CompressionType', ['DXT1Compression', # 6.3.9-3
- 'DXT3Compression', # 6.3.9-3
- 'DXT5Compression', # 6.3.9-3
- 'ZipSCompression', # 6.5.5-4
- 'PizCompression', # 6.5.5-4
- 'Pxr24Compression', # 6.5.5-4
- 'B44Compression', # 6.5.5-4
- 'B44ACompression'], headers) # 6.5.5-4
-
- have_enum_values('DistortImageMethod', ['BarrelDistortion', # 6.4.2-5
- 'BarrelInverseDistortion', # 6.4.3-8
- 'BilinearForwardDistortion', # 6.5.1-2
- 'BilinearReverseDistortion', # 6.5.1-2
- 'DePolarDistortion', # 6.4.2-6
- 'PolarDistortion', # 6.4.2-6
- 'PolynomialDistortion', # 6.4.2-4
- 'ShepardsDistortion'], headers) # 6.4.2-4
- have_enum_value('DitherMethod', 'NoDitherMethod', headers) # 6.4.3
- have_enum_values('FilterTypes', ['KaiserFilter', # 6.3.6
- 'WelshFilter', # 6.3.6-4
- 'ParzenFilter', # 6.3.6-4
- 'LagrangeFilter', # 6.3.7-2
- 'BohmanFilter', # 6.3.7-2
- 'BartlettFilter', # 6.3.7-2
- 'SentinelFilter'], headers) # 6.3.7-2
- have_enum_values('MagickEvaluateOperator', ['PowEvaluateOperator', # 6.4.1-9
- 'LogEvaluateOperator', # 6.4.2
- 'ThresholdEvaluateOperator', # 6.4.3
- 'ThresholdBlackEvaluateOperator', # 6.4.3
- 'ThresholdWhiteEvaluateOperator', # 6.4.3
- 'GaussianNoiseEvaluateOperator', # 6.4.3
- 'ImpulseNoiseEvaluateOperator', # 6.4.3
- 'LaplacianNoiseEvaluateOperator', # 6.4.3
- 'MultiplicativeNoiseEvaluateOperator', # 6.4.3
- 'PoissonNoiseEvaluateOperator', # 6.4.3
- 'UniformNoiseEvaluateOperator', # 6.4.3
- 'CosineEvaluateOperator', # 6.4.8-5
- 'SineEvaluateOperator', # 6.4.8-5
- 'AddModulusEvaluateOperator'], # 6.4.8-5
- headers)
- have_enum_values('MagickFunction', ['ArcsinFunction', # 6.5.2-8
- 'ArctanFunction', # 6.5.2-8
- 'PolynomialFunction', # 6.4.8-8
- 'SinusoidFunction'], headers) # 6.4.8-8
- have_enum_values('ImageLayerMethod', ['FlattenLayer', # 6.3.6-2
- 'MergeLayer', # 6.3.6
- 'MosaicLayer', # 6.3.6-2
- 'TrimBoundsLayer' ], headers) # 6.4.3-8
- have_enum_values('VirtualPixelMethod', ['HorizontalTileVirtualPixelMethod', # 6.4.2-6
- 'VerticalTileVirtualPixelMethod', # 6.4.2-6
- 'HorizontalTileEdgeVirtualPixelMethod', # 6.5.0-1
- 'VerticalTileEdgeVirtualPixelMethod', # 6.5.0-1
- 'CheckerTileVirtualPixelMethod'], # 6.5.0-1
- headers)
-
- # Now test Ruby 1.9.0 features.
- headers = ['ruby.h']
- if have_header('ruby/io.h')
- headers << 'ruby/io.h'
- else
- headers << 'rubyio.h'
+ unless have_header('malloc.h')
+ have_header('malloc/malloc.h')
end
- have_func('rb_frame_this_func', headers)
-
# Miscellaneous constants
$defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
$defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1') if im_version_at_least?('6.8.9')
+ $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1') if im_version_at_least?('6.9.0')
+ $defs.push('-DIMAGEMAGICK_7=1') if im_version_at_least?('7.0.0')
+
create_header
end
@@ -526,12 +366,24 @@ SRC
print_summary
end
- def print_summary
- summary = <<"END_SUMMARY"
+ def magick_command
+ @magick_command ||= if find_executable('magick')
+ 'magick'
+ elsif find_executable('identify')
+ 'identify'
+ else
+ raise NotImplementedError, "no executable found for ImageMagick"
+ end
+ end
+ def im_version_at_least?(version)
+ Gem::Version.new($magick_version) >= Gem::Version.new(version)
+ end
+ def print_summary
+ summary = <<"END_SUMMARY"
#{'=' * 70}
-#{DateTime.now.strftime('%a %d%b%y %T')}
+#{Time.now.strftime('%a %d %b %y %T')}
This installation of RMagick #{RMAGICK_VERS} is configured for
Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
#{'=' * 70}
@@ -549,6 +401,6 @@ extconf = RMagick::Extconf.new
at_exit do
msg = "Configured compile options: #{extconf.configured_compile_options}"
Logging.message msg
- message msg+"\n"
+ message msg + "\n"
end
extconf.create_makefile_file
$NetBSD: patch-rmagick-2.16.0_ext_RMagick_rmpixel.c,v 1.1 2020/05/06 08:15:01 taca Exp $
* Fix build problem with newer ImageMagick6.
--- rmagick-2.16.0/ext/RMagick/rmpixel.c.orig 2020-04-28 14:51:55.156006214 +0000
+++ rmagick-2.16.0/ext/RMagick/rmpixel.c
@@ -533,15 +533,6 @@ Pixel_from_hsla(int argc, VALUE *argv, V
rb_raise(rb_eRangeError, "hue %g out of range [0.0, 360.0)", h);
}
- // Ugly way of checking for change in ImageMagick 6.5.6-5 to see whether
- // saturation/lightness should be out of 255 or out of 100.
- if(MagickLibVersion < 0x656 ||
- (MagickLibVersion == 0x656 && strcmp(MagickLibSubversion,"-5") <= 0) )
- {
- s = s/2.55;
- l = l/2.55;
- }
-
memset(name, 0, sizeof(name));
if (alpha)
{
@@ -1041,7 +1032,7 @@ Pixel_to_color(int argc, VALUE *argv, VA
exception = AcquireExceptionInfo();
-#if defined(HAVE_NEW_QUERYMAGICKCOLORNAME)
+#if 1
// Support for hex-format color names moved out of QueryMagickColorname
// in 6.4.1-9. The 'hex' argument was removed as well.
if (hex)