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.
- data/Rakefile.rb +116 -116
- data/bin/cxx +10 -10
- data/lib/cxxproject.rb +23 -23
- data/lib/cxxproject/buildingblocks/binary_library.rb +39 -39
- data/lib/cxxproject/buildingblocks/building_block.rb +251 -239
- data/lib/cxxproject/buildingblocks/command_line.rb +79 -79
- data/lib/cxxproject/buildingblocks/custom_building_block.rb +39 -41
- data/lib/cxxproject/buildingblocks/executable.rb +257 -249
- data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +83 -83
- data/lib/cxxproject/buildingblocks/has_includes_mixin.rb +20 -20
- data/lib/cxxproject/buildingblocks/has_libraries_mixin.rb +34 -34
- data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +371 -364
- data/lib/cxxproject/buildingblocks/makefile.rb +153 -153
- data/lib/cxxproject/buildingblocks/module.rb +35 -35
- data/lib/cxxproject/buildingblocks/single_source.rb +33 -33
- data/lib/cxxproject/buildingblocks/source_library.rb +124 -124
- data/lib/cxxproject/errorparser/diab_compiler_error_parser.rb +40 -40
- data/lib/cxxproject/errorparser/diab_linker_error_parser.rb +41 -33
- data/lib/cxxproject/errorparser/error_parser.rb +50 -50
- data/lib/cxxproject/errorparser/gcc_compiler_error_parser.rb +35 -30
- data/lib/cxxproject/errorparser/gcc_linker_error_parser.rb +35 -29
- data/lib/cxxproject/errorparser/ti_compiler_error_parser.rb +30 -30
- data/lib/cxxproject/errorparser/ti_linker_error_parser.rb +30 -29
- data/lib/cxxproject/eval_context.rb +144 -136
- data/lib/cxxproject/ext/file.rb +71 -71
- data/lib/cxxproject/ext/filelist.rb +6 -6
- data/lib/cxxproject/ext/progressbar.rb +20 -20
- data/lib/cxxproject/ext/rake.rb +419 -397
- data/lib/cxxproject/ext/rake_dirty.rb +30 -30
- data/lib/cxxproject/ext/rake_listener.rb +59 -59
- data/lib/cxxproject/ext/stdout.rb +44 -44
- data/lib/cxxproject/ext/string.rb +9 -9
- data/lib/cxxproject/ide_interface.rb +187 -181
- data/lib/cxxproject/toolchain/clang.rb +39 -39
- data/lib/cxxproject/toolchain/colorizing_formatter.rb +99 -99
- data/lib/cxxproject/toolchain/diab.rb +3 -1
- data/lib/cxxproject/toolchain/gcc.rb +2 -1
- data/lib/cxxproject/toolchain/provider.rb +131 -128
- data/lib/cxxproject/toolchain/toolchain.rb +38 -38
- data/lib/cxxproject/toolchain/toolchain_benchmark.rb +23 -23
- data/lib/cxxproject/torake.rb +218 -216
- data/lib/cxxproject/utils/cleanup.rb +20 -20
- data/lib/cxxproject/utils/console.rb +6 -6
- data/lib/cxxproject/utils/exit_helper.rb +40 -40
- data/lib/cxxproject/utils/graphstream.rb +154 -154
- data/lib/cxxproject/utils/optional.rb +16 -16
- data/lib/cxxproject/utils/printer.rb +50 -50
- data/lib/cxxproject/utils/process.rb +52 -52
- data/lib/cxxproject/utils/progress.rb +66 -66
- data/lib/cxxproject/utils/progress_helper.rb +77 -77
- data/lib/cxxproject/utils/rbcurse.rb +284 -284
- data/lib/cxxproject/utils/rbcurse_executable_ext.rb +14 -14
- data/lib/cxxproject/utils/rbcurse_progress.rb +71 -71
- data/lib/cxxproject/utils/rbcurse_tasktable.rb +51 -51
- data/lib/cxxproject/utils/stats.rb +60 -60
- data/lib/cxxproject/utils/ubigraph.rb +228 -228
- data/lib/cxxproject/utils/utils.rb +60 -37
- data/lib/cxxproject/utils/valgrind.rb +11 -11
- data/lib/cxxproject/version.rb +7 -7
- data/lib/tools/Rakefile.rb.template +10 -10
- data/lib/tools/project.rb.template +6 -6
- data/lib/tools/project_wizard.rb +66 -66
- data/spec/building_block_spec.rb +56 -56
- data/spec/cxxproject_2_rake_spec.rb +186 -186
- data/spec/file_ext_spec.rb +30 -30
- data/spec/ide_interface_spec.rb +41 -41
- data/spec/object_dependency_spec.rb +83 -83
- data/spec/project_path_spec.rb +71 -71
- data/spec/rake_listener_ext_spec.rb +58 -58
- data/spec/spec_helper.rb +18 -18
- data/spec/string_spec.rb +11 -11
- data/spec/testdata/basic/exe12/project.rb +5 -5
- data/spec/testdata/basic/lib1/project.rb +5 -5
- data/spec/testdata/basic/lib2/project.rb +8 -8
- data/spec/testdata/multiple_levels/libs/lib1/project.rb +5 -5
- data/spec/testdata/multiple_levels/libs/lib2/project.rb +19 -19
- data/spec/testdata/multiple_levels/mainproject/basic/project.rb +8 -8
- data/spec/testdata/onlyOneHeader/Rakefile.rb +4 -4
- data/spec/testdata/onlyOneHeader/project.rb +4 -4
- data/spec/toolchain_spec.rb +29 -29
- 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
|