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

cvs diff -r1.9 -r1.10 pkgsrc/devel/ruby-redmine/Attic/distinfo (expand / switch to unified diff)

--- 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
3SHA1 (actioncable-5.2.4.1.gem) = 71ad415759312c7194ae717137177f0da8247eae 3SHA1 (actioncable-5.2.4.1.gem) = 71ad415759312c7194ae717137177f0da8247eae
4RMD160 (actioncable-5.2.4.1.gem) = ed89210c5d2095a9f24116ed947b11fee3b46c43 4RMD160 (actioncable-5.2.4.1.gem) = ed89210c5d2095a9f24116ed947b11fee3b46c43
5SHA512 (actioncable-5.2.4.1.gem) = d84dc73398c930bdd35f7efe18c405029627b1d755b73cc00ab350bc227ea353be95b1fd8a845d67c7c6613de906ac839686be7674c5a98b9322d8db1b7ca613 5SHA512 (actioncable-5.2.4.1.gem) = d84dc73398c930bdd35f7efe18c405029627b1d755b73cc00ab350bc227ea353be95b1fd8a845d67c7c6613de906ac839686be7674c5a98b9322d8db1b7ca613
6Size (actioncable-5.2.4.1.gem) = 41472 bytes 6Size (actioncable-5.2.4.1.gem) = 41472 bytes
7SHA1 (actionmailer-5.2.4.1.gem) = 29608c1712f5faca8b183a4e080ef53482edc4e1 7SHA1 (actionmailer-5.2.4.1.gem) = 29608c1712f5faca8b183a4e080ef53482edc4e1
8RMD160 (actionmailer-5.2.4.1.gem) = c4098392c50095d20213e597697dc4d3d288d92c 8RMD160 (actionmailer-5.2.4.1.gem) = c4098392c50095d20213e597697dc4d3d288d92c
9SHA512 (actionmailer-5.2.4.1.gem) = b8a1c9fb3965499ffef559c6efcef5ce70d965452d8630db0adcfa7383f56b38494f06821d5f91d54b45543e9f245def773f072b6035055d7f2df8ef83caabd6 9SHA512 (actionmailer-5.2.4.1.gem) = b8a1c9fb3965499ffef559c6efcef5ce70d965452d8630db0adcfa7383f56b38494f06821d5f91d54b45543e9f245def773f072b6035055d7f2df8ef83caabd6
10Size (actionmailer-5.2.4.1.gem) = 29184 bytes 10Size (actionmailer-5.2.4.1.gem) = 29184 bytes
11SHA1 (actionpack-5.2.4.1.gem) = 9752c1cea5c486dd4925c5ce4d04349abbf58cc8 11SHA1 (actionpack-5.2.4.1.gem) = 9752c1cea5c486dd4925c5ce4d04349abbf58cc8
12RMD160 (actionpack-5.2.4.1.gem) = 533a2deaacbd15c03e93028cc84664f87bac48f1 12RMD160 (actionpack-5.2.4.1.gem) = 533a2deaacbd15c03e93028cc84664f87bac48f1
13SHA512 (actionpack-5.2.4.1.gem) = 62ae9e12af87e0dd75e2fe2bcdac28c9fb1271faba00e14695a2cc54b1c1ad2dae19640ca2108de292d7a6efac37e31bf291f0917ce06d7b6eb6d3d132c116e6 13SHA512 (actionpack-5.2.4.1.gem) = 62ae9e12af87e0dd75e2fe2bcdac28c9fb1271faba00e14695a2cc54b1c1ad2dae19640ca2108de292d7a6efac37e31bf291f0917ce06d7b6eb6d3d132c116e6
14Size (actionpack-5.2.4.1.gem) = 212480 bytes 14Size (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
302Size (unicorn-5.5.3.gem) = 222208 bytes 302Size (unicorn-5.5.3.gem) = 222208 bytes
303SHA1 (websocket-driver-0.7.1.gem) = 2f27afd937edef023be05cd20810cea0e596daa9 303SHA1 (websocket-driver-0.7.1.gem) = 2f27afd937edef023be05cd20810cea0e596daa9
304RMD160 (websocket-driver-0.7.1.gem) = bde2aebb6e326c42bf6d6cf6c467263f6ca5ffd7 304RMD160 (websocket-driver-0.7.1.gem) = bde2aebb6e326c42bf6d6cf6c467263f6ca5ffd7
305SHA512 (websocket-driver-0.7.1.gem) = 595ccf336844eb92018fa04c10cb7a333f5adcfa362d1605d5b96f0d81af43a1ebe2344abc95d541c49b34e16314ef230f3f1f2f2bfd681f59a97038fdd62651 305SHA512 (websocket-driver-0.7.1.gem) = 595ccf336844eb92018fa04c10cb7a333f5adcfa362d1605d5b96f0d81af43a1ebe2344abc95d541c49b34e16314ef230f3f1f2f2bfd681f59a97038fdd62651
306Size (websocket-driver-0.7.1.gem) = 22016 bytes 306Size (websocket-driver-0.7.1.gem) = 22016 bytes
307SHA1 (websocket-extensions-0.1.4.gem) = 3a4e6c171ecc660dafb2ecbd28a08ff7efdd8ad2 307SHA1 (websocket-extensions-0.1.4.gem) = 3a4e6c171ecc660dafb2ecbd28a08ff7efdd8ad2
308RMD160 (websocket-extensions-0.1.4.gem) = 6306f9addac999aa6014bac852c0bf4932f24bd0 308RMD160 (websocket-extensions-0.1.4.gem) = 6306f9addac999aa6014bac852c0bf4932f24bd0
309SHA512 (websocket-extensions-0.1.4.gem) = abc46b0e86c181b16787720582cfc2d1d362648159b4ff08a271a2a93020dab6fa89a19fc313f859d7f23c8fc1529a25e47bc5e81c4e193f4625f5e2f4f068ad 309SHA512 (websocket-extensions-0.1.4.gem) = abc46b0e86c181b16787720582cfc2d1d362648159b4ff08a271a2a93020dab6fa89a19fc313f859d7f23c8fc1529a25e47bc5e81c4e193f4625f5e2f4f068ad
310Size (websocket-extensions-0.1.4.gem) = 10752 bytes 310Size (websocket-extensions-0.1.4.gem) = 10752 bytes
311SHA1 (yard-0.9.20.gem) = 86ff7f1064a21b21957b92efc700b705f970f49b 311SHA1 (yard-0.9.20.gem) = 86ff7f1064a21b21957b92efc700b705f970f49b
312RMD160 (yard-0.9.20.gem) = fa7f80200c7aa66a642de137b26c227f836297c1 312RMD160 (yard-0.9.20.gem) = fa7f80200c7aa66a642de137b26c227f836297c1
313SHA512 (yard-0.9.20.gem) = 4269037ba61185c999df9f1195825ec92a76b32ccb18fc2b86b54e34ff2e5efd22a536c3e207304ef47a52905215103a2094634d1bb8d8ab722b11488cf04e13 313SHA512 (yard-0.9.20.gem) = 4269037ba61185c999df9f1195825ec92a76b32ccb18fc2b86b54e34ff2e5efd22a536c3e207304ef47a52905215103a2094634d1bb8d8ab722b11488cf04e13
314Size (yard-0.9.20.gem) = 640512 bytes 314Size (yard-0.9.20.gem) = 640512 bytes
 315SHA1 (patch-rmagick-2.16.0_ext_RMagick_extconf.rb) = 227e2f02855019fb8750130af6cb8b10baee5bbf
 316SHA1 (patch-rmagick-2.16.0_ext_RMagick_rmpixel.c) = ef9243b90961bdb2435176e70facc4eb89d66b9a

File Added: pkgsrc/devel/ruby-redmine/patches/Attic/patch-rmagick-2.16.0_ext_RMagick_extconf.rb
$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

File Added: pkgsrc/devel/ruby-redmine/patches/Attic/patch-rmagick-2.16.0_ext_RMagick_rmpixel.c
$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)