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,154 +1,154 @@
1
- module Cxxproject
2
- module Utils
3
- define_graphstream = lambda do
4
- require 'socket'
5
- require 'thread'
6
-
7
- class GraphStream
8
- def initialize
9
- begin
10
- @server = TCPSocket.open('localhost', 31217)
11
- @queue = Queue.new
12
- Thread.new do
13
- while true
14
- command = @queue.pop
15
- @server.puts(command)
16
- end
17
- end
18
- rescue Exception => bang
19
- puts bang
20
- end
21
- end
22
- def send(command)
23
- @queue << command
24
- end
25
-
26
- def clear
27
- send('Clear()')
28
- end
29
-
30
- def set_stylesheet(s)
31
- send("SetStylesheet(#{s})")
32
- end
33
- def add_vertex(id)
34
- send("AddVertex(#{id})")
35
- end
36
- def add_edge(from, to)
37
- send("AddEdge(#{from},#{to})")
38
- end
39
- def set_class(id, clazz)
40
- send("SetClass(#{id},#{clazz})")
41
- end
42
- end
43
-
44
- class GraphStreamSupport
45
-
46
- def object?(name)
47
- name.match(/.*\.o\Z/) != nil
48
- end
49
-
50
- def exe?(name)
51
- name.match(/.*\.exe\Z/) != nil
52
- end
53
- def library?(name)
54
- name.match(/.*\.a\Z/) != nil
55
- end
56
- def multitask?(name)
57
- name.index("Objects of") == 0
58
- end
59
- def interesting?(name)
60
- exe?(name) || object?(name) || library?(name) || multitask?(name)
61
- end
62
-
63
- def initialize(gs)
64
- @gs = gs
65
-
66
- @interesting_tasks = Rake::Task.tasks.select { |i| interesting?(i.name) }
67
- create_vertices
68
- create_edges
69
-
70
- @vertices.each do |name, task|
71
- set_attributes(name, task)
72
- end
73
-
74
- end
75
-
76
- def create_vertices
77
- @vertices = {}
78
- @interesting_tasks.each do |task|
79
- @vertices[task.name] = task
80
- @gs.add_vertex(task.name)
81
- end
82
- end
83
-
84
- def create_edges
85
- @interesting_tasks.each do |task|
86
- from = task.name
87
- task.prerequisites.each do |to|
88
- @gs.add_edge(from, to)
89
- end
90
- end
91
- end
92
-
93
- def set_attributes(name, task)
94
- @gs.set_class(name, state2color(task))
95
- end
96
-
97
- def state2color(t)
98
- begin
99
- if t.dirty?
100
- return 'dirty'
101
- else
102
- return 'ready'
103
- end
104
- rescue StandardError => bang
105
- puts bang
106
- return '#ff00ff'
107
- end
108
- end
109
-
110
- def update(name, color)
111
- @gs.set_class(name, color)
112
- end
113
-
114
- def before_prerequisites(name)
115
- update(name, 'before_prerequisites')
116
- end
117
-
118
- def after_prerequisites(name)
119
- update(name, 'after_prerequisites')
120
- end
121
-
122
- def before_execute(name)
123
- update(name, 'before_execute')
124
- end
125
-
126
- def after_execute(name)
127
- update(name, 'after_execute')
128
- end
129
- end
130
-
131
- namespace :graphstream do
132
- gs = nil
133
- task :init do
134
- gs = GraphStream.new
135
- end
136
-
137
- desc 'clear graphstream'
138
- task :clear => :init do
139
- gs.clear
140
- end
141
-
142
- desc 'update graphstream'
143
- task :update => :init do
144
- gs.set_stylesheet('node {fill-color:green;}node.dirty{fill-color:red;}node.before_prerequisites{fill-color:yellow;}node.after_prerequisites{fill-color:orange;}node.before_execute{fill-color:blue;}node.after_execute{fill-color:green;}node.ready{fill-color:yellow;}')
145
- require 'cxxproject/ext/rake_listener'
146
- require 'cxxproject/ext/rake_dirty'
147
- Rake::add_listener(GraphStreamSupport.new(gs))
148
- end
149
- end
150
- end
151
-
152
- optional_package(define_graphstream, nil)
153
- end
154
- end
1
+ module Cxxproject
2
+ module Utils
3
+ define_graphstream = lambda do
4
+ require 'socket'
5
+ require 'thread'
6
+
7
+ class GraphStream
8
+ def initialize
9
+ begin
10
+ @server = TCPSocket.open('localhost', 31217)
11
+ @queue = Queue.new
12
+ Thread.new do
13
+ while true
14
+ command = @queue.pop
15
+ @server.puts(command)
16
+ end
17
+ end
18
+ rescue Exception => bang
19
+ puts bang
20
+ end
21
+ end
22
+ def send(command)
23
+ @queue << command
24
+ end
25
+
26
+ def clear
27
+ send('Clear()')
28
+ end
29
+
30
+ def set_stylesheet(s)
31
+ send("SetStylesheet(#{s})")
32
+ end
33
+ def add_vertex(id)
34
+ send("AddVertex(#{id})")
35
+ end
36
+ def add_edge(from, to)
37
+ send("AddEdge(#{from},#{to})")
38
+ end
39
+ def set_class(id, clazz)
40
+ send("SetClass(#{id},#{clazz})")
41
+ end
42
+ end
43
+
44
+ class GraphStreamSupport
45
+
46
+ def object?(name)
47
+ name.match(/.*\.o\Z/) != nil
48
+ end
49
+
50
+ def exe?(name)
51
+ name.match(/.*\.exe\Z/) != nil
52
+ end
53
+ def library?(name)
54
+ name.match(/.*\.a\Z/) != nil
55
+ end
56
+ def multitask?(name)
57
+ name.index("Objects of") == 0
58
+ end
59
+ def interesting?(name)
60
+ exe?(name) || object?(name) || library?(name) || multitask?(name)
61
+ end
62
+
63
+ def initialize(gs)
64
+ @gs = gs
65
+
66
+ @interesting_tasks = Rake::Task.tasks.select { |i| interesting?(i.name) }
67
+ create_vertices
68
+ create_edges
69
+
70
+ @vertices.each do |name, task|
71
+ set_attributes(name, task)
72
+ end
73
+
74
+ end
75
+
76
+ def create_vertices
77
+ @vertices = {}
78
+ @interesting_tasks.each do |task|
79
+ @vertices[task.name] = task
80
+ @gs.add_vertex(task.name)
81
+ end
82
+ end
83
+
84
+ def create_edges
85
+ @interesting_tasks.each do |task|
86
+ from = task.name
87
+ task.prerequisites.each do |to|
88
+ @gs.add_edge(from, to)
89
+ end
90
+ end
91
+ end
92
+
93
+ def set_attributes(name, task)
94
+ @gs.set_class(name, state2color(task))
95
+ end
96
+
97
+ def state2color(t)
98
+ begin
99
+ if t.dirty?
100
+ return 'dirty'
101
+ else
102
+ return 'ready'
103
+ end
104
+ rescue StandardError => bang
105
+ puts bang
106
+ return '#ff00ff'
107
+ end
108
+ end
109
+
110
+ def update(name, color)
111
+ @gs.set_class(name, color)
112
+ end
113
+
114
+ def before_prerequisites(name)
115
+ update(name, 'before_prerequisites')
116
+ end
117
+
118
+ def after_prerequisites(name)
119
+ update(name, 'after_prerequisites')
120
+ end
121
+
122
+ def before_execute(name)
123
+ update(name, 'before_execute')
124
+ end
125
+
126
+ def after_execute(name)
127
+ update(name, 'after_execute')
128
+ end
129
+ end
130
+
131
+ namespace :graphstream do
132
+ gs = nil
133
+ task :init do
134
+ gs = GraphStream.new
135
+ end
136
+
137
+ desc 'clear graphstream'
138
+ task :clear => :init do
139
+ gs.clear
140
+ end
141
+
142
+ desc 'update graphstream'
143
+ task :update => :init do
144
+ gs.set_stylesheet('node {fill-color:green;}node.dirty{fill-color:red;}node.before_prerequisites{fill-color:yellow;}node.after_prerequisites{fill-color:orange;}node.before_execute{fill-color:blue;}node.after_execute{fill-color:green;}node.ready{fill-color:yellow;}')
145
+ require 'cxxproject/ext/rake_listener'
146
+ require 'cxxproject/ext/rake_dirty'
147
+ Rake::add_listener(GraphStreamSupport.new(gs))
148
+ end
149
+ end
150
+ end
151
+
152
+ optional_package(define_graphstream, nil)
153
+ end
154
+ end
@@ -1,16 +1,16 @@
1
- require 'rake'
2
-
3
- module Cxxproject
4
- module Utils
5
- def self.optional_package(block1, block2)
6
- begin
7
- block1.call
8
- rescue LoadError => e
9
- if RakeFileUtils.verbose == true
10
- puts e
11
- end
12
- block2.call if block2
13
- end
14
- end
15
- end
16
- end
1
+ require 'rake'
2
+
3
+ module Cxxproject
4
+ module Utils
5
+ def self.optional_package(block1, block2)
6
+ begin
7
+ block1.call
8
+ rescue LoadError => e
9
+ if RakeFileUtils.verbose == true
10
+ puts e
11
+ end
12
+ block2.call if block2
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,50 +1,50 @@
1
- require 'cxxproject/toolchain/colorizing_formatter'
2
-
3
- module Cxxproject
4
-
5
- class Printer
6
- @@cf = ColorizingFormatter.new
7
-
8
- def self.printInfo(str)
9
- if @@cf.enabled?
10
- puts @@cf.printInfo(str)
11
- else
12
- puts str
13
- end
14
- end
15
-
16
- def self.printAdditionalInfo(str)
17
- if @@cf.enabled?
18
- puts @@cf.printAdditionalInfo(str)
19
- else
20
- puts str
21
- end
22
- end
23
-
24
- def self.printWarning(str)
25
- if @@cf.enabled?
26
- puts @@cf.printWarning(str)
27
- else
28
- puts str
29
- end
30
- end
31
-
32
- def self.printError(str)
33
- if @@cf.enabled?
34
- puts @@cf.printError(str)
35
- else
36
- puts str
37
- end
38
- end
39
-
40
- def self.printSuccess(str)
41
- if @@cf.enabled?
42
- puts @@cf.printSuccess(str)
43
- else
44
- puts str
45
- end
46
- end
47
-
48
- end
49
-
50
- end
1
+ require 'cxxproject/toolchain/colorizing_formatter'
2
+
3
+ module Cxxproject
4
+
5
+ class Printer
6
+ @@cf = ColorizingFormatter.new
7
+
8
+ def self.printInfo(str)
9
+ if @@cf.enabled?
10
+ puts @@cf.printInfo(str)
11
+ else
12
+ puts str
13
+ end
14
+ end
15
+
16
+ def self.printAdditionalInfo(str)
17
+ if @@cf.enabled?
18
+ puts @@cf.printAdditionalInfo(str)
19
+ else
20
+ puts str
21
+ end
22
+ end
23
+
24
+ def self.printWarning(str)
25
+ if @@cf.enabled?
26
+ puts @@cf.printWarning(str)
27
+ else
28
+ puts str
29
+ end
30
+ end
31
+
32
+ def self.printError(str)
33
+ if @@cf.enabled?
34
+ puts @@cf.printError(str)
35
+ else
36
+ puts str
37
+ end
38
+ end
39
+
40
+ def self.printSuccess(str)
41
+ if @@cf.enabled?
42
+ puts @@cf.printSuccess(str)
43
+ else
44
+ puts str
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -1,59 +1,53 @@
1
- module Cxxproject
2
-
3
- class ProcessHelper
4
- @@pid = nil
5
-
6
- def self.readOutput(sp, rd, wr)
7
- wr.close
8
-
9
- consoleOutput = ""
10
- begin
11
- while not rd.eof?
12
- tmp = rd.read(1000)
13
- if (tmp != nil)
14
- consoleOutput << tmp
15
- end
16
- end
17
- rescue Exception=>e
18
- # Seems to be a bug in ruby: sometimes there is a bad file descriptor on Windows instead of eof, which causes
19
- # an exception on read(). However, this happens not before everything is read, so there is no practical difference
20
- # how to "break" the loop.
21
- # This problem occurs on Windows command shell and Cygwin.
22
- end
23
-
24
- Process.wait(sp)
25
- rd.close
26
-
27
- consoleOutput.encode!('UTF-8', :invalid => :replace, :undef => :replace, :replace => '')
28
- consoleOutput.encode!('binary', :invalid => :replace, :undef => :replace, :replace => '')
29
-
30
- consoleOutput
31
- end
32
-
33
- def self.spawnProcess(cmdLine)
34
- return system(cmdLine) if Cxxproject::Utils.old_ruby?
35
- @@pid = spawn(cmdLine)
36
- pid, status = Process.wait2(@@pid)
37
- @@pid = nil
38
- status.success?
39
- end
40
-
41
- def self.killProcess
42
- begin
43
- Process.kill("KILL",@@pid)
44
- rescue
45
- end
46
- @@pid = nil
47
- end
48
-
49
- def self.safeExecute
50
- begin
51
- consoleOutput = yield
52
- [($?.to_i >> 8) == 0, consoleOutput, false]
53
- rescue Exception => e
54
- [false, e.message, true]
55
- end
56
- end
57
- end
58
-
1
+ module Cxxproject
2
+
3
+ class ProcessHelper
4
+ @@pid = nil
5
+
6
+ def self.readOutput(sp, rd, wr)
7
+ wr.close
8
+
9
+ consoleOutput = ""
10
+ begin
11
+ while not rd.eof?
12
+ tmp = rd.read(1000)
13
+ if (tmp != nil)
14
+ consoleOutput << tmp
15
+ end
16
+ end
17
+ rescue Exception=>e
18
+ # Seems to be a bug in ruby: sometimes there is a bad file descriptor on Windows instead of eof, which causes
19
+ # an exception on read(). However, this happens not before everything is read, so there is no practical difference
20
+ # how to "break" the loop.
21
+ # This problem occurs on Windows command shell and Cygwin.
22
+ end
23
+
24
+ Process.wait(sp)
25
+ rd.close
26
+
27
+ # seems that pipe cannot handle non-ascii characters right on windows (even with correct encoding)
28
+ consoleOutput.gsub!(/\xE2\x80\x98/,"`") # ���
29
+ consoleOutput.gsub!(/\xE2\x80\x99/,"'") # ���
30
+
31
+ consoleOutput
32
+ end
33
+
34
+ def self.spawnProcess(cmdLine)
35
+ return system(cmdLine) if Cxxproject::Utils.old_ruby?
36
+
37
+ @@pid = spawn(cmdLine)
38
+ pid, status = Process.wait2(@@pid)
39
+ @@pid = nil
40
+ status.success?
41
+ end
42
+
43
+ def self.killProcess
44
+ begin
45
+ Process.kill("KILL",@@pid)
46
+ rescue
47
+ end
48
+ @@pid = nil
49
+ end
50
+
51
+ end
52
+
59
53
  end
