cxxproject 0.4.6 → 0.5.47

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/Rakefile.rb +101 -54
  2. data/bin/cxx +4 -4
  3. data/lib/cxxproject/buildingblocks/binary_library.rb +32 -9
  4. data/lib/cxxproject/buildingblocks/building_block.rb +220 -74
  5. data/lib/cxxproject/buildingblocks/command_line.rb +70 -21
  6. data/lib/cxxproject/buildingblocks/custom_building_block.rb +33 -9
  7. data/lib/cxxproject/buildingblocks/executable.rb +228 -33
  8. data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +69 -43
  9. data/lib/cxxproject/buildingblocks/has_includes_mixin.rb +20 -0
  10. data/lib/cxxproject/buildingblocks/has_libraries_mixin.rb +29 -30
  11. data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +343 -64
  12. data/lib/cxxproject/buildingblocks/makefile.rb +142 -24
  13. data/lib/cxxproject/buildingblocks/module.rb +27 -6
  14. data/lib/cxxproject/buildingblocks/single_source.rb +26 -4
  15. data/lib/cxxproject/buildingblocks/source_library.rb +113 -20
  16. data/lib/cxxproject/errorparser/diab_compiler_error_parser.rb +40 -0
  17. data/lib/cxxproject/errorparser/diab_linker_error_parser.rb +33 -0
  18. data/lib/cxxproject/errorparser/error_parser.rb +50 -0
  19. data/lib/cxxproject/errorparser/gcc_compiler_error_parser.rb +30 -0
  20. data/lib/cxxproject/errorparser/gcc_linker_error_parser.rb +29 -0
  21. data/lib/cxxproject/errorparser/ti_compiler_error_parser.rb +30 -0
  22. data/lib/cxxproject/errorparser/ti_linker_error_parser.rb +29 -0
  23. data/lib/cxxproject/eval_context.rb +136 -0
  24. data/lib/cxxproject/ext/file.rb +71 -0
  25. data/lib/cxxproject/ext/filelist.rb +6 -0
  26. data/lib/cxxproject/ext/progressbar.rb +20 -0
  27. data/lib/cxxproject/ext/rake.rb +397 -0
  28. data/lib/cxxproject/{extensions/rake_listener_ext.rb → ext/rake_listener.rb} +18 -12
  29. data/lib/cxxproject/ext/stdout.rb +44 -0
  30. data/lib/cxxproject/ide_interface.rb +181 -0
  31. data/lib/cxxproject/toolchain/clang.rb +39 -0
  32. data/lib/cxxproject/toolchain/colorizing_formatter.rb +99 -0
  33. data/lib/cxxproject/toolchain/diab.rb +36 -33
  34. data/lib/cxxproject/toolchain/gcc.rb +16 -8
  35. data/lib/cxxproject/toolchain/provider.rb +112 -2
  36. data/lib/cxxproject/toolchain/ti.rb +50 -0
  37. data/lib/cxxproject/toolchain/toolchain.rb +38 -0
  38. data/lib/cxxproject/toolchain/toolchain_benchmark.rb +23 -0
  39. data/lib/cxxproject/torake.rb +181 -123
  40. data/lib/cxxproject/utils/cleanup.rb +20 -0
  41. data/lib/cxxproject/utils/console.rb +6 -0
  42. data/lib/cxxproject/utils/exit_helper.rb +40 -0
  43. data/lib/cxxproject/utils/graphstream.rb +154 -0
  44. data/lib/cxxproject/utils/optional.rb +16 -0
  45. data/lib/cxxproject/utils/printer.rb +50 -0
  46. data/lib/cxxproject/utils/process.rb +53 -0
  47. data/lib/cxxproject/utils/progress.rb +66 -0
  48. data/lib/cxxproject/utils/progress_helper.rb +77 -0
  49. data/lib/cxxproject/utils/rbcurse.rb +284 -0
  50. data/lib/cxxproject/utils/rbcurse_executable_ext.rb +14 -0
  51. data/lib/cxxproject/utils/rbcurse_progress.rb +71 -0
  52. data/lib/cxxproject/utils/rbcurse_tasktable.rb +51 -0
  53. data/lib/cxxproject/utils/stats.rb +60 -0
  54. data/lib/cxxproject/utils/ubigraph.rb +179 -188
  55. data/lib/cxxproject/utils/utils.rb +29 -25
  56. data/lib/cxxproject/version.rb +7 -0
  57. data/lib/cxxproject.rb +13 -7
  58. data/lib/tools/project_wizard.rb +66 -0
  59. data/spec/building_block_spec.rb +50 -6
  60. data/spec/{build_dependencies_spec.rb → cxxproject_2_rake_spec.rb} +82 -65
  61. data/spec/file_ext_spec.rb +30 -0
  62. data/spec/ide_interface_spec.rb +41 -0
  63. data/spec/object_dependency_spec.rb +83 -0
  64. data/spec/project_path_spec.rb +14 -16
  65. data/spec/rake_listener_ext_spec.rb +38 -5
  66. data/spec/spec_helper.rb +18 -0
  67. data/spec/testdata/basic/lib2/project.rb +1 -1
  68. data/spec/testdata/multiple_levels/libs/lib2/project.rb +1 -1
  69. data/spec/toolchain_spec.rb +29 -0
  70. metadata +91 -58
  71. data/lib/cxxproject/extensions/file_ext.rb +0 -47
  72. data/lib/cxxproject/extensions/rake_ext.rb +0 -158
  73. data/lib/cxxproject/extensions/stdout_ext.rb +0 -35
  74. data/lib/cxxproject/task_maker.rb +0 -418
  75. data/lib/cxxproject/testinstanceeval.rb +0 -65
  76. data/lib/cxxproject/toolchain/base.rb +0 -98
  77. data/lib/cxxproject/torake/compiler.rb +0 -10
  78. data/lib/cxxproject/torake/gcccompiler.rb +0 -7
  79. data/lib/cxxproject/torake/osxcompiler.rb +0 -7
  80. data/lib/cxxproject/utils/dot/building_block_graph_writer.rb +0 -19
  81. data/lib/cxxproject/utils/dot/graph_writer.rb +0 -53
  82. data/lib/cxxproject/utils/dot/task_graph_writer.rb +0 -34
  83. data/lib/tools/projectWizard.rb +0 -44
  84. data/spec/dir_spec.rb +0 -13
  85. /data/lib/cxxproject/{extensions/rake_dirty_ext.rb → ext/rake_dirty.rb} +0 -0
  86. /data/lib/cxxproject/{extensions/string_ext.rb → ext/string.rb} +0 -0
