[DRE-commits] [SCM] gem2deb.git branch, master, updated. 460e84be1f7bd8d430c5ddae46d62fd657ac5fa3
Antonio Terceiro
terceiro at softwarelivre.org
Fri Mar 18 14:53:32 UTC 2011
The following commit has been merged in the master branch:
commit 403a3279a737141038c33272d57a3c21f43f5a87
Author: Antonio Terceiro <terceiro at softwarelivre.org>
Date: Thu Mar 17 20:43:47 2011 -0300
Modularize logic for handling native extensions
* Added a new sample package with a native extension in the root
directory (instead of under ext/)
* Extracted native extension detection logic from Gem2Deb::DhMakeRuby,
Gem2Deb::DhRuby, and Gem2Deb::ExtensionBuilder to Gem2Deb::Metadata.
* Added support for packages with native extensions in the root
directory to dh-make-ruby and dh_ruby.
diff --git a/lib/gem2deb/dh_make_ruby.rb b/lib/gem2deb/dh_make_ruby.rb
index f0e0834..d8b60da 100644
--- a/lib/gem2deb/dh_make_ruby.rb
+++ b/lib/gem2deb/dh_make_ruby.rb
@@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
require 'gem2deb'
+require 'gem2deb/metadata'
require 'rubygems'
require 'yaml'
require 'fileutils'
@@ -31,7 +32,7 @@ module Gem2Deb
attr_accessor :gem_version
- attr_accessor :gemspec
+ attr_accessor :metadata
attr_reader :source_package_name
@@ -81,15 +82,15 @@ module Gem2Deb
end
def homepage
- gemspec && gemspec.homepage
+ metadata.homepage
end
def short_description
- gemspec && gemspec.summary
+ metadata.short_description
end
def long_description
- gemspec && gemspec.description
+ metadata.long_description
end
def build
@@ -106,29 +107,24 @@ module Gem2Deb
end
def read_upstream_source_info
- read_gemspec
+ read_metadata
detect_needed_binary_packages
end
- def read_gemspec
- metadata_file = 'metadata.yml'
- if File.exists?(metadata_file)
- self.gemspec = YAML::load_file(metadata_file)
- end
+ def read_metadata
+ self.metadata = Gem2Deb::Metadata.new('.')
end
def detect_needed_binary_packages
binary_packages << Package.new(source_package_name)
- if File.directory?('ext')
+ if metadata.has_native_extensions?
binary_packages << Package.new(source_package_name.sub('ruby-', 'ruby1.8-'))
binary_packages << Package.new(source_package_name.sub('ruby-', 'ruby1.9.1-'))
end
- if gemspec
- binary_packages.each do |package|
- gemspec.dependencies.each do |dependency|
- package.gem_dependencies << dependency
- end
+ binary_packages.each do |package|
+ metadata.dependencies.each do |dependency|
+ package.gem_dependencies << dependency
end
end
@@ -256,9 +252,9 @@ module Gem2Deb
end
def test_suite
- if gemspec && !gemspec.test_files.empty?
+ if !metadata.test_files.empty?
File::open("debian/ruby-test-files.yaml", 'w') do |f|
- YAML::dump(gemspec.test_files, f)
+ YAML::dump(metadata.test_files, f)
end
else
if File::directory?("test") or File::directory?("spec")
diff --git a/lib/gem2deb/dh_ruby.rb b/lib/gem2deb/dh_ruby.rb
index ab54b30..0153009 100644
--- a/lib/gem2deb/dh_ruby.rb
+++ b/lib/gem2deb/dh_ruby.rb
@@ -32,6 +32,7 @@
# dh_ruby could generate rdoc (not sure if we want this)
require 'gem2deb'
+require 'gem2deb/metadata'
require 'find'
module Gem2Deb
@@ -51,23 +52,17 @@ module Gem2Deb
attr_accessor :verbose
+ attr_reader :metadata
+
def initialize
@verbose = true
@bindir = '/usr/bin'
+ @metadata = Gem2Deb::Metadata.new('.')
end
def clean
puts "Entering dh_ruby --clean" if @verbose
- if File::directory?('ext')
- Find::find('ext') do |f|
- if File::basename(f) == 'Makefile'
- puts "Running 'make clean' in #{File::dirname(f)}..."
- Dir::chdir(File::dirname(f)) do
- system("make clean")
- end
- end
- end
- end
+ run_make_clean_on_extensions
end
def configure
@@ -106,7 +101,7 @@ module Gem2Deb
end
end
else
- if File::directory?('ext')
+ if metadata.has_native_extensions?
if not SUPPORTED_RUBY_VERSIONS.has_key?(rubyver)
puts "Unknown Ruby version: #{rubyver}"
exit(1)
@@ -351,5 +346,19 @@ module Gem2Deb
end
end
+ def run_make_clean_on_extensions
+ if metadata.has_native_extensions?
+ metadata.native_extensions.each do |extension|
+ extension_dir = File.dirname(extension)
+ if File.exists?(File.join(extension_dir, 'Makefile'))
+ puts "Running 'make clean' in #{extension_dir}..."
+ Dir.chdir(extension_dir) do
+ run 'make clean'
+ end
+ end
+ end
+ end
+ end
+
end
end
diff --git a/lib/gem2deb/extension_builder.rb b/lib/gem2deb/extension_builder.rb
index c89c5d5..bd09e6b 100644
--- a/lib/gem2deb/extension_builder.rb
+++ b/lib/gem2deb/extension_builder.rb
@@ -17,6 +17,7 @@ require 'gem2deb'
require 'yaml'
require 'rubygems/ext'
require 'yaml'
+require 'gem2deb/metadata'
module Gem2Deb
class ExtensionBuilder
@@ -76,11 +77,8 @@ module Gem2Deb
end
def self.all_extensions
- if File.exists?('metadata.yml')
- YAML.load_file('metadata.yml').extensions
- else
- Dir.glob('ext/**/{extconf.rb,configure,Rakefile}')
- end
+ @metadata ||= Gem2Deb::Metadata.new('.')
+ @metadata.native_extensions
end
end
end
diff --git a/lib/gem2deb/metadata.rb b/lib/gem2deb/metadata.rb
new file mode 100644
index 0000000..527a12a
--- /dev/null
+++ b/lib/gem2deb/metadata.rb
@@ -0,0 +1,72 @@
+require 'rubygems'
+require 'rubygems/specification'
+
+module Gem2Deb
+ class Metadata
+
+ attr_reader :gemspec
+
+ attr_reader :native_extensions
+
+ def initialize(directory)
+ Dir.chdir(directory) do
+ load_gemspec
+ if gemspec
+ initialize_from_gemspec
+ else
+ initialize_without_gemspec
+ end
+ end
+ end
+
+ def has_native_extensions?
+ native_extensions.size > 0
+ end
+
+ def homepage
+ gemspec && gemspec.homepage
+ end
+
+ def short_description
+ gemspec && gemspec.summary
+ end
+
+ def long_description
+ gemspec && gemspec.description
+ end
+
+ def dependencies
+ gemspec ? gemspec.dependencies : []
+ end
+
+ def test_files
+ gemspec ? gemspec.test_files : []
+ end
+
+ protected
+
+ def load_gemspec
+ if File.exists?('metadata.yml')
+ @gemspec = YAML.load_file('metadata.yml')
+ else
+ gemspec_files = Dir.glob('*.gemspec')
+ if gemspec_files.size == 1
+ @gemspec = Gem::Specification.load(gemspec_files.first)
+ else
+ unless gemspec_files.empty?
+ raise "More than one .gemspec file in this directory: #{gemspec_files.join(', ')}"
+ end
+ end
+ end
+ end
+
+ def initialize_from_gemspec
+ @native_extensions = gemspec.extensions
+ end
+
+ def initialize_without_gemspec
+ @native_extensions = Dir.glob('**/extconf.rb') + Dir.glob('ext/**/{configure,Rakefile}')
+ end
+
+ end
+end
diff --git a/test/helper/samples.rb b/test/helper/samples.rb
index 1e14b9b..2cb3427 100644
--- a/test/helper/samples.rb
+++ b/test/helper/samples.rb
@@ -15,6 +15,10 @@ class Gem2DebTestCase
SIMPLE_EXTENSION_DIRNAME = SIMPLE_EXTENSION_NAME + '-1.2.3'
SIMPLE_EXTENSION = File.join(SAMPLE_DIR, "#{SIMPLE_EXTENSION_NAME}/pkg/#{SIMPLE_EXTENSION_DIRNAME}.gem")
+ SIMPLE_ROOT_EXTENSION_NAME = 'simpleextension_in_root'
+ SIMPLE_ROOT_EXTENSION_DIRNAME = SIMPLE_ROOT_EXTENSION_NAME.gsub('_', '-') + '-1.2.3'
+ SIMPLE_ROOT_EXTENSION = File.join(SAMPLE_DIR, SIMPLE_ROOT_EXTENSION_NAME, 'pkg', "#{SIMPLE_ROOT_EXTENSION_NAME}-1.2.3.gem")
+
SIMPLE_TGZ_NAME = 'simpletgz'
SIMPLE_TGZ_DIRNAME = SIMPLE_TGZ_NAME + '-0.0.1'
SIMPLE_TGZ = File.join(SAMPLE_DIR, "#{SIMPLE_TGZ_NAME}/pkg/#{SIMPLE_TGZ_DIRNAME}.tgz")
diff --git a/test/sample/simpleextension_in_root/Rakefile b/test/sample/simpleextension_in_root/Rakefile
new file mode 100644
index 0000000..ef1b287
--- /dev/null
+++ b/test/sample/simpleextension_in_root/Rakefile
@@ -0,0 +1,24 @@
+require 'rubygems'
+require 'rake/gempackagetask'
+
+spec = Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.summary = "Simple native extension with extconf.rb in root directory used to test dh_ruby"
+ s.name = 'simpleextension_in_root'
+ s.version = '1.2.3'
+ s.requirements << 'none'
+ s.require_path = '.'
+ s.extensions << 'extconf.rb'
+ #s.autorequire = 'rake'
+ s.files = ['extconf.rb', 'simpleextension_in_root.c']
+ s.description = <<EOF
+simpleextension_in_root is a simple native extension that is used to test
+dh_ruby. It contains a Ruby native extension in the root of the source
+directory, instead of inside ext/ subdirectory.
+EOF
+end
+
+Rake::GemPackageTask.new(spec) do |pkg|
+ pkg.need_zip = false
+ pkg.need_tar = false
+end
diff --git a/test/sample/simpleextension_in_root/extconf.rb b/test/sample/simpleextension_in_root/extconf.rb
new file mode 100644
index 0000000..fc28331
--- /dev/null
+++ b/test/sample/simpleextension_in_root/extconf.rb
@@ -0,0 +1,2 @@
+require 'mkmf'
+create_makefile('simpleextension_in_root')
diff --git a/test/sample/simplemixed/pkg/simplemixed-1.2.3.gem b/test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem
similarity index 57%
copy from test/sample/simplemixed/pkg/simplemixed-1.2.3.gem
copy to test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem
index f030677..e7b5139 100644
Binary files a/test/sample/simplemixed/pkg/simplemixed-1.2.3.gem and b/test/sample/simpleextension_in_root/pkg/simpleextension_in_root-1.2.3.gem differ
diff --git a/test/sample/simpleextension_in_root/simpleextension_in_root.c b/test/sample/simpleextension_in_root/simpleextension_in_root.c
new file mode 100644
index 0000000..260f600
--- /dev/null
+++ b/test/sample/simpleextension_in_root/simpleextension_in_root.c
@@ -0,0 +1,5 @@
+#include "ruby.h"
+
+void Init_simpleextension_in_root() {
+ rb_define_module("SimpleExtensionInRoot");
+}
diff --git a/test/unit/dh_make_ruby_test.rb b/test/unit/dh_make_ruby_test.rb
index f7cdd5a..df6df2b 100644
--- a/test/unit/dh_make_ruby_test.rb
+++ b/test/unit/dh_make_ruby_test.rb
@@ -70,6 +70,26 @@ class DhMakeRubyTest < Gem2DebTestCase
end
end
+ DEBIANIZED_SIMPLE_ROOT_EXTENSION = File.join(tmpdir, 'ruby-' + SIMPLE_ROOT_EXTENSION_DIRNAME.gsub('_', '-'))
+ SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL = DEBIANIZED_SIMPLE_ROOT_EXTENSION + '.tar.gz'
+ one_time_setup do
+ Gem2Deb::Gem2Tgz.convert!(SIMPLE_ROOT_EXTENSION, SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL)
+ Gem2Deb::DhMakeRuby.new(SIMPLE_ROOT_EXTENSION_UPSTREAM_TARBALL).build
+ end
+
+ context 'native extension with extconf.rb in the sources root' do
+ should 'generate one package for ruby1.8' do
+ Dir.chdir(DEBIANIZED_SIMPLE_ROOT_EXTENSION) do
+ assert(packages.include?('ruby1.8-simpleextension-in-root'), "Package ruby1.8-simpleextension-in-root not created")
+ end
+ end
+ should 'generate one package for ruby1.9.1' do
+ Dir.chdir(DEBIANIZED_SIMPLE_ROOT_EXTENSION) do
+ assert(packages.include?('ruby1.9.1-simpleextension-in-root'), "Package ruby1.9.1-simpleextension-in-root not created")
+ end
+ end
+ end
+
DEBIANIZED_SIMPLE_PROGRAM = File.join(tmpdir, SIMPLE_PROGRAM_DIRNAME)
SIMPLE_PROGRAM_UPSTREAM_TARBALL = DEBIANIZED_SIMPLE_PROGRAM + '.tar.gz'
one_time_setup do
diff --git a/test/unit/dh_ruby_test.rb b/test/unit/dh_ruby_test.rb
index 8532b5d..0310898 100644
--- a/test/unit/dh_ruby_test.rb
+++ b/test/unit/dh_ruby_test.rb
@@ -11,6 +11,7 @@ class DhRubyTest < Gem2DebTestCase
build(SIMPLE_PROGRAM, SIMPLE_PROGRAM_DIRNAME)
build(SIMPLE_EXTENSION, SIMPLE_EXTENSION_DIRNAME)
build(SIMPLE_MIXED, SIMPLE_MIXED_DIRNAME)
+ build(SIMPLE_ROOT_EXTENSION, SIMPLE_ROOT_EXTENSION_DIRNAME)
end
context 'installing simplegem' do
@@ -48,6 +49,20 @@ class DhRubyTest < Gem2DebTestCase
end
end
+ context 'installing native extension with extconf.rb in the sources root' do
+ arch = RbConfig::CONFIG['arch']
+ {
+ '1.8' => 'ruby1.8',
+ '1.9.1' => 'ruby1.9.1',
+ }.each do |version_number, version_name|
+ target_so = "/usr/lib/ruby/vendor_ruby/#{version_number}/#{arch}/simpleextension_in_root.so"
+ should "install native extension for #{version_name}" do
+ assert_installed SIMPLE_ROOT_EXTENSION_DIRNAME, "#{version_name}-simpleextension-in-root", target_so
+ end
+ end
+
+ end
+
context 'determining ruby version for package' do
{
'foo' => 'ruby',
diff --git a/test/unit/metadata_test.rb b/test/unit/metadata_test.rb
new file mode 100644
index 0000000..9f629bc
--- /dev/null
+++ b/test/unit/metadata_test.rb
@@ -0,0 +1,81 @@
+require 'test_helper'
+require 'gem2deb/metadata'
+require 'yaml'
+
+class MetaDataTest < Gem2DebTestCase
+
+ {
+ 'simpleextension' => true,
+ 'simpleextension_in_root' => true,
+ 'simplegem' => false,
+ 'simplemixed' => true,
+ 'simpleprogram' => false,
+ 'simpletgz' => false,
+ }.each do |source_package, has_extensions|
+ should "correctly detect native extensions for #{source_package}" do
+ assert_equal has_extensions, Gem2Deb::Metadata.new(File.join('test/sample', source_package)).has_native_extensions?
+ end
+ end
+
+ def setup
+ FileUtils.mkdir_p('test/tmp')
+ @metadata = Gem2Deb::Metadata.new('test/tmp')
+ end
+
+ def teardown
+ FileUtils.rmdir('test/tmp')
+ end
+
+ context 'without gemspec' do
+ should 'have no homepage' do
+ assert_nil @metadata.homepage
+ end
+ should 'have no short description' do
+ assert_nil @metadata.short_description
+ end
+ should 'have no long description' do
+ assert_nil @metadata.long_description
+ end
+ should 'have no dependencies' do
+ assert_equal [], @metadata.dependencies
+ end
+ should 'have no test files' do
+ assert_equal [], @metadata.test_files
+ end
+ end
+
+ context 'with gemspec' do
+ setup do
+ @gemspec = mock
+ @metadata.stubs(:gemspec).returns(@gemspec)
+ end
+
+ should 'obtain homepage from gemspec' do
+ @gemspec.stubs(:homepage).returns('http://www.debian.org/')
+ assert_equal 'http://www.debian.org/', @metadata.homepage
+ end
+
+ should 'obtain short description from gemspec' do
+ @gemspec.stubs(:summary).returns('This library does stuff')
+ assert_equal 'This library does stuff', @metadata.short_description
+ end
+
+ should 'obtain long detect from gemspec' do
+ @gemspec.stubs(:description).returns('This is the long description, bla bla bla')
+ assert_equal 'This is the long description, bla bla bla', @metadata.long_description
+ end
+
+ should 'obtain dependencies list from gemspec' do
+ @gemspec.stubs(:dependencies).returns(['gem1', 'gem2'])
+ assert_equal ['gem1', 'gem2'], @metadata.dependencies
+ end
+
+ should 'obtain test files list from gemspec' do
+ @gemspec.stubs(:test_files).returns(['test/class1_test.rb', 'test/class2_test.rb'])
+ assert_equal ['test/class1_test.rb', 'test/class2_test.rb'], @metadata.test_files
+ end
+
+ end
+
+end
+
--
gem2deb.git
More information about the Pkg-ruby-extras-commits
mailing list