cxxproject 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,23 @@
1
+
2
+ module Cxxproject
3
+ module Context
4
+
5
+ def check_hash(hash,allowed)
6
+ hash.keys.map do |k|
7
+ error_string = ["error while evaluating \"#{@current_working_dir}/#{@current_project_file}\"",
8
+ "\"#{k}\" is not a valid specifier!",
9
+ "allowd specifiers: #{allowed}"].join($/)
10
+ raise error_string unless allowed.include?(k)
11
+ end
12
+ end
13
+
14
+ def get_as_array(hash, s)
15
+ res = hash[s]
16
+ if res.is_a?(Array)
17
+ return res
18
+ end
19
+ return [res]
20
+ end
21
+
22
+ end
23
+ end
@@ -1,3 +1,4 @@
1
+ require 'cxxproject/context'
1
2
 
2
3
  module Cxxproject
3
4
  class BinaryLibs
@@ -13,13 +14,14 @@ module Cxxproject
13
14
  end
14
15
 
15
16
  class EvalContext
17
+ include Context
16
18
 
17
- attr_accessor :myblock, :all_blocks
19
+ attr_accessor :all_blocks
18
20
 
19
21
  # must be called to add building blocks
20
22
  def cxx_configuration(&block)
21
- @myblock = block
22
23
  @all_blocks = []
24
+ block.call
23
25
  end
24
26
 
25
27
  def eval_project(project_text, project_file, pwd)
@@ -28,28 +30,6 @@ module Cxxproject
28
30
  instance_eval(project_text)
29
31
  end
30
32
 
31
- def configuration(*args, &block)
32
- name = args[0]
33
- raise "no name given" unless name.is_a?(String) && !name.strip.empty?
34
- instance_eval(&block)
35
- end
36
-
37
- def check_hash(hash,allowed)
38
- hash.keys.map do |k|
39
- error_string = ["error while evaluating \"#{@current_working_dir}/#{@current_project_file}\"",
40
- "\"#{k}\" is not a valid specifier!"].join($/)
41
- raise error_string unless allowed.include?(k)
42
- end
43
- end
44
-
45
- def get_as_array(hash, s)
46
- res = hash[s]
47
- if res.is_a?(Array)
48
- return res
49
- end
50
- return [res]
51
- end
52
-
53
33
  # specify an executable
54
34
  # hash supports:
55
35
  # * :sources
@@ -59,7 +39,7 @@ module Cxxproject
59
39
  # * :output_dir
60
40
  def exe(name, hash)
61
41
  raise "not a hash" unless hash.is_a?(Hash)
62
- check_hash hash,[:sources,:includes,:dependencies,:libpath,:output_dir]
42
+ check_hash(hash,[:sources,:includes,:dependencies,:libpath,:output_dir])
63
43
  bblock = Executable.new(name)
64
44
  bblock.set_sources(hash[:sources]) if hash.has_key?(:sources)
65
45
  bblock.set_includes(get_as_array(hash, :includes)) if hash.has_key?(:includes)
@@ -94,7 +74,7 @@ module Cxxproject
94
74
  # * :output_dir
95
75
  def source_lib(name, hash)
96
76
  raise "not a hash" unless hash.is_a?(Hash)
97
- check_hash hash,[:sources, :includes, :dependencies, :toolchain, :file_dependencies, :output_dir]
77
+ check_hash(hash,[:sources, :includes, :dependencies, :toolchain, :file_dependencies, :output_dir])
98
78
  raise ":sources need to be defined" unless hash.has_key?(:sources)
99
79
  bblock = SourceLibrary.new(name)
100
80
  bblock.set_sources(hash[:sources])
@@ -122,7 +102,7 @@ module Cxxproject
122
102
 
123
103
  def compile(name, hash)
124
104
  raise "not a hash" unless hash.is_a?(Hash)
125
- check_hash hash,[:sources,:includes]
105
+ check_hash(hash,[:sources,:includes])
126
106
  bblock = SingleSource.new(name)
127
107
  bblock.set_sources(hash[:sources]) if hash.has_key?(:sources)
128
108
  bblock.set_includes(hash[:includes]) if hash.has_key?(:includes)
@@ -131,7 +111,7 @@ module Cxxproject
131
111
 
132
112
  def custom(name, hash)
133
113
  raise "not a hash" unless hash.is_a?(Hash)
134
- check_hash hash,[:execute, :dependencies]
114
+ check_hash(hash,[:execute, :dependencies])
135
115
  bblock = CustomBuildingBlock.new(name)
136
116
  bblock.set_actions(hash[:execute]) if hash.has_key?(:execute)
137
117
  if hash.has_key?(:dependencies)
@@ -0,0 +1,132 @@
1
+ require 'cxxproject/context'
2
+ require 'cxxproject/toolchain/provider'
3
+
4
+ module Cxxproject
5
+ # context in which plugins are evaluated
6
+ # a cxx_plugin is a gem that:
7
+ # - follows the naming convention cxxplugin_name
8
+ # - that has a plugin.rb file in lib and
9
+ # - that calls cxx_plugin
10
+ #
11
+ # the context contains
12
+ # - @cxxproject2rake
13
+ # - @building_blocks
14
+ # - @log
15
+ class PluginContext
16
+ include Context
17
+
18
+ def initialize(cxxproject2rake, building_blocks, log)
19
+ @cxxproject2rake = cxxproject2rake
20
+ @building_blocks = building_blocks
21
+ @log = log
22
+ end
23
+
24
+ # method for plugins to get the
25
+ # cxxproject2rake
26
+ # building_blocks
27
+ # log
28
+ def cxx_plugin(&blk)
29
+ blk.call(@cxxproject2rake, @building_blocks, @log)
30
+ end
31
+
32
+ # specify a toolchain
33
+ # hash supports:
34
+ # * :command
35
+ def toolchain(name, tc)
36
+ raise "not a tc" unless tc.is_a?(Hash)
37
+ check_hash(tc,Provider.default.keys)
38
+ check_compiler(tc[:COMPILER]) if tc[:COMPILER]
39
+ check_linker(tc[:LINKER]) if tc[:LINKER]
40
+ check_archiver(tc[:ARCHIVER]) if tc[:ARCHIVER]
41
+ PluginContext::expand(tc)
42
+ Provider.add(name)
43
+ Provider.merge(Provider[name], tc)
44
+ end
45
+
46
+ def self.expand(toolchain)
47
+ to_expand = nil
48
+ from = nil
49
+ while (needs_expansion(toolchain)) do
50
+ to_expand = find_toolchain_subhash(toolchain)
51
+ from = find_toolchain_element(toolchain,to_expand[:BASED_ON])
52
+ to_expand.delete(:BASED_ON)
53
+ Cxxproject::Toolchain::Provider.merge(to_expand,from,false)
54
+ end
55
+ return toolchain
56
+ end
57
+
58
+ def self.needs_expansion(tc)
59
+ res = false
60
+ tc.each do |k,v|
61
+ if k == :BASED_ON
62
+ res = true
63
+ elsif v.is_a?(Hash)
64
+ res = needs_expansion(v)
65
+ end
66
+ if res
67
+ break
68
+ end
69
+ end
70
+ return res
71
+ end
72
+
73
+ def self.find_toolchain_subhash(tc)
74
+ res = []
75
+ loop = lambda do |res,tc|
76
+ tc.each do |k,v|
77
+ if(k == :BASED_ON)
78
+ res << tc
79
+ elsif v.is_a?(Hash)
80
+ loop.call(res,v)
81
+ end
82
+ end
83
+ end
84
+ loop.call(res,tc)
85
+ return res[0] if res.length > 0
86
+ end
87
+
88
+
89
+ def self.find_toolchain_element(tc,name)
90
+ res = []
91
+ loop = lambda do |res,tc,name|
92
+ tc.each do |k,v|
93
+ if k == name
94
+ res << v
95
+ elsif v.is_a?(Hash)
96
+ loop.call(res,v,name)
97
+ end
98
+ end
99
+ end
100
+ loop.call(res,tc,name)
101
+ return res[0] if res.length > 0
102
+ end
103
+
104
+
105
+ def check_compiler(hash)
106
+ raise "not a hash" unless hash.is_a?(Hash)
107
+ check_hash(hash,Provider.default[:COMPILER].keys)
108
+
109
+ check_hash(hash[:CPP],Provider.default[:COMPILER][:CPP].keys << :BASED_ON) if hash[:CPP]
110
+ check_hash(hash[:C],Provider.default[:COMPILER][:C].keys << :BASED_ON) if hash[:C]
111
+ check_hash(hash[:ASM],Provider.default[:COMPILER][:ASM].keys << :BASED_ON) if hash[:ASM]
112
+ end
113
+
114
+ def check_linker(hash)
115
+ raise "not a hash" unless hash.is_a?(Hash)
116
+ check_hash(hash,Provider.default[:LINKER].keys)
117
+ end
118
+
119
+ def check_archiver(hash)
120
+ raise "not a hash" unless hash.is_a?(Hash)
121
+ check_hash(hash,Provider.default[:ARCHIVER].keys)
122
+ end
123
+
124
+ # will use the content of the plugin.rb file and evaluate it
125
+ # this will in turn result in a call to cxx_plugin
126
+ def eval_plugin(plugin_text)
127
+ instance_eval(plugin_text)
128
+ end
129
+
130
+ end
131
+
132
+ end
@@ -18,7 +18,7 @@ module Cxxproject
18
18
  :FLAGS => "",
