On Jan 20, 7:15 ¨Âí¬ Ìõéó Ìáöåîá ¼ìõéóìáö®®®Àçíáéì®ãïí¾ ÷òïôåº > > Can you point me to the extconf.rb file of RMagick? > > There is room definitely there is room to add more customization, but > I basedrake-compilerstructure in the PickAxe. > > Please let me know if you make progress on this. Thanks for your prompt reply, Luis. With the exception of the .so filename I believe rake-compiler is working normally. The extconf.rb for RMagick is below. I recognize that rake-compiler wants "convention-over-configuration" and that this can make it difficult to "import" existing projects, especially those that don't match the convention. I appreciate your patience. Indeed, changing the name of the directory to RMagick2 causes rake- compiler to know that the name of the .so file is RMagick2.so, at the cost of changing the name of the directory. The directory structure, which I based on setup.rb, has been my convention from the beginning and I prefer not to change it. I believe that it is compatible with the Pickaxe convention. RMagick has both a Ruby part and a binary part. The Ruby part is RMagick.rb and the binary part is RMagick2.so for RMagick 2 and simply RMagick.so for RMagick 1. require "mkmf" require "date" RMAGICK_VERS = "0.0.0" MIN_RUBY_VERS = "1.8.2" MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr(".","").to_i MIN_IM_VERS = "6.3.0" MIN_IM_VERS_NO = MIN_IM_VERS.tr(".","").to_i # 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 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) end end def exit_failure(msg) Logging::message msg message msg+"\n" exit(1) end # Seems like lots of people have multiple versions of ImageMagick installed. def check_multiple_imagemagick_versions() versions = [] 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 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 end end 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 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" end # Magick-config is not available on Windows if RUBY_PLATFORM !~ /mswin/ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments. cc = (ENV["CC"] or Config::CONFIG["CC"] or "gcc").split(' ').first unless find_executable(cc) exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." end # Check for Magick-config unless find_executable("Magick-config") exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config in #{ENV['PATH']}\n" end check_multiple_imagemagick_versions() # Ensure minimum ImageMagick version unless checking_for("ImageMagick version >= #{MIN_IM_VERS}") do version = `Magick-config --version`.chomp.tr(".","").to_i version >= MIN_IM_VERS_NO end exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{MIN_IM_VERS} or later.\n" end $magick_version = `Magick-config --version`.chomp # Ensure ImageMagick is not configured for HDRI unless checking_for("HDRI disabled version of ImageMagick") do not (`Magick-config --version`["HDRI"]) end exit_failure "\nCan't install RMagick #{RMAGICK_VERS}."+ "\nRMagick does not work when ImageMagick is configured for High Dynamic Range Images."+ "\nDon't use the --enable-hdri option when configuring ImageMagick.\n" end # 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 else # mswin `convert -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 X11.lib' end #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} headers << "stdint.h" if have_header("stdint.h") # defines uint64_t headers << "sys/types.h" if have_header("sys/types.h") unless have_header("magick/MagickCore.h") exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find MagickCore.h.\n" else headers << "magick/MagickCore.h" end if RUBY_PLATFORM !~ /mswin/ unless have_library("Magick", "InitializeMagick", headers) || have_library("MagickCore", "InitializeMagick", headers) || have_library ("Magick++", "InitializeMagick") 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" end end have_func("snprintf", headers) ["AcquireQuantumMemory", # 6.3.5-9 "AcquireImage", # 6.4.1 "AffinityImage", # 6.4.3-6 "AffinityImages", # 6.4.3-6 "ClutImageChannel", # 6.3.5-8 "CompositeLayers", # 6.3.3-? "ConvertHSLToRGB", # 6.3.5-9 "ConvertRGBToHSL", # 6.3.5-9 "DeskewImage", # 6.4.2-5 "DistortImage", # 6.3.5 "EncipherImage", # 6.3.8-6 "EqualizeImageChannel", # 6.3.6-9 "ExcerptImage", # 6.3.5-8 "ExtentImage", # 6.3.1 "FloodfillPaintImage", # 6.3.7 "GetAuthenticPixels", # 6.4.5-6 "GetImageAlphaChannel", # 6.3.9-2 "GetImageProperty", # 6.3.1 "GetNextImageProperty", # 6.3.1 "GetStringInfoDatum", # 6.3.2 "GetVirtualPixels", # 6.4.5-6 "InterpretImageProperties", # 6.3.2 "IsHistogramImage", # 6.3.5 "LevelImageColors", # 6.4.2 "LevelizeImageChannel", # 6.4.2 "LinearStretchImage", # 6.3.1 "LiquidRescaleImage", # 6.3.8-2 "MagickCoreGenesis", # 6.3.4 "OpaquePaintImageChannel", # 6.3.7-10 "PolaroidImage", # 6.3.1-6 "RecolorImage", # 6.3.1-3 "RemapImage", # 6.4.4-0 "RemoveImageArtifact", # 6.3.6 "ResetImagePage", # 6.3.3 "ResizeQuantumMemory", # 6.3.5-9 "SetImageAlphaChannel", # 6.3.6-9 "SetImageArtifact", # 6.3.6 "SetImageMask", # 6.3.1 "SetImageProperty", # 6.3.1 "SetImageRegistry", # 6.3.4 "SparseColorImage", # 6.3.4-? "SyncImageProfiles", # 6.3.2 "SyncAuthenticPixels", # 6.4.5-6 "TransparentPaintImage", # 6.3.7-10 "TransparentPaintImageChroma" # 6.4.5-6 ].each do |func| have_func(func, headers) end 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 end have_struct_member("ImageInfo", "profile", headers) # 6.3.2 have_struct_member("Image", "tile_offset", headers) # 6.3.4 have_struct_member("Image", "type", headers) # ??? have_struct_member("DrawInfo", "kerning", headers) # 6.4.7-8 have_struct_member("DrawInfo", "interword_spacing", headers) # 6.4.8-0 have_type("AlphaChannelType", headers) # 6.3.5 have_type("DitherMethod", headers) # 6.4.2 have_type("ImageLayerMethod", headers) # 6.3.6 replaces MagickLayerMethod have_type("SpreadMethod", headers) # 6.3.1 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_value("AlphaChannelType", "CopyAlphaChannel", headers) # 6.4.3-7 have_enum_value("ColorspaceType", "CMYColorspace", headers) # 6.3.5 have_enum_values("CompositeOperator", ["ChangeMaskCompositeOp", # 6.3.3 "LinearLightCompositeOp", # 6.3.5 "DivideCompositeOp"], headers) # 6.3.5 have_enum_values("CompressionType", ["DXT1Compression", # 6.3.9-3 "DXT3Compression", # 6.3.9-3 "DXT5Compression"], headers) # 6.3.9-3 have_enum_values("DistortImageMethod", ["ArcDistortion", # 6.3.5-5 "BarrelDistortion", # 6.4.2-5 "BarrelInverseDistortion", # 6.4.3-8 "DePolarDistortion", # 6.4.2-6 "PerspectiveProjectionDistortion", # 6.3.5-9 "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_value("InterpolatePixelMethod", "SplineInterpolatePixel", headers) # 6.3.5 have_enum_values("InterlaceType", ["GIFInterlace", # 6.3.4 "JPEGInterlace", # 6.3.4 "PNGInterlace"], headers) # 6.3.4 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("MagickLayerMethod", ["OptimizeTransLayer", # 6.3.3-4 "RemoveDupsLayer", # 6.3.3-6 "RemoveZeroLayer", # 6.3.3-6 "CompositeLayer", # 6.3.3-6 "OptimizeImageLayer"], headers) # 6.3.3-? 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_value("MetricType", "MeanErrorPerPixelMetric", headers) # 6.3.4-? have_enum_value("NoiseType", "RandomNoise", headers) # 6.3.5-0 have_enum_value("SpreadMethod", "ReflectSpread", headers) # 6.3.1 have_enum_values("VirtualPixelMethod", ["MaskVirtualPixelMethod", # 6.3.3 "BlackVirtualPixelMethod", # 6.3.5 "GrayVirtualPixelMethod", # 6.3.5 "HorizontalTileVirtualPixelMethod", # 6.4.2-6 "VerticalTileVirtualPixelMethod", # 6.4.2-6 "WhiteVirtualPixelMethod"], headers) # 6.3.5 # Now test Ruby 1.9.0 features. headers = ["ruby.h"] if have_header("ruby/io.h") headers << "ruby/io.h" else headers << "rubyio.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}\"") create_header() # Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the # extconf.h header. Suppress that behavior by removing the symbol array. $defs = [] # Force re-compilation if the generated Makefile changed. $config_h = "Makefile rmagick.h" create_makefile("RMagick2") SUMMARY = <<"END_SUMMARY" #{"=" * 70} #{DateTime.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