[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-core
Subject:    [PATCH] native extention by rubygems
From:       nobuyoshi nakada <nobuyoshi.nakada () ge ! com>
Date:       2005-08-26 8:04:04
Message-ID: TYOMLEM04sq94tLuVG00000010d () tyomlvem02 ! e2k ! ad ! ge ! com
[Download RAW message or body]

Hi,

Rubygems 0.8.11 fails to compile a native extention which
needs optional configurations.

  $ ruby18 /usr/bin/gem install mysql -- --with-mysql-dir=/usr/lib/mysql
  Attempting local installation of 'mysql'
  Local gem file not found: mysql*.gem
  Attempting remote installation of 'mysql'
  Building native extensions.  This could take a while...
  *** extconf.rb failed ***
  Could not create Makefile due to some reason, probably lack of
  necessary libraries and/or headers.  Check the mkmf.log file for more
  details.  You may need configuration options.

  Provided configuration options:
  	--with-opt-dir
  	--with-opt-include=${opt-dir}/include
  	--with-opt-lib=${opt-dir}/lib
  	--with-make-prog=make
  	--srcdir=.
  	--curdir
  	--ruby=/usr/bin/ruby
  	--with-mysql-config
  	--with-mysql-dir=/usr/local
  	--with-mysql-include=${mysql-dir}/include
  	--with-mysql-lib=${mysql-dir}/lib
  	--with-mysqlclientlib=mysqlclient
  	--with-mlib=m
  	--with-mysqlclientlib=mysqlclient
  	--with-zlib=z
  	--with-mysqlclientlib=mysqlclient
  	--with-socketlib=socket
  	--with-mysqlclientlib=mysqlclient
  	--with-nsllib=nsl
  	--with-mysqlclientlib=mysqlclient
  ERROR:	While executing gem ... (RuntimeError)
      ERROR: Failed to build gem native extension.
  Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/mysql-2.6 for \
inspection.  ruby extconf.rb install mysql -- \
--with-mysql-dir=/usr/lib/mysql\nchecking for mysql_query() in -lmysqlclient... no

Note that also arguments to gem command itself are passed to
extconf.rb.

And, gem doesn't work with ruby 1.9.

  $ ruby19 /usr/bin/gem install mysql -- --with-mysql-dir=/usr/lib/mysql
  Attempting local installation of 'mysql'
  Local gem file not found: mysql*.gem
  Attempting remote installation of 'mysql'
  ERROR:  While executing gem ... (NoMethodError)
      undefined method `close' for nil:NilClass

Because Zlib::GzipReader in 1.9 uses readpartial method.  But
subsequent exception is hiding it.


--- bin/gem.orig	2005-08-10 13:28:10.567750000 +0900
+++ bin/gem	2005-08-26 15:33:18.054250000 +0900
@@ -9,9 +9,4 @@
   exit(1)
 end
 
-# We need to preserve the original ARGV to use for passing gem options
-# to source gems.  If there is a -- in the line, strip all options after
-# it...its for the source building process.
-args = !ARGV.include?("--") ? ARGV.clone : ARGV[0...ARGV.index("--")]
-
-Gem::GemRunner.new.run(args)
+Gem::GemRunner.new.run(ARGV)
--- lib/rubygems/gem_commands.rb.orig	2005-08-10 13:28:11.395875000 +0900
+++ lib/rubygems/gem_commands.rb	2005-08-26 15:55:43.226125000 +0900
@@ -146,11 +146,19 @@
       ENV['GEM_PATH'] = options[:install_dir]
       # TODO: If a dependency isn't met, first check to see if it's in 
       # the install list
-      if(options[:args].empty?)
+      args = options[:args]
+      gems = []
+      until args.empty? or /^-/ =~ args.first
+        gems << args.shift
+      end
+      if args.first == '--'
+        args.shift
+      end
+      if gems.empty?
         fail Gem::CommandLineError,
           "Please specify a gem name on the command line (e.g. gem build GEMNAME)"
       end
-      options[:args].each do |gem_name|
+      gems.each do |gem_name|
         if local?
           begin
             say "Attempting local installation of '#{gem_name}'"
--- lib/rubygems/installer.rb.orig	2005-08-10 13:28:11.130250000 +0900
+++ lib/rubygems/installer.rb	2005-08-26 16:02:25.913625000 +0900
@@ -286,8 +286,8 @@
       dest_path = File.join(directory, spec.require_paths[0])
       spec.extensions.each do |extension|
         Dir.chdir File.join(directory, File.dirname(extension))
-        results = ["#{Gem.ruby} #{File.basename(extension)} #{ARGV.join(" ")}"]
-        results << `#{Gem.ruby} #{File.basename(extension)} #{ARGV.join(" ")}`
+        results = [[Gem.ruby, File.basename(extension), *@options[:args]].join(" ")]
+        results << `#{results.last}`
         if File.exist?('Makefile')
           mf = File.read('Makefile')
           mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$.*/, "RUBYARCHDIR = #{dest_path}")