19
19
  :SOURCE_FILE_ENDINGS => [".cxx", ".cpp", ".c++", ".cc", ".C"],
20
20
  :DEP_FLAGS => "",
21
- :DEP_FLAGS => true,
21
+ :DEP_FLAGS_SPACE => false,
22
22
  :ERROR_PARSER => nil,
23
23
  :PREPRO_FLAGS => ""
24
24
  },
@@ -32,6 +32,7 @@ module Cxxproject
32
32
  :FLAGS => "",
33
33
  :SOURCE_FILE_ENDINGS => [".c"],
34
34
  :DEP_FLAGS => "",
35
+ :DEP_FLAGS_SPACE => false,
35
36
  :ERROR_PARSER => nil,
36
37
  :PREPRO_FLAGS => ""
37
38
  },
@@ -93,12 +94,35 @@ module Cxxproject
93
94
  chain
94
95
  end
95
96
 
97
+ # merge hashB into hashA
98
+ # recurse on sub-hash-structures
99
+ # elements present in hashA only will be taken from hashA
100
+ # elements present in hashB only will be taken from hashB
101
+ # elements present in both will be taken from hashB
102
+ #
103
+ def self.merge(hashA,hashB,overwrite=true)
104
+ missingKeys = hashB.keys - hashA.keys
105
+ missingKeys.each do |k|
106
+ hashA[k] = hashB[k]
107
+ end
108
+ hashA.each do |k,v|
109
+ if v.is_a? Hash
110
+ merge(v,hashB[k],overwrite) if hashB[k]
111
+ else
112
+ hashA[k] = hashB[k] if hashB[k] and overwrite
113
+ end
114
+ end
115
+ hashA
116
+ end
117
+
96
118
  def self.default
97
119
  @@default
98
120
  end
99
121
 
100
122
  def self.modify_cpp_compiler(based_on, h)
101
- chain = Marshal.load(Marshal.dump(@@settings[based_on]))
123
+ # chain = Marshal.load(Marshal.dump(@@settings[based_on]))
124
+ chain = @@settings[based_on]
125
+ raise "unknown toolchain: #{based_on}" unless chain
102
126
  chain[:COMPILER][:CPP].update(h)
103
127
  chain
104
128
  end
@@ -125,7 +149,3 @@ module Cxxproject
125
149
  end
126
150
  end
127
151
 
128
- require 'cxxproject/toolchain/diab'
129
- require 'cxxproject/toolchain/gcc'
130
- require 'cxxproject/toolchain/clang'
131
- require 'cxxproject/toolchain/ti'
@@ -12,76 +12,35 @@ require 'cxxproject/buildingblocks/custom_building_block'
12
12
  require 'cxxproject/buildingblocks/command_line'
13
13
  require 'cxxproject/toolchain/colorizing_formatter'
14
14
  require 'cxxproject/eval_context'
15
+ require 'cxxproject/plugin_context'
15
16
 
16
17
  require 'rubygems'
17
18
 
18
19
  module Cxxproject
19
20
 
20
- # context in which plugins are evaluated
21
- # a cxx_plugin is a gem that:
22
- # - follows the naming convention cxxplugin_name
23
- # - that has a plugin.rb file in lib and
24
- # - that calls cxx_plugin
25
- #
26
- # the context contains
27
- # - @cxxproject2rake
28
- # - @building_blocks
29
- # - @log
30
- class PluginContext
31
- def initialize(cxxproject2rake, building_blocks, log)
32
- @cxxproject2rake = cxxproject2rake
33
- @building_blocks = building_blocks
34
- @log = log
35
- end
36
- def load_plugin(gem)
37
- path = File.join(gem.full_gem_path, 'lib', 'plugin.rb')
38
- content = File.read(path)
39
- instance_eval(content)
40
- end
41
-
42
- # method for plugins to get the
43
- # cxxproject2rake
44
- # building_blocks
45
- # log
46
- def cxx_plugin(&blk)
47
- blk.call(@cxxproject2rake, @building_blocks, @log)
48
- end
49
- end
50
-
51
21
  class CxxProject2Rake
52
22
  attr_accessor :base, :all_tasks
53
- def load_cxx_plugins
54
- prefix = 'cxxproject_'
55
- gems_to_load = Gem::Specification.find_all do |gem|
56
- gem.name.index(prefix)
57
- end
58
- gems_to_load.each do |gem|
59
- context = PluginContext.new(self, ALL_BUILDING_BLOCKS, @log)
60
- context.load_plugin(gem)
61
- end
62
- end
63
23
 
64
- def initialize(projects, build_dir, toolchain, base='.')
24
+ def initialize(projects, build_dir, toolchain_name, base='.')
25
+ load_cxx_plugins
26
+ toolchain = Provider[toolchain_name]
27
+ raise "no provider with name \"#{toolchain_name}\" found" unless toolchain
65
28
  @base = base
66
29
  cd(@base, :verbose => false) do
67
30
  @projects = projects.to_a
68
31
  end
69
- @build_dir = build_dir
70
- @toolchain = toolchain
71
- @rel_projects = @projects#.map { |p| File.join(@base, p) }
72
32
 
73
33
  # TODO: this should be cleaned up somehow...
