rake-builder 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. data/Rakefile +8 -5
  2. data/examples/05_tests/Rakefile +3 -3
  3. data/examples/05_tests/include/units.h +2 -2
  4. data/lib/compiler.rb +25 -30
  5. data/lib/rake/builder.rb +135 -136
  6. data/lib/rake/builder/installer.rb +37 -0
  7. data/lib/rake/{local_config.rb → builder/local_config.rb} +13 -14
  8. data/lib/rake/builder/logger/formatter.rb +7 -1
  9. data/lib/rake/builder/presenters/makefile/builder_presenter.rb +66 -33
  10. data/lib/rake/builder/presenters/makefile_am/builder_presenter.rb +4 -4
  11. data/lib/rake/builder/qt_builder.rb +3 -8
  12. data/lib/rake/builder/task_definers/builder_task_definer.rb +1 -4
  13. data/lib/rake/builder/version.rb +1 -1
  14. data/lib/rake/{microsecond.rb → microsecond_task.rb} +22 -27
  15. data/lib/rake/once_task.rb +2 -7
  16. data/lib/rake/path.rb +1 -6
  17. data/spec/gather_rspec_coverage.rb +2 -0
  18. data/spec/spec_helper.rb +13 -98
  19. data/spec/unit/compiler_spec.rb +129 -0
  20. data/spec/unit/rake/builder/autoconf/version_spec.rb +62 -5
  21. data/spec/unit/rake/builder/configure_ac_spec.rb +53 -0
  22. data/spec/unit/rake/builder/install_spec.rb +101 -0
  23. data/spec/unit/rake/builder/local_config_spec.rb +53 -0
  24. data/spec/unit/rake/builder/logger/formatter_spec.rb +20 -0
  25. data/spec/unit/rake/builder/presenters/makefile/builder_presenter_spec.rb +163 -0
  26. data/spec/unit/rake/builder/presenters/makefile_am/builder_presenter_spec.rb +4 -2
  27. data/spec/unit/rake/builder/task_definers/builder_task_definer_spec.rb +6 -0
  28. data/spec/unit/rake/builder_spec.rb +391 -16
  29. data/spec/unit/rake/microsecond_task_spec.rb +63 -0
  30. metadata +39 -55
  31. data/examples/01_hello_world_cpp/vendor/bundle/gems/coderay-1.0.8/Rakefile +0 -35
  32. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/Rakefile +0 -412
  33. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/fbuffer/fbuffer.h +0 -185
  34. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/generator/generator.c +0 -1427
  35. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/generator/generator.h +0 -149
  36. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/parser/parser.c +0 -2204
  37. data/examples/01_hello_world_cpp/vendor/bundle/gems/json-1.7.6/ext/json/ext/parser/parser.h +0 -77
  38. data/examples/01_hello_world_cpp/vendor/bundle/gems/method_source-0.8.1/Rakefile +0 -79
  39. data/examples/01_hello_world_cpp/vendor/bundle/gems/pry-0.9.11.3/Rakefile +0 -136
  40. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/Rakefile +0 -374
  41. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/a.c +0 -6
  42. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/b.c +0 -6
  43. data/examples/01_hello_world_cpp/vendor/bundle/gems/rake-10.0.3/doc/example/main.c +0 -11
  44. data/examples/01_hello_world_cpp/vendor/bundle/gems/slop-3.4.3/Rakefile +0 -29
  45. data/lib/rake/file_task_alias.rb +0 -24
  46. data/spec/c_project/main.c +0 -12
  47. data/spec/c_project/main.h +0 -6
  48. data/spec/c_project_spec.rb +0 -41
  49. data/spec/cpp_project/main.cpp +0 -12
  50. data/spec/cpp_project/main.h +0 -8
  51. data/spec/cpp_project_spec.rb +0 -203
  52. data/spec/generated_files_spec.rb +0 -65
  53. data/spec/libraries_spec.rb +0 -35
  54. data/spec/local_config_spec.rb +0 -95
  55. data/spec/logger_spec.rb +0 -25
  56. data/spec/microsecond_task_spec.rb +0 -32
  57. data/spec/objective_c_project/main.h +0 -1
  58. data/spec/objective_c_project/main.m +0 -18
  59. data/spec/objective_c_project_spec.rb +0 -72
  60. data/spec/paths_spec.rb +0 -19
  61. data/spec/project_spec.rb +0 -20
  62. data/spec/target_spec.rb +0 -48
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rake::Builder::LocalConfig do
4
+ let(:local_config_file) { 'local_config' }
5
+ let(:include_paths) { ['/foo/bar'] }
6
+ let(:compilation_options) { ['foo', 'bar'] }
7
+ let(:config_data) do
8
+ {
9
+ :rake_builder => {
10
+ :config_file => {:version => '1.1'},
11
+ },
12
+ :include_paths => include_paths,
13
+ :compilation_options => compilation_options,
14
+ }
15
+ end
16
+ let(:bad_config_data) do
17
+ config_data[:rake_builder][:config_file][:version] = '0.1'
18
+ config_data
19
+ end
20
+
21
+ before { YAML.stub(:load_file).and_return(config_data) }
22
+
23
+ subject { Rake::Builder::LocalConfig.new(local_config_file) }
24
+
25
+ context '#load' do
26
+ it 'loads the file' do
27
+ YAML.should_receive(:load_file).and_return(config_data)
28
+
29
+ subject.load
30
+ end
31
+
32
+ it 'fails if the version is not recognized' do
33
+ YAML.should_receive(:load_file).and_return(bad_config_data)
34
+
35
+ expect {
36
+ subject.load
37
+ }.to raise_error(Rake::Builder::Error, /version incorrect/)
38
+ end
39
+
40
+ it 'sets the include_paths' do
41
+ subject.load
42
+
43
+ expect(subject.include_paths).to eq(include_paths)
44
+ end
45
+
46
+ it 'sets compilation_options' do
47
+ subject.load
48
+
49
+ expect(subject.compilation_options).to eq(compilation_options)
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Rake::Builder::Logger::Formatter' do
4
+ let(:formatter) { Rake::Builder::Logger::Formatter.new }
5
+ let(:stream) { StringIO.new }
6
+ let(:logger) do
7
+ logger = Logger.new(stream)
8
+ logger.formatter = formatter
9
+ logger
10
+ end
11
+
12
+ context '#call' do
13
+ it 'only prints the supplied string' do
14
+ logger.info 'foo'
15
+
16
+ expect(stream.string).to eq("foo\n")
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,163 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rake::Builder::Presenters::Makefile::BuilderPresenter do
4
+ def self.compiler; 'the_compiler'; end
5
+ def self.compiler_flags; 'the_compiler_flags'; end
6
+ def self.linker; 'the_linker'; end
7
+ def self.link_flags; 'the_link_flags'; end
8
+ def self.objects_path; '/objects'; end
9
+
10
+ let(:executable_target) { 'the_executable' }
11
+ let(:shared_library_target) { 'libshared.so' }
12
+ let(:static_library_target) { 'libstatic.a' }
13
+ let(:label) { 'the_label' }
14
+ let(:source_files) { ['/sources/one.c', '/sources/two.c'] }
15
+ let(:object_files) { ['/objects/one.o', '/objects/two.o'] }
16
+ let(:makefile_name) { 'the_makefile' }
17
+ let(:common_attributes) do
18
+ {
19
+ :label => label,
20
+ :compiler => self.class.compiler,
21
+ :compiler_flags => self.class.compiler_flags,
22
+ :linker => self.class.linker,
23
+ :link_flags => self.class.link_flags,
24
+ :objects_path => self.class.objects_path,
25
+ :source_files => source_files,
26
+ :object_files => object_files,
27
+ :makefile_name => makefile_name,
28
+ }
29
+ end
30
+ let(:executable_attributes) do
31
+ common_attributes.merge(
32
+ :target => executable_target,
33
+ :target_type => :executable,
34
+ )
35
+ end
36
+ let(:static_library_attributes) do
37
+ common_attributes.merge(
38
+ :target => static_library_target,
39
+ :target_type => :static_library,
40
+ )
41
+ end
42
+ let(:shared_library_attributes) do
43
+ common_attributes.merge(
44
+ :target => shared_library_target,
45
+ :target_type => :shared_library,
46
+ )
47
+ end
48
+
49
+ let(:executable_builder) { stub('Rake::Builder', executable_attributes) }
50
+ let(:static_library_builder) { stub('Rake::Builder', static_library_attributes) }
51
+ let(:shared_library_builder) { stub('Rake::Builder', shared_library_attributes) }
52
+
53
+ let(:executable_subject) { Rake::Builder::Presenters::Makefile::BuilderPresenter.new(executable_builder) }
54
+ let(:static_library_subject) { Rake::Builder::Presenters::Makefile::BuilderPresenter.new(static_library_builder) }
55
+ let(:shared_library_subject) { Rake::Builder::Presenters::Makefile::BuilderPresenter.new(shared_library_builder) }
56
+
57
+ context '.new' do
58
+ it 'takes one parameter' do
59
+ expect {
60
+ Rake::Builder::Presenters::Makefile::BuilderPresenter.new
61
+ }.to raise_error(ArgumentError, /wrong number of arguments/)
62
+ end
63
+
64
+ it 'fails with unknown target types' do
65
+ end
66
+ end
67
+
68
+ context '#to_s' do
69
+ it 'fails with unknown target types' do
70
+ executable_builder.should_receive(:target_type).any_number_of_times.and_return(:foo)
71
+
72
+ expect {
73
+ Rake::Builder::Presenters::Makefile::BuilderPresenter.new(executable_builder)
74
+ }.to raise_error(RuntimeError, /Unknown.*?target type/)
75
+ end
76
+
77
+ context 'target' do
78
+ context 'for executable' do
79
+ it 'is executable' do
80
+ expect(executable_subject.to_s).to include("EXECUTABLE_TARGET = #{executable_target}")
81
+ end
82
+ end
83
+
84
+ context 'for library' do
85
+ it 'is a library' do
86
+ expect(static_library_subject.to_s).to include("LIB_TARGET = #{static_library_target}")
87
+ end
88
+ end
89
+ end
90
+
91
+ context 'variables' do
92
+ [
93
+ ['COMPILER', compiler],
94
+ ['COMPILER_FLAGS', compiler_flags],
95
+ ['LINKER', linker],
96
+ ['LINK_FLAGS', link_flags],
97
+ ['OBJECT_DIR', objects_path],
98
+ ].each do |name, value|
99
+ it "declares '#{name}'" do
100
+ expect(executable_subject.to_s).to match(/#{name}\s+=\s+#{value}/)
101
+ end
102
+ end
103
+
104
+ it "declares 'OBJECTS'" do
105
+ expect(executable_subject.to_s).to match(%r(OBJECTS\s+=\s+\$\(OBJECT_DIR\)/one\.o \$\(OBJECT_DIR\)/two\.o))
106
+ end
107
+ end
108
+
109
+ context 'actions' do
110
+ context 'for executable' do
111
+ it 'builds the target' do
112
+ expected = <<EOT
113
+ $(EXECUTABLE_TARGET): $(OBJECTS)
114
+ $(LINKER) $(LINK_FLAGS) -o $(EXECUTABLE_TARGET) $(OBJECTS)
115
+ EOT
116
+ expect(executable_subject.to_s).to include(expected)
117
+ end
118
+ end
119
+
120
+ context 'for static library' do
121
+ it 'builds the target' do
122
+ expected = <<EOT
123
+ $(LIB_TARGET): $(OBJECTS)
124
+ rm -f $(LIB_TARGET)
125
+ ar -cq $(LIB_TARGET) $(OBJECTS)
126
+ ranlib $(LIB_TARGET)
127
+ EOT
128
+ expect(static_library_subject.to_s).to include(expected)
129
+ end
130
+ end
131
+
132
+ context 'for shared library' do
133
+ it 'builds the target' do
134
+ expected = <<EOT
135
+ $(LIB_TARGET): $(OBJECTS)
136
+ $(LINKER) -shared -o $(LIB_TARGET) $(OBJECTS) $(LINK_FLAGS)
137
+ EOT
138
+ expect(shared_library_subject.to_s).to include(expected)
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ context '#save' do
145
+ it 'creates the makefile' do
146
+ File.should_receive(:open).with(makefile_name, 'w')
147
+
148
+ executable_subject.save
149
+ end
150
+
151
+ it 'saves' do
152
+ file = stub('File')
153
+ File.stub(:open).with(makefile_name, 'w') do |&block|
154
+ block.call file
155
+ end
156
+
157
+ file.should_receive(:write).with(/COMPILER.*?= the_compiler/)
158
+
159
+ executable_subject.save
160
+ end
161
+ end
162
+ end
163
+
@@ -15,7 +15,7 @@ describe Rake::Builder::Presenters::MakefileAm::BuilderPresenter do
15
15
  'Rake::Builder',
16
16
  :is_library? => false,
17
17
  :label => 'fubar',
18
- :source_paths => ['path/to/1', 'path/to/2'],
18
+ :source_files => ['path/to/1', 'path/to/2'],
19
19
  :compiler_flags => '-D FOO -D BAR',
20
20
  :library_dependencies_list => '-lfoo -lbar'
21
21
  )
@@ -41,7 +41,9 @@ describe Rake::Builder::Presenters::MakefileAm::BuilderPresenter do
41
41
  expect(subject.to_s).to match(/fubar_CPPFLAGS\s+=\s+-D FOO -D BAR/)
42
42
  end
43
43
 
44
- it 'ends with a blank line'
44
+ it 'ends with a blank line' do
45
+ expect(subject.to_s).to end_with("\n")
46
+ end
45
47
 
46
48
  context 'library builder' do
47
49
  subject { Rake::Builder::Presenters::MakefileAm::BuilderPresenter.new(library) }
@@ -129,6 +129,12 @@ describe Rake::Builder::BuilderTaskDefiner do
129
129
 
130
130
  expect(Rake::Task.task_defined?('foo')).to be_true
131
131
  end
132
+
133
+ it 'does not fiddle up the local_config file' do
134
+ subject.run
135
+
136
+ expect(Rake::Task['foo:load_local_config'].prerequisites).to eq([namespaced_builder.local_config])
137
+ end
132
138
  end
133
139
  end
134
140
 
@@ -1,7 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Rake::Builder do
4
- include RakeBuilderHelper
4
+ include InputOutputTestHelper
5
+
6
+ let(:target_pathname) { File.join('foo', 'bar', 'my_prog.exe') }
7
+ let(:source_paths) { ['src/file1.cpp'] }
8
+ let(:builder) do
9
+ Rake::Builder.new do |b|
10
+ b.target = target_pathname
11
+ b.library_dependencies = ['foo', 'bar']
12
+ end
13
+ end
14
+ let(:installer) do
15
+ stub(
16
+ 'Rake::Builder::Installer',
17
+ :install => nil
18
+ )
19
+ end
20
+
21
+ before do
22
+ Rake::Path.stub(:find_files).and_return(source_paths)
23
+ end
5
24
 
6
25
  context '.create_autoconf' do
7
26
  let(:version) { stub('Rake::Builder::Autoconf::Autoconf::Version', :decide => 'qux') }
@@ -59,41 +78,397 @@ describe Rake::Builder do
59
78
  end
60
79
  end
61
80
 
81
+ context '.new' do
82
+ it 'fails without a block' do
83
+ expect {
84
+ Rake::Builder.new
85
+ }.to raise_error(RuntimeError, 'No block given')
86
+ end
87
+
88
+ it 'raises an error when the target is an empty string' do
89
+ expect {
90
+ Rake::Builder.new { |b| b.target = '' }
91
+ }.to raise_error(Rake::Builder::Error, 'The target name cannot be an empty string')
92
+ end
93
+
94
+ it 'raises an error when the target is nil' do
95
+ expect {
96
+ Rake::Builder.new { |b| b.target = nil }
97
+ }.to raise_error(Rake::Builder::Error, 'The target name cannot be nil')
98
+ end
99
+
100
+ it 'raises an error when the supplied target_type is unknown' do
101
+ expect {
102
+ Rake::Builder.new { |b| b.target_type = :foo }
103
+ }.to raise_error(Rake::Builder::Error, 'Building foo targets is not supported')
104
+ end
105
+
106
+ it 'remembers the Rakefile path' do
107
+ Rake::Path.stub(:find_files => ['main.cpp'])
108
+ here = File.dirname(File.expand_path(__FILE__))
109
+
110
+ builder = Rake::Builder.new {}
111
+
112
+ expect(builder.rakefile_path).to eq(here)
113
+ end
114
+ end
115
+
116
+ context '#build' do
117
+ before do
118
+ @target_exists = [false, true]
119
+ File.stub(:exist?).with(builder.target) { @target_exists.shift }
120
+ builder.stub(:system => nil)
121
+ `(exit 0)` # set $? to a successful Process::Status
122
+ end
123
+
124
+ it 'checks if the old target exists' do
125
+ File.should_receive(:exist?).with(builder.target) { @target_exists.shift }
126
+
127
+ builder.build
128
+ end
129
+
130
+ it 'deletes the old target' do
131
+ @target_exists = [true, true]
132
+
133
+ File.should_receive(:unlink).with(builder.target)
134
+
135
+ builder.build
136
+ end
137
+
138
+ it 'fails if a build command fails' do
139
+ `(exit 1)` # set $? to a failing Process::Status
140
+
141
+ expect {
142
+ builder.build
143
+ }.to raise_error(Rake::Builder::BuildFailure, /command.*?failed/)
144
+ end
145
+
146
+ it 'fails if the target is missing afterwards' do
147
+ @target_exists = [false, false]
148
+
149
+ expect {
150
+ builder.build
151
+ }.to raise_error(Rake::Builder::BuildFailure, /not created/)
152
+ end
153
+ end
154
+
155
+ context '#run' do
156
+ before do
157
+ @old_dir = Dir.pwd
158
+ Dir.stub(:chdir).with(builder.rakefile_path)
159
+ builder.stub(:system)
160
+ Dir.stub(:chdir).with(@old_dir)
161
+ end
162
+
163
+ it 'changes directory to the Rakefile path' do
164
+ Dir.should_receive(:chdir).with(builder.rakefile_path)
165
+
166
+ capturing_output do
167
+ builder.run
168
+ end
169
+ end
170
+
171
+ it 'runs the executable' do
172
+ builder.should_receive(:system).with('./' + builder.target, anything)
173
+
174
+ capturing_output do
175
+ builder.run
176
+ end
177
+ end
178
+
179
+ it 'outputs the stdout results, then the stderr results' do
180
+ builder.stub(:system) do |command|
181
+ $stdout.puts 'standard output'
182
+ $stderr.puts 'error output'
183
+ end
184
+
185
+ stdout, stderr = capturing_output do
186
+ builder.run
187
+ end
188
+
189
+ expect(stdout).to eq("standard output\n")
190
+ expect(stderr).to eq("error output\n")
191
+ end
192
+
193
+ it 'raises and error is the program does not run successfully' do
194
+ builder.stub(:system) { `(exit 1)` } # set $? to a failing Process::Status
195
+
196
+ expect {
197
+ builder.run
198
+ }.to raise_error(Exception, /Running.*?failed with status 1/)
199
+ end
200
+
201
+ it 'restores the preceding working directory, even after errors' do
202
+ builder.stub(:system).and_raise('foo')
203
+
204
+ Dir.should_receive(:chdir).with(@old_dir)
205
+
206
+ builder.run rescue nil
207
+ end
208
+ end
209
+
210
+ context '#clean' do
211
+ it 'checks if files exist' do
212
+ exists = []
213
+ File.stub(:exist?) { |file| exists << file; false }
214
+
215
+ builder.clean
216
+
217
+ expect(exists).to eq(builder.generated_files)
218
+ end
219
+
220
+ it 'deletes generated files' do
221
+ deletes = []
222
+ File.stub(:exist? => true)
223
+ File.stub(:unlink) { |file| deletes << file }
224
+
225
+ builder.clean
226
+
227
+ expect(deletes).to eq(builder.generated_files)
228
+ end
229
+ end
230
+
231
+ context '#header_search_paths' do
232
+ it 'is deprecated' do
233
+ stdout, stderr = capturing_output do
234
+ builder.header_search_paths
235
+ end
236
+
237
+ expect(stderr).to include('Deprecation notice')
238
+ end
239
+ end
240
+
241
+ context '#header_search_paths=' do
242
+ it 'is deprecated' do
243
+ stdout, stderr = capturing_output do
244
+ builder.header_search_paths = []
245
+ end
246
+
247
+ expect(stderr).to include('Deprecation notice')
248
+ end
249
+ end
250
+
251
+ context '#target' do
252
+ it "defaults to 'a.out'" do
253
+ Rake::Path.stub(:find_files => ['main.cpp'])
254
+
255
+ builder = Rake::Builder.new {}
256
+
257
+ expect(builder.target).to end_with('/a.out')
258
+ end
259
+ end
260
+
62
261
  context '#primary_name' do
63
262
  it 'returns a relative path' do
64
- here = File.expand_path(File.dirname(__FILE__))
65
- target_pathname = File.join(here, 'my_prog')
66
- builder = cpp_task(:executable) { |b| b.target = target_pathname }
67
-
68
- expect(builder.primary_name).to eq(File.join('unit', 'rake', 'my_prog'))
263
+ expect(builder.primary_name).to eq(File.join('foo', 'bar', 'my_prog.exe'))
69
264
  end
70
265
  end
71
266
 
72
267
  context '#label' do
73
268
  it 'replaces dots with underscores' do
74
- builder = cpp_task(:executable) { |b| b.target = 'my_prog.exe' }
269
+ expect(builder.label).to eq(File.join('foo', 'bar', 'my_prog_exe'))
270
+ end
271
+ end
272
+
273
+ context '#target_type' do
274
+ [
275
+ ['my_program', :executable],
276
+ ['libstatic.a', :static_library],
277
+ ['libshared.so', :shared_library],
278
+ ].each do |name, type|
279
+ it "recognises '#{name}' as '#{type}'" do
280
+ Rake::Path.stub(:find_files).and_return(['file'])
75
281
 
76
- expect(builder.label).to eq('my_prog_exe')
282
+ builder = Rake::Builder.new { |b| b.target = name }
283
+
284
+ expect(builder.target_type).to eq(type)
285
+ end
77
286
  end
78
287
  end
79
288
 
80
- context '#source_paths' do
81
- it 'returns source files' do
82
- builder = cpp_task(:executable)
289
+ context '#is_library?' do
290
+ [
291
+ [:static_library, 'libbaz.a', true],
292
+ [:shared_library, 'libfoo.so', true],
293
+ [:executable, 'baz', false]
294
+ ].each do |type, target, is_library|
295
+ example type do
296
+ builder = Rake::Builder.new do |b|
297
+ b.target = target
298
+ end
299
+ expect(builder.is_library?).to eq(is_library)
300
+ end
301
+ end
302
+ end
303
+
304
+ context '#source_files' do
305
+ it 'finds files with the .cpp extension' do
306
+ Rake::Path.should_receive(:find_files).with(anything, 'cpp').and_return(['a.cpp'])
307
+
308
+ builder
309
+ end
310
+
311
+ it 'should allow configuration of source extension' do
312
+ Rake::Path.should_receive(:find_files).with(anything, 'cc').and_return(['a.cc'])
83
313
 
84
- expect(builder.source_paths).to eq(['cpp_project/main.cpp'])
314
+ Rake::Builder.new do |b|
315
+ b.source_file_extension = 'cc'
316
+ end
85
317
  end
86
318
  end
87
319
 