@@ -0,0 +1,66 @@
1
+ module Cxxproject
2
+ module Utils
3
+ define_progress = lambda do
4
+ require 'rake'
5
+ require 'cxxproject/ext/rake'
6
+
7
+ require 'progressbar'
8
+ require 'cxxproject/ext/progressbar'
9
+ require 'colored'
10
+ require 'cxxproject/utils/progress_helper'
11
+
12
+ class ProgressListener
13
+ def initialize
14
+ @progress_helper = ProgressHelper.new
15
+ Rake::application.top_level_tasks.each do |name|
16
+ @progress_helper.count_with_filter(name)
17
+ end
18
+ @progress = ProgressBar.new('all tasks', @progress_helper.todo)
19
+ @progress.title_width = 30
20
+ @progress.unblock
21
+ end
22
+
23
+ def after_execute(name)
24
+ needed_tasks = @progress_helper.needed_tasks
25
+ if needed_tasks[name]
26
+ task = Rake::Task[name]
27
+ @progress.title = task.name
28
+ @progress.inc(task.progress_count)
29
+ if (@progress.total == @progress.current)
30
+ puts
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ require 'benchmark'
37
+ class BenchmarkedProgressListener < ProgressListener
38
+ def initialize
39
+ Benchmark.bm do |x|
40
+ x.report('ProgressListener.initialize') do
41
+ super
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ desc 'show a progressbar for the build (use with -s for best results)'
48
+ task :progress do
49
+ require 'cxxproject/ext/rake_listener'
50
+ Rake::add_listener(ProgressListener.new)
51
+ end
52
+
53
+ task :benchmark_progress do
54
+ require 'cxxproject/ext/rake_listener'
55
+ Rake::add_listener(BenchmarkedProgressListener.new)
56
+ end
57
+ end
58
+
59
+ could_not_define_progress = lambda {
60
+ task :progress do
61
+ puts 'could not define progress'
62
+ end
63
+ }
64
+ optional_package(define_progress, could_not_define_progress)
65
+ end
66
+ end