74
- if Utils::OS.linux?
75
- toolchain[:LINKER][:LIB_PREFIX_FLAGS] = "-Wl,--whole-archive"
76
- toolchain[:LINKER][:LIB_POSTFIX_FLAGS] = "-Wl,--no-whole-archive"
77
- end
34
+ # if Utils::OS.linux?
35
+ # toolchain[:LINKER][:LIB_PREFIX_FLAGS] = "-Wl,--whole-archive"
36
+ # toolchain[:LINKER][:LIB_POSTFIX_FLAGS] = "-Wl,--no-whole-archive"
37
+ # end
78
38
 
79
39
  Rake::application.deriveIncludes = true
80
40
 
81
- initialize_logging
82
- @all_tasks = instantiate_tasks
41
+ initialize_logging(build_dir)
42
+ @all_tasks = instantiate_tasks(toolchain, build_dir)
83
43
 
84
- load_cxx_plugins
85
44
 
86
45
  create_generic_tasks
87
46
  create_console_colorization
@@ -91,11 +50,33 @@ module Cxxproject
91
50
  create_console_task
92
51
  end
93
52
 
53
+ def load_cxx_plugins
54
+ prefix = 'cxxproject_'
55
+ gems_to_load = Gem::Specification.find_all do |gem|
56
+ gem.name.index(prefix)
57
+ end
58
+ context = PluginContext.new(self, ALL_BUILDING_BLOCKS, @log)
59
+ gems_to_load.each do |gem|
60
+ load_plugin(gem, context)
61
+ end
62
+ end
63
+
64
+ def load_plugin(gem, pluginContext)
65
+ begin
66
+ path = File.join(gem.full_gem_path, 'lib', 'plugin.rb')
67
+ content = File.read(path)
68
+ pluginContext.eval_plugin(content)
69
+ rescue Exception => e
70
+ puts "problems with gem #{gem} in dir: #{path}: #{e}"
71
+ raise e
72
+ end
73
+ end
74
+
94
75
  def create_console_task
95
76
  require 'cxxproject/utils/console'
96
77
  end
97
78
 
98
- def initialize_logging
79
+ def initialize_logging(build_dir)
99
80
  @log = Logger.new(STDOUT)
