cxxproject 0.5.48 → 0.5.59

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 (81) hide show
  1. data/Rakefile.rb +116 -116
  2. data/bin/cxx +10 -10
  3. data/lib/cxxproject.rb +23 -23
  4. data/lib/cxxproject/buildingblocks/binary_library.rb +39 -39
  5. data/lib/cxxproject/buildingblocks/building_block.rb +251 -239
  6. data/lib/cxxproject/buildingblocks/command_line.rb +79 -79
  7. data/lib/cxxproject/buildingblocks/custom_building_block.rb +39 -41
  8. data/lib/cxxproject/buildingblocks/executable.rb +257 -249
  9. data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +83 -83
  10. data/lib/cxxproject/buildingblocks/has_includes_mixin.rb +20 -20
  11. data/lib/cxxproject/buildingblocks/has_libraries_mixin.rb +34 -34
  12. data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +371 -364
  13. data/lib/cxxproject/buildingblocks/makefile.rb +153 -153
  14. data/lib/cxxproject/buildingblocks/module.rb +35 -35
  15. data/lib/cxxproject/buildingblocks/single_source.rb +33 -33
  16. data/lib/cxxproject/buildingblocks/source_library.rb +124 -124
  17. data/lib/cxxproject/errorparser/diab_compiler_error_parser.rb +40 -40
  18. data/lib/cxxproject/errorparser/diab_linker_error_parser.rb +41 -33
  19. data/lib/cxxproject/errorparser/error_parser.rb +50 -50
  20. data/lib/cxxproject/errorparser/gcc_compiler_error_parser.rb +35 -30
  21. data/lib/cxxproject/errorparser/gcc_linker_error_parser.rb +35 -29
  22. data/lib/cxxproject/errorparser/ti_compiler_error_parser.rb +30 -30
  23. data/lib/cxxproject/errorparser/ti_linker_error_parser.rb +30 -29
  24. data/lib/cxxproject/eval_context.rb +144 -136
  25. data/lib/cxxproject/ext/file.rb +71 -71
  26. data/lib/cxxproject/ext/filelist.rb +6 -6
  27. data/lib/cxxproject/ext/progressbar.rb +20 -20
  28. data/lib/cxxproject/ext/rake.rb +419 -397
  29. data/lib/cxxproject/ext/rake_dirty.rb +30 -30
  30. data/lib/cxxproject/ext/rake_listener.rb +59 -59
  31. data/lib/cxxproject/ext/stdout.rb +44 -44
  32. data/lib/cxxproject/ext/string.rb +9 -9
  33. data/lib/cxxproject/ide_interface.rb +187 -181
  34. data/lib/cxxproject/toolchain/clang.rb +39 -39
  35. data/lib/cxxproject/toolchain/colorizing_formatter.rb +99 -99
  36. data/lib/cxxproject/toolchain/diab.rb +3 -1
  37. data/lib/cxxproject/toolchain/gcc.rb +2 -1
  38. data/lib/cxxproject/toolchain/provider.rb +131 -128
  39. data/lib/cxxproject/toolchain/toolchain.rb +38 -38
  40. data/lib/cxxproject/toolchain/toolchain_benchmark.rb +23 -23
  41. data/lib/cxxproject/torake.rb +218 -216
  42. data/lib/cxxproject/utils/cleanup.rb +20 -20
  43. data/lib/cxxproject/utils/console.rb +6 -6
  44. data/lib/cxxproject/utils/exit_helper.rb +40 -40
  45. data/lib/cxxproject/utils/graphstream.rb +154 -154
  46. data/lib/cxxproject/utils/optional.rb +16 -16
  47. data/lib/cxxproject/utils/printer.rb +50 -50
  48. data/lib/cxxproject/utils/process.rb +52 -52
  49. data/lib/cxxproject/utils/progress.rb +66 -66
  50. data/lib/cxxproject/utils/progress_helper.rb +77 -77
  51. data/lib/cxxproject/utils/rbcurse.rb +284 -284
  52. data/lib/cxxproject/utils/rbcurse_executable_ext.rb +14 -14
  53. data/lib/cxxproject/utils/rbcurse_progress.rb +71 -71
  54. data/lib/cxxproject/utils/rbcurse_tasktable.rb +51 -51
  55. data/lib/cxxproject/utils/stats.rb +60 -60
  56. data/lib/cxxproject/utils/ubigraph.rb +228 -228
  57. data/lib/cxxproject/utils/utils.rb +60 -37
  58. data/lib/cxxproject/utils/valgrind.rb +11 -11
  59. data/lib/cxxproject/version.rb +7 -7
  60. data/lib/tools/Rakefile.rb.template +10 -10
  61. data/lib/tools/project.rb.template +6 -6
  62. data/lib/tools/project_wizard.rb +66 -66
  63. data/spec/building_block_spec.rb +56 -56
  64. data/spec/cxxproject_2_rake_spec.rb +186 -186
  65. data/spec/file_ext_spec.rb +30 -30
  66. data/spec/ide_interface_spec.rb +41 -41
  67. data/spec/object_dependency_spec.rb +83 -83
  68. data/spec/project_path_spec.rb +71 -71
  69. data/spec/rake_listener_ext_spec.rb +58 -58
  70. data/spec/spec_helper.rb +18 -18
  71. data/spec/string_spec.rb +11 -11
  72. data/spec/testdata/basic/exe12/project.rb +5 -5
  73. data/spec/testdata/basic/lib1/project.rb +5 -5
  74. data/spec/testdata/basic/lib2/project.rb +8 -8
  75. data/spec/testdata/multiple_levels/libs/lib1/project.rb +5 -5
  76. data/spec/testdata/multiple_levels/libs/lib2/project.rb +19 -19
  77. data/spec/testdata/multiple_levels/mainproject/basic/project.rb +8 -8
  78. data/spec/testdata/onlyOneHeader/Rakefile.rb +4 -4
  79. data/spec/testdata/onlyOneHeader/project.rb +4 -4
  80. data/spec/toolchain_spec.rb +29 -29
  81. metadata +58 -58