data/Rakefile.rb CHANGED
@@ -1,69 +1,116 @@
1
- require 'rake/gempackagetask'
2
- begin
3
- require 'roodi'
4
- require 'roodi_task'
5
- rescue LoadError # don't bail out when people do not have roodi installed!
6
- warn "roodi not installed...will not be checked!"
7
- end
8
-
9
- begin
10
- require 'spec/rake/spectask' # old rspec
11
- rescue LoadError
12
- begin
13
- require 'rspec/core/rake_task' # rspec 2.5.x
14
- rescue LoadError
15
- warn "spec not installed...will not be checked!"
16
- end
17
- end
18
-
19
-
1
+ require 'rake/clean'
2
+ require './rake_helper/spec.rb'
20
3
 
21
4
  desc "Default Task"
22
5
  task :default => [:install]
23
6
 
24
- PKG_FILES = FileList[
25
- 'lib/**/*.rb',
26
- 'lib/tools/**/*.template',
27
- 'Rakefile.rb',
28
- 'spec/**/*.rb'
29
- ]
30
7
 
31
- task :gem
32
- spec = Gem::Specification.load('cxx.gemspec')
33
- Rake::GemPackageTask.new(spec)
8
+ begin
9
+ require 'rubygems/package_task'
10
+ spec = Gem::Specification.load('cxx.gemspec')
11
+ Gem::PackageTask.new(spec){|pkg|}
12
+
13
+ desc "install gem globally"
14
+ task :install => [:gem] do
15
+ sh "gem install pkg/#{spec.name}-#{spec.version}.gem"
16
+ end
34
17
 
35
- if self.class.const_defined?(:RoodiTask) then
36
- RoodiTask.new 'roodi', PKG_FILES, 'roodi.yml'
37
- task :gem => [:roodi]
38
- end
39
18
 