100
81
  @log.formatter = proc { |severity, datetime, progname, msg|
101
82
  "#{severity}: #{msg}\n"
@@ -106,7 +87,7 @@ module Cxxproject
106
87
  @log.level = Logger::ERROR
107
88
  @log.level = Logger::INFO if RakeFileUtils.verbose == true
108
89
  @log.level = Logger::DEBUG if Rake::application.options.trace
109
- @log.debug "initializing for build_dir: \"#{@build_dir}\", base: \"#{@base}\""
90
+ @log.debug "initializing for build_dir: \"#{build_dir}\", base: \"#{@base}\""
110
91
  end
111
92
  def describe_clean_task
112
93
  Rake::Task[:clean].add_description('clean')
@@ -176,7 +157,7 @@ module Cxxproject
176
157
  end
177
158
  end
178
159
 
179
- def instantiate_tasks
160
+ def instantiate_tasks(toolchain, build_dir)
180
161
  check_for_project_configs
181
162
 
182
163
  if @log.debug?
@@ -185,7 +166,7 @@ module Cxxproject
185
166
  end
186
167
  register_projects()
187
168
  ALL_BUILDING_BLOCKS.values.each do |block|
188
- prepare_block(block)
169
+ prepare_block(block, toolchain, build_dir)
189
170
  end
190
171
  ALL_BUILDING_BLOCKS.values.inject([]) do |memo,block|
191
172
  @log.debug "creating tasks for block: #{block.name}/taskname: #{block.get_task_name} (#{block})"
@@ -201,9 +182,9 @@ module Cxxproject
201
182
  end
202
183
  end
203
184
 
204
- def prepare_block(block)
205
- block.set_tcs(@toolchain) unless block.has_tcs?
206
- block.set_output_dir(Dir.pwd + "/" + @build_dir)
185
+ def prepare_block(block, toolchain, build_dir)
186
+ block.set_tcs(toolchain) unless block.has_tcs?
187
+ block.set_output_dir(Dir.pwd + "/" + build_dir)
207
188
  block.complete_init()
208
189
  end
209
190
 
@@ -228,13 +209,6 @@ module Cxxproject
228
209
  puts "problems with #{File.join(b, project_file)} in dir: #{Dir.pwd}"
229
210
  raise e
230
211
  end
231
- begin
232
- loadContext.myblock.call()
233
- rescue Exception => e
234
- error_string = "error while evaluating \"#{Dir.pwd}/#{project_file}\""
235
- puts error_string
236
- raise e
237
- end
238
212
 
239
213
  loadContext.all_blocks.each do |block|
240
214
  block.
@@ -248,7 +222,6 @@ module Cxxproject
248
222
  def define_project_info_task
249
223
  desc "shows your defined projects"
250
224
  task :project_info do
251
- p "ProjectBase: #{@base}"
252
225
  ALL_BUILDING_BLOCKS.each_value do |bb|
253
226
  pp bb
254
227
  end
@@ -1,7 +1,7 @@
1
1
  module Cxxproject
2
2
  class Version
3
3
  def self.cxxproject
4
- "0.6.1"
4
+ "0.6.2"
5
5
  end
6
6
  end
7
7
  end
data/lib/cxxproject.rb CHANGED
@@ -17,7 +17,12 @@ require 'cxxproject/utils/rbcurse'
17
17
  require 'cxxproject/utils/progress'
18
18
  require 'cxxproject/utils/rbcurse'
19
19
  require 'cxxproject/utils/stats'
20
+ require 'cxxproject/version'
20
21
 
21
22
  include Cxxproject::Toolchain
22
23
  CxxProject2Rake = Cxxproject::CxxProject2Rake
23
24
  BinaryLibs = Cxxproject::BinaryLibs
25
+
26
+ def version_info
27
+ Cxxproject::Version.cxxproject
28
+ end
@@ -38,9 +38,10 @@ describe Cxxproject::BuildingBlock do
38
38
  lib2 = Cxxproject::SourceLibrary.new('lib2').set_sources(['test.cc']).set_output_dir('build2')
39
39
  lib2.set_project_dir(File.join(Dir.pwd, 'lib2'))
40
40
 
41
- cxx = CxxProject2Rake.new([], 'build', GCCChain)
42
- cxx.prepare_block(lib1)
43
- cxx.prepare_block(lib2)
41
+ cxx = CxxProject2Rake.new([], 'build', "clang")
42
+
43
+ cxx.prepare_block(lib1, Provider["clang"], "build")
44
+ cxx.prepare_block(lib2, Provider["clang"], "build")
44
45
 
45
46
  lib1.complete_output_dir.should eq(File.join(Dir.pwd, 'build'))
46
47
  lib2.complete_output_dir.should eq(File.join(Dir.pwd, 'lib2', 'build2'))
@@ -49,7 +50,7 @@ describe Cxxproject::BuildingBlock do
49
50
  it 'should raise exception if building block cannot be resolved' do
50
51
  expect do
51
52
  lib1 = Cxxproject::SourceLibrary.new('1').set_dependencies(['unresolved'])
52
- cxx = CxxProject2Rake.new([], 'build', GCCChain)
53
+ cxx = CxxProject2Rake.new([], 'build', "clang")
53
54
  end.to raise_exception(RuntimeError, 'Error: while reading config file for 1: dependent building block "unresolved" was specified but not found!')
54
55
  end
55
56
 
@@ -66,7 +66,7 @@ end
66
66
  def fresh_cxx
67
67
  Cxxproject::Utils.cleanup_rake
68
68
  outputdir = 'output'
69
- CxxProject2Rake.new(Dir.glob('**/project.rb'), outputdir, GCCChain)
69
+ CxxProject2Rake.new(Dir.glob('**/project.rb'), outputdir, "clang")
70
70
  end
71
71
 
72
72
  def cleanup
@@ -17,7 +17,7 @@ describe Rake::Task do
17
17
  file 'test.cc' => 'compiler'
18
18
  File.delete('test.cc') if File.exists?('test.cc')
19
19
  sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
20
- cxx = CxxProject2Rake.new([], 'build', GCCChain)
20
+ cxx = CxxProject2Rake.new([], 'build', "clang")
21
21
 
22
22
  task = Rake::application['lib:testlib']
23
23
  task.invoke
@@ -35,7 +35,7 @@ describe Rake::Task do
35
35
  end
36
36
 
37
37
  sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
38
- CxxProject2Rake.new([], 'build', GCCChain)
38
+ CxxProject2Rake.new([], 'build', "clang")
39
39
 
40
40
  task = Rake::application['lib:testlib']
41
41
  task.invoke
@@ -48,7 +48,7 @@ describe Rake::Task do
48
48
  end
49
49
 
50
50
  sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
51
- CxxProject2Rake.new([], 'build', GCCChain)
51
+ CxxProject2Rake.new([], 'build', "clang")
52
52
 
53
53
  task = Rake::application['build/libs/libtestlib.a']
54
54
  task.invoke
@@ -69,7 +69,7 @@ describe Rake::Task do
69
69
  end
70
70
 
71
71
  sl = Cxxproject::SourceLibrary.new('testlib').set_sources(['test.cc']).set_project_dir(".")
72
- CxxProject2Rake.new([], 'build', GCCChain)
72
+ CxxProject2Rake.new([], 'build', "clang")
73
73
 
74
74
  task = Rake::application['build/libs/libtestlib.a']
75
75
  task.invoke
@@ -0,0 +1,57 @@
1
+ require 'cxxproject/plugin_context'
2
+
3
+
4
+ describe Cxxproject::PluginContext do
5
+ it "should copy cpp settings to c settings" do
6
+ toolchain = {:COMPILER => {
7
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
8
+ :C => { :BASED_ON => :CPP, :COMMAND => "clang" }
9
+ }}
10
+ expected = {:COMPILER => {
11
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
12
+ :C => { :DEFINE_FLAG => "-D", :COMMAND => "clang" }
13
+ }}
14
+ Cxxproject::PluginContext.expand(toolchain).should == expected
15
+ end
16
+
17
+ it "should fully resolve all :BASED_ON sections" do
18
+ toolchain = {:COMPILER => {
19
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
20
+ :C => { :BASED_ON => :CPP, :COMMAND => "clang" },
21
+ :ASM => { :BASED_ON => :C }
22
+ }}
23
+ expected = {:COMPILER => {
24
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
25
+ :C => { :DEFINE_FLAG => "-D", :COMMAND => "clang" },
26
+ :ASM => { :DEFINE_FLAG => "-D", :COMMAND => "clang" }
27
+ }}
28
+ Cxxproject::PluginContext.expand(toolchain).should == expected
29
+ end
30
+
31
+ it "should find out if extension is needed" do
32
+ toolchain = {:COMPILER => {
33
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
34
+ :C => { :BASED_ON => :CPP, :COMMAND => "clang" } }}
35
+ toolchain2 = {:COMPILER => {
36
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
37
+ :C => { :COMMAND => "clang" } }}
38
+ Cxxproject::PluginContext.needs_expansion(toolchain).should == true
39
+ Cxxproject::PluginContext.needs_expansion(toolchain2).should == false
40
+ end
41
+
42
+ it "should find a toolchain to expand" do
43
+ toolchain = {:COMPILER => {
44
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
45
+ :C => { :BASED_ON => :CPP, :COMMAND => "clang" }
46
+ }}
47
+ Cxxproject::PluginContext.find_toolchain_subhash(toolchain).should == toolchain[:COMPILER][:C]
48
+ end
49
+
50
+ it "should find a toolchain element by name" do
51
+ toolchain = {:COMPILER => {
52
+ :CPP => { :DEFINE_FLAG => "-D", :COMMAND => "clang++" },
53
+ :C => { :BASED_ON => :CPP, :COMMAND => "clang" }
54
+ }}
55
+ Cxxproject::PluginContext.find_toolchain_element(toolchain, :CPP).should == toolchain[:COMPILER][:CPP]
56
+ end
57
+ end
@@ -18,7 +18,7 @@ describe CxxProject2Rake do
18
18
  cd base do # have to be relative to base
19
19
  project_configs = Dir.glob('**/project.rb')
20
20
  end
21
- CxxProject2Rake.new(project_configs, outputdir, GCCChain, base)
21
+ CxxProject2Rake.new(project_configs, outputdir, "clang", base)
22
22
  end
23
23
 
24
24
 
@@ -0,0 +1,39 @@
1
+ require 'rspec'
2
+ require 'cxxproject/toolchain/provider'
3
+
4
+ describe Cxxproject::Toolchain::Provider do
5
+
6
+ it 'should merge without overwrite' do
7
+ cpp = { :DEFINE_FLAG => "-D", :COMMAND => "clang++" }
8
+ c = { :COMMAND => "clang" }
9
+ expected = { :DEFINE_FLAG => "-D", :COMMAND => "clang" }
10
+ Cxxproject::Toolchain::Provider.merge(c, cpp, false).should == expected
11
+ end
12
+
13
+ it 'should merge two simple hashes' do
14
+ hashA = { :a => 1, :b => 2 }
15
+ hashB = { :a => 3, :c => 2 }
16
+ merged = Cxxproject::Toolchain::Provider.merge(hashA, hashB)
17
+ merged.should == { :a => 3, :b => 2, :c => 2 }
18
+ end
19
+
20
+ it 'should merge nested hashes' do
21
+ hashA = { :n => { :a => 1, :b => 2 }}
22
+ hashB = { :n => { :a => 3, :c => 2 }}
23
+ merged = Cxxproject::Toolchain::Provider.merge(hashA, hashB)
24
+ merged.should == { :n => { :a => 3, :b => 2, :c => 2 }}
25
+ end
26
+
27
+ it 'should merge multiple level nested hashes' do
28
+ hashA = {:COMPILER => {
29
+ :CPP => {:COMMAND => "",:DEFINE_FLAG => "",:SOURCE_FILE_ENDINGS => [".cxx", ".cpp", ".c++", ".cc", ".C"]}}}
30
+ hashB = {:COMPILER =>
31
+ {:CPP => { :COMMAND => "clang++", :SOURCE_FILE_ENDINGS => [".cxx", ".cpp"]}}}
32
+ merged = Cxxproject::Toolchain::Provider.merge(hashA, hashB)
33
+ expected = {:COMPILER =>
34
+ {:CPP => { :COMMAND => "clang++", :DEFINE_FLAG => "", :SOURCE_FILE_ENDINGS => [".cxx", ".cpp"]}}}
35
+ merged.should == expected
36
+ end
37
+
38
+ end
39
+
@@ -15,5 +15,5 @@ cxx_configuration do
15
15
  :sources => FileList['**/*.cpp'],
16
16
  :dependencies => deps,
17
17
  :includes => ['.'],
18
- :toolchain => Provider.modify_cpp_compiler("GCC", unittest_flags)
18
+ :toolchain => Provider.modify_cpp_compiler("gcc", unittest_flags)
19
19
  end
@@ -1,4 +1,4 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),"..","..","lib")
2
2
  require 'cxxproject'