@@ -1,14 +1,14 @@
1
- module Cxxproject
2
- module Utils
3
- class Executable
4
- def run_command(task, command)
5
- require 'open3'
6
- stdin, stdout, stderr = Open3.popen3(command)
7
- puts "StdOut:"
8
- puts stdout.readlines
9
- puts "StdErr:"
10
- puts stderr.readlines
11
- end
12
- end
13
- end
14
- end
1
+ module Cxxproject
2
+ module Utils
3
+ class Executable
4
+ def run_command(task, command)
5
+ require 'open3'
6
+ stdin, stdout, stderr = Open3.popen3(command)
7
+ puts "StdOut:"
8
+ puts stdout.readlines
9
+ puts "StdErr:"
10
+ puts stderr.readlines
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,71 +1,71 @@
1
- module Cxxproject
2
- module Utils
3
- class Progress
4
- def initialize(form, size)
5
- @width = size[0]
6
- initialize_progress(form, size)
7
- initialize_title(form, size)
8
- max = 100
9
- end
10
-
11
- def initialize_progress(form, size)
12
- @progress = Label.new form do
13
- name 'progress'
14
- row size[1]-1
15
- col 0
16
- width size[0]
17
- height 1
18
- end
19
- @progress.display_length(@width)
20
- @progress.text = ' '*@width
21
- end
22
-
23
- def initialize_title(form, size)
24
- @title = Label.new form do
25
- name 'title'
26
- row size[1]-2
27
- col 0
28
- width size[0]
29
- height 1
30
- end
31
- @title.display_length(@widget)
32
- @title.text = 'Idle'
33
- end
34
-
35
- def title=(t)
36
- @title_text = t
37
- format_title
38
- end
39
-
40
- def inc(i)
41
- @current += i
42
- format_title
43
- format_progress
44
- end
45
-
46
- def percentage
47
- return @current.to_f / @max.to_f
48
- end
49
-
50
- def format_progress
51
- total = (percentage * @width.to_f).to_i
52
- text = "#" * total
53
- @progress.text = text
54
- @progress.repaint_all(true)
55
- end
56
-
57
- def format_title
58
- format = "%3d%% - worked on %s "
59
- @title.text = sprintf(format, (percentage*100).to_i, @title_text)
60
- @title.repaint_all(true)
61
- end
62
-
63
- def max=(f)
64
- @max = f.to_f
65
- @current = 0.0
66
- format_progress
67
- format_title
68
- end
69
- end
70
- end
71
- end
1
+ module Cxxproject
2
+ module Utils
3
+ class Progress
4
+ def initialize(form, size)
5
+ @width = size[0]
6
+ initialize_progress(form, size)
7
+ initialize_title(form, size)
8
+ max = 100
9
+ end
10
+
11
+ def initialize_progress(form, size)
12
+ @progress = Label.new form do
13
+ name 'progress'
14
+ row size[1]-1
15
+ col 0
16
+ width size[0]
17
+ height 1
18
+ end
19
+ @progress.display_length(@width)
20
+ @progress.text = ' '*@width
21
+ end
22
+
23
+ def initialize_title(form, size)
24
+ @title = Label.new form do
25
+ name 'title'
26
+ row size[1]-2
27
+ col 0
28
+ width size[0]
29
+ height 1
30
+ end
31
+ @title.display_length(@widget)
32
+ @title.text = 'Idle'
33
+ end
34
+
35
+ def title=(t)
36
+ @title_text = t
37
+ format_title
38
+ end
39
+
40
+ def inc(i)
41
+ @current += i
42
+ format_title
43
+ format_progress
44
+ end
45
+
46
+ def percentage
47
+ return @current.to_f / @max.to_f
48
+ end
49
+
50
+ def format_progress
51
+ total = (percentage * @width.to_f).to_i
52
+ text = "#" * total
53
+ @progress.text = text
54
+ @progress.repaint_all(true)
55
+ end
56
+
57
+ def format_title
58
+ format = "%3d%% - worked on %s "
59
+ @title.text = sprintf(format, (percentage*100).to_i, @title_text)
60
+ @title.repaint_all(true)
61
+ end
62
+
63
+ def max=(f)
64
+ @max = f.to_f
65
+ @current = 0.0
66
+ format_progress
67
+ format_title
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,51 +1,51 @@
1
- module Cxxproject
2
- module Utils
3
- class TaskTable < Table
4
- def initialize(rake_gui, form=nil, config={}, &block)
5
- super(form, config, &block)
6
- @rake_gui = rake_gui
7
- activate_keybindings
8
- end
9
- def activate_keybindings
10
- configure do
11
- bind_key(RakeGui.keycode('r')) do
12
- @rake_gui.invoke(self)
13
- end
14
- bind_key(RakeGui.keycode('d')) do
15
- @rake_gui.details(self)
16
- end
17
- bind_key(RakeGui.keycode('e')) do
18
- task = get_value_at(focussed_row, 0)
19
- @rake_gui.start_editor_for_task(task)
20
- end
21
- [RakeGui.keycode('p'), KEY_BACKSPACE, 127].each do |code|
22
- bind_key(code) do
23
- @rake_gui.pop_data
24
- end
25
- end
26
- end
27
- end
28
-
29
- def get_cell_renderer(row, col)
30
- renderer = super(row, col)
31
- content = get_value_at(row, 0)
32
- if renderer.nil?
33
- renderer = get_default_cell_renderer_for_class(content.class.to_s) if renderer.nil?
34
- column = @table_column_model.column(col)
35
- renderer.display_length column.width if column
36
- end
37
-
38
- if content && content.failure
39
- renderer.color('red')
40
- renderer.bgcolor('black')
41
- else
42
- renderer.color('white')
43
- renderer.bgcolor('black')
44
- end
45
- return renderer
46
- end
47
-
48
- end
49
-
50
- end
51
- end
1
+ module Cxxproject
2
+ module Utils
3
+ class TaskTable < Table
4
+ def initialize(rake_gui, form=nil, config={}, &block)
5
+ super(form, config, &block)
6
+ @rake_gui = rake_gui
7
+ activate_keybindings
8
+ end
9
+ def activate_keybindings
10
+ configure do
11
+ bind_key(RakeGui.keycode('r')) do
12
+ @rake_gui.invoke(self)
13
+ end
14
+ bind_key(RakeGui.keycode('d')) do
15
+ @rake_gui.details(self)
16
+ end
17
+ bind_key(RakeGui.keycode('e')) do
18
+ task = get_value_at(focussed_row, 0)
19
+ @rake_gui.start_editor_for_task(task)
20
+ end
21
+ [RakeGui.keycode('p'), KEY_BACKSPACE, 127].each do |code|
22
+ bind_key(code) do
23
+ @rake_gui.pop_data
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def get_cell_renderer(row, col)
30
+ renderer = super(row, col)
31
+ content = get_value_at(row, 0)
32
+ if renderer.nil?
33
+ renderer = get_default_cell_renderer_for_class(content.class.to_s) if renderer.nil?
34
+ column = @table_column_model.column(col)
35
+ renderer.display_length column.width if column
36
+ end
37
+
38
+ if content && content.failure
39
+ renderer.color('red')
40
+ renderer.bgcolor('black')
41
+ else
42
+ renderer.color('white')
43
+ renderer.bgcolor('black')
44
+ end
45
+ return renderer
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -1,60 +1,60 @@
1
- module Cxxproject
2
- module Utils
3
- define_stats = lambda do
4
- require 'haml'
5
-
6
- def count_sources(bbs)
7
- return bbs.inject(0) do |memo, bb|
8
- memo += bb.sources.size if bb.kind_of?(HasSources)
9
- memo
10
- end
11
- end
12
- def print_sources(io, bbs, indent)
13
- io.puts(indent + '%div.details')
14
- bbs.each do |bb|
15
- if bb.kind_of?(HasSources)
16
- io.puts(indent + " %p Sources of #{bb.name}: #{bb.sources.size}")
17
- io.puts(indent + ' %ul')
18
- bb.sources.each do |s|
19
- io.puts(indent + " %li #{s}")
20
- end
21
- end
22
- end
23
- end
24
-
25
- def handle_exe(io, bb, indent)
26
- if bb.kind_of?(Executable)
27
- io.puts(indent + "%h1")
28
- bbs = bb.all_dependencies.map{|name|ALL_BUILDING_BLOCKS[name]}
29
- io.puts(indent + " %p.details_toggle Executable '#{bb.name}' total sources: #{count_sources(bbs)}")
30
- print_sources(io, bbs, indent + ' '*2)
31
- end
32
- end
33
-
34
- directory 'build'
35
-
36
- desc 'print building block stats'
37
- task :stats => 'build' do
38
- io = StringIO.new
39
- io.puts('%html')
40
- io.puts(' %head')
41
- io.puts(' %title Some Stats')
42
- io.puts(' %script{ :type => "text/javascript", :src=>"http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"}')
43
- io.puts(' :javascript')
44
- io.puts(' $(document).ready(function() {$("div.details").hide();$("p.details_toggle").click(function() {$(this).siblings().last().toggle();});});')
45
- io.puts(' %body')
46
- res = ALL_BUILDING_BLOCKS.inject(io) do |memo, pair|
47
- key, bb = pair
48
- handle_exe(memo, bb, ' '*4)
49
- memo
50
- end
51
- engine = Haml::Engine.new(res.string)
52
- File.open(File.join('build','stats.out.html'), 'w') do |out|
53
- out.puts(engine.render)
54
- end
55
- end
56
- end
57
-
58
- optional_package(define_stats, nil)
59
- end
60
- end
1
+ module Cxxproject
2
+ module Utils
3
+ define_stats = lambda do
4
+ require 'haml'
5
+
6
+ def count_sources(bbs)
7
+ return bbs.inject(0) do |memo, bb|
8
+ memo += bb.sources.size if bb.kind_of?(HasSources)
9
+ memo
10
+ end
11
+ end
12
+ def print_sources(io, bbs, indent)
13
+ io.puts(indent + '%div.details')
14
+ bbs.each do |bb|
15
+ if bb.kind_of?(HasSources)
16
+ io.puts(indent + " %p Sources of #{bb.name}: #{bb.sources.size}")
17
+ io.puts(indent + ' %ul')
18
+ bb.sources.each do |s|
19
+ io.puts(indent + " %li #{s}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def handle_exe(io, bb, indent)
26
+ if bb.kind_of?(Executable)
27
+ io.puts(indent + "%h1")
28
+ bbs = bb.all_dependencies.map{|name|ALL_BUILDING_BLOCKS[name]}
29
+ io.puts(indent + " %p.details_toggle Executable '#{bb.name}' total sources: #{count_sources(bbs)}")
30
+ print_sources(io, bbs, indent + ' '*2)
31
+ end
32
+ end
33
+
34
+ directory 'build'
35
+
36
+ desc 'print building block stats'
37
+ task :stats => 'build' do
38
+ io = StringIO.new
39
+ io.puts('%html')
40
+ io.puts(' %head')
41
+ io.puts(' %title Some Stats')
42
+ io.puts(' %script{ :type => "text/javascript", :src=>"http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"}')
43
+ io.puts(' :javascript')
44
+ io.puts(' $(document).ready(function() {$("div.details").hide();$("p.details_toggle").click(function() {$(this).siblings().last().toggle();});});')
45
+ io.puts(' %body')
46
+ res = ALL_BUILDING_BLOCKS.inject(io) do |memo, pair|
47
+ key, bb = pair
48
+ handle_exe(memo, bb, ' '*4)
49
+ memo
50
+ end
51
+ engine = Haml::Engine.new(res.string)
52
+ File.open(File.join('build','stats.out.html'), 'w') do |out|
53
+ out.puts(engine.render)
54
+ end
55
+ end
56
+ end
57
+
58
+ optional_package(define_stats, nil)
59
+ end
60
+ end
@@ -1,228 +1,228 @@
1
- module Cxxproject
2
- define_ubigraph = lambda do
3
- require 'rubigraph'
4
-
5
- module Rubigraph
6
- class Vertex
7
- alias_method :initialize_original, :initialize
8
- def initialize(id = nil)
9
- if id != nil
10
- @id = id
11
- else
12
- initialize_original
13
- end
14
- end
15
- end
16
- end
17
-
18
- class IdsAndEdges
19
- attr_reader :ids, :edges
20
- def initialize
21
- @ids = Hash.new
22
- @edges = Hash.new
23
- end
24
- end
25
-
26
- class V
27
-
28
- def self.shutdown
29
- File.open('id_cache', 'w') do |f|
30
- f.write(@@ids_and_edges.to_yaml)
31
- end
32
- end
33
-
34
- def self.reset
35
- begin
36
- File.delete('id_cache')
37
- rescue StandardError => e
38
- puts e
39
- puts 'problem deleting id_cache'
40
- end
41
- @@ids_and_edges = IdsAndEdges.new
42
- end
43
-
44
- def self.startup
45
- begin
46
- @@ids_and_edges = YAML.load_file('id_cache')
47
- rescue
48
- @@ids_and_edges = IdsAndEdges.new
49
- end
50
- end
51
-
52
- attr_reader :v
53
-
54
- def initialize(name)
55
- h = @@ids_and_edges.ids
56
- id = h[name]
57
- if !id
58
- @v = Rubigraph::Vertex.new
59
- @@ids_and_edges.ids()[name] = @v.id
60
- else
61
- @v = Rubigraph::Vertex.new(id)
62
- end
63
- end
64
- def self.create_edge(edge_and_task1, edge_and_task2)
65
- complete_name = "#{edge_and_task1[:task].name}->#{edge_and_task2[:task].name}"
66
- if @@ids_and_edges.edges.has_key?(complete_name)
67
- return nil
68
- else
69
- e = Rubigraph::Edge.new(edge_and_task1[:vertex].v, edge_and_task2[:vertex].v)
70
- @@ids_and_edges.edges[complete_name] = true
71
- return e
72
- end
73
- end
74
- end
75
-
76
- class UbiGraphSupport
77
-
78
- def object?(name)
79
- name.match(/.*\.o\Z/) != nil
80
- end
81
-
82
- def exe?(name)
83
- name.match(/.*\.exe\Z/) != nil
84
- end
85
- def library?(name)
86
- name.match(/.*\.a\Z/) != nil
87
- end
88
- def multitask?(name)
89
- name.index("Sources") == 0
90
- end
91
- def interesting?(name)
92
- exe?(name) || object?(name) || library?(name) || multitask?(name)
93
- end
94
- def create_vertices
95
- @vertices = {}
96
- @interesting_tasks.each do |task|
97
- v = V.new(task.name)
98
- @vertices[task.name] = {:vertex=>v, :task=>task}
99
- end
100
- end
101
- def create_edges
102
- @interesting_tasks.each do |task|
103
- name = task.name
104
- v1 = @vertices[name]
105
- task.prerequisites.each do |p|
106
- v2 = @vertices[p]
107
- if (v2 != nil)
108
- e = V.create_edge(v1, v2)
109
- e.width=2 if e
110
- end
111
- end
112
- end
113
- end
114
- def color_vertices
115
- @vertices.each do |k, value|
116
- v = value[:vertex]
117
- v.v.label = k
118
- set_attributes(v, k)
119
- end
120
- end
121
- def initialize
122
- @interesting_tasks = Rake::Task.tasks.select { |i| interesting?(i.name) }
123
- create_vertices
124
- create_edges
125
- color_vertices
126
- end
127
-
128
- def update_colors
129
- @vertices.each_key do |k|
130
- set_attributes(v, k)
131
- end
132
- end
133
-
134
- def set_attributes(v, name)
135
- v.v.color = state2color(name)
136
- v.v.shape = name2shape(name)
137
- v.v.size = name2size(name)
138
- end
139
-
140
- def name2shape(name)
141
- if object?(name)
142
- return 'cube'
143
- elsif exe?(name)
144
- return 'sphere'
145
- elsif multitask?(name)
146
- return 'torus'
147
- else
148
- return 'octahedron'
149
- end
150
- end
151
- def name2size(name)
152
- if object?(name)
153
- return 0.7
154
- elsif exe?(name)
155
- return 1.2
156
- else
157
- return 1.0
158
- end
159
- end
160
- def state2color(name)
161
- t = @vertices[name][:task]
162
- begin
163
- if t.dirty?
164
- return '#ff0000'
165
- else
166
- return '#00ff00'
167
- end
168
- rescue StandardError => bang
169
- puts bang
170
- return '#ff00ff'
171
- end
172
- end
173
-
174
- def update(name, color)
175
- @vertices[name][:vertex].v.color = color if @vertices[name]
176
- end
177
-
178
- YELLOW = '#ffff00'
179
- def before_prerequisites(name)
180
- update(name, YELLOW)
181
- end
182
-
183
- ORANGE = '#ff7f00'
184
- def after_prerequisites(name)
185
- update(name, ORANGE)
186
- end
187
-
188
- BLUE = '#0000ff'
189
- def before_execute(name)
190
- update(name, BLUE)
191
- end
192
-
193
- GREEN = '#00ff00'
194
- def after_execute(name)
195
- update(name, GREEN)
196
- end
197
- end
198
-
199
- namespace :rubygraph do
200
- task :init do
201
- Rubigraph.init
202
- V.startup
203
- at_exit do
204
- V.shutdown
205
- end
206
- end
207
-
208
- desc 'clear rubygraph'
209
- task :clear => :init do
210
- Rubigraph.clear
211
- V.reset
212
- end
213
-
214
- desc 'update rubygraph'
215
- task :update => :init do
216
- begin
217
- require 'cxxproject/ext/rake_listener'
218
- require 'cxxproject/ext/rake_dirty'
219
- Rake::add_listener(UbiGraphSupport.new)
220
- rescue StandardError => e
221
- puts e
222
- end
223
- end
224
- end
225
- end
226
-
227
- Utils.optional_package(define_ubigraph, nil)
228
- end
1
+ module Cxxproject
2
+ define_ubigraph = lambda do
3
+ require 'rubigraph'
4
+
5
+ module Rubigraph
6
+ class Vertex
7
+ alias_method :initialize_original, :initialize
8
+ def initialize(id = nil)
9
+ if id != nil
10
+ @id = id
11
+ else
12
+ initialize_original
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ class IdsAndEdges
19
+ attr_reader :ids, :edges
20
+ def initialize
21
+ @ids = Hash.new
22
+ @edges = Hash.new
23
+ end
24
+ end
25
+
26
+ class V
27
+
28
+ def self.shutdown
29
+ File.open('id_cache', 'w') do |f|
30
+ f.write(@@ids_and_edges.to_yaml)
31
+ end
32
+ end
33
+
34
+ def self.reset
35
+ begin
36
+ File.delete('id_cache')
37
+ rescue StandardError => e
38
+ puts e
39
+ puts 'problem deleting id_cache'
40
+ end
41
+ @@ids_and_edges = IdsAndEdges.new
42
+ end
43
+
44
+ def self.startup
45
+ begin
46
+ @@ids_and_edges = YAML.load_file('id_cache')
47
+ rescue
48
+ @@ids_and_edges = IdsAndEdges.new
49
+ end
50
+ end
51
+
52
+ attr_reader :v
53
+
54
+ def initialize(name)
55
+ h = @@ids_and_edges.ids
56
+ id = h[name]
57
+ if !id
58
+ @v = Rubigraph::Vertex.new
59
+ @@ids_and_edges.ids()[name] = @v.id
60
+ else
61
+ @v = Rubigraph::Vertex.new(id)
62
+ end
63
+ end
64
+ def self.create_edge(edge_and_task1, edge_and_task2)
65
+ complete_name = "#{edge_and_task1[:task].name}->#{edge_and_task2[:task].name}"
66
+ if @@ids_and_edges.edges.has_key?(complete_name)
67
+ return nil
68
+ else
69
+ e = Rubigraph::Edge.new(edge_and_task1[:vertex].v, edge_and_task2[:vertex].v)
70
+ @@ids_and_edges.edges[complete_name] = true
71
+ return e
72
+ end
73
+ end
74
+ end
75
+
76
+ class UbiGraphSupport
77
+
78
+ def object?(name)
79
+ name.match(/.*\.o\Z/) != nil
80
+ end
81
+
82
+ def exe?(name)
83
+ name.match(/.*\.exe\Z/) != nil
84
+ end
85
+ def library?(name)
86
+ name.match(/.*\.a\Z/) != nil
87
+ end
88
+ def multitask?(name)
89
+ name.index("Sources") == 0
90
+ end
91
+ def interesting?(name)
92
+ exe?(name) || object?(name) || library?(name) || multitask?(name)
93
+ end
94
+ def create_vertices
95
+ @vertices = {}
96
+ @interesting_tasks.each do |task|
97
+ v = V.new(task.name)
98
+ @vertices[task.name] = {:vertex=>v, :task=>task}
99
+ end
100
+ end
101
+ def create_edges
102
+ @interesting_tasks.each do |task|
103
+ name = task.name
104
+ v1 = @vertices[name]
105
+ task.prerequisites.each do |p|
106
+ v2 = @vertices[p]
107
+ if (v2 != nil)
108
+ e = V.create_edge(v1, v2)
109
+ e.width=2 if e
110
+ end
111
+ end
112
+ end
113
+ end
114
+ def color_vertices
115
+ @vertices.each do |k, value|
116
+ v = value[:vertex]
117
+ v.v.label = k
118
+ set_attributes(v, k)
119
+ end
120
+ end
121
+ def initialize
122
+ @interesting_tasks = Rake::Task.tasks.select { |i| interesting?(i.name) }
123
+ create_vertices
124
+ create_edges
125
+ color_vertices
126
+ end
127
+
128
+ def update_colors
129
+ @vertices.each_key do |k|
130
+ set_attributes(v, k)
131
+ end
132
+ end
133
+
134
+ def set_attributes(v, name)
135
+ v.v.color = state2color(name)
136
+ v.v.shape = name2shape(name)
137
+ v.v.size = name2size(name)
138
+ end
139
+
140
+ def name2shape(name)
141
+ if object?(name)
142
+ return 'cube'
143
+ elsif exe?(name)
144
+ return 'sphere'
145
+ elsif multitask?(name)
146
+ return 'torus'
147
+ else
148
+ return 'octahedron'
149
+ end
150
+ end
151
+ def name2size(name)
152
+ if object?(name)
153
+ return 0.7
154
+ elsif exe?(name)
155
+ return 1.2
156
+ else
157
+ return 1.0
158
+ end
159
+ end
160
+ def state2color(name)
161
+ t = @vertices[name][:task]
162
+ begin
163
+ if t.dirty?
164
+ return '#ff0000'
165
+ else
166
+ return '#00ff00'
167
+ end
168
+ rescue StandardError => bang
169
+ puts bang
170
+ return '#ff00ff'
171
+ end
172
+ end
173
+
174
+ def update(name, color)
175
+ @vertices[name][:vertex].v.color = color if @vertices[name]
176
+ end
177
+
178
+ YELLOW = '#ffff00'
179
+ def before_prerequisites(name)
180
+ update(name, YELLOW)
181
+ end
182
+
183
+ ORANGE = '#ff7f00'
184
+ def after_prerequisites(name)
185
+ update(name, ORANGE)
186
+ end
187
+
188
+ BLUE = '#0000ff'
189
+ def before_execute(name)
190
+ update(name, BLUE)
191
+ end
192
+
193
+ GREEN = '#00ff00'
194
+ def after_execute(name)
195
+ update(name, GREEN)
196
+ end
197
+ end
198
+
199
+ namespace :rubygraph do
200
+ task :init do
201
+ Rubigraph.init
202
+ V.startup
203
+ at_exit do
204
+ V.shutdown
205
+ end
206
+ end
207
+
208
+ desc 'clear rubygraph'
209
+ task :clear => :init do
210
+ Rubigraph.clear
211
+ V.reset
212
+ end
213
+
214
+ desc 'update rubygraph'
215
+ task :update => :init do
216
+ begin
217
+ require 'cxxproject/ext/rake_listener'
218
+ require 'cxxproject/ext/rake_dirty'
219
+ Rake::add_listener(UbiGraphSupport.new)
220
+ rescue StandardError => e
221
+ puts e
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ Utils.optional_package(define_ubigraph, nil)
228
+ end