40
- # old rspec
41
- if self.class.const_defined?(:SpecTask) then
42
- desc "Run all examples"
43
- Spec::Rake::SpecTask.new() do |t|
44
- t.spec_files = FileList['spec/**/*_spec.rb']
19
+ begin
20
+ require 'rdoc'
21
+ require 'rdoc/task'
22
+ RDoc::Task.new do |rd|
23
+ rd.rdoc_files.include(spec.files)
24
+ end
25
+ rescue LoadError => e
26
+ task :rdoc do
27
+ puts 'please gem install rdoc'
28
+ end
45
29
  end
46
- # task :gem => [:spec]
30
+ begin
31
+ require 'roodi'
32
+ require 'roodi_task'
33
+ class RoodiTask
34
+ def define
35
+ # copied from roodi_task.rb
36
+ desc "Check for design issues in: #{patterns.join(', ')}"
37
+ task name do
38
+ runner = Roodi::Core::Runner.new
39
+ runner.config = config if config
40
+ patterns.each do |pattern|
41
+ Dir.glob(pattern).each { |file| runner.check_file(file) }
42
+ end
43
+ runner.errors.each {|error| puts error}
44
+ # raise "Found #{runner.errors.size} errors." unless runner.errors.empty?
45
+ end
46
+ self
47
+ end
48
+ end
49
+ RoodiTask.new('roodi', spec.files)
50
+ task :gem => [:roodi]
51
+ rescue LoadError # don't bail out when people do not have roodi installed!
52
+ puts 'please gem install roodi'
53
+ end
54
+ rescue LoadError => e
55
+ puts "please missing gems #{e}"
47
56
  end
48
57
 
49
- # new rspec
50
- begin # const_defined? did not work?
51
- desc "Run all examples"
52
- RSpec::Core::RakeTask.new() do |t|
53
- puts Dir.glob 'spec/**/*_spec.rb'
54
- t.pattern = 'spec/**/*_spec.rb'
58
+ def two_digits(x)
59
+ if x.length > 1
60
+ x
61
+ else
62
+ "0#{x}"
55
63
  end
56
- # task :gem => [:spec]
57
- rescue
58
64
  end
59
65
 
60
- desc 'build gem only'
61
- task :gem_only do
62
- sh "gem build cxx.gemspec"
63
- mv FileList["*.gem"], "pkg"
64
- end
66
+ begin
67
+ require 'grit'
68
+ include Grit
65
69
 
