diff --git a/ext/jasmine-webkit-specrunner/extconf.rb b/ext/jasmine-webkit-specrunner/extconf.rb index cbc77ca..6cb0252 100644 --- a/ext/jasmine-webkit-specrunner/extconf.rb +++ b/ext/jasmine-webkit-specrunner/extconf.rb @@ -1,8 +1,6 @@ -case RUBY_PLATFORM -when /linux/ - system %{qmake -spec linux-g++} -else - system %{qmake -spec macx-g++} -end +$: << File.expand_path("../../../lib", __FILE__) + +require 'qt/qmake' + +Qt::Qmake.make!('jasmine-headless-webkit') -system %{make} diff --git a/lib/qt/qmake.rb b/lib/qt/qmake.rb new file mode 100644 index 0000000..e1ce112 --- /dev/null +++ b/lib/qt/qmake.rb @@ -0,0 +1,143 @@ +require 'rbconfig' + +module Qt + class NotInstalledError < StandardError; end + + class Qmake + class << self + def installed? + path != nil + end + + def make_installed? + make_path != nil + end + + def command + case platform + when :linux + "#{path} -spec linux-g++" + when :mac_os_x + "#{path} -spec macx-g++" + end + end + + def make!(name) + @name = name + + check_make! + check_qmake! + check_qmake_version! + + system command + system %{make} + end + + # + # We need integration tests for these! + # + def path + get_exe_path('qmake') + end + + def make_path + get_exe_path('make') + end + + def platform + case RbConfig::CONFIG['host_os'] + when /linux/ + :linux + when /darwin/ + :mac_os_x + end + end + + def qt_version + @qt_version ||= %x{#{path} -v}.lines.to_a[1][%r{Using Qt version ([^ ]+) },1] + end + + def qt_47_or_better? + return false if !qt_version + return true if (major = qt_version.split('.')[0].to_i) > 4 + return false if major < 4 + qt_version.split('.')[1].to_i >= 7 + end + + private + def get_exe_path(command) + path = %x{which #{command}}.strip + path = nil if path == '' + path + end + + def check_make! + if !make_installed? + install_method = ( + case platform + when :linux + %{sudo apt-get install make or sudo yum install make} + when :darwin + %{Install XCode, and/or sudo port install make} + end + ) + + $stderr.puts <<-MSG +make is not installed. You'll need to install it to build #{@name}. +#{install_method} should do it for you. +MSG + raise NotInstalledError + end + end + + def check_qmake! + if !installed? + install_method = strip( + case platform + when :linux + <<-MSG +sudo apt-get install libqt4-dev qt4-qmake on Debian-based systems, or downloading +Nokia's prebuilt binary at http://qt.nokia.com/downloads/ +MSG + when :darwin + <<-MSG +sudo port install qt4-mac (for the patient) or downloading Nokia's pre-built binary +at http://qt.nokia.com/downloads/ +MSG + end + ) + + $stderr.puts <<-MSG +qmake is not installed. You'll need to install it to build #{@name}. +#{install_method} should do it for you. +MSG + end + end + + def check_qmake_version! + if !qt_47_or_better? + install_method = strip( + case platform + when :linux + <<-MSG +sudo apt-get install libqt4-dev qt4-qmake on Debian-based systems, or downloading +Nokia's prebuilt binary at http://qt.nokia.com/downloads/ +MSG + when :darwin + <<-MSG +sudo port install qt4-mac (for the patient) or downloading Nokia's pre-built binary +at http://qt.nokia.com/downloads/ +MSG + end + ) + + $stderr.puts <<-MSG +qmake is not version 4.7 or above (currently version #{qt_version}. You'll need to install version 4.7 or higher +to build #{@name}. #{install_method} should do it for you. +MSG + end + end + end + end +end + diff --git a/spec/lib/qt/qmake_spec.rb b/spec/lib/qt/qmake_spec.rb new file mode 100644 index 0000000..41a0862 --- /dev/null +++ b/spec/lib/qt/qmake_spec.rb @@ -0,0 +1,93 @@ +require 'spec_helper' +require 'qt/qmake' +require 'rbconfig' + +describe Qt::Qmake do + describe '.make_installed?' do + subject { described_class } + + before do + Qt::Qmake.stubs(:make_path).returns(path) + end + + context 'not installed' do + let(:path) { nil } + + it { should_not be_make_installed } + end + + context 'installed' do + let(:path) { '/here/there/make' } + + it { should be_make_installed } + end + end + + describe '.installed?' do + subject { described_class } + + before do + Qt::Qmake.stubs(:path).returns(path) + end + + context 'not installed' do + let(:path) { nil } + + it { should_not be_installed } + end + + context 'installed' do + let(:path) { '/here/there/qmake' } + + it { should be_installed } + end + end + + describe '.command' do + subject { described_class.command } + + before do + Qt::Qmake.stubs(:platform).returns(platform) + Qt::Qmake.stubs(:path).returns("qmake") + end + + context 'linux' do + let(:platform) { :linux } + + it { should == "qmake -spec linux-g++" } + end + + context 'mac os x' do + let(:platform) { :mac_os_x } + + it { should == "qmake -spec macx-g++" } + end + end + + describe '.qt_47_or_better?' do + subject { described_class } + + before do + Qt::Qmake.stubs(:qt_version).returns(version) + end + + context 'no version' do + let(:version) { nil } + + it { should_not be_qt_47_or_better } + end + + context 'not better' do + let(:version) { '4.6.0' } + + it { should_not be_qt_47_or_better } + end + + context 'better' do + let(:version) { '4.7.0' } + + it { should be_qt_47_or_better } + end + end +end +