3
3
  BuildDir='output'
4
- CxxProject2Rake.new(['project.rb'], BuildDir, GCCChain)
4
+ CxxProject2Rake.new(['project.rb'], BuildDir, "clang")
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: cxxproject
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.1
5
+ version: 0.6.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - oliver mueller
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-07-04 00:00:00 Z
13
+ date: 2012-07-05 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
@@ -54,85 +54,78 @@ extensions: []
54
54
  extra_rdoc_files: []
55
55
 
56
56
  files:
57
- - lib/cxxproject/errorparser/ti_linker_error_parser.rb
58
- - lib/cxxproject/errorparser/diab_linker_error_parser.rb
59
- - lib/cxxproject/errorparser/gcc_linker_error_parser.rb
60
- - lib/cxxproject/errorparser/diab_compiler_error_parser.rb
61
- - lib/cxxproject/errorparser/gcc_compiler_error_parser.rb
62
- - lib/cxxproject/errorparser/ti_compiler_error_parser.rb
57
+ - lib/cxxproject.rb
58
+ - lib/tools/project_wizard.rb
59
+ - lib/cxxproject/context.rb
63
60
  - lib/cxxproject/errorparser/error_parser.rb
64
- - lib/cxxproject/utils/optional.rb
65
- - lib/cxxproject/utils/cleanup.rb
66
- - lib/cxxproject/utils/exit_helper.rb
67
- - lib/cxxproject/utils/rbcurse_progress.rb
68
- - lib/cxxproject/utils/process.rb
69
- - lib/cxxproject/utils/ubigraph.rb
70
- - lib/cxxproject/utils/printer.rb
71
- - lib/cxxproject/utils/stats.rb
72
- - lib/cxxproject/utils/rbcurse.rb
73
- - lib/cxxproject/utils/progress_helper.rb
74
- - lib/cxxproject/utils/rbcurse_executable_ext.rb
75
- - lib/cxxproject/utils/utils.rb
76
- - lib/cxxproject/utils/rbcurse_tasktable.rb
77
- - lib/cxxproject/utils/console.rb
78
- - lib/cxxproject/utils/progress.rb
79
- - lib/cxxproject/utils/graphstream.rb
80
- - lib/cxxproject/toolchain/toolchain_benchmark.rb
81
- - lib/cxxproject/toolchain/diab.rb
82
- - lib/cxxproject/toolchain/gcc.rb
83
- - lib/cxxproject/toolchain/provider.rb
84
- - lib/cxxproject/toolchain/clang.rb
85
- - lib/cxxproject/toolchain/ti.rb
86
- - lib/cxxproject/toolchain/colorizing_formatter.rb
87
- - lib/cxxproject/toolchain/toolchain.rb
88
61
  - lib/cxxproject/version.rb
62
+ - lib/cxxproject/torake.rb
63
+ - lib/cxxproject/plugin_context.rb
89
64
  - lib/cxxproject/ide_interface.rb
90
- - lib/cxxproject/ext/rake_listener.rb
65
+ - lib/cxxproject/ext/file.rb
66
+ - lib/cxxproject/ext/rake_dirty.rb
91
67
  - lib/cxxproject/ext/filelist.rb
92
68
  - lib/cxxproject/ext/string.rb
69
+ - lib/cxxproject/ext/rake_listener.rb
70
+ - lib/cxxproject/ext/stdout.rb
93
71
  - lib/cxxproject/ext/rake.rb
94
72
  - lib/cxxproject/ext/progressbar.rb
95
- - lib/cxxproject/ext/stdout.rb
96
- - lib/cxxproject/ext/rake_dirty.rb
97
- - lib/cxxproject/ext/file.rb
98
- - lib/cxxproject/torake.rb
99
- - lib/cxxproject/buildingblocks/building_block.rb
100
73
  - lib/cxxproject/buildingblocks/has_libraries_mixin.rb
101
- - lib/cxxproject/buildingblocks/custom_building_block.rb
102
- - lib/cxxproject/buildingblocks/makefile.rb
74
+ - lib/cxxproject/buildingblocks/executable.rb
103
75
  - lib/cxxproject/buildingblocks/has_includes_mixin.rb
104
- - lib/cxxproject/buildingblocks/has_sources_mixin.rb
76
+ - lib/cxxproject/buildingblocks/has_dependencies_mixin.rb
77
+ - lib/cxxproject/buildingblocks/custom_building_block.rb
105
78
  - lib/cxxproject/buildingblocks/binary_library.rb
106
- - lib/cxxproject/buildingblocks/executable.rb
107
79
  - lib/cxxproject/buildingblocks/module.rb
108
- - lib/cxxproject/buildingblocks/single_source.rb
109
- - lib/cxxproject/buildingblocks/has_dependencies_mixin.rb
80
+ - lib/cxxproject/buildingblocks/building_block.rb
110
81
  - lib/cxxproject/buildingblocks/source_library.rb
82
+ - lib/cxxproject/buildingblocks/single_source.rb
83
+ - lib/cxxproject/buildingblocks/makefile.rb
111
84
  - lib/cxxproject/buildingblocks/command_line.rb
85
+ - lib/cxxproject/buildingblocks/has_sources_mixin.rb
86
+ - lib/cxxproject/utils/rbcurse_progress.rb
87
+ - lib/cxxproject/utils/ubigraph.rb
88
+ - lib/cxxproject/utils/graphstream.rb
89
+ - lib/cxxproject/utils/progress.rb
90
+ - lib/cxxproject/utils/stats.rb
91
+ - lib/cxxproject/utils/utils.rb
92
+ - lib/cxxproject/utils/optional.rb
93
+ - lib/cxxproject/utils/console.rb
94
+ - lib/cxxproject/utils/progress_helper.rb
95
+ - lib/cxxproject/utils/exit_helper.rb
96
+ - lib/cxxproject/utils/cleanup.rb
97
+ - lib/cxxproject/utils/rbcurse_tasktable.rb
98
+ - lib/cxxproject/utils/rbcurse_executable_ext.rb
99
+ - lib/cxxproject/utils/rbcurse.rb
100
+ - lib/cxxproject/utils/printer.rb
101
+ - lib/cxxproject/utils/process.rb
102
+ - lib/cxxproject/toolchain/provider.rb
103
+ - lib/cxxproject/toolchain/toolchain.rb
104
+ - lib/cxxproject/toolchain/colorizing_formatter.rb
112
105
  - lib/cxxproject/eval_context.rb
113
- - lib/tools/project_wizard.rb
114
- - lib/cxxproject.rb
115
106
  - Rakefile.rb