66
- desc "install gem globally"
67
- task :install => [:gem] do
68
- sh "gem install pkg/#{spec.name}-#{spec.version}.gem"
70
+ def git_history
71
+ repo = Repo.new('.')
72
+ tag_names = repo.tags.collect {|t| t.name }
73
+ relevant_tags = repo.tags.reject {|t| !t.name.start_with?("v_")}
74
+ sorted_tags = relevant_tags.sort_by.each do |t|
75
+ /v_(?<x>\d+)\.(?<y>\d+)\.(?<z>\d+)/ =~ t.name
76
+ "#{two_digits(x)}-#{two_digits(y)}-#{two_digits(z)}"
77
+ end
78
+
79
+ change_text = []
80
+ zipped = sorted_tags[0..-2].zip(sorted_tags[1..-1])
81
+ zipped.reverse.each do |a,b|
82
+ change_text << ""
83
+ change_text << "#{a.name} => #{b.name}"
84
+ change_text << ""
85
+ cs = repo.commits_between(a.commit, b.commit)
86
+ cm = cs.each do |c|
87
+ change_lines = c.message.lines.to_a
88
+ first = change_lines.first
89
+ change_text << " * " + first + "#{change_lines[1..-1].collect {|l| " #{l}"}.join("")}"
90
+ end
91
+ end
92
+ change_text
93
+ end
94
+
95
+ desc 'generate version history'
96
+ task :generate_history do
97
+ puts git_history
98
+ end
99
+
100
+ desc 'generate and update version history'
101
+ task :update_version_history do
102
+ change_line = "## Change History:"
103
+ readme = 'README.md'
104
+ content = File.read(readme)
105
+ File.open(readme, 'w') do |f|
106
+ f.puts content.gsub(/^#{change_line}.*/m, ([change_line] << git_history).join("\n"))
107
+ end
108
+ end
109
+
110
+ rescue LoadError => e
111
+ puts 'to build the version history please gem install grit'
69
112
  end
113
+
114
+
115
+ require './rake_helper/perftools'
116
+
data/bin/cxx CHANGED
@@ -1,10 +1,10 @@
1
- #!/usr/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
  $:.unshift File.join(File.dirname(__FILE__),"..","lib")
3
3
 
4
- require 'tools/projectWizard'
4
+ require 'tools/project_wizard'
5
5
 
6
- if ARGV.size < 1
7
- puts "usage: cxx project-dir"
6
+ if ARGV.size < 1
7
+ puts "usage: cxx project-dir"
8
8
  exit 0
9
9
  end
10
10
  prepare_project(ARGV[0])
@@ -1,16 +1,39 @@
1
1
  require 'cxxproject/buildingblocks/building_block'
2
2
  require 'cxxproject/buildingblocks/has_libraries_mixin'
3
+ require 'cxxproject/buildingblocks/has_includes_mixin'
3
4
 
4
- class BinaryLibrary < BuildingBlock
5
- include HasLibraries
5
+ module Cxxproject
6
6
 
7
- def initialize(name)
8
- super(name)
9
- libs_to_search << name
10
- end
7
+ class BinaryLibrary < BuildingBlock
8
+ include HasLibraries
9
+ include HasIncludes
11
10
 
12
- def get_task_name()
13
- libs_to_search[0]
14
- end
11
+ def initialize(name, useNameAsLib = true)
12
+ super(name)
13
+ if useNameAsLib
14
+ @useNameAsLib = name
15
+ add_lib_element(HasLibraries::LIB, name, true)
16
+ else
17
+ @useNameAsLib = nil
18
+ end
19
+ end
20
+
21
+ def get_task_name()
22
+ return @useNameAsLib if @useNameAsLib
23
+ @name
24
+ end
15
25
 
26
+
27
+ def convert_to_rake()
28
+ res = task get_task_name
29
+ def res.needed?
30
+ return false
31
+ end
32
+ res.transparent_timestamp = true
33
+ res.type = Rake::Task::BINARY
34
+ setup_rake_dependencies(res)
35
+ res
36
+ end
37
+
38
+ end
16
39
  end
@@ -1,93 +1,239 @@
1
1
  require 'cxxproject/buildingblocks/has_dependencies_mixin'
2
- require 'cxxproject/utils/dot/graph_writer'
2
+ require 'cxxproject/utils/exit_helper'
3
+ require 'cxxproject/ext/rake'
4
+ require 'cxxproject/ext/file'
5
+ require 'cxxproject/ide_interface'
6
+ require 'cxxproject/utils/printer'
3
7
 
4
- # stores all defined buildingblocks by name (the name should be unique)
5
- ALL_BUILDING_BLOCKS = {}
8
+ # no deprecated warning for rake >= 0.9.x
9
+ include Rake::DSL if defined?(Rake::DSL)
10
+ module Cxxproject
6
11
 
7
- class BuildingBlock
8
- include HasDependencies
12
+ # stores all defined buildingblocks by name (the name should be unique)
13
+ ALL_BUILDING_BLOCKS = {}
9
14
 
10
- attr_reader :name
11
- attr_reader :graph_name
12
- attr_reader :config_files
13
- attr_reader :project_dir
14
- attr_reader :output_dir
15
- attr_reader :complete_output_dir
16
-
17
- def set_name(x)
18
- @name = x
19
- self
15
+ trap("INT") do
16
+ Rake.application.idei.set_abort(true)
20
17
  end
21
18
 
22
- def set_tcs(x)
23
- @tcs = x
24
- self
25
- end
26
-
27
- def has_tcs?
28
- @tcs != nil
29
- end
19
+ class BuildingBlock
20
+ include HasDependencies
30
21
 
31
- def tcs()
32
- raise "Toolchain settings must be set before!" if @tcs.nil?
33
- @tcs
34
- end
22
+ attr_reader :name
23
+ attr_reader :config_name
24
+ attr_reader :config_files
35
25
 
36
- def set_config_files(x)
37
- @config_files = x
38
- self
39
- end
26
+ attr_reader :project_dir
27
+ attr_accessor :output_dir
28
+ attr_accessor :pre_step
29
+ attr_reader :output_dir_abs
40
30
 
41
- def set_project_dir(x)
42
- @project_dir = x
43
- calc_complete_output_dir
44
- self
45
- end
31
+ def set_name(x)
32
+ @name = x
33
+ self
34
+ end
46
35
 
47
- # if output dir is absolute, -L and -l is used for linker ("linux mode")
48
- def set_output_dir(x)
49
- @output_dir = x
50
- @output_dir_abs = File.is_absolute?(@output_dir)
51
- calc_complete_output_dir
52
- self
53
- end
36
+ def set_tcs(x)
37
+ @tcs = x
38
+ self
39
+ end
54
40
 
55
- def calc_complete_output_dir
56
- if @output_dir_abs
57
- @complete_output_dir = @output_dir
58
- else
59
- @complete_output_dir = @project_dir + "/" + @output_dir
41
+ def has_tcs?
42
+ @tcs != nil
60
43
  end
61
- end
62
44
 
63
- def set_graph_name(x)
64
- @graph_name = x
65
- self
66
- end
45
+ def tcs()
46
+ raise "Toolchain settings must be set before!" if @tcs.nil?
47
+ @tcs
48
+ end
67
49
 
68
- def initialize(name)
69
- @name = name
70
- @graph_name = name
71
- @config_files = []
72
- @project_dir = "."
73
- @output_dir = "."
74
- @complete_output_dir = "."
75
- @tcs = nil
76
- @output_dir_abs = false
77
-
78
- begin
79
- raise "building block already exists: #{name}" if ALL_BUILDING_BLOCKS.include?@name
80
- ALL_BUILDING_BLOCKS[@name] = self
81
- rescue Exception => e
82
- puts e
50
+ def set_config_files(x)
51
+ @config_files = x
52
+ @config_date = Time.now
53
+ self
83
54
  end
84
- end
85
55
 
86
- def complete_init()
87
- end
56
+ def set_project_dir(x)
57
+ @project_dir = File.expand_path(x)
58
+ if @output_dir_abs
59
+ @output_dir_relPath = File.rel_from_to_project(@project_dir, @output_dir)
60
+ end
61
+ self
62
+ end
88
63
 
89
- def get_task_name()
90
- raise "this method must be implemented by decendants"
91
- end
64
+ # if output dir is absolute, -L and -l is used for linker ("linux mode")
65
+ def set_output_dir(x)
66
+ return self if @output_dir
67
+
68
+ @output_dir = x
69
+ @output_dir_abs = File.is_absolute?(@output_dir)
70
+ if @project_dir
71
+ @output_dir_relPath = File.rel_from_to_project(@project_dir, @output_dir)
72
+ end
73
+ self
74
+ end
75
+
76
+ def complete_output_dir
77
+ @complete_output_dir ||= calc_complete_output_dir
78
+ end
79
+
80
+ def calc_complete_output_dir
81
+ if @output_dir_abs
82
+ @output_dir
83
+ else
84
+ File.join(@project_dir, @output_dir)
85
+ end
86
+ end
87
+
88
+ def initialize(name)
89
+ @name = name
90
+ @config_name = nil
91
+ @config_files = []
92
+ @config_date = nil
93
+ @project_dir = nil
94
+ @tcs = nil
95
+ @output_dir = nil
96
+ @output_dir_abs = false
97
+ @complete_output_dir = nil
98
+ @pre_step = nil
99
+
100
+ if ALL_BUILDING_BLOCKS.include?(@name) and not self.instance_of?(BinaryLibrary)
101
+ raise "building block already exists: #{name}"
102
+ else
103
+ ALL_BUILDING_BLOCKS[@name] = self
104
+ end
105
+ end
106
+
107
+ def set_config_name(x)
108
+ @config_name = x
109
+ end
110
+
111
+ def complete_init()
112
+ if self.respond_to?(:calc_compiler_strings)
113
+ calc_compiler_strings
114
+ end
115
+ end
116
+
117
+ def get_task_name()
118
+ raise "this method must be implemented by decendants"
119
+ end
120
+
121
+ ##
122
+ # convert all dependencies of a building block to rake task prerequisites (e.g. exe needs lib)
123
+ #
124
+ def setup_rake_dependencies(task, multitask = nil)
125
+ dependencies.reverse_each do |d|
126
+ begin
127
+ bb = ALL_BUILDING_BLOCKS[d]
128
+ raise "Error: tried to add the dependencies of \"#{d}\" to \"#{@name}\" but such a building block could not be found!" unless bb
129
+
130
+ if multitask and bb.pre_step
131
+ multitask.prerequisites.unshift(bb.get_task_name)
132
+ else
133
+ task.prerequisites.unshift(bb.get_task_name)
134
+ end
135
+ rescue ExitHelperException
136
+ raise
137
+ rescue Exception => e
138
+ Printer.printError e.message
139
+ ExitHelper.exit(1)
140
+ end
141
+ end
142
+
143
+ task
144
+ end
145
+
146
+ def add_output_dir_dependency(file, taskOfFile, addDirToCleanTask)
147
+ d = File.dirname(file)
148
+ directory d
149
+ taskOfFile.enhance([d])
150
+
151
+ if addDirToCleanTask
152
+ CLOBBER.include(complete_output_dir)
153
+ if (@output_dir_abs)
154
+ CLEAN.include(file)
155
+ else
156
+ CLEAN.include(complete_output_dir)
157
+ end
158
+ end
159
+ end
160
+
161
+ def process_result(cmd, console_output, error_parser, alternate)
162
+
163
+ hasError = ($?.success? == false)
164
+
165
+ if hasError or RakeFileUtils.verbose or (alternate.nil? and not Rake::application.options.silent)
166
+ exedIn = ""
167
+ exedIn = " (executed in '#{@project_dir}')" if (hasError or RakeFileUtils.verbose)
168
+ if cmd.is_a?(Array)
169
+ puts cmd.join(' ') + exedIn
170
+ else
171
+ puts cmd + exedIn
172
+ end
173
+ else
174
+ puts alternate unless Rake::application.options.silent
175
+ end
176
+
177
+ errorPrinted = process_console_output(console_output, error_parser)
178
+
179
+ if hasError
180
+ if not errorPrinted
181
+ Printer.printError "Error: system command failed"
182
+ res = ErrorDesc.new
183
+ res.file_name = @project_dir
184
+ res.line_number = 0
185
+ res.message = "Unknown error, see log output. Maybe the lake error parser has to be updated..."
186
+ res.severity = ErrorParser::SEVERITY_ERROR
187
+ Rake.application.idei.set_errors([res])
188
+ end
189
+
190
+ raise SystemCommandFailed.new
191
+ end
192
+ end
92
193
 
194
+ def read_file_or_empty_string(filename)
195
+ begin
196
+ return File.read(filename)
197
+ rescue
198
+ return ""
199
+ end
200
+ end
201
+
202
+ def typed_file_task(type, *args, &block)
203
+ t = file *args do
204
+ block.call
205
+ end
206
+ t.type = type
207
+ t.progress_count = 1
208
+ return t
209
+ end
210
+
211
+ def remove_empty_strings_and_join(a, j=' ')
212
+ return a.reject{|e|e.to_s.empty?}.join(j)
213
+ end
214
+
215
+ def catch_output(cmd)
216
+ new_command = "#{cmd} 2>&1"
217
+ # "/" does not work on windows with backticks, switch the separator on windows:
218
+ new_command.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if File::ALT_SEPARATOR
219
+ return `#{new_command}`
220
+ end
221
+
222
+ def check_config_file()
223
+ if @config_date
224
+ @config_files.each do |c|
225
+ err_msg = nil
226
+ if File.exists?(c) and File.mtime(c) > @config_date
227
+ @config_date = File.mtime(c)
228
+ begin
229
+ FileUtils.touch(c)
230
+ rescue Exception
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+
237
+ end
238
+
93
239
  end
@@ -1,30 +1,79 @@
1
1
  require 'cxxproject/buildingblocks/building_block'
2
+ require 'cxxproject/utils/process'
2
3
 
3
- class CommandLine < BuildingBlock
4
+ module Cxxproject
4
5
 
5
- def set_command_line(x)
6
- @line = x
7
- self
8
- end
6
+ class CommandLine < BuildingBlock
9
7
 
10
- def get_command_line
11
- @line
12
- end
8
+ def set_command_line(x)
9
+ @line = x
10
+ self
11
+ end
13
12
 
14
- def get_target
15
- @target
16
- end
13
+ def get_command_line
14
+ @line
15
+ end
17
16
 
18
- @@command_line_num = 0
19
- def initialize(name)
20
- super(name)
21
- @line = name
22
- @@command_line_num = @@command_line_num + 1
23
- @num = @@command_line_num
24
- end
17
+ def set_defined_in_file(x)
18
+ @defined_in_file = x
19
+ self
20
+ end
25
21
 
26
- def get_task_name()
27
- "command line (#{@num}): " + get_command_line
28
- end
22
+ def get_defined_in_file
23
+ @defined_in_file
24
+ end
25
+
26
+ def set_defined_in_line(x)
27
+ @defined_in_line = x
28
+ self
29
+ end
29
30
 
31
+ def get_defined_in_line
32
+ @defined_in_line
33
+ end
34
+
35
+ def initialize(name)
36
+ set_command_line(name)
37
+ @num = Rake.application.command_line_number
38
+ super(get_task_name)
39
+ end
40
+
41
+ def get_task_name()
42
+ "command line (#{@num}): " + get_command_line
43
+ end
44
+
45
+ def convert_to_rake()
46
+ res = task get_task_name do
47
+ Dir.chdir(@project_dir) do
48
+ check_config_file
49
+ cmd = get_command_line
50
+ puts cmd + (RakeFileUtils.verbose ? " (executed in '#{@project_dir}')" : "")
51
+ cmd_result = false
52
+ begin
53
+ cmd_result = ProcessHelper.spawnProcess(cmd + " 2>&1")
54
+ rescue
55
+ end
56
+ if (cmd_result == false)
57
+ if Rake.application.idei
58
+ err_res = ErrorDesc.new
59
+ err_res.file_name = (@defined_in_file ? @defined_in_file : @project_dir)
60
+ err_res.line_number = (@defined_in_line ? @defined_in_line : 0)
61
+ err_res.severity = ErrorParser::SEVERITY_ERROR
62
+ err_res.message = "Command \"#{get_command_line}\" failed"
63
+ Rake.application.idei.set_errors([err_res])
64
+ end
65
+ Printer.printError "Error: command \"#{get_command_line}\" failed" + (RakeFileUtils.verbose ? "" : " (executed in '#{@project_dir}')")
66
+ raise SystemCommandFailed.new
67
+ end
68
+ end
69
+ end
70
+ res.immediate_output = true
71
+ res.transparent_timestamp = true
72
+ res.type = Rake::Task::COMMANDLINE
73
+ setup_rake_dependencies(res)
74
+ res
75
+ end
76
+
77
+
78
+ end
30
79
  end
@@ -1,17 +1,41 @@
1
1
  require 'cxxproject/buildingblocks/building_block'
2
2
 
3
3
  # todo...
4
+ module Cxxproject
4
5
 
5
- class CustomBuildingBlock < BuildingBlock
6
- attr_reader :custom_command
6
+ class CustomBuildingBlock < BuildingBlock
7
+ attr_reader :custom_command, :actions
7
8
 
8
- def set_custom_command(c)
9
- @custom_command = c
10
- self
11
- end
9
+ def set_custom_command(c)
10
+ @custom_command = c
11
+ self
12
+ end
12
13
 
13
- def get_task_name()
14
- raise "todo"
15
- end
14
+ def get_task_name()
15
+ name
16
+ end
17
+
18
+ def set_actions(actions)
19
+ if actions.kind_of?(Array)
20
+ @actions = actions
21
+ else
22
+ @actions = [actions]
23
+ end
24
+ end
25
+
26
+ def convert_to_rake()
27
+ desc get_task_name
28
+ res = task get_task_name do
29
+ actions.each do |a|
30
+ a.call
31
+ end
32
+ end
33
+ res.type = Rake::Task::CUSTOM
34
+ setup_rake_dependencies(res)
35
+ res
36
+ end
16
37
 
38
+
39
+
40
+ end
17
41
  end