class RMagick::Extconf
Constants
- IM6_PACKAGES
ImageMagick 6.8+ packages
- IM7_PACKAGES
ImageMagick 7 packages
- MIN_RUBY_VERS
- RMAGICK_VERS
Attributes
headers[R]
Public Class Methods
new()
click to toggle source
# File ext/RMagick/extconf.rb, line 41 def initialize @stdout = $stdout.dup exit_failure("No longer support MSWIN environment.") if RUBY_PLATFORM.include?('mswin') setup_pkg_config_path assert_can_compile! configure_compile_options configure_headers end
Public Instance Methods
append_pkg_config_path(path)
click to toggle source
# File ext/RMagick/extconf.rb, line 63 def append_pkg_config_path(path) pkg_config_paths = ENV['PKG_CONFIG_PATH'].to_s.split(':') if File.exist?(path) && !pkg_config_paths.include?(path) ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], path].compact.join(':') end end
assert_can_compile!()
click to toggle source
# File ext/RMagick/extconf.rb, line 301 def assert_can_compile! assert_minimum_ruby_version! assert_has_dev_libs! # Check for compiler. Extract first word so ENV['CXX'] can be a program name with arguments. cxx = (ENV['CXX'] || RbConfig::CONFIG['CXX'] || 'g++').split.first exit_failure "No C++ compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cxx) end
assert_has_dev_libs!()
click to toggle source
# File ext/RMagick/extconf.rb, line 318 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.include?('mingw') `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ / $magick_version = Regexp.last_match(1) exit_failure failure_message unless $magick_version else unless PKGConfig.libs('MagickCore')[/\bl\s*(MagickCore|Magick)6?\b/] exit_failure failure_message end $magick_package = determine_imagemagick_package $magick_version = PKGConfig.modversion($magick_package)[/^(\d+\.\d+\.\d+)/] 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
assert_minimum_ruby_version!()
click to toggle source
# File ext/RMagick/extconf.rb, line 310 def assert_minimum_ruby_version! 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
check_multiple_imagemagick_versions()
click to toggle source
Seems like lots of people have multiple versions of ImageMagick installed.
# File ext/RMagick/extconf.rb, line 198 def check_multiple_imagemagick_versions versions = [] path = ENV['PATH'].split(File::PATH_SEPARATOR) path.each do |dir| file = File.join(dir, 'Magick-config') next unless File.executable? file vers = `#{file} --version`.chomp.strip prefix = `#{file} --prefix`.chomp.strip versions << [vers, prefix, dir] end versions.uniq! 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
check_partial_imagemagick_versions()
click to toggle source
Ubuntu (maybe other systems) comes with a partial installation of ImageMagick in the prefix /usr (some libraries, no includes, and no binaries). This causes problems when /usr/lib is in the path (e.g., using the default Ruby installation).
# File ext/RMagick/extconf.rb, line 225 def check_partial_imagemagick_versions prefix = config_string('prefix') || '' matches = [ prefix + '/lib/lib?agick*', prefix + '/include/ImageMagick', prefix + '/bin/Magick-config' ].map do |file_glob| Dir.glob(file_glob) 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
configure_archflags_for_osx(magick_package)
click to toggle source
issue #169 set ARCHFLAGS appropriately for OSX
# File ext/RMagick/extconf.rb, line 253 def configure_archflags_for_osx(magick_package) return unless PKGConfig.libs_only_L(magick_package) =~ %r{-L(.+)/lib} imagemagick_dir = Regexp.last_match(1) command = Dir.glob(File.join(imagemagick_dir, "bin/*")).find { |file| File.executable? file } fileinfo = `file #{command}` # default ARCHFLAGS archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten archflags = [] archs.each do |arch| archflags << "-arch #{arch}" if fileinfo.include?(arch) end $ARCH_FLAG = archflags.join(' ') unless archflags.empty? end
configure_compile_options()
click to toggle source
# File ext/RMagick/extconf.rb, line 99 def configure_compile_options # Magick-config is not available on Windows if RUBY_PLATFORM.include?('mingw') # mingw dir_paths = search_paths_for_windows $CPPFLAGS += %( -I"#{dir_paths[:include]}") $CPPFLAGS += ' -x c++ -std=c++11 -Wno-register' $LDFLAGS += %( -L"#{dir_paths[:root]}" -lucrt) $LDFLAGS += (im_version_at_least?('7.0.0') ? ' -lCORE_RL_MagickCore_' : ' -lCORE_RL_magick_') else check_multiple_imagemagick_versions check_partial_imagemagick_versions original_ldflags = $LDFLAGS.dup libdir = PKGConfig.libs_only_L($magick_package).chomp.sub('-L', '') ldflags = "#{ENV['LDFLAGS']} " + PKGConfig.libs($magick_package).chomp rpath = libdir.empty? ? '' : "-Wl,-rpath,#{libdir}" # Save flags $CPPFLAGS += " #{ENV['CPPFLAGS']} " + PKGConfig.cflags($magick_package).chomp $CPPFLAGS += ' -x c++ -std=c++11 -Wno-register' $LOCAL_LIBS += " #{ENV['LIBS']} " + PKGConfig.libs($magick_package).chomp $LDFLAGS += " #{ldflags} #{rpath}" unless try_link("int main() { }") # if linker does not recognizes '-Wl,-rpath,somewhere' option, it revert to original option $LDFLAGS = "#{original_ldflags} #{ldflags}" end configure_archflags_for_osx($magick_package) if RUBY_PLATFORM.include?('darwin') # osx end $CPPFLAGS += ' $(optflags) $(debugflags) -fomit-frame-pointer' end
configure_headers()
click to toggle source
# File ext/RMagick/extconf.rb, line 81 def configure_headers @headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h sys/types.h ruby.h ruby/io.h] if have_header('MagickCore/MagickCore.h') headers << 'MagickCore/MagickCore.h' elsif have_header('magick/MagickCore.h') headers << 'magick/MagickCore.h' else exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find magick/MagickCore.h." end if have_header('malloc.h') headers << 'malloc.h' elsif have_header('malloc/malloc.h') headers << 'malloc/malloc.h' end end
configured_compile_options()
click to toggle source
# File ext/RMagick/extconf.rb, line 70 def configured_compile_options { magick_version: $magick_version, local_libs: $LOCAL_LIBS, cppflags: $CPPFLAGS, ldflags: $LDFLAGS, defs: $defs, config_h: $config_h } end
create_compile_flags_txt()
click to toggle source
# File ext/RMagick/extconf.rb, line 391 def create_compile_flags_txt cppflags = $CPPFLAGS.split include_flags = cppflags.select { |flag| flag.start_with?('-I') } define_flags = cppflags.select { |flag| flag.start_with?('-D') } + $defs File.open('compile_flags.txt', 'w') do |f| include_flags.each { |flag| f.puts(flag) } f.puts "-I#{Dir.pwd}" f.puts "-I#{RbConfig::CONFIG['rubyhdrdir']}" f.puts "-I#{RbConfig::CONFIG['rubyhdrdir']}/ruby/backward" f.puts "-I#{RbConfig::CONFIG['rubyarchhdrdir']}" f.puts "-std=c++11" define_flags.each { |flag| f.puts(flag) } end end
create_header_file()
click to toggle source
# File ext/RMagick/extconf.rb, line 347 def create_header_file ruby_api = [ 'rb_io_path' # Ruby 3.2.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 ] check_api = ruby_api + memory_api + imagemagick_api check_api.each do |func| have_func(func, headers) end # 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_9_0=1') if im_version_at_least?('6.9.0') $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_10=1') if im_version_at_least?('6.9.10') $defs.push('-DIMAGEMAGICK_7=1') if im_version_at_least?('7.0.0') $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_8=1') if im_version_at_least?('7.0.8') $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_7_0_10=1') if im_version_at_least?('7.0.10') create_header end
create_makefile_file()
click to toggle source
# File ext/RMagick/extconf.rb, line 381 def create_makefile_file create_header_file # Force re-compilation if the generated Makefile changed. $config_h = 'Makefile' create_makefile('RMagick2') print_summary end
detect_imagemagick_packages(packages)
click to toggle source
# File ext/RMagick/extconf.rb, line 154 def detect_imagemagick_packages(packages) packages.select do |package| PKGConfig.exist?(package) end end
determine_imagemagick_package()
click to toggle source
# File ext/RMagick/extconf.rb, line 168 def determine_imagemagick_package packages = [installed_im7_packages, installed_im6_packages].flatten if packages.empty? exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find ImageMagick with pkg-config\n" end if installed_im6_packages.any? && installed_im7_packages.any? checking_for('forced use of ImageMagick 6') do if ENV['USE_IMAGEMAGICK_6'] packages = installed_im6_packages true else packages = installed_im7_packages false end end end 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 end packages.first end
exit_failure(msg)
click to toggle source
# File ext/RMagick/extconf.rb, line 137 def exit_failure(msg) msg = "ERROR: #{msg}" 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
im_version_at_least?(version)
click to toggle source
# File ext/RMagick/extconf.rb, line 417 def im_version_at_least?(version) Gem::Version.new($magick_version) >= Gem::Version.new(version) end
installed_im6_packages()
click to toggle source
# File ext/RMagick/extconf.rb, line 160 def installed_im6_packages @installed_im6_packages ||= detect_imagemagick_packages(IM6_PACKAGES) end
installed_im7_packages()
click to toggle source
# File ext/RMagick/extconf.rb, line 164 def installed_im7_packages @installed_im7_packages ||= detect_imagemagick_packages(IM7_PACKAGES) end
magick_command()
click to toggle source
# File ext/RMagick/extconf.rb, line 407 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
print_summary()
click to toggle source
# File ext/RMagick/extconf.rb, line 421 def print_summary summary = <<~"END_SUMMARY" #{'=' * 70} #{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} END_SUMMARY Logging.message summary message summary end
search_paths_for_windows()
click to toggle source
# File ext/RMagick/extconf.rb, line 271 def search_paths_for_windows msg = 'searching PATH for the ImageMagick library...' Logging.message msg message msg + "\n" found = false dir_paths = {} paths = ENV['PATH'].split(File::PATH_SEPARATOR) paths.each do |dir| dll = File.join(dir, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.dll' : 'CORE_RL_magick_.dll') next unless File.exist?(dll) dir_paths[:include] = File.join(dir, 'include') dir_paths[:root] = dir found = true break end return dir_paths if found exit_failure <<~END_MINGW Can't install RMagick #{RMAGICK_VERS}. Can't find the ImageMagick library. Please check PATH environment variable for ImageMagick installation path. END_MINGW end
setup_pkg_config_path()
click to toggle source
# File ext/RMagick/extconf.rb, line 52 def setup_pkg_config_path return if RUBY_PLATFORM.include?('mingw') if find_executable('brew') append_pkg_config_path("#{`brew --prefix imagemagick`.strip}/lib/pkgconfig") append_pkg_config_path("#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig") elsif find_executable('pacman') append_pkg_config_path('/usr/lib/imagemagick6/pkgconfig') end end