@@ -303,8 +303,8 @@
           results << `#{make_program} install`
           say results.join("\n")
         else
-          File.open(File.join(Dir.pwd, 'gem_make.out'), 'wb') {|f| f.puts \
                results.join("\n")}
-          raise "ERROR: Failed to build gem native extension.\nGem files will remain \
installed in #{directory} for inspection.\n  #{results.join('\n')}\n\nResults logged \
to #{File.join(Dir.pwd, 'gem_make.out')}" +          File.open(File.join(Dir.pwd, \
'gem_make.out'), 'wb') {|f| f.puts results} +          raise "ERROR: Failed to build \
gem native extension.\nGem files will remain installed in #{directory} for \
inspection.\n  #{results.join("\n")}\n\nResults logged to #{File.join(Dir.pwd, \
'gem_make.out')}"  end
         File.open('gem_make.out', 'wb') {|f| f.puts results.join("\n")}
       end
@@ -417,7 +417,7 @@
         return if executables.size == 0
         answer = @force_executables || ask_yes_no(
 	  "Remove executables and scripts for\n" +
-	  "'#{gemspec.executables.join(", ")}' in addition to the gem?",
+	  "'#{gemspec.executables.join(", ")}' in addition to the gem\?",
 	  true)
         unless answer
           say "Executables and scripts will remain installed."
--- lib/rubygems/package.rb.orig	2005-08-10 13:28:11.192750000 +0900
+++ lib/rubygems/package.rb	2005-08-26 14:43:19.245875000 +0900
@@ -350,6 +350,8 @@
             ret
         end
 
+        alias readpartial read
+
         def getc
             return nil if @read >= @size
             ret = @io.getc
@@ -486,18 +488,18 @@
                 has_meta = true
                 break
             when "metadata.gz"
-                begin
-                    # if we have a security_policy, then pre-read the
-                    # metadata file and calculate it's digest
-                    sio = nil
-                    if security_policy 
-                      Gem.ensure_ssl_available
-                      sio = StringIO.new(entry.read)
-                      meta_dgst = dgst_algo.digest(sio.string)
-                      sio.rewind
-                    end
+                # if we have a security_policy, then pre-read the
+                # metadata file and calculate it's digest
+                sio = nil
+                if security_policy 
+                    Gem.ensure_ssl_available
+                    sio = StringIO.new(entry.read)
+                    meta_dgst = dgst_algo.digest(sio.string)
+                    sio.rewind
+                end
 
-                    gzis = Zlib::GzipReader.new(sio || entry)
+                gzis = Zlib::GzipReader.new(sio || entry)
+                begin
                     # YAML wants an instance of IO 
                     # (GS) Changed to line below: @metadata = YAML.load(gzis) rescue \
nil  @metadata = load_gemspec(gzis)
--- lib/rubygems/specification.rb.orig	2005-08-10 13:28:11.005250000 +0900
+++ lib/rubygems/specification.rb	2005-08-26 14:13:42.955875000 +0900
@@ -404,8 +404,8 @@
       unless Specification === spec
         raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
       end
-      unless spec.instance_variable_get :@specification_version
-        spec.instance_variable_set :@specification_version, \
NONEXISTENT_SPECIFICATION_VERSION +      spec.instance_eval do
+        @specification_version ||= NONEXISTENT_SPECIFICATION_VERSION
       end
       spec
     end 


-- 
Nobu Nakada


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic