cxxproject 0.5.76 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/Rakefile.rb +116 -116
  2. data/bin/cxx +10 -10
  3. data/lib/cxxproject/buildingblocks/binary_library.rb +39 -39
  4. data/lib/cxxproject/buildingblocks/building_block.rb +251 -234
  5. data/lib/cxxproject/buildingblocks/command_line.rb +79 -86
  6. data/lib/cxxproject/buildingblocks/custom_building_block.rb +39 -39
  7. data/lib/cxxproject/buildingblocks/executable.rb +246 -258
  8. data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +83 -83
  9. data/lib/cxxproject/buildingblocks/has_includes_mixin.rb +20 -20
  10. data/lib/cxxproject/buildingblocks/has_libraries_mixin.rb +34 -34
  11. data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +371 -379
  12. data/lib/cxxproject/buildingblocks/makefile.rb +153 -153
  13. data/lib/cxxproject/buildingblocks/module.rb +35 -35
  14. data/lib/cxxproject/buildingblocks/single_source.rb +33 -33
  15. data/lib/cxxproject/buildingblocks/source_library.rb +124 -111
  16. data/lib/cxxproject/errorparser/diab_compiler_error_parser.rb +40 -40
  17. data/lib/cxxproject/errorparser/diab_linker_error_parser.rb +41 -41
  18. data/lib/cxxproject/errorparser/error_parser.rb +50 -71
  19. data/lib/cxxproject/errorparser/gcc_compiler_error_parser.rb +35 -35
  20. data/lib/cxxproject/errorparser/gcc_linker_error_parser.rb +35 -35
  21. data/lib/cxxproject/errorparser/ti_compiler_error_parser.rb +30 -30
  22. data/lib/cxxproject/errorparser/ti_linker_error_parser.rb +30 -30
  23. data/lib/cxxproject/eval_context.rb +144 -144
  24. data/lib/cxxproject/ext/file.rb +71 -81
  25. data/lib/cxxproject/ext/filelist.rb +6 -6
  26. data/lib/cxxproject/ext/progressbar.rb +20 -0
  27. data/lib/cxxproject/ext/rake.rb +419 -434
  28. data/lib/cxxproject/ext/rake_dirty.rb +30 -30
  29. data/lib/cxxproject/ext/rake_listener.rb +59 -59
  30. data/lib/cxxproject/ext/stdout.rb +44 -44
  31. data/lib/cxxproject/ext/string.rb +9 -9
  32. data/lib/cxxproject/ide_interface.rb +187 -189
  33. data/lib/cxxproject/toolchain/clang.rb +39 -43
  34. data/lib/cxxproject/toolchain/colorizing_formatter.rb +99 -99
  35. data/lib/cxxproject/toolchain/diab.rb +1 -1
  36. data/lib/cxxproject/toolchain/gcc.rb +1 -1
  37. data/lib/cxxproject/toolchain/provider.rb +131 -143
  38. data/lib/cxxproject/toolchain/toolchain.rb +38 -38
  39. data/lib/cxxproject/toolchain/toolchain_benchmark.rb +23 -23
  40. data/lib/cxxproject/torake.rb +259 -218
  41. data/lib/cxxproject/utils/cleanup.rb +20 -24
  42. data/lib/cxxproject/utils/console.rb +6 -6
  43. data/lib/cxxproject/utils/exit_helper.rb +40 -40
  44. data/lib/cxxproject/utils/graphstream.rb +154 -154
  45. data/lib/cxxproject/utils/optional.rb +16 -16
  46. data/lib/cxxproject/utils/printer.rb +50 -50
  47. data/lib/cxxproject/utils/process.rb +52 -58
  48. data/lib/cxxproject/utils/progress.rb +66 -0
  49. data/lib/cxxproject/utils/progress_helper.rb +77 -0
  50. data/lib/cxxproject/utils/rbcurse.rb +284 -0
  51. data/lib/cxxproject/utils/rbcurse_executable_ext.rb +14 -0
  52. data/lib/cxxproject/utils/rbcurse_progress.rb +71 -0
  53. data/lib/cxxproject/utils/rbcurse_tasktable.rb +51 -0
  54. data/lib/cxxproject/utils/stats.rb +60 -60
  55. data/lib/cxxproject/utils/ubigraph.rb +228 -228
  56. data/lib/cxxproject/utils/utils.rb +37 -69
  57. data/lib/cxxproject/version.rb +7 -7
  58. data/lib/cxxproject.rb +23 -19
  59. data/lib/tools/Rakefile.rb.template +10 -10
  60. data/lib/tools/project.rb.template +6 -6
  61. data/lib/tools/project_wizard.rb +66 -66
  62. data/spec/building_block_spec.rb +56 -56
  63. data/spec/cxxproject_2_rake_spec.rb +186 -186
  64. data/spec/file_ext_spec.rb +30 -30
  65. data/spec/ide_interface_spec.rb +41 -41
  66. data/spec/object_dependency_spec.rb +83 -83
  67. data/spec/project_path_spec.rb +71 -71
  68. data/spec/rake_listener_ext_spec.rb +58 -58
  69. data/spec/spec_helper.rb +18 -18
  70. data/spec/string_spec.rb +11 -11
  71. data/spec/testdata/basic/exe12/project.rb +5 -5
  72. data/spec/testdata/basic/lib1/project.rb +5 -5
  73. data/spec/testdata/basic/lib2/project.rb +8 -8
  74. data/spec/testdata/multiple_levels/libs/lib1/project.rb +5 -5
  75. data/spec/testdata/multiple_levels/libs/lib2/project.rb +19 -19
  76. data/spec/testdata/multiple_levels/mainproject/basic/project.rb +8 -8
  77. data/spec/testdata/onlyOneHeader/Rakefile.rb +4 -4
  78. data/spec/testdata/onlyOneHeader/project.rb +4 -4
  79. data/spec/toolchain_spec.rb +29 -29
  80. metadata +116 -107
  81. checksums.yaml +0 -7
  82. data/lib/cxxproject/buildingblocks/lint.rb +0 -89
  83. data/lib/cxxproject/errorparser/gcc_lint_error_parser.rb +0 -34
  84. data/lib/cxxproject/errorparser/greenhills_compiler_error_parser.rb +0 -32
  85. data/lib/cxxproject/errorparser/greenhills_linker_error_parser.rb +0 -44
  86. data/lib/cxxproject/errorparser/keil_compiler_error_parser.rb +0 -40
  87. data/lib/cxxproject/errorparser/keil_linker_error_parser.rb +0 -30
  88. data/lib/cxxproject/toolchain/gcc_lint.rb +0 -21
  89. data/lib/cxxproject/toolchain/gcc_param.rb +0 -7
  90. data/lib/cxxproject/toolchain/greenhills.rb +0 -51
  91. data/lib/cxxproject/toolchain/keil.rb +0 -52
  92. data/lib/cxxproject/utils/valgrind.rb +0 -11
@@ -1,66 +1,66 @@
1
- require 'rake'
2
- require 'erb'
3
-
4
- def choose_building_block
5
- res = nil
6
- choose do |menu|
7
- menu.prompt = "what building block do you want to start with?"
8
-
9
- menu.choice(:exe) { res = "exe" }
10
- menu.choice(:lib) { res = "source_lib" }
11
- end
12
- res
13
- end
14
-
15
- def choose_generate_makefile
16
- res = true
17
- choose do |menu|
18
- menu.prompt = 'generate rakefile?'
19
- menu.choice(:yes) { res = true }
20
- menu.choice(:no) { res = false }
21
- end
22
- res
23
- end
24
-
25
- def prepare_project(d)
26
- begin
27
- require 'highline/import'
28
-
29
- if agree("This will create a new cxx-project config in dir \"#{d}\" \nAre you sure you want to continue? [yn] ")
30
- bb = choose_building_block
31
- generate_makefile = choose_generate_makefile
32
-
33
- create_project(d, bb, generate_makefile)
34
- else
35
- say "stopped project creation"
36
- end
37
- rescue LoadError
38
- puts "Please 'gem install highline'"
39
- end
40
- end
41
-
42
-
43
- def create_project(d, bb, generate_rakefile)
44
- rakefile_template = File.join(File.dirname(__FILE__),"..","tools","Rakefile.rb.template")
45
- projectrb_template = File.join(File.dirname(__FILE__),"..","tools","project.rb.template")
46
- s1 = IO.read(rakefile_template)
47
- s2 = IO.read(projectrb_template)
48
- name = "testme"
49
- building_block = bb
50
- mkdir_p(d, :verbose => false)
51
- cd(d,:verbose => false) do
52
- if ((File.exists? "Rakefile.rb") || (File.exists? "project.rb"))
53
- abort "cannot create project in this directory, existing files would be overwritten!"
54
- end
55
- if generate_rakefile
56
- write_template('Rakefile.rb', s1, binding)
57
- end
58
- write_template('project.rb', s2, binding)
59
- end
60
- end
61
-
62
- def write_template(name, template_string, b)
63
- File.open(name, 'w') do |f|
64
- f.write ERB.new(template_string).result(b)
65
- end
66
- end
1
+ require 'rake'
2
+ require 'erb'
3
+
4
+ def choose_building_block
5
+ res = nil
6
+ choose do |menu|
7
+ menu.prompt = "what building block do you want to start with?"
8
+
9
+ menu.choice(:exe) { res = "exe" }
10
+ menu.choice(:lib) { res = "source_lib" }
11
+ end
12
+ res
13
+ end
14
+
15
+ def choose_generate_makefile
16
+ res = true
17
+ choose do |menu|
18
+ menu.prompt = 'generate rakefile?'
19
+ menu.choice(:yes) { res = true }
20
+ menu.choice(:no) { res = false }
21
+ end
22
+ res
23
+ end
24
+
25
+ def prepare_project(d)
26
+ begin
27
+ require 'highline/import'
28
+
29
+ if agree("This will create a new cxx-project config in dir \"#{d}\" \nAre you sure you want to continue? [yn] ")
30
+ bb = choose_building_block
31
+ generate_makefile = choose_generate_makefile
32
+
33
+ create_project(d, bb, generate_makefile)
34
+ else
35
+ say "stopped project creation"
36
+ end
37
+ rescue LoadError
38
+ puts "Please 'gem install highline'"
39
+ end
40
+ end
41
+
42
+
43
+ def create_project(d, bb, generate_rakefile)
44
+ rakefile_template = File.join(File.dirname(__FILE__),"..","tools","Rakefile.rb.template")
45
+ projectrb_template = File.join(File.dirname(__FILE__),"..","tools","project.rb.template")
46
+ s1 = IO.read(rakefile_template)
47
+ s2 = IO.read(projectrb_template)
48
+ name = "testme"
49
+ building_block = bb
50
+ mkdir_p(d, :verbose => false)
51
+ cd(d,:verbose => false) do
52
+ if ((File.exists? "Rakefile.rb") || (File.exists? "project.rb"))
53
+ abort "cannot create project in this directory, existing files would be overwritten!"
54
+ end
55
+ if generate_rakefile
56
+ write_template('Rakefile.rb', s1, binding)
57
+ end
58
+ write_template('project.rb', s2, binding)
59
+ end
60
+ end
61
+
62
+ def write_template(name, template_string, b)
63
+ File.open(name, 'w') do |f|
64
+ f.write ERB.new(template_string).result(b)
65
+ end
66
+ end
@@ -1,56 +1,56 @@
1
- require 'spec_helper'
2
-
3
- require 'rspec'
4
- require 'cxxproject'
5
- require 'cxxproject/utils/cleanup'
6
-
7
- describe Cxxproject::BuildingBlock do
8
-
9
- before(:each) do
10
- Cxxproject::Utils.cleanup_rake
11
- end
12
- after(:each) do
13
- Cxxproject::Utils.cleanup_rake
14
- end
15
-
16
- it 'should build the right dependency-chain' do
17
- lib1 = Cxxproject::SourceLibrary.new('1')
18
- lib2 = Cxxproject::SourceLibrary.new('2').set_dependencies(['1'])
19
- lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1'])
20
- lib4 = Cxxproject::SourceLibrary.new('4').set_dependencies(['2', '3'])
21
- deps = lib4.all_dependencies.map { |d| d.name }
22
- deps.should == ['4', '2', '3', '1']
23
- end
24
-
25
- it 'should build the right dependency-chain for custom blocks' do
26
- lib1 = Cxxproject::SourceLibrary.new('1')
27
- lib2 = Cxxproject::CustomBuildingBlock.new('2').set_dependencies(['1'])
28
- lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1'])
29
- lib4 = Cxxproject::CustomBuildingBlock.new('4').set_dependencies(['2', '3'])
30
- deps = lib4.all_dependencies.map { |d| d.name }
31
- deps.should == ['4', '2', '3', '1']
32
- end
33
-
34
- it 'should have the right output-directory' do
35
- lib1 = Cxxproject::SourceLibrary.new('lib1').set_sources(['test.cc'])
36
- lib1.set_project_dir(File.join(Dir.pwd, 'lib1'))
37
-
38
- lib2 = Cxxproject::SourceLibrary.new('lib2').set_sources(['test.cc']).set_output_dir('build2')
39
- lib2.set_project_dir(File.join(Dir.pwd, 'lib2'))
40
-
41
- cxx = CxxProject2Rake.new([], 'build', GCCChain)
42
- cxx.prepare_block(lib1)
43
- cxx.prepare_block(lib2)
44
-
45
- lib1.output_dir.should eq(File.join(Dir.pwd, 'build'))
46
- lib2.output_dir.should eq(File.join(Dir.pwd, 'lib2', 'build2'))
47
- end
48
-
49
- it 'should raise exception if building block cannot be resolved' do
50
- expect do
51
- lib1 = Cxxproject::SourceLibrary.new('1').set_dependencies(['unresolved'])
52
- cxx = CxxProject2Rake.new([], 'build', GCCChain)
53
- end.to raise_exception(RuntimeError, 'Error: while reading config file for 1: dependent building block "unresolved" was specified but not found!')
54
- end
55
-
56
- end
1
+ require 'spec_helper'
2
+
3
+ require 'rspec'
4
+ require 'cxxproject'
5
+ require 'cxxproject/utils/cleanup'
6
+
7
+ describe Cxxproject::BuildingBlock do
8
+
9
+ before(:each) do
10
+ Cxxproject::Utils.cleanup_rake
11
+ end
12
+ after(:each) do
13
+ Cxxproject::Utils.cleanup_rake
14
+ end
15
+
16
+ it 'should build the right dependency-chain' do
17
+ lib1 = Cxxproject::SourceLibrary.new('1')
18
+ lib2 = Cxxproject::SourceLibrary.new('2').set_dependencies(['1'])
19
+ lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1'])
20
+ lib4 = Cxxproject::SourceLibrary.new('4').set_dependencies(['2', '3'])
21
+ deps = lib4.all_dependencies.map { |d| d.name }
22
+ deps.should == ['4', '2', '3', '1']
23
+ end
24
+
25
+ it 'should build the right dependency-chain for custom blocks' do
26
+ lib1 = Cxxproject::SourceLibrary.new('1')
27
+ lib2 = Cxxproject::CustomBuildingBlock.new('2').set_dependencies(['1'])
28
+ lib3 = Cxxproject::SourceLibrary.new('3').set_dependencies(['1'])
29
+ lib4 = Cxxproject::CustomBuildingBlock.new('4').set_dependencies(['2', '3'])
30
+ deps = lib4.all_dependencies.map { |d| d.name }
31
+ deps.should == ['4', '2', '3', '1']
32
+ end
33
+
34
+ it 'should have the right output-directory' do
35
+ lib1 = Cxxproject::SourceLibrary.new('lib1').set_sources(['test.cc'])
36
+ lib1.set_project_dir(File.join(Dir.pwd, 'lib1'))
37
+
38
+ lib2 = Cxxproject::SourceLibrary.new('lib2').set_sources(['test.cc']).set_output_dir('build2')
39
+ lib2.set_project_dir(File.join(Dir.pwd, 'lib2'))
40
+
41
+ cxx = CxxProject2Rake.new([], 'build', GCCChain)
42
+ cxx.prepare_block(lib1)
43
+ cxx.prepare_block(lib2)
44
+
45
+ lib1.complete_output_dir.should eq(File.join(Dir.pwd, 'build'))
46
+ lib2.complete_output_dir.should eq(File.join(Dir.pwd, 'lib2', 'build2'))
47
+ end
48
+
49
+ it 'should raise exception if building block cannot be resolved' do
50
+ expect do
51
+ lib1 = Cxxproject::SourceLibrary.new('1').set_dependencies(['unresolved'])
52
+ cxx = CxxProject2Rake.new([], 'build', GCCChain)
53
+ end.to raise_exception(RuntimeError, 'Error: while reading config file for 1: dependent building block "unresolved" was specified but not found!')
54
+ end
55
+
56
+ end
@@ -1,186 +1,186 @@
1
- require 'spec_helper'
2
- require 'cxxproject'
3
- require 'cxxproject/utils/cleanup'
4
-
5
- RSPECDIR = File.dirname(__FILE__)
6
- puts RSPECDIR
7
-
8
- class SpecTaskListener
9
- def initialize
10
- @task_execution_count = 0
11
- end
12
- def before_prerequisites(name)
13
- end
14
-
15
- def after_prerequisites(name)
16
- end
17
-
18
- def before_execute(name)
19
- @task_execution_count += 1
20
- end
21
-
22
- def after_execute(name)
23
- end
24
- def reset_exec_count()
25
- @task_execution_count = 0
26
- end
27
- def get_exec_count()
28
- @task_execution_count
29
- end
30
- end
31
-
32
- def rebuild
33
- tasks = fresh_cxx.all_tasks
34
- execute_all_tasks(tasks)
35
- end
36
-
37
- #def is_older? fileA, fileB
38
- # File.mtime(fileA) < File.mtime(fileB)
39
- #end
40
- #
41
- #def is_newer? fileA, fileB
42
- # File.mtime(fileA) > File.mtime(fileB)
43
- #end
44
-
45
- def check_rebuilding (end_product, prereq_file, should_rebuild = true)
46
- sleep(2)
47
- FileUtils.touch prereq_file
48
- # prereq_file should be newer
49
- File.mtime(prereq_file).should > File.mtime(end_product)
50
- rebuild
51
- if should_rebuild
52
- # prereq_file should NOT be newer
53
- File.mtime(prereq_file).should <= File.mtime(end_product)
54
- else
55
- # prereq_file should still be newer
56
- File.mtime(prereq_file).should > File.mtime(end_product)
57
- end
58
- end
59
-
60
- def execute_all_tasks(tasks)
61
- tasks.each do |t|
62
- t.invoke
63
- end
64
- end
65
-
66
- def fresh_cxx
67
- Cxxproject::Utils.cleanup_rake
68
- outputdir = 'output'
69
- CxxProject2Rake.new(Dir.glob('**/project.rb'), outputdir, GCCChain)
70
- end
71
-
72
- def cleanup
73
- rm_r 'output' if File.directory?('output')
74
- end
75
-
76
- #def count_needed_tasks(tasks)
77
- # needed = 0
78
- # tasks.each do |tn|
79
- # t = tn[:task]
80
- # if t.needed?
81
- # needed = needed + 1
82
- # end
83
- # end
84
- # needed
85
- #end
86
-
87
- ONLY_ONE_HEADER = "#{RSPECDIR}/testdata/onlyOneHeader"
88
- describe CxxProject2Rake do
89
- before(:all) do
90
- Rake::application.options.silent = true
91
- end
92
-
93
- it 'should provide runtask for executables' do
94
- cd ONLY_ONE_HEADER, :verbose => false do
95
- cleanup
96
- tasks = fresh_cxx.all_tasks
97
- Rake::Task['run:basic'].invoke
98
- cleanup
99
- end
100
- end
101
-
102
- it 'should rebuild only when one file was changed' do
103
- require 'cxxproject/ext/rake_listener'
104
- require 'cxxproject/ext/rake_dirty'
105
-
106
- listener = SpecTaskListener.new
107
- Rake::add_listener(listener)
108
- cd(ONLY_ONE_HEADER, :verbose => false) do
109
- # fresh build
110
- listener.reset_exec_count
111
- cleanup
112
-
113
- tasks = fresh_cxx.all_tasks
114
- CLOBBER.each { |fn| rm_r fn rescue nil }
115
- execute_all_tasks(tasks)
116
- fresh_build_steps = listener.get_exec_count
117
-
118
- # rebuild, nothing changed
119
- listener.reset_exec_count
120
- execute_all_tasks(tasks)
121
- rebuild_build_steps = listener.get_exec_count
122
-
123
- # rebuild, nothing changed
124
- listener.reset_exec_count
125
- execute_all_tasks(tasks)
126
- listener.get_exec_count.should == rebuild_build_steps
127
-
128
- # rebuild after header changed
129
- listener.reset_exec_count
130
- sleep(1)
131
- files2touch = Dir.glob('help.h')
132
- FileUtils.touch files2touch
133
- execute_all_tasks(fresh_cxx.all_tasks)
134
- rebuild_after_touch_steps = listener.get_exec_count
135
- rebuild_after_touch_steps.should > rebuild_build_steps
136
-
137
- # rebuild, nothing changed
138
- listener.reset_exec_count
139
- execute_all_tasks(tasks)
140
- listener.get_exec_count.should == rebuild_build_steps
141
-
142
- cleanup
143
- end
144
- Rake::remove_listener(listener)
145
- end
146
-
147
- it 'should rebuild when any source file changes' do
148
- cd("#{RSPECDIR}/testdata/basic", :verbose => false) do
149
- cleanup
150
-
151
- tasks = fresh_cxx.all_tasks
152
- CLOBBER.each { |fn| rm_r fn rescue nil }
153
- execute_all_tasks(tasks)
154
-
155
- # dependencies: exe -> libC -> libB
156
-
157
- headerA = 'exe12/help.h'
158
- sourceA = 'exe12/main.cpp'
159
- projectA = 'exe12/project.rb'
160
- headerB = 'lib1/lib1.h'
161
- sourceB = 'lib1/lib1.cpp'
162
- projectB = 'lib1/project.rb'
163
- headerC = 'lib2/lib2.h'
164
- sourceC = 'lib2/lib2.cpp'
165
- projectC = 'lib2/project.rb'
166
- exe = 'output/basic.exe'
167
- libB = 'output/libs/lib1.a'
168
- libC = 'output/libs/lib2.a'
169
-
170
- check_rebuilding exe, headerA
171
- check_rebuilding exe, sourceA
172
- check_rebuilding exe, projectA
173
- check_rebuilding exe, headerB
174
- check_rebuilding exe, headerC
175
- check_rebuilding libB, sourceA, false
176
- check_rebuilding libB, sourceB
177
-
178
- check_rebuilding libB, sourceC, false
179
- check_rebuilding libC, sourceB
180
-
181
- cleanup
182
- Cxxproject::Utils.cleanup_rake
183
- end
184
- end
185
-
186
- end
1
+ require 'spec_helper'
2
+ require 'cxxproject'
3
+ require 'cxxproject/utils/cleanup'
4
+
5
+ RSPECDIR = File.dirname(__FILE__)
6
+ puts RSPECDIR
7
+
8
+ class SpecTaskListener
9
+ def initialize
10
+ @task_execution_count = 0
11
+ end
12
+ def before_prerequisites(name)
13
+ end
14
+
15
+ def after_prerequisites(name)
16
+ end
17
+
18
+ def before_execute(name)
19
+ @task_execution_count += 1
20
+ end
21
+
22
+ def after_execute(name)
23
+ end
24
+ def reset_exec_count()
25
+ @task_execution_count = 0
26
+ end
27
+ def get_exec_count()
28
+ @task_execution_count
29
+ end
30
+ end
31
+
32
+ def rebuild
33
+ tasks = fresh_cxx.all_tasks
34
+ execute_all_tasks(tasks)
35
+ end
36
+
37
+ #def is_older? fileA, fileB
38
+ # File.mtime(fileA) < File.mtime(fileB)
39
+ #end
40
+ #
41
+ #def is_newer? fileA, fileB
42
+ # File.mtime(fileA) > File.mtime(fileB)
43
+ #end
44
+
45
+ def check_rebuilding (end_product, prereq_file, should_rebuild = true)
46
+ sleep(1)
47
+ FileUtils.touch prereq_file
48
+ # prereq_file should be newer
49
+ File.mtime(prereq_file).should > File.mtime(end_product)
50
+ rebuild
51
+ if should_rebuild
52
+ # prereq_file should NOT be newer
53
+ File.mtime(prereq_file).should <= File.mtime(end_product)
54
+ else
55
+ # prereq_file should still be newer
56
+ File.mtime(prereq_file).should > File.mtime(end_product)
57
+ end
58
+ end
59
+
60
+ def execute_all_tasks(tasks)
61
+ tasks.each do |t|
62
+ t.invoke
63
+ end
64
+ end
65
+
66
+ def fresh_cxx
67
+ Cxxproject::Utils.cleanup_rake
68
+ outputdir = 'output'
69
+ CxxProject2Rake.new(Dir.glob('**/project.rb'), outputdir, GCCChain)
70
+ end
71
+
72
+ def cleanup
73
+ rm_r 'output' if File.directory?('output')
74
+ end
75
+
76
+ #def count_needed_tasks(tasks)
77
+ # needed = 0
78
+ # tasks.each do |tn|
79
+ # t = tn[:task]
80
+ # if t.needed?
81
+ # needed = needed + 1
82
+ # end
83
+ # end
84
+ # needed
85
+ #end
86
+
87
+ ONLY_ONE_HEADER = "#{RSPECDIR}/testdata/onlyOneHeader"
88
+ describe CxxProject2Rake do
89
+ before(:all) do
90
+ Rake::application.options.silent = true
91
+ end
92
+
93
+ it 'should provide runtask for executables' do
94
+ cd ONLY_ONE_HEADER, :verbose => false do
95
+ cleanup
96
+ tasks = fresh_cxx.all_tasks
97
+ Rake::Task['run:basic'].invoke
98
+ cleanup
99
+ end
100
+ end
101
+
102
+ it 'should rebuild only when one file was changed' do
103
+ require 'cxxproject/ext/rake_listener'
104
+ require 'cxxproject/ext/rake_dirty'
105
+
106
+ listener = SpecTaskListener.new
107
+ Rake::add_listener(listener)
108
+ cd(ONLY_ONE_HEADER, :verbose => false) do
109
+ # fresh build
110
+ listener.reset_exec_count
111
+ cleanup
112
+
113
+ tasks = fresh_cxx.all_tasks
114
+ CLOBBER.each { |fn| rm_r fn rescue nil }
115
+ execute_all_tasks(tasks)
116
+ fresh_build_steps = listener.get_exec_count
117
+
118
+ # rebuild, nothing changed
119
+ listener.reset_exec_count
120
+ execute_all_tasks(tasks)
121
+ rebuild_build_steps = listener.get_exec_count
122
+
123
+ # rebuild, nothing changed
124
+ listener.reset_exec_count
125
+ execute_all_tasks(tasks)
126
+ listener.get_exec_count.should == rebuild_build_steps
127
+
128
+ # rebuild after header changed
129
+ listener.reset_exec_count
130
+ sleep(1)
131
+ files2touch = Dir.glob('help.h')
132
+ FileUtils.touch files2touch
133
+ execute_all_tasks(fresh_cxx.all_tasks)
134
+ rebuild_after_touch_steps = listener.get_exec_count
135
+ rebuild_after_touch_steps.should > rebuild_build_steps
136
+
137
+ # rebuild, nothing changed
138
+ listener.reset_exec_count
139
+ execute_all_tasks(tasks)
140
+ listener.get_exec_count.should == rebuild_build_steps
141
+
142
+ cleanup
143
+ end
144
+ Rake::remove_listener(listener)
145
+ end
146
+
147
+ it 'should rebuild when any source file changes' do
148
+ cd("#{RSPECDIR}/testdata/basic", :verbose => false) do
149
+ cleanup
150
+
151
+ tasks = fresh_cxx.all_tasks
152
+ CLOBBER.each { |fn| rm_r fn rescue nil }
153
+ execute_all_tasks(tasks)
154
+
155
+ # dependencies: exe -> libC -> libB
156
+
157
+ headerA = 'exe12/help.h'
158
+ sourceA = 'exe12/main.cpp'
159
+ projectA = 'exe12/project.rb'
160
+ headerB = 'lib1/lib1.h'
161
+ sourceB = 'lib1/lib1.cpp'
162
+ projectB = 'lib1/project.rb'
163
+ headerC = 'lib2/lib2.h'
164
+ sourceC = 'lib2/lib2.cpp'
165
+ projectC = 'lib2/project.rb'
166
+ exe = 'output/basic.exe'
167
+ libB = 'output/libs/lib1.a'
168
+ libC = 'output/libs/lib2.a'
169
+
170
+ check_rebuilding exe, headerA
171
+ check_rebuilding exe, sourceA
172
+ check_rebuilding exe, projectA
173
+ check_rebuilding exe, headerB
174
+ check_rebuilding exe, headerC
175
+ check_rebuilding libB, sourceA, false
176
+ check_rebuilding libB, sourceB
177
+
178
+ check_rebuilding libB, sourceC, false
179
+ check_rebuilding libC, sourceB
180
+
181
+ cleanup
182
+ Cxxproject::Utils.cleanup_rake
183
+ end
184
+ end
185
+
186
+ end