summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--lib/rubygems/ext.rb1
-rw-r--r--lib/rubygems/ext/cmake_builder.rb14
-rw-r--r--lib/rubygems/installer.rb2
-rw-r--r--test/rubygems/test_gem_ext_cmake_builder.rb84
5 files changed, 108 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f3845db2db..84debb3cef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Dec 10 09:40:19 2012 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/ext/cmake_builder.rb: Added a builder for cmake.
+ * lib/rubygems/ext.rb: ditto.
+ * lib/rubygems/installer.rb: ditto.
+ * test/rubygems/test_gem_ext_cmake_builder.rb: Test for above.
+
Mon Dec 10 09:13:08 2012 Eric Hodel <drbrain@segment7.net>
* lib/rubygems/package.rb: Omit directories when packaging gems like
diff --git a/lib/rubygems/ext.rb b/lib/rubygems/ext.rb
index 97ee762a4a..b2bb09aad5 100644
--- a/lib/rubygems/ext.rb
+++ b/lib/rubygems/ext.rb
@@ -15,4 +15,5 @@ require 'rubygems/ext/builder'
require 'rubygems/ext/configure_builder'
require 'rubygems/ext/ext_conf_builder'
require 'rubygems/ext/rake_builder'
+require 'rubygems/ext/cmake_builder'
diff --git a/lib/rubygems/ext/cmake_builder.rb b/lib/rubygems/ext/cmake_builder.rb
new file mode 100644
index 0000000000..d6d106f4ae
--- /dev/null
+++ b/lib/rubygems/ext/cmake_builder.rb
@@ -0,0 +1,14 @@
+class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
+ def self.build(extension, directory, dest_path, results)
+ unless File.exist?('Makefile') then
+ cmd = "cmake . -DCMAKE_INSTALL_PREFIX=#{dest_path}"
+ cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty?
+
+ run cmd, results
+ end
+
+ make dest_path, results
+
+ results
+ end
+end
diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb
index 2b7c821727..6c2e6ce5a3 100644
--- a/lib/rubygems/installer.rb
+++ b/lib/rubygems/installer.rb
@@ -667,6 +667,8 @@ TEXT
when /rakefile/i, /mkrf_conf/i then
ran_rake = true
Gem::Ext::RakeBuilder
+ when /CMakeLists.txt/ then
+ Gem::Ext::CmakeBuilder
else
message = "No builder for extension '#{extension}'"
extension_build_error extension_dir, message
diff --git a/test/rubygems/test_gem_ext_cmake_builder.rb b/test/rubygems/test_gem_ext_cmake_builder.rb
new file mode 100644
index 0000000000..f43f13662b
--- /dev/null
+++ b/test/rubygems/test_gem_ext_cmake_builder.rb
@@ -0,0 +1,84 @@
+require 'rubygems/test_case'
+require 'rubygems/ext'
+
+class TestGemExtCmakeBuilder < Gem::TestCase
+
+ def setup
+ super
+
+ `cmake #{Gem::Ext::Builder.redirector}`
+
+ skip 'cmake not present' unless $?.success?
+
+ @ext = File.join @tempdir, 'ext'
+ @dest_path = File.join @tempdir, 'prefix'
+
+ FileUtils.mkdir_p @ext
+ FileUtils.mkdir_p @dest_path
+ end
+
+ def test_self_build
+ File.open File.join(@ext, 'CMakeLists.txt'), 'w' do |cmakelists|
+ cmakelists.write <<-eo_cmake
+cmake_minimum_required(VERSION 2.8)
+install (FILES test.txt DESTINATION bin)
+ eo_cmake
+ end
+ File.open File.join(@ext, 'test.txt'), 'w' do |testfile|
+ end
+
+ output = []
+
+ Dir.chdir @ext do
+ Gem::Ext::CmakeBuilder.build nil, nil, @dest_path, output
+ end
+
+ assert_equal "cmake . -DCMAKE_INSTALL_PREFIX=#{@dest_path}", output.shift
+ assert_match(/#{@ext}/, output.shift)
+ assert_equal make_command, output.shift
+ assert_equal "", output.shift
+ assert_equal make_command + " install", output.shift
+ assert_match(/test\.txt/, output.shift)
+ end
+
+ def test_self_build_fail
+ output = []
+
+ error = assert_raises Gem::InstallError do
+ Dir.chdir @ext do
+ Gem::Ext::CmakeBuilder.build nil, nil, @dest_path, output
+ end
+ end
+
+ shell_error_msg = %r{(CMake Error: .*)}
+ sh_prefix_cmake = "cmake . -DCMAKE_INSTALL_PREFIX="
+
+ expected = %r(cmake failed:
+
+#{Regexp.escape sh_prefix_cmake}#{Regexp.escape @dest_path}
+#{shell_error_msg}
+)
+
+ assert_match expected, error.message
+
+ assert_equal "#{sh_prefix_cmake}#{@dest_path}", output.shift
+ assert_match %r(#{shell_error_msg}), output.shift
+ assert_equal true, output.empty?
+ end
+
+ def test_self_build_has_makefile
+ File.open File.join(@ext, 'Makefile'), 'w' do |makefile|
+ makefile.puts "all:\n\t@echo ok\ninstall:\n\t@echo ok"
+ end
+
+ output = []
+ Dir.chdir @ext do
+ Gem::Ext::CmakeBuilder.build nil, nil, @dest_path, output
+ end
+
+ assert_equal make_command, output[0]
+ assert_equal "#{make_command} install", output[2]
+ end
+
+end
+