116
- - spec/string_spec.rb
117
- - spec/project_path_spec.rb
118
- - spec/ide_interface_spec.rb
119
- - spec/spec_helper.rb
120
- - spec/object_dependency_spec.rb
121
- - spec/building_block_spec.rb
122
- - spec/file_ext_spec.rb
123
- - spec/testdata/basic/exe12/project.rb
124
- - spec/testdata/basic/lib1/project.rb
125
- - spec/testdata/basic/lib2/project.rb
126
107
  - spec/testdata/onlyOneHeader/Rakefile.rb
127
108
  - spec/testdata/onlyOneHeader/project.rb
109
+ - spec/testdata/basic/lib1/project.rb
110
+ - spec/testdata/basic/lib2/project.rb
111
+ - spec/testdata/basic/exe12/project.rb
112
+ - spec/testdata/multiple_levels/mainproject/basic/project.rb
128
113
  - spec/testdata/multiple_levels/libs/lib1/project.rb
129
114
  - spec/testdata/multiple_levels/libs/lib2/project.rb
130
- - spec/testdata/multiple_levels/mainproject/basic/project.rb
115
+ - spec/string_spec.rb
131
116
  - spec/cxxproject_2_rake_spec.rb
132
- - spec/toolchain_spec.rb
117
+ - spec/provider_spec.rb
118
+ - spec/project_path_spec.rb
119
+ - spec/building_block_spec.rb
120
+ - spec/plugin_context_spec.rb
121
+ - spec/file_ext_spec.rb
122
+ - spec/spec_helper.rb
123
+ - spec/ide_interface_spec.rb
124
+ - spec/object_dependency_spec.rb
133
125
  - spec/rake_listener_ext_spec.rb
134
- - lib/tools/Rakefile.rb.template
126
+ - spec/toolchain_spec.rb
135
127
  - lib/tools/project.rb.template
128
+ - lib/tools/Rakefile.rb.template
136
129
  - bin/cxx
137
130
  homepage: https://github.com/marcmo/cxxproject
138
131
  licenses: []
@@ -147,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
140
  requirements:
148
141
  - - ">="
149
142
  - !ruby/object:Gem::Version
150
- hash: -1979026599221260154
143
+ hash: 3389425425970571321
151
144
  segments:
152
145
  - 0
153
146
  version: "0"