88
- context '#library_dependencies_list' do
89
- subject { cpp_task(:executable) { |b| b.library_dependencies = ['foo', 'bar'] } }
320
+ context '#object_path' do
321
+ let(:source_path) { 'foo/bar/baz.cpp' }
90
322
 
323
+ subject { builder.object_path(source_path) }
324
+
325
+ it 'substitutes the source extension with the object one' do
326
+ expect(subject).to end_with('.o')
327
+ end
328
+
329
+ it 'adds the objects path' do
330
+ expect(subject).to start_with(builder.objects_path)
331
+ end
332
+ end
333
+
334
+ context '#library_dependencies_list' do
91
335
  it 'is a string' do
92
- expect(subject.library_dependencies_list).to be_a(String)
336
+ expect(builder.library_dependencies_list).to be_a(String)
93
337
  end
94
338
 
95
339
  it 'lists libraries' do
96
- expect(subject.library_dependencies_list).to eq('-lfoo -lbar')
340
+ expect(builder.library_dependencies_list).to eq('-lfoo -lbar')
341
+ end
342
+ end
343
+
344
+ context '#create_makedepend_file' do
345
+ before do
346
+ builder.stub(:system).with('which makedepend >/dev/null') do
347
+ `(exit 0)` # set $? to a successful Process::Status
348
+ end
349
+
350
+ builder.stub(:system).with(/makedepend -f-/, anything)
351
+ end
352
+
353
+ it 'fails if makedepend is missing' do
354
+ builder.stub(:system).with('which makedepend >/dev/null') do
355
+ `(exit 1)` # set $? to a successful Process::Status
356
+ end
357
+
358
+ expect {
359
+ builder.create_makedepend_file
360
+ }.to raise_error(RuntimeError, 'makedepend not found')
361
+ end
362
+
363
+ it 'calls makedepend' do
364
+ builder.should_receive(:system).with(/makedepend -f-/, anything)
365
+
366
+ builder.create_makedepend_file
367
+ end
368
+ end
369
+
370
+ context '#load_makedepend' do
371
+ let(:content) do
372
+ lines = []
373
+ lines << 'Some text'
374
+ builder.source_files.each do |f|
375
+ source_path_object = f.gsub(/\.[^\.]+$/, '.o')
376
+ lines << source_path_object + ': header1.h'
377
+ end
378
+ lines.join("\n")
379
+ end
380
+
381
+ before do
382
+ File.stub(:read).with(builder.makedepend_file).and_return(content)
383
+ end
384
+
385
+ it 'opens the file' do
386
+ File.should_receive(:read).with(builder.makedepend_file).and_return(content)
387
+
388
+ builder.load_makedepend
389
+ end
390
+
391
+ it 'returns a map of sources to headers' do
392
+ expected = builder.object_files.reduce({}) do |a, e|
393
+ a[e] = ['header1.h']
394
+ a
395
+ end
396
+
397
+ expect(builder.load_makedepend).to eq(expected)
398
+ end
399
+ end
400
+
401
+ context '#load_local_config' do
402
+ let(:config_include_paths) { ['/path/one', '/path/two'] }
403
+ let(:config_compilation_options) { ['opt1', 'opt2'] }
404
+ let(:local_config) do
405
+ stub(
406
+ 'Rake::Builder::LocalConfig',
407
+ :load => nil,
408
+ :include_paths => config_include_paths,
409
+ :compilation_options => config_compilation_options,
410
+ )
411
+ end
412
+
413
+ before { Rake::Builder::LocalConfig.stub(:new => local_config) }
414
+
415
+ it 'loads local config' do
416
+ Rake::Builder::LocalConfig.should_receive(:new).
417
+ with(/\.rake-builder/).and_return(local_config)
418
+ local_config.should_receive(:load).with()
419
+
420
+ builder.load_local_config
421
+ end
422
+
423
+ it 'adds include paths' do
424
+ original = builder.include_paths.clone
425
+
426
+ builder.load_local_config
427
+
428
+ expect(builder.include_paths).to eq(original + config_include_paths)
429
+ end
430
+
431
+ it 'adds compilation options' do
432
+ original = builder.compilation_options.clone
433
+
434
+ builder.load_local_config
435
+
436
+ expect(builder.compilation_options).to eq(original + config_compilation_options)
437
+ end
438
+ end
439
+
440
+ context '#install' do
441
+ before { Rake::Builder::Installer.stub(:new).and_return(installer) }
442
+
443
+ it 'installs the target' do
444
+ Rake::Builder::Installer.should_receive(:new).and_return(installer)
445
+ installer.should_receive(:install).with(builder.target, anything)
446
+
447
+ builder.install
448
+ end
449
+
450
+ it 'installs headers for static libraries' do
451
+ installer.stub(:install).with(builder.target, anything)
452
+ File.should_receive(:file?).with('header.h').and_return(true)
453
+ installer.should_receive(:install).with('header.h', anything)
454
+
455
+ builder = Rake::Builder.new do |b|
456
+ b.target = 'libthe_static_library.a'
457
+ b.installable_headers = ['header.h']
458
+ end
459
+
460
+ builder.install
461
+ end
462
+ end
463
+
464
+ context '#uninstall' do
465
+ before { Rake::Builder::Installer.stub(:new).and_return(installer) }
466
+
467
+ it 'uninstalls' do
468
+ installed_path = File.join(builder.install_path, builder.target_basename)
469
+ installer.should_receive(:uninstall).with(installed_path)
470
+
471
+ builder.uninstall
97
472
  end
98
473
  end
99
474
  end