@@ -1,40 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class DiabCompilerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- @error_expression_start = /\"(.+)\", line ([0-9]+): (?!included)(catastrophic |fatal )*([A-Za-z]+)[:]* (.+)/
8
- @error_expression_end = /^[ \t]*\^/ # well, it may end without "^"... in this case the error will last the next one starts or console text ends
9
- end
10
-
11
- def scan_lines(consoleOutput, proj_dir)
12
- res = []
13
- error_severity = 255
14
- consoleOutputFullnames = ""
15
- consoleOutput.each_line do |l|
16
- d = ErrorDesc.new
17
- lstripped = l.rstrip
18
- scan_res = lstripped.scan(@error_expression_start)
19
- if scan_res.length == 0
20
- d.severity = error_severity
21
- d.message = lstripped
22
- if lstripped.scan(@error_expression_end).length > 0
23
- error_severity = 255
24
- end
25
- else
26
- d.file_name = File.expand_path(scan_res[0][0])
27
- d.line_number = scan_res[0][1].to_i
28
- d.message = scan_res[0][4]
29
- d.severity = get_severity(scan_res[0][3])
30
- error_severity = d.severity
31
- l.gsub!(scan_res[0][0],d.file_name)
32
- end
33
- res << d
34
- consoleOutputFullnames << l
35
- end
36
- [res, consoleOutputFullnames]
37
- end
38
-
39
- end
40
- end
@@ -1,41 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class DiabLinkerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- @error_expression = /dld: ([A-Za-z]+): (.+)/
8
- @error_expression_linkerscript = /dld: \"([^\"]+)\", line ([0-9]+): (.+)/
9
- end
10
-
11
- def scan_lines(consoleOutput, proj_dir)
12
- res = []
13
- error_severity = 255
14
- consoleOutput.each_line do |l|
15
- l.rstrip!
16
- d = ErrorDesc.new
17
- scan_res = l.scan(@error_expression)
18
- scan_res2 = l.scan(@error_expression_linkerscript)
19
- if scan_res.length == 0 and scan_res2.length == 0 # msg will end with the beginning of the next message
20
- d.severity = error_severity
21
- d.message = l
22
- elsif scan_res.length > 0
23
- d.file_name = proj_dir
24
- d.line_number = 0
25
- d.message = scan_res[0][1]
26
- d.severity = get_severity(scan_res[0][0])
27
- error_severity = d.severity
28
- else
29
- d.file_name = proj_dir+"/"+scan_res2[0][0]
30
- d.line_number = scan_res2[0][1].to_i
31
- d.message = scan_res2[0][2]
32
- d.severity = SEVERITY_ERROR
33
- error_severity = d.severity
34
- end
35
- res << d
36
- end
37
- [res, consoleOutput]
38
- end
39
-
40
- end
41
- end
@@ -1,35 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class GCCCompilerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- @error_expression = /([^:]+):([0-9]+)[:0-9]* (catastrophic |fatal )*([A-Za-z\._]+): (.+)/
8
- end
9
-
10
- def scan_lines(consoleOutput, proj_dir)
11
- res = []
12
- consoleOutputFullnames = ""
13
- consoleOutput.each_line do |l|
14
- d = ErrorDesc.new
15
- scan_res = l.gsub(/\r\n?/, "").scan(@error_expression)
16
- if scan_res.length > 0
17
- d.file_name = File.expand_path(scan_res[0][0])
18
- d.line_number = scan_res[0][1].to_i
19
- d.message = scan_res[0][4]
20
- if (scan_res[0][3].include?".")
21
- d.severity = SEVERITY_ERROR
22
- d.message = scan_res[0][3] + ": " + d.message
23
- else
24
- d.severity = get_severity(scan_res[0][3])
25
- end
26
- l.gsub!(scan_res[0][0],d.file_name)
27
- end
28
- res << d
29
- consoleOutputFullnames << l
30
- end
31
- [res, consoleOutputFullnames]
32
- end
33
-
34
- end
35
- end
@@ -1,35 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class GCCLinkerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- # todo: is every line an error?
8
- # todo: some linker errors look like simple text, dunno how to parse properly...
9
- # @error_expression1 = /(.*:\(\..*\)): (.*)/ # e.g. /c/Tool/Temp/ccAlar4R.o:x.cpp:(.text+0x17): undefined reference to `_a'
10
- # @error_expression2 = /(.*):([0-9]+): (.*)/ # e.g. /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld:roodi.yml.a:1: syntax error
11
- end
12
-
13
- def scan_lines(consoleOutput, proj_dir)
14
- res = []
15
- consoleOutput.each_line do |l|
16
- l.rstrip!
17
- d = ErrorDesc.new
18
- d.file_name = proj_dir
19
- d.line_number = 0
20
- d.message = l
21
- if l.length == 0
22
- d.severity = SEVERITY_OK
23
- elsif l.include?" Warning:"
24
- d.severity = SEVERITY_WARNING
25
- else
26
- d.severity = SEVERITY_ERROR
27
- end
28
- res << d
29
- end
30
- [res, consoleOutput]
31
- end
32
-
33
-
34
- end
35
- end
@@ -1,30 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class TICompilerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- @error_expression = /\"([^,^\"]+)\", line ([0-9]+)[:0-9]* (catastrophic |fatal )*([A-Za-z]+): (.+)/
8
- end
9
-
10
- def scan_lines(consoleOutput, proj_dir)
11
- res = []
12
- consoleOutputFullnames = ""
13
- consoleOutput.each_line do |l|
14
- d = ErrorDesc.new
15
- scan_res = l.gsub(/\r\n?/, "").scan(@error_expression)
16
- if scan_res.length > 0
17
- d.file_name = File.expand_path(scan_res[0][0])
18
- d.line_number = scan_res[0][1].to_i
19
- d.message = scan_res[0][4]
20
- d.severity = get_severity(scan_res[0][3])
21
- l.gsub!(scan_res[0][0],d.file_name)
22
- end
23
- res << d
24
- consoleOutputFullnames << l
25
- end
26
- [res, consoleOutputFullnames]
27
- end
28
-
29
- end
30
- end
@@ -1,30 +0,0 @@
1
- require 'cxxproject/errorparser/error_parser'
2
-
3
- module Cxxproject
4
- class TILinkerErrorParser < ErrorParser
5
-
6
- def initialize()
7
- # todo: is every line an error?
8
- # todo: some linker errors look like simple text, dunno how to parse properly...
9
- # @error_expression1 = /(.*:\(\..*\)): (.*)/ # e.g. /c/Tool/Temp/ccAlar4R.o:x.cpp:(.text+0x17): undefined reference to `_a'
10
- # @error_expression2 = /(.*):([0-9]+): (.*)/ # e.g. /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld:roodi.yml.a:1: syntax error
11
- end
12
-
13
- def scan_lines(consoleOutput, proj_dir)
14
- res = []
15
- consoleOutput.each_line do |l|
16
- l.rstrip!
17
- d = ErrorDesc.new
18
- if l != "<Linking>" then
19
- d.file_name = proj_dir
20
- d.line_number = 0
21
- d.message = l
22
- d.severity = SEVERITY_ERROR
23
- end
24
- res << d
25
- end
26
- [res, consoleOutput]
27
- end
28
-
29
- end
30
- end
@@ -1,39 +0,0 @@
1
- require 'cxxproject/utils/utils'
2
- require 'cxxproject/toolchain/provider'
3
- require 'cxxproject/errorparser/error_parser'
4
- require 'cxxproject/errorparser/gcc_compiler_error_parser'
5
-
6
- module Cxxproject
7
- module Toolchain
8
- gccCompilerErrorParser = GCCCompilerErrorParser.new
9
-
10
- CLANG_CHAIN = Provider.add("CLANG")
11
-
12
- CLANG_CHAIN[:COMPILER][:CPP].update({
13
- :COMMAND => "llvm-g++",
14
- :DEFINE_FLAG => "-D",
15
- :OBJECT_FILE_FLAG => "-o",
16
- :INCLUDE_PATH_FLAG => "-I",
17
- :COMPILE_FLAGS => "-c ",
18
- :DEP_FLAGS => "-MMD -MF ", # empty space at the end is important!
19
- :ERROR_PARSER => gccCompilerErrorParser
20
- })
21
-
22
- CLANG_CHAIN[:COMPILER][:C] = Utils.deep_copy(CLANG_CHAIN[:COMPILER][:CPP])
23
- CLANG_CHAIN[:COMPILER][:C][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:C][:SOURCE_FILE_ENDINGS]
24
- CLANG_CHAIN[:COMPILER][:C][:COMMAND] = "llvm-gcc"
25
-
26
- CLANG_CHAIN[:COMPILER][:ASM] = Utils.deep_copy(CLANG_CHAIN[:COMPILER][:C])
27
- CLANG_CHAIN[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS]
28
-
29
- CLANG_CHAIN[:ARCHIVER][:COMMAND] = "ar"
30
- CLANG_CHAIN[:ARCHIVER][:ARCHIVE_FLAGS] = "r"
31
-
32
- CLANG_CHAIN[:LINKER][:COMMAND] = "llvm-g++"
33
- CLANG_CHAIN[:LINKER][:SCRIPT] = "-T"
34
- CLANG_CHAIN[:LINKER][:USER_LIB_FLAG] = "-l:"
35
- CLANG_CHAIN[:LINKER][:EXE_FLAG] = "-o"
36
- CLANG_CHAIN[:LINKER][:LIB_FLAG] = "-l"
37
- CLANG_CHAIN[:LINKER][:LIB_PATH_FLAG] = "-L"
38
- end
39
- end
@@ -1,52 +0,0 @@
1
- require 'cxxproject/toolchain/provider'
2
- require 'cxxproject/utils/utils'
3
- require 'cxxproject/errorparser/diab_compiler_error_parser'
4
- require 'cxxproject/errorparser/diab_linker_error_parser'
5
-
6
- module Cxxproject
7
- module Toolchain
8
-
9
- DiabChain = Provider.add("Diab")
10
-
11
- DiabChain[:COMPILER][:C].update({
12
- :COMMAND => "dcc",
13
- :FLAGS => "",
14
- :DEFINE_FLAG => "-D",
15
- :OBJECT_FILE_FLAG => "-o ",
16
- :INCLUDE_PATH_FLAG => "-I",
17
- :COMPILE_FLAGS => "-c",
18
- :DEP_FLAGS => "-Xmake-dependency=6 -Xmake-dependency-savefile=",
19
- :DEP_FLAGS_SPACE => false,
20
- :PREPRO_FLAGS => "-P"
21
- })
22
-
23
- DiabChain[:COMPILER][:CPP] = Utils.deep_copy(DiabChain[:COMPILER][:C])
24
- DiabChain[:COMPILER][:CPP][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:CPP][:SOURCE_FILE_ENDINGS]
25
-
26
- DiabChain[:COMPILER][:ASM] = Utils.deep_copy(DiabChain[:COMPILER][:C])
27
- DiabChain[:COMPILER][:ASM][:COMMAND] = "das"
28
- DiabChain[:COMPILER][:ASM][:COMPILE_FLAGS] = ""
29
- DiabChain[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS]
30
- DiabChain[:COMPILER][:ASM][:PREPRO_FLAGS] = ""
31
-
32
- DiabChain[:ARCHIVER][:COMMAND] = "dar"
33
- DiabChain[:ARCHIVER][:ARCHIVE_FLAGS] = "-rc"
34
-
35
- DiabChain[:LINKER][:COMMAND] = "dcc"
36
- DiabChain[:LINKER][:SCRIPT] = "-Wm"
37
- DiabChain[:LINKER][:USER_LIB_FLAG] = "-l:"
38
- DiabChain[:LINKER][:EXE_FLAG] = "-o"
39
- DiabChain[:LINKER][:LIB_FLAG] = "-l"
40
- DiabChain[:LINKER][:LIB_PATH_FLAG] = "-L"
41
- DiabChain[:LINKER][:MAP_FILE_FLAG] = "-Wl,-m6" # no map file if this string is empty, otherwise -Wl,-m6>abc.map
42
- DiabChain[:LINKER][:OUTPUT_ENDING] = ".elf"
43
-
44
- diabCompilerErrorParser = DiabCompilerErrorParser.new
45
- DiabChain[:COMPILER][:C][:ERROR_PARSER] = diabCompilerErrorParser
46
- DiabChain[:COMPILER][:CPP][:ERROR_PARSER] = diabCompilerErrorParser
47
- DiabChain[:COMPILER][:ASM][:ERROR_PARSER] = diabCompilerErrorParser
48
- DiabChain[:ARCHIVER][:ERROR_PARSER] = diabCompilerErrorParser
49
- DiabChain[:LINKER][:ERROR_PARSER] = DiabLinkerErrorParser.new
50
-
51
- end
52
- end
@@ -1,48 +0,0 @@
1
- require 'cxxproject/utils/utils'
2
- require 'cxxproject/toolchain/provider'
3
- require 'cxxproject/errorparser/error_parser'
4
- require 'cxxproject/errorparser/gcc_compiler_error_parser'
5
- require 'cxxproject/errorparser/gcc_linker_error_parser'
6
-
7
- module Cxxproject
8
- module Toolchain
9
-
10
- GCCChain = Provider.add("GCC")
11
-
12
- GCCChain[:COMPILER][:CPP].update({
13
- :COMMAND => "g++",
14
- :DEFINE_FLAG => "-D",
15
- :OBJECT_FILE_FLAG => "-o ",
16
- :INCLUDE_PATH_FLAG => "-I",
17
- :COMPILE_FLAGS => "-c ",
18
- :DEP_FLAGS => "-MMD -MF",
19
- :DEP_FLAGS_SPACE => true,
20
- :PREPRO_FLAGS => "-E -P"
21
- })
22
-
23
- GCCChain[:COMPILER][:C] = Utils.deep_copy(GCCChain[:COMPILER][:CPP])
24
- GCCChain[:COMPILER][:C][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:C][:SOURCE_FILE_ENDINGS]
25
- GCCChain[:COMPILER][:C][:COMMAND] = "gcc"
26
-
27
- GCCChain[:COMPILER][:ASM] = Utils.deep_copy(GCCChain[:COMPILER][:C])
28
- GCCChain[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS]
29
-
30
- GCCChain[:ARCHIVER][:COMMAND] = "ar"
31
- GCCChain[:ARCHIVER][:ARCHIVE_FLAGS] = "-rc"
32
-
33
- GCCChain[:LINKER][:COMMAND] = "g++"
34
- GCCChain[:LINKER][:SCRIPT] = "-T"
35
- GCCChain[:LINKER][:USER_LIB_FLAG] = "-l:"
36
- GCCChain[:LINKER][:EXE_FLAG] = "-o"
37
- GCCChain[:LINKER][:LIB_FLAG] = "-l"
38
- GCCChain[:LINKER][:LIB_PATH_FLAG] = "-L"
39
-
40
- gccCompilerErrorParser = GCCCompilerErrorParser.new
41
- GCCChain[:COMPILER][:C][:ERROR_PARSER] = gccCompilerErrorParser
42
- GCCChain[:COMPILER][:CPP][:ERROR_PARSER] = gccCompilerErrorParser
43
- GCCChain[:COMPILER][:ASM][:ERROR_PARSER] = gccCompilerErrorParser
44
- GCCChain[:ARCHIVER][:ERROR_PARSER] = gccCompilerErrorParser
45
- GCCChain[:LINKER][:ERROR_PARSER] = GCCLinkerErrorParser.new
46
-
47
- end
48
- end
@@ -1,50 +0,0 @@
1
- require 'cxxproject/utils/utils'
2
- require 'cxxproject/toolchain/provider'
3
- require 'cxxproject/errorparser/error_parser'
4
- require 'cxxproject/errorparser/ti_compiler_error_parser'
5
- require 'cxxproject/errorparser/ti_linker_error_parser'
6
-
7
- module Cxxproject
8
- module Toolchain
9
-
10
- TiChain = Provider.add("TI")
11
-
12
- ti_home = ENV['TI_HOME']
13
-
14
- TiChain[:COMPILER][:CPP].update({
15
- :COMMAND => "#{ti_home}/ccsv5/tools/compiler/tms470/bin/cl470",
16
- :FLAGS => "-mv7A8 -g --include_path=\"#{ti_home}/ccsv5/tools/compiler/tms470/include\" --diag_warning=225 -me --abi=eabi --code_state=32 --preproc_with_compile",
17
- :DEFINE_FLAG => "--define=",
18
- :OBJECT_FILE_FLAG => "--output_file=",
19
- :INCLUDE_PATH_FLAG => "--include_path=",
20
- :COMPILE_FLAGS => "-c ",
21
- :DEP_FLAGS => "--preproc_dependency=",
22
- :DEP_FLAGS_SPACE => false
23
- })
24
-
25
- TiChain[:COMPILER][:C] = Utils.deep_copy(TiChain[:COMPILER][:CPP])
26
- TiChain[:COMPILER][:C][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:C][:SOURCE_FILE_ENDINGS]
27
-
28
- TiChain[:COMPILER][:ASM] = Utils.deep_copy(TiChain[:COMPILER][:C])
29
- TiChain[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS] = Provider.default[:COMPILER][:ASM][:SOURCE_FILE_ENDINGS]
30
-
31
- TiChain[:ARCHIVER][:COMMAND] = "#{ti_home}/ccsv5/tools/compiler/tms470/bin/ar470"
32
- TiChain[:ARCHIVER][:ARCHIVE_FLAGS] = "r"
33
-
34
- TiChain[:LINKER][:COMMAND] = "#{ti_home}/ccsv5/tools/compiler/tms470/bin/cl470"
35
- TiChain[:LINKER][:FLAGS] = "-mv7A8 -g --diag_warning=225 -me --abi=eabi --code_state=32 -z --warn_sections -i\"#{ti_home}/ccsv5/tools/compiler/tms470/lib\" -i\"#{ti_home}/ccsv5/tools/compiler/tms470/include\""
36
- TiChain[:LINKER][:MAP_FILE_FLAG] = '-m'
37
- TiChain[:LINKER][:EXE_FLAG] = "-o"
38
- TiChain[:LINKER][:LIB_PREFIX_FLAGS] = '-lDebug/configPkg/linker.cmd'
39
- TiChain[:LINKER][:LIB_FLAG] = "-l"
40
- TiChain[:LINKER][:LIB_PATH_FLAG] = "-i"
41
-
42
- tiCompilerErrorParser = TICompilerErrorParser.new
43
- TiChain[:COMPILER][:C][:ERROR_PARSER] = tiCompilerErrorParser
44
- TiChain[:COMPILER][:CPP][:ERROR_PARSER] = tiCompilerErrorParser
45
- TiChain[:COMPILER][:ASM][:ERROR_PARSER] = tiCompilerErrorParser
46
- TiChain[:ARCHIVER][:ERROR_PARSER] = tiCompilerErrorParser
47
- TiChain[:LINKER][:ERROR_PARSER] = TILinkerErrorParser.new
48
-
49
- end
50
- end
@@ -1,23 +0,0 @@
1
- $:.unshift File.dirname(__FILE__)
2
- require 'toolchain'
3
- require 'benchmark'
4
-
5
- Benchmark.bm do |x|
6
-
7
- n = 1000
8
- x.report("load Toolchain #{n}-times") do
9
- n.times do
10
- tc = Toolchain.new('gcc.json')
11
- end
12
- end
13
-
14
- tc = Toolchain.new('gcc.json')
15
- n = 1000000
16
- x.report("access fields as methods #{n}-times") do
17
- n.times do
18
- x = tc.compiler.c.source_file_endings
19
- end
20
- end
21
-
22
- end
23
-