bake-toolkit 1.8.0.1 → 2.0.10
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.
- checksums.yaml +4 -4
- data/bin/bake +14 -53
- data/bin/bakery +50 -43
- data/bin/createVSProjects +3 -3
- data/doc/cmd/install.html +1 -5
- data/doc/cmd/usecmd.html +29 -5
- data/doc/dyk/lint.html +21 -4
- data/doc/dyk/tipps.html +0 -6
- data/doc/eclipse/import.html +3 -1
- data/doc/eclipse/import/Import.png +0 -0
- data/doc/eclipse/use.html +8 -5
- data/doc/further/change.html +134 -1
- data/doc/further/issues.html +1 -0
- data/doc/further/wish.html +24 -21
- data/doc/index.html +1 -1
- data/doc/syntax/subst.html +8 -1
- data/doc/syntax/syntax.html +42 -14
- data/lib/bake/cache.rb +51 -59
- data/lib/bake/config/loader.rb +289 -0
- data/lib/bake/libElement.rb +134 -0
- data/lib/bake/mergeConfig.rb +1 -1
- data/lib/bake/model/language.rb +1 -1
- data/lib/bake/model/loader.rb +88 -0
- data/lib/bake/model/metamodel.rb +24 -16
- data/lib/bake/model/metamodel_ext.rb +9 -4
- data/lib/bake/options/options.rb +222 -0
- data/lib/bake/options/showConfigNames.rb +44 -0
- data/lib/bake/options/showDoc.rb +19 -0
- data/lib/bake/options/showLicense.rb +9 -0
- data/lib/bake/options/showToolchains.rb +39 -0
- data/lib/bake/options/usage.rb +54 -0
- data/lib/bake/process_output.rb +10 -0
- data/lib/bake/subst.rb +105 -40
- data/lib/bake/toolchain/clang.rb +44 -0
- data/lib/bake/toolchain/colorizing_formatter.rb +125 -0
- data/lib/bake/toolchain/diab.rb +53 -0
- data/lib/bake/toolchain/errorparser/diab_compiler_error_parser.rb +40 -0
- data/lib/bake/toolchain/errorparser/diab_linker_error_parser.rb +41 -0
- data/lib/bake/toolchain/errorparser/error_parser.rb +71 -0
- data/lib/bake/toolchain/errorparser/gcc_compiler_error_parser.rb +35 -0
- data/lib/bake/toolchain/errorparser/gcc_linker_error_parser.rb +35 -0
- data/lib/bake/toolchain/errorparser/greenhills_compiler_error_parser.rb +32 -0
- data/lib/bake/toolchain/errorparser/greenhills_linker_error_parser.rb +44 -0
- data/lib/bake/toolchain/errorparser/keil_compiler_error_parser.rb +40 -0
- data/lib/bake/toolchain/errorparser/keil_linker_error_parser.rb +30 -0
- data/lib/bake/toolchain/errorparser/lint_error_parser.rb +34 -0
- data/lib/bake/toolchain/errorparser/process_output.rb +3 -0
- data/lib/bake/toolchain/errorparser/ti_compiler_error_parser.rb +30 -0
- data/lib/bake/toolchain/errorparser/ti_linker_error_parser.rb +30 -0
- data/lib/bake/toolchain/gcc.rb +49 -0
- data/lib/bake/toolchain/gcc_param.rb +7 -0
- data/lib/bake/toolchain/greenhills.rb +52 -0
- data/lib/bake/toolchain/keil.rb +55 -0
- data/lib/bake/toolchain/lint.rb +20 -0
- data/lib/bake/toolchain/provider.rb +136 -0
- data/lib/bake/toolchain/ti.rb +47 -0
- data/lib/bake/util.rb +27 -15
- data/lib/bakery/buildPattern.rb +1 -1
- data/lib/bakery/model/language.rb +1 -1
- data/lib/bakery/model/loader.rb +56 -0
- data/lib/bakery/model/metamodel.rb +1 -1
- data/lib/bakery/options/options.rb +87 -0
- data/lib/bakery/toBake.rb +10 -6
- data/lib/blocks/block.rb +225 -0
- data/lib/blocks/blockBase.rb +155 -0
- data/lib/blocks/commandLine.rb +25 -0
- data/lib/blocks/compile.rb +382 -0
- data/lib/blocks/docu.rb +28 -0
- data/lib/blocks/executable.rb +143 -0
- data/lib/blocks/has_execute_command.rb +31 -0
- data/lib/blocks/library.rb +78 -0
- data/lib/blocks/lint.rb +53 -0
- data/lib/blocks/makefile.rb +87 -0
- data/lib/blocks/showIncludes.rb +114 -0
- data/lib/common/abortException.rb +4 -0
- data/lib/common/cleanup.rb +9 -0
- data/lib/common/exit_helper.rb +28 -0
- data/lib/common/ext/file.rb +88 -0
- data/lib/common/ext/stdout.rb +45 -0
- data/lib/common/ide_interface.rb +194 -0
- data/lib/common/options/option.rb +13 -0
- data/lib/common/options/parser.rb +59 -0
- data/lib/common/process.rb +64 -0
- data/lib/common/utils.rb +52 -0
- data/lib/{bake → common}/version.rb +3 -10
- data/lib/multithread/job.rb +44 -0
- data/lib/tocxx.rb +201 -932
- data/lib/vs/options.rb +3 -2
- data/license.txt +47 -22
- metadata +90 -30
- data/bin/bake-doc +0 -12
- data/lib/alias/loader.rb +0 -56
- data/lib/alias/model/language.rb +0 -22
- data/lib/alias/model/metamodel.rb +0 -29
- data/lib/bake/loader.rb +0 -92
- data/lib/bake/options.rb +0 -421
- data/lib/bakery/loader.rb +0 -57
- data/lib/bakery/options.rb +0 -105
- data/lib/option/parser.rb +0 -73
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'common/ext/stdout'
|
2
|
+
require 'stringio'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
module Bake
|
6
|
+
module Multithread
|
7
|
+
|
8
|
+
class Jobs
|
9
|
+
def initialize(jobs, &block)
|
10
|
+
nr_of_threads = [Bake.options.threads, jobs.length].min
|
11
|
+
@jobs = jobs
|
12
|
+
@threads = []
|
13
|
+
nr_of_threads.times do
|
14
|
+
@threads << ::Thread.new do
|
15
|
+
block.call(self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def failed
|
21
|
+
@failed ||= false
|
22
|
+
end
|
23
|
+
def set_failed
|
24
|
+
@failed = true
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_next_or_nil
|
28
|
+
the_next = nil
|
29
|
+
mutex.synchronize {
|
30
|
+
the_next = @jobs.shift
|
31
|
+
}
|
32
|
+
the_next
|
33
|
+
end
|
34
|
+
def join
|
35
|
+
@threads.each{|t| while not t.join(2) do end}
|
36
|
+
end
|
37
|
+
def mutex
|
38
|
+
@mutex ||= Mutex.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
data/lib/tocxx.rb
CHANGED
@@ -1,1015 +1,284 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
gem 'rake', '>= 0.7.3'
|
4
3
|
|
5
|
-
require 'rake'
|
6
|
-
require 'rake/clean'
|
7
|
-
require 'bake/loader'
|
8
4
|
require 'bake/model/metamodel_ext'
|
5
|
+
|
9
6
|
require 'bake/util'
|
10
7
|
require 'bake/cache'
|
11
8
|
require 'bake/subst'
|
12
9
|
require 'bake/mergeConfig'
|
13
|
-
|
14
|
-
require '
|
15
|
-
require '
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require '
|
19
|
-
require '
|
20
|
-
require '
|
21
|
-
require '
|
22
|
-
|
23
|
-
require '
|
24
|
-
require '
|
25
|
-
require '
|
26
|
-
require '
|
27
|
-
require '
|
28
|
-
require '
|
10
|
+
|
11
|
+
require 'common/exit_helper'
|
12
|
+
require 'common/ide_interface'
|
13
|
+
require 'common/ext/file'
|
14
|
+
require 'bake/toolchain/provider'
|
15
|
+
require 'common/ext/stdout'
|
16
|
+
require 'common/utils'
|
17
|
+
require 'bake/toolchain/colorizing_formatter'
|
18
|
+
require 'bake/config/loader'
|
19
|
+
|
20
|
+
require 'blocks/block'
|
21
|
+
require 'blocks/commandLine'
|
22
|
+
require 'blocks/makefile'
|
23
|
+
require 'blocks/compile'
|
24
|
+
require 'blocks/library'
|
25
|
+
require 'blocks/executable'
|
26
|
+
require 'blocks/lint'
|
27
|
+
require 'blocks/docu'
|
29
28
|
|
30
29
|
require 'set'
|
31
30
|
require 'socket'
|
32
31
|
|
33
|
-
|
32
|
+
require 'blocks/showIncludes'
|
33
|
+
require 'common/abortException'
|
34
34
|
|
35
|
-
module
|
35
|
+
module Bake
|
36
36
|
|
37
|
+
class SystemCommandFailed < Exception
|
38
|
+
end
|
39
|
+
|
37
40
|
class ToCxx
|
38
41
|
|
39
|
-
def initialize
|
40
|
-
@options = options
|
42
|
+
def initialize
|
41
43
|
@configTcMap = {}
|
42
|
-
|
43
|
-
RakeFileUtils.verbose_flag = @options.verbose
|
44
|
-
end
|
45
|
-
|
46
|
-
def set_output_taskname(bb)
|
47
|
-
return if not bb.instance_of?ModuleBuildingBlock
|
48
|
-
outputTaskname = task "Print #{bb.get_task_name}" do
|
49
|
-
num = Rake.application.idei.get_number_of_projects
|
50
|
-
@numCurrent ||= 0
|
51
|
-
@numCurrent += 1
|
52
|
-
|
53
|
-
unless @options.printLess
|
54
|
-
Printer.printAdditionalInfo "**** Building #{@numCurrent} of #{num}: #{bb.name.gsub("Project ","")} (#{bb.config_name}) ****"
|
55
|
-
end
|
56
|
-
|
57
|
-
Rake.application.idei.set_build_info(bb.name.gsub("Project ",""), bb.config_name)
|
58
|
-
Rake.application.addEmptyLine = true if @options.verbose
|
59
|
-
end
|
60
|
-
outputTaskname.type = Rake::Task::UTIL
|
61
|
-
outputTaskname.transparent_timestamp = true
|
62
|
-
insertAt = 0
|
63
|
-
t = Rake.application[bb.last_content.get_task_name]
|
64
|
-
t.prerequisites.each do |p|
|
65
|
-
pname = String === p ? p : p.name
|
66
|
-
if pname.index("Project ") == 0
|
67
|
-
insertAt = insertAt + 1
|
68
|
-
else
|
69
|
-
break
|
70
|
-
end
|
71
|
-
end
|
72
|
-
t.prerequisites.insert(insertAt, outputTaskname)
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
def calc_needed_bbs(bbChildName, needed_bbs)
|
77
|
-
bbChild = ALL_BUILDING_BLOCKS[bbChildName]
|
78
|
-
isModule = (ModuleBuildingBlock === bbChild ? 1 : 0)
|
79
|
-
return 0 if needed_bbs.include?bbChild
|
80
|
-
needed_bbs << bbChild
|
81
|
-
bbChild.dependencies.each { |d| isModule += calc_needed_bbs(d, needed_bbs) }
|
82
|
-
return isModule
|
83
44
|
end
|
84
45
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
checkDefault = true
|
92
|
-
if m.filter != "" # explicit filter = 1. prio
|
93
|
-
next if @options.exclude_filter.include?m.filter
|
94
|
-
checkDefault = false if @options.include_filter.include?m.filter
|
95
|
-
end
|
96
|
-
|
97
|
-
if globalFilterStr != nil
|
98
|
-
if checkDefault == true # global filter = 2. prio
|
99
|
-
next if @options.exclude_filter.include?globalFilterStr
|
100
|
-
checkDefault = false if @options.include_filter.include?globalFilterStr
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
if checkDefault # default = 3. prio
|
105
|
-
next if m.default == "off"
|
106
|
-
end
|
107
|
-
|
108
|
-
if Cxxproject::Metamodel::Makefile === m
|
109
|
-
nameOfBB = m.name+"_"+m.target
|
110
|
-
bb = Makefile.new(m.name, m.target)
|
111
|
-
if m.pathTo != ""
|
112
|
-
pathHash = {}
|
113
|
-
m.pathTo.split(",").each do |p|
|
114
|
-
nameOfP = p.strip
|
115
|
-
dirOfP = nil
|
116
|
-
if not @project2config.include?nameOfP
|
117
|
-
@options.roots.each do |r|
|
118
|
-
absIncDir = r+"/"+nameOfP
|
119
|
-
if File.exists?(absIncDir)
|
120
|
-
dirOfP = absIncDir
|
121
|
-
break
|
122
|
-
end
|
123
|
-
end
|
124
|
-
else
|
125
|
-
dirOfP = @project2config[nameOfP].parent.get_project_dir
|
126
|
-
end
|
127
|
-
if dirOfP == nil
|
128
|
-
Printer.printError "Error: Project '#{nameOfP}' not found for makefile #{projDir}/#{m.name}"
|
129
|
-
ExitHelper.exit(1)
|
130
|
-
end
|
131
|
-
pathHash[nameOfP] = File.rel_from_to_project(File.dirname(projDir),File.dirname(dirOfP))
|
132
|
-
end
|
133
|
-
bb.set_path_to(pathHash)
|
134
|
-
bb.pre_step = true if globalFilterStr
|
135
|
-
end
|
136
|
-
bb.set_flags(adjustFlags(tcs[:MAKE][:FLAGS],m.flags)) if m.flags
|
137
|
-
|
138
|
-
@lib_elements[m.line_number] = [HasLibraries::LIB_WITH_PATH, m.lib] if m.lib != ""
|
139
|
-
elsif Cxxproject::Metamodel::CommandLine === m
|
140
|
-
nameOfBB = m.name
|
141
|
-
bb = CommandLine.new(nameOfBB)
|
142
|
-
bb.set_defined_in_file(m.file_name.to_s)
|
143
|
-
bb.set_defined_in_line(m.line_number)
|
144
|
-
bb.pre_step = true if globalFilterStr
|
145
|
-
else
|
146
|
-
next
|
147
|
-
end
|
148
|
-
bbModule.last_content.dependencies << bb.name
|
149
|
-
bbModule.contents << bb
|
150
|
-
bbModule.last_content = bb
|
151
|
-
end
|
46
|
+
def createBaseTcsForConfig
|
47
|
+
@loadedConfig.referencedConfigs.each do |projName, configs|
|
48
|
+
configs.each do |config|
|
49
|
+
tcs = Utils.deep_copy(@defaultToolchain)
|
50
|
+
@configTcMap[config] = tcs
|
51
|
+
end
|
152
52
|
end
|
153
53
|
end
|
154
54
|
|
155
|
-
def
|
156
|
-
projName
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
return d if @options.no_autodir
|
161
|
-
|
162
|
-
inc = d.split("/")
|
163
|
-
if (inc[0] == projName)
|
164
|
-
res = inc[1..-1].join("/") # within self
|
165
|
-
res = "." if res == ""
|
166
|
-
elsif @project2config.include?(inc[0])
|
167
|
-
dirOther = @project2config[inc[0]].parent.get_project_dir
|
168
|
-
res = File.rel_from_to_project(projDir, dirOther)
|
169
|
-
postfix = inc[1..-1].join("/")
|
170
|
-
res = res + postfix if postfix != ""
|
171
|
-
else
|
172
|
-
if (inc[0] != "..")
|
173
|
-
return d if File.exists?(projDir + "/" + d) # e.g. "include"
|
174
|
-
|
175
|
-
# check if dir exists without Project.meta entry
|
176
|
-
@options.roots.each do |r|
|
177
|
-
absIncDir = r+"/"+d
|
178
|
-
if File.exists?(absIncDir)
|
179
|
-
res = File.rel_from_to_project(projDir,absIncDir)
|
180
|
-
if not res.nil?
|
181
|
-
return res
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
else
|
186
|
-
Printer.printInfo "Info: #{projName} uses \"..\" in path name #{d}" if @options.verbose
|
187
|
-
end
|
188
|
-
|
189
|
-
res = d # relative from self as last resort
|
55
|
+
def createTcsForConfig
|
56
|
+
@loadedConfig.referencedConfigs.each do |projName, configs|
|
57
|
+
configs.each do |config|
|
58
|
+
integrateToolchain(@configTcMap[config], config.toolchain)
|
59
|
+
end
|
190
60
|
end
|
191
|
-
res
|
192
61
|
end
|
193
|
-
|
194
|
-
|
195
|
-
def getFullProject(configs, configname, filename)
|
196
|
-
config = nil
|
197
|
-
configs.each do |c|
|
198
|
-
if c.name == configname
|
199
|
-
if config
|
200
|
-
Printer.printError "Error: Config '#{configname}' found more than once in '#{filename}'"
|
201
|
-
ExitHelper.exit(1)
|
202
|
-
end
|
203
|
-
config = c
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
if not config
|
208
|
-
Printer.printError "Error: Config '#{configname}' not found in '#{filename}'"
|
209
|
-
ExitHelper.exit(1)
|
210
|
-
end
|
211
|
-
|
212
|
-
if config.extends != ""
|
213
|
-
parent = getFullProject(configs, config.extends, filename)
|
214
|
-
MergeConfig.new(config, parent).merge()
|
215
|
-
end
|
216
|
-
|
217
|
-
config
|
218
|
-
end
|
219
|
-
|
220
|
-
|
221
|
-
def loadProjMeta(loader, filename, configname)
|
222
|
-
@project_files << filename
|
223
|
-
f = loader.load(filename)
|
224
|
-
|
225
|
-
config = nil
|
226
|
-
|
227
|
-
if f.root_elements.length != 1 or not Metamodel::Project === f.root_elements[0]
|
228
|
-
Printer.printError "Error: '#{filename}' must have exactly one 'Project' element as root element"
|
229
|
-
ExitHelper.exit(1)
|
230
|
-
end
|
231
|
-
|
232
|
-
f.root_elements.each do |e|
|
233
|
-
x = e.getConfig
|
234
|
-
config = getFullProject(x,configname,filename)
|
235
62
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
if not config
|
246
|
-
Printer.printError "Error: Config '#{configname}' not found in '#{filename}'"
|
247
|
-
ExitHelper.exit(1)
|
63
|
+
def substVars
|
64
|
+
Subst.itute(@mainConfig, Bake.options.main_project_name, true, @configTcMap[@mainConfig])
|
65
|
+
@loadedConfig.referencedConfigs.each do |projName, configs|
|
66
|
+
configs.each do |config|
|
67
|
+
if config != @mainConfig
|
68
|
+
Subst.itute(config, projName, false, @configTcMap[config])
|
69
|
+
end
|
70
|
+
end
|
248
71
|
end
|
249
|
-
|
250
|
-
config
|
251
72
|
end
|
252
|
-
|
253
|
-
def load_meta
|
254
73
|
|
255
|
-
loader = Loader.new(@options)
|
256
|
-
@project_files = []
|
257
|
-
|
258
|
-
@project2config = {}
|
259
|
-
|
260
|
-
project2config_pending = {}
|
261
|
-
project2config_pending[@mainProjectName] = @options.build_config
|
262
|
-
|
263
|
-
if not File.exist?(@options.main_dir+"/Project.meta")
|
264
|
-
Printer.printError "Error: #{@options.main_dir}/Project.meta not found"
|
265
|
-
ExitHelper.exit(1)
|
266
|
-
end
|
267
|
-
|
268
|
-
potentialProjs = []
|
269
|
-
@options.roots.each do |r|
|
270
|
-
if (r.length == 3 && r.include?(":/"))
|
271
|
-
r = r + @mainProjectName # glob would not work otherwise on windows (ruby bug?)
|
272
|
-
end
|
273
|
-
r = r+"/**{,/*/**}/Project.meta"
|
274
|
-
potentialProjs.concat(Dir.glob(r))
|
275
|
-
end
|
276
|
-
|
277
|
-
potentialProjs = potentialProjs.uniq.sort unless potentialProjs.empty?
|
278
|
-
|
279
|
-
while project2config_pending.length > 0
|
280
|
-
|
281
|
-
pname_toload = project2config_pending.keys[0]
|
282
|
-
cname_toload = project2config_pending[pname_toload]
|
283
|
-
project2config_pending.delete(pname_toload)
|
284
|
-
|
285
|
-
# check if file is in more than one root
|
286
|
-
pmeta_filenames = []
|
287
|
-
|
288
|
-
potentialProjs.each do |pp|
|
289
|
-
if pp.include?("/" + pname_toload + "/Project.meta") or pp == pname_toload + "/Project.meta"
|
290
|
-
pmeta_filenames << pp
|
291
|
-
end
|
292
|
-
end
|
293
74
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
chosen = " (chosen)"
|
302
|
-
pmeta_filenames.each do |f|
|
303
|
-
Printer.printWarning " #{f}#{chosen}"
|
304
|
-
chosen = ""
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
|
309
|
-
config = loadProjMeta(loader, pmeta_filenames[0], cname_toload)
|
310
|
-
|
311
|
-
@project2config[pname_toload] = config
|
312
|
-
|
313
|
-
project2configLocal = {}
|
314
|
-
|
315
|
-
if @project2config.length == 1
|
316
|
-
if config.defaultToolchain == nil
|
317
|
-
Printer.printError "Error: Main project configuration must contain DefaultToolchain"
|
318
|
-
ExitHelper.exit(1)
|
319
|
-
else
|
320
|
-
basedOn = config.defaultToolchain.basedOn
|
321
|
-
basedOn = "GCC_Lint" if @options.lint
|
322
|
-
basedOnToolchain = Cxxproject::Toolchain::Provider[basedOn]
|
323
|
-
if basedOnToolchain == nil
|
324
|
-
Printer.printError "Error: DefaultToolchain based on unknown compiler '#{basedOn}'"
|
325
|
-
ExitHelper.exit(1)
|
326
|
-
end
|
327
|
-
@defaultToolchain = Utils.deep_copy(basedOnToolchain)
|
328
|
-
integrateToolchain(@defaultToolchain, config.defaultToolchain)
|
329
|
-
|
330
|
-
if @defaultToolchainCached
|
331
|
-
unless @defaultToolchain[:LINKER][:FLAGS] == @defaultToolchainCached[:LINKER][:FLAGS] and
|
332
|
-
@defaultToolchain[:LINKER][:LIB_PREFIX_FLAGS] == @defaultToolchainCached[:LINKER][:LIB_PREFIX_FLAGS] and
|
333
|
-
@defaultToolchain[:LINKER][:LIB_POSTFIX_FLAGS] == @defaultToolchainCached[:LINKER][:LIB_POSTFIX_FLAGS] and
|
334
|
-
@defaultToolchain[:ARCHIVER][:FLAGS] == @defaultToolchainCached[:ARCHIVER][:FLAGS] and
|
335
|
-
@defaultToolchain[:COMPILER][:CPP][:FLAGS] == @defaultToolchainCached[:COMPILER][:CPP][:FLAGS] and
|
336
|
-
@defaultToolchain[:COMPILER][:CPP][:DEFINES].join("") == @defaultToolchainCached[:COMPILER][:CPP][:DEFINES].join("") and
|
337
|
-
@defaultToolchain[:COMPILER][:C][:FLAGS] == @defaultToolchainCached[:COMPILER][:C][:FLAGS] and
|
338
|
-
@defaultToolchain[:COMPILER][:C][:DEFINES].join("") == @defaultToolchainCached[:COMPILER][:C][:DEFINES].join("") and
|
339
|
-
@defaultToolchain[:COMPILER][:ASM][:FLAGS] == @defaultToolchainCached[:COMPILER][:ASM][:FLAGS] and
|
340
|
-
@defaultToolchain[:COMPILER][:ASM][:DEFINES].join("") == @defaultToolchainCached[:COMPILER][:ASM][:DEFINES].join("") and
|
341
|
-
@defaultToolchain[:LINT_POLICY].join("") == @defaultToolchainCached[:LINT_POLICY].join("")
|
342
|
-
@defaultToolchainTime = @mainMetaTime
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
if config.respond_to?("toolchain") and config.toolchain
|
350
|
-
config.toolchain.compiler.each do |c|
|
351
|
-
if not c.internalDefines.nil? and c.internalDefines != ""
|
352
|
-
Printer.printError "Error: #{c.file_name}(#{c.internalDefines.line_number}): InternalDefines only allowed in DefaultToolchain'"
|
353
|
-
ExitHelper.exit(1)
|
354
|
-
end
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
config.dependency.each do |d|
|
359
|
-
pname = d.name
|
360
|
-
cname = d.config
|
361
|
-
|
362
|
-
# check that a project is not dependent twice
|
363
|
-
if project2configLocal.include?pname
|
364
|
-
Printer.printError "Error: More than one dependencies found to '#{pname}' in config '#{config.name}'"
|
365
|
-
ExitHelper.exit(1)
|
366
|
-
end
|
367
|
-
project2configLocal[pname] = cname
|
368
|
-
|
369
|
-
# check pending loads
|
370
|
-
inconsistentConfigs = nil
|
371
|
-
if @project2config.include?pname
|
372
|
-
inconsistentConfigs = @project2config[pname].name if @project2config[pname].name != cname
|
373
|
-
else
|
374
|
-
if project2config_pending.include?pname
|
375
|
-
if project2config_pending[pname] != cname
|
376
|
-
inconsistentConfigs = project2config_pending[pname]
|
377
|
-
end
|
378
|
-
else
|
379
|
-
project2config_pending[pname] = cname
|
380
|
-
end
|
381
|
-
end
|
382
|
-
if inconsistentConfigs
|
383
|
-
Printer.printError "Error: dependency to config '#{cname}' of project '#{pname}' found (line #{d.line_number}), but config #{inconsistentConfigs} was requested earlier"
|
384
|
-
ExitHelper.exit(1)
|
385
|
-
end
|
75
|
+
|
76
|
+
def addSteps(block, blockSteps, configSteps)
|
77
|
+
Array(configSteps.step).each do |step|
|
78
|
+
if Bake::Metamodel::Makefile === step
|
79
|
+
blockSteps << Blocks::Makefile.new(step, @loadedConfig.referencedConfigs, block)
|
80
|
+
elsif Bake::Metamodel::CommandLine === step
|
81
|
+
blockSteps << Blocks::CommandLine.new(step, @loadedConfig.referencedConfigs)
|
386
82
|
end
|
387
|
-
end
|
388
|
-
|
83
|
+
end if configSteps
|
389
84
|
end
|
390
85
|
|
391
|
-
def
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
integrateToolchain(tcs, config.toolchain)
|
400
|
-
else
|
401
|
-
tcs = Utils.deep_copy(Cxxproject::Toolchain::Provider.default)
|
402
|
-
end
|
403
|
-
@configTcMap[config] = tcs
|
404
|
-
end
|
405
|
-
|
406
|
-
def substVars
|
407
|
-
@mainConfig = @project2config[@mainProjectName]
|
408
|
-
|
409
|
-
basedOn = @mainConfig.defaultToolchain.basedOn
|
410
|
-
basedOn = "GCC_Lint" if @options.lint
|
411
|
-
|
412
|
-
basedOnToolchain = Cxxproject::Toolchain::Provider[basedOn]
|
413
|
-
@defaultToolchain = Utils.deep_copy(basedOnToolchain)
|
414
|
-
integrateToolchain(@defaultToolchain, @mainConfig.defaultToolchain)
|
415
|
-
|
416
|
-
Subst.itute(@mainConfig, @mainProjectName, @options, true, getTc(@mainConfig))
|
417
|
-
@project2config.each do |projName, config|
|
418
|
-
Subst.itute(config, projName, @options, false, getTc(config)) if projName != @mainProjectName
|
86
|
+
def addDependencies(block, configDeps)
|
87
|
+
configDeps.each do |dep|
|
88
|
+
@loadedConfig.referencedConfigs[dep.name].each do |config|
|
89
|
+
if config.name == dep.config
|
90
|
+
block.dependencies << config.qname
|
91
|
+
break
|
92
|
+
end
|
93
|
+
end
|
419
94
|
end
|
420
|
-
end
|
95
|
+
end
|
421
96
|
|
422
97
|
def convert2bb
|
423
|
-
@
|
424
|
-
|
425
|
-
projDir = config.parent.get_project_dir
|
426
|
-
@lib_elements = {}
|
427
|
-
|
428
|
-
bbModule = ModuleBuildingBlock.new("Project "+projName)
|
429
|
-
bbModule.contents = []
|
430
|
-
|
431
|
-
tcs = @configTcMap[config]
|
432
|
-
|
433
|
-
addSteps(config.postSteps, bbModule, projDir, "POST", tcs) if not @options.linkOnly
|
434
|
-
|
435
|
-
if Metamodel::CustomConfig === config
|
436
|
-
if config.step
|
437
|
-
if config.step.filter != ""
|
438
|
-
Printer.printError "Error: #{config.file_name}(#{config.step.line_number}): attribute filter not allowed here"
|
439
|
-
ExitHelper.exit(1)
|
440
|
-
end
|
441
|
-
if config.step.default != "on"
|
442
|
-
Printer.printError "Error: #{config.file_name}(#{config.step.line_number}): attribute default not allowed here"
|
443
|
-
ExitHelper.exit(1)
|
444
|
-
end
|
445
|
-
addSteps(config.step, bbModule, projDir, nil, tcs)
|
446
|
-
end
|
447
|
-
bbModule.main_content = BinaryLibrary.new(projName, false)
|
448
|
-
elsif @options.lint
|
449
|
-
bbModule.main_content = Lint.new(projName)
|
450
|
-
bbModule.main_content.set_lint_min(@options.lint_min).set_lint_max(@options.lint_max)
|
451
|
-
elsif Metamodel::LibraryConfig === config
|
452
|
-
bbModule.main_content = SourceLibrary.new(projName)
|
453
|
-
elsif Metamodel::ExecutableConfig === config
|
454
|
-
bbModule.main_content = Executable.new(projName)
|
455
|
-
if not config.artifactName.nil?
|
456
|
-
x = @options.build_config + "/" + config.artifactName.name
|
457
|
-
bbModule.main_content.set_executable_name(x)
|
458
|
-
end
|
459
|
-
bbModule.main_content.set_linker_script(convPath(config.linkerScript, config)) unless config.linkerScript.nil?
|
460
|
-
end
|
461
|
-
bbModule.last_content.dependencies << bbModule.main_content.name
|
462
|
-
bbModule.last_content = bbModule.main_content
|
463
|
-
bbModule.contents << bbModule.main_content
|
464
|
-
|
465
|
-
# PRE CONDITIONS
|
466
|
-
addSteps(config.preSteps, bbModule, projDir, "PRE", tcs) if not @options.linkOnly
|
467
|
-
|
468
|
-
([bbModule] + bbModule.contents).each do |c|
|
469
|
-
c.set_tcs(tcs)
|
470
|
-
if (@defaultToolchainTime <= File.mtime(config.file_name))
|
471
|
-
c.set_config_files([config.file_name])
|
472
|
-
else
|
473
|
-
xxx = file "ssss"
|
474
|
-
$defaultToolchainTime = @defaultToolchainTime
|
475
|
-
def xxx.timestamp
|
476
|
-
$defaultToolchainTime
|
477
|
-
end
|
478
|
-
def xxx.needed?
|
479
|
-
true
|
480
|
-
end
|
481
|
-
@defaultToolchainTime
|
98
|
+
@loadedConfig.referencedConfigs.each do |projName, configs|
|
99
|
+
configs.each do |config|
|
482
100
|
|
483
|
-
|
484
|
-
end
|
485
|
-
c.set_project_dir(projDir)
|
101
|
+
block = Blocks::Block.new(config, @loadedConfig.referencedConfigs)
|
486
102
|
|
487
|
-
|
488
|
-
p = convPath(tcs[:OUTPUT_DIR], config)
|
489
|
-
c.set_output_dir(p)
|
490
|
-
elsif projName == @mainProjectName
|
491
|
-
c.set_output_dir(@options.build_config)
|
492
|
-
else
|
493
|
-
c.set_output_dir(@options.build_config + "_" + @mainProjectName)
|
494
|
-
end
|
495
|
-
c.set_config_name(config.name)
|
496
|
-
end
|
497
|
-
|
498
|
-
if HasLibraries === bbModule.main_content
|
499
|
-
config.userLibrary.each do |l|
|
500
|
-
ln = l.lib
|
501
|
-
ls = nil
|
502
|
-
if l.lib.include?("/")
|
503
|
-
pos = l.lib.rindex("/")
|
504
|
-
ls = convPath(l.lib[0..pos-1], config)
|
505
|
-
ln = l.lib[pos+1..-1]
|
506
|
-
end
|
507
|
-
@lib_elements[l.line_number] = ls.nil? ? [] : [HasLibraries::SEARCH_PATH, ls]
|
508
|
-
@lib_elements[l.line_number].concat [HasLibraries::USERLIB, ln]
|
509
|
-
end
|
103
|
+
Blocks::ALL_BLOCKS[config.qname] = block
|
510
104
|
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
if exLib.name.include?("/")
|
515
|
-
pos = exLib.name.rindex("/")
|
516
|
-
ls = convPath(exLib.name[0..pos-1], config)
|
517
|
-
ln = exLib.name[pos+1..-1]
|
518
|
-
end
|
519
|
-
if exLib.search
|
520
|
-
@lib_elements[exLib.line_number] = ls.nil? ? [] : [HasLibraries::SEARCH_PATH, ls]
|
521
|
-
@lib_elements[exLib.line_number].concat [HasLibraries::LIB, ln]
|
522
|
-
else
|
523
|
-
@lib_elements[exLib.line_number] = [HasLibraries::LIB_WITH_PATH, (ls.nil? ? ln : (ls + "/" + ln))]
|
524
|
-
end
|
105
|
+
if not Bake.options.linkOnly and not Bake.options.prepro and not Bake.options.lint and not Bake.options.docu and not Bake.options.filename
|
106
|
+
addSteps(block, block.preSteps, config.preSteps)
|
107
|
+
addSteps(block, block.postSteps, config.postSteps)
|
525
108
|
end
|
526
109
|
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
)
|
543
|
-
|
544
|
-
bbModule.main_content.set_source_patterns(srcs)
|
545
|
-
bbModule.main_content.set_exclude_sources(ex_srcs)
|
546
|
-
|
547
|
-
tcsMapConverted = {}
|
548
|
-
srcs = config.files.each do |f|
|
549
|
-
if (f.define.length > 0 or f.flags.length > 0)
|
550
|
-
if f.name.include?"*"
|
551
|
-
Printer.printWarning "Warning: #{config.file_name}(#{f.line_number}): toolchain settings not allowed for file pattern #{f.name}"
|
552
|
-
err_res = ErrorDesc.new
|
553
|
-
err_res.file_name = config.file_name
|
554
|
-
err_res.line_number = f.line_number
|
555
|
-
err_res.severity = ErrorParser::SEVERITY_WARNING
|
556
|
-
err_res.message = "Toolchain settings not allowed for file patterns"
|
557
|
-
Rake.application.idei.set_errors([err_res])
|
110
|
+
if Bake.options.docu
|
111
|
+
block.mainSteps << Blocks::Docu.new(config, @configTcMap[config])
|
112
|
+
elsif Metamodel::CustomConfig === config
|
113
|
+
if not Bake.options.linkOnly and not Bake.options.prepro and not Bake.options.lint and not Bake.options.docu and not Bake.options.filename
|
114
|
+
addSteps(block, block.mainSteps, config) if config.step
|
115
|
+
end
|
116
|
+
elsif Bake.options.lint
|
117
|
+
block.mainSteps << Blocks::Lint.new(block, config, @loadedConfig.referencedConfigs, @configTcMap[config])
|
118
|
+
else
|
119
|
+
compile = Blocks::Compile.new(block, config, @loadedConfig.referencedConfigs, @configTcMap[config])
|
120
|
+
(Blocks::ALL_COMPILE_BLOCKS[projName] ||= []) << compile
|
121
|
+
block.mainSteps << compile
|
122
|
+
if not Bake.options.filename
|
123
|
+
if Metamodel::LibraryConfig === config
|
124
|
+
block.mainSteps << Blocks::Library.new(block, config, @loadedConfig.referencedConfigs, @configTcMap[config], compile)
|
558
125
|
else
|
559
|
-
|
126
|
+
block.mainSteps << Blocks::Executable.new(block, config, @loadedConfig.referencedConfigs, @configTcMap[config], compile)
|
560
127
|
end
|
561
128
|
end
|
562
129
|
end
|
563
|
-
bbModule.main_content.set_tcs4source(tcsMapConverted)
|
564
|
-
|
565
|
-
end
|
566
|
-
|
567
|
-
# special exe stuff
|
568
|
-
if Metamodel::ExecutableConfig === config and not @options.lint
|
569
|
-
if not config.mapFile.nil?
|
570
|
-
if config.mapFile.name == ""
|
571
|
-
exeName = bbModule.main_content.get_executable_name
|
572
|
-
mapfileName = exeName.chomp(File.extname(exeName)) + ".map"
|
573
|
-
else
|
574
|
-
mapfileName = config.mapFile.name
|
575
|
-
end
|
576
|
-
|
577
|
-
bbModule.main_content.set_mapfile(mapfileName)
|
578
|
-
end
|
579
|
-
end
|
580
|
-
|
581
|
-
bbModule.contents.each do |c|
|
582
|
-
if Cxxproject::CommandLine === c
|
583
|
-
cmdLine = convPath(c.get_command_line, config, bbModule.main_content)
|
584
|
-
c.set_command_line(cmdLine)
|
585
|
-
end
|
586
|
-
end
|
587
|
-
|
588
|
-
# DEPS
|
589
|
-
projDeps = config.dependency.map { |dd| "Project "+dd.name }
|
590
|
-
projDeps.concat(bbModule.main_content.dependencies)
|
591
|
-
bbModule.main_content.set_dependencies(projDeps)
|
592
|
-
config.dependency.each { |dd| @lib_elements[dd.line_number] = [HasLibraries::DEPENDENCY, dd.name] }
|
593
|
-
|
594
130
|
|
595
|
-
|
596
|
-
|
597
|
-
elem = 0
|
598
|
-
while elem < v.length do
|
599
|
-
bbModule.main_content.add_lib_elements([v[elem..elem+1]])
|
600
|
-
elem = elem + 2
|
131
|
+
if not Bake.options.project# and not Bake.options.filename
|
132
|
+
addDependencies(block, config.dependency)
|
601
133
|
end
|
134
|
+
|
602
135
|
end
|
603
|
-
|
604
|
-
end
|
605
|
-
|
606
|
-
ALL_BUILDING_BLOCKS.each do |bbname,bb|
|
607
|
-
bb.complete_init
|
608
136
|
end
|
609
|
-
|
610
137
|
end
|
611
138
|
|
612
|
-
def
|
613
|
-
loader = Loader.new(@options)
|
614
|
-
|
615
|
-
f = loader.load(@options.main_dir+"/Project.meta")
|
616
|
-
|
617
|
-
if f.root_elements.length != 1 or not Metamodel::Project === f.root_elements[0]
|
618
|
-
Printer.printError "Error: '#{filename}' must have exactly one 'Project' element as root element"
|
619
|
-
ExitHelper.exit(1)
|
620
|
-
end
|
621
|
-
|
622
|
-
validConfigs = []
|
623
|
-
f.root_elements[0].getConfig.each do |c|
|
624
|
-
validConfigs << c.name unless c.defaultToolchain.nil?
|
625
|
-
end
|
626
|
-
puts "Please specify a config name (with -b)!"
|
627
|
-
puts "Possible values are:"
|
628
|
-
if validConfigs.length > 0
|
629
|
-
validConfigs.each { |v| puts "* " + v }
|
630
|
-
else
|
631
|
-
puts " No main config found!"
|
632
|
-
end
|
633
|
-
|
634
|
-
ExitHelper.exit(0)
|
635
|
-
end
|
636
|
-
|
637
|
-
def doit()
|
638
|
-
CLEAN.clear
|
639
|
-
CLOBBER.clear
|
640
|
-
parsingOk = false
|
641
|
-
ex = nil
|
139
|
+
def callBlock(block, method)
|
642
140
|
begin
|
643
|
-
|
644
|
-
rescue
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
err_res.severity = ErrorParser::SEVERITY_ERROR
|
653
|
-
err_res.message = "Parsing configurations failed, see log output."
|
654
|
-
Rake.application.idei.set_errors([err_res])
|
141
|
+
return block.send(method)
|
142
|
+
rescue AbortException
|
143
|
+
raise
|
144
|
+
rescue Exception => ex
|
145
|
+
if Bake.options.debug
|
146
|
+
puts ex.message
|
147
|
+
puts ex.backtrace
|
148
|
+
end
|
149
|
+
return false
|
655
150
|
end
|
656
|
-
|
657
|
-
raise ex if ex
|
658
|
-
parsingOk
|
659
151
|
end
|
660
|
-
|
661
|
-
def
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
end
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
if not forceLoadMeta
|
688
|
-
@project2config = cache.load_cache
|
689
|
-
@defaultToolchainCached = cache.defaultToolchain
|
690
|
-
@defaultToolchainTime = cache.defaultToolchainTime unless cache.defaultToolchainTime.nil?
|
691
|
-
if @project2config.nil?
|
692
|
-
forceLoadMeta = true
|
693
|
-
else
|
694
|
-
@defaultToolchain = @defaultToolchainCached
|
152
|
+
|
153
|
+
def callBlocks(startBlocks, method)
|
154
|
+
Blocks::ALL_BLOCKS.each {|name,block| block.visited = false; block.result = false; block.inDeps = false }
|
155
|
+
Blocks::Block.reset_block_counter
|
156
|
+
result = true
|
157
|
+
startBlocks.each do |block|
|
158
|
+
result = callBlock(block, method) && result
|
159
|
+
return false if not result and Bake.options.stopOnFirstError
|
160
|
+
end
|
161
|
+
return result
|
162
|
+
end
|
163
|
+
|
164
|
+
def calcStartBlocks
|
165
|
+
startProjectName = nil
|
166
|
+
startConfigName = nil
|
167
|
+
if Bake.options.project
|
168
|
+
splitted = Bake.options.project.split(',')
|
169
|
+
startProjectName = splitted[0]
|
170
|
+
startConfigName = splitted[1] if splitted.length == 2
|
171
|
+
end
|
172
|
+
|
173
|
+
if startConfigName
|
174
|
+
blockName = startProjectName+","+startConfigName
|
175
|
+
if not Blocks::ALL_BLOCKS.include?(startProjectName+","+startConfigName)
|
176
|
+
Bake.formatter.printError("Error: project #{startProjectName} with config #{startConfigName} not found")
|
177
|
+
ExitHelper.exit(1)
|
695
178
|
end
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
substVars
|
704
|
-
|
705
|
-
if (@options.cmake)
|
706
|
-
writeCMake
|
707
|
-
ExitHelper.exit(0)
|
708
|
-
end
|
709
|
-
|
710
|
-
convert2bb
|
711
|
-
|
712
|
-
#################################################
|
713
|
-
|
714
|
-
startBBName = "Project "+@options.project
|
715
|
-
startBB = ALL_BUILDING_BLOCKS[startBBName]
|
716
|
-
if startBB.nil?
|
717
|
-
Printer.printError "Error: Project #{@options.project} is not a dependency of #{@mainProjectName}"
|
718
|
-
ExitHelper.exit(1)
|
719
|
-
end
|
720
|
-
|
721
|
-
|
722
|
-
#################################################
|
723
|
-
|
724
|
-
if @options.single or @startupFilename
|
725
|
-
content_names = startBB.contents.map { |c| c.name }
|
726
|
-
startBB.main_content.set_helper_dependencies(startBB.main_content.dependencies.dup) if Executable === startBB.main_content
|
727
|
-
startBB.main_content.dependencies.delete_if { |d| not content_names.include?d}
|
728
|
-
end
|
729
|
-
|
730
|
-
if @startupFilename
|
731
|
-
startBB.contents.each do |c|
|
732
|
-
if SourceLibrary === c or Executable === c
|
733
|
-
|
734
|
-
# check that the file is REALLY included and glob if file does not exist and guess what file can be meant
|
735
|
-
Dir.chdir(startBB.project_dir) do
|
736
|
-
|
737
|
-
theFile = []
|
738
|
-
if not File.exists?(@startupFilename)
|
739
|
-
Dir.chdir(startBB.project_dir) do
|
740
|
-
theFile = Dir.glob("**/#{@startupFilename}")
|
741
|
-
theFile.map! {|tf| startBB.project_dir + "/" + tf}
|
742
|
-
end
|
743
|
-
if theFile.length == 0
|
744
|
-
Printer.printError "Error: #{@startupFilename} not found in project #{@options.project}"
|
745
|
-
ExitHelper.exit(1)
|
746
|
-
end
|
747
|
-
else
|
748
|
-
if File.is_absolute?(@startupFilename)
|
749
|
-
theFile << @startupFilename
|
750
|
-
else
|
751
|
-
theFile << startBB.project_dir + "/" + @startupFilename
|
752
|
-
end
|
753
|
-
|
754
|
-
end
|
755
|
-
|
756
|
-
exclude_files = []
|
757
|
-
c.exclude_sources.each do |e|
|
758
|
-
Dir.glob(e).each {|f| exclude_files << f}
|
759
|
-
end
|
760
|
-
theFile.delete_if { |f| exclude_files.any? {|e| e==f} }
|
761
|
-
if theFile.length == 0
|
762
|
-
Printer.printError "Error: #{@startupFilename} excluded in config #{@options.build_config} of project #{@options.project}"
|
763
|
-
ExitHelper.exit(1)
|
764
|
-
end
|
765
|
-
|
766
|
-
source_files = c.sources.dup
|
767
|
-
c.source_patterns.each do |p|
|
768
|
-
Dir.glob(p).each {|f| source_files << (startBB.project_dir + "/" + f)}
|
769
|
-
end
|
770
|
-
|
771
|
-
theFile.delete_if { |f| source_files.all? {|e| e!=f} }
|
772
|
-
if theFile.length == 0
|
773
|
-
Printer.printError "Error: #{@startupFilename} is no source file in config #{@options.build_config} of project #{@options.project}"
|
774
|
-
ExitHelper.exit(1)
|
775
|
-
elsif theFile.length > 1
|
776
|
-
Printer.printError "Error: #{@startupFilename} is ambiguous in project #{@options.project}"
|
777
|
-
ExitHelper.exit(1)
|
778
|
-
else
|
779
|
-
@startupFilename = theFile[0]
|
780
|
-
end
|
781
|
-
end
|
782
|
-
|
783
|
-
c.set_sources([@startupFilename])
|
784
|
-
c.set_source_patterns([])
|
785
|
-
c.set_exclude_sources([])
|
786
|
-
c.extend(SingleSourceModule) unless @options.lint
|
787
|
-
break
|
788
|
-
else
|
789
|
-
def c.needed?
|
790
|
-
false
|
791
|
-
end
|
179
|
+
startBlocks = [Blocks::ALL_BLOCKS[startProjectName+","+startConfigName]]
|
180
|
+
Blocks::Block.set_num_projects(1)
|
181
|
+
elsif startProjectName
|
182
|
+
startBlocks = []
|
183
|
+
Blocks::ALL_BLOCKS.each do |blockName, block|
|
184
|
+
if blockName.start_with? startProjectName
|
185
|
+
startBlocks << block
|
792
186
|
end
|
793
187
|
end
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
Rake.application.check_unnecessary_includes = (@startupFilename == nil) if @options.check_uninc
|
798
|
-
|
799
|
-
|
800
|
-
#################################################
|
801
|
-
|
802
|
-
|
803
|
-
startBB.contents.each do |b|
|
804
|
-
if SourceLibrary === b or Executable === b or BinaryLibrary === b
|
805
|
-
@parseBB = b
|
188
|
+
if startBlocks.length == 0
|
189
|
+
Bake.formatter.printError("Error: project #{startProjectName} not found")
|
190
|
+
ExitHelper.exit(1)
|
806
191
|
end
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
@bbs = []
|
811
|
-
@num_modules = 1
|
812
|
-
if @options.single or @startupFilename
|
813
|
-
@bbs << startBB
|
814
|
-
@bbs.concat(startBB.contents)
|
192
|
+
startBlocks.reverse! # most probably the order of dependencies if any
|
193
|
+
Blocks::Block.set_num_projects(startBlocks.length)
|
815
194
|
else
|
816
|
-
|
195
|
+
startBlocks = [Blocks::ALL_BLOCKS[Bake.options.main_project_name+","+Bake.options.build_config]]
|
196
|
+
Blocks::Block.set_num_projects(Blocks::ALL_BLOCKS.length)
|
817
197
|
end
|
198
|
+
return startBlocks
|
199
|
+
end
|
200
|
+
|
201
|
+
def doit()
|
818
202
|
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
if @options.show_includes_and_defines
|
833
|
-
intIncs = []
|
834
|
-
intDefs = {:CPP => [], :C => [], :ASM => []}
|
835
|
-
Dir.chdir(@options.main_dir) do
|
836
|
-
|
837
|
-
if (@mainConfig.defaultToolchain.internalIncludes)
|
838
|
-
iname = convPath(@mainConfig.defaultToolchain.internalIncludes.name, @mainConfig)
|
839
|
-
if iname != ""
|
840
|
-
if not File.exists?(iname)
|
841
|
-
Printer.printError "Error: InternalIncludes file #{iname} does not exist"
|
842
|
-
ExitHelper.exit(1)
|
843
|
-
end
|
844
|
-
IO.foreach(iname) {|x| add_line_if_no_comment(intIncs,x) }
|
845
|
-
end
|
846
|
-
end
|
847
|
-
|
848
|
-
@mainConfig.defaultToolchain.compiler.each do |c|
|
849
|
-
if (c.internalDefines)
|
850
|
-
dname = convPath(c.internalDefines.name, @mainConfig)
|
851
|
-
if dname != ""
|
852
|
-
if not File.exists?(dname)
|
853
|
-
Printer.printError "Error: InternalDefines file #{dname} does not exist"
|
854
|
-
ExitHelper.exit(1)
|
855
|
-
end
|
856
|
-
IO.foreach(dname) {|x| add_line_if_no_comment(intDefs[c.ctype],x) }
|
857
|
-
end
|
858
|
-
end
|
859
|
-
end
|
860
|
-
|
861
|
-
end
|
862
|
-
|
863
|
-
|
864
|
-
@bbs.each do |bb|
|
865
|
-
if HasIncludes === bb
|
866
|
-
puts bb.name
|
867
|
-
|
868
|
-
puts " includes"
|
869
|
-
(bb.local_includes + intIncs).each { |i| puts " #{i}" }
|
870
|
-
|
871
|
-
[:CPP, :C, :ASM].each do |type|
|
872
|
-
puts " #{type} defines"
|
873
|
-
(bb.tcs[:COMPILER][type][:DEFINES] + intDefs[type]).each { |d| puts " #{d}" }
|
874
|
-
end
|
875
|
-
puts " done"
|
876
|
-
end
|
877
|
-
end
|
878
|
-
ExitHelper.exit(0)
|
879
|
-
end
|
880
|
-
rescue Exception => e
|
881
|
-
if (not SystemExit === e)
|
882
|
-
puts e
|
883
|
-
puts e.backtrace
|
884
|
-
ExitHelper.exit(1)
|
885
|
-
else
|
886
|
-
raise e
|
887
|
-
end
|
203
|
+
taskType = "Building"
|
204
|
+
if Bake.options.lint
|
205
|
+
taskType = "Linting"
|
206
|
+
elsif Bake.options.docu
|
207
|
+
taskType = "Generating documentation"
|
208
|
+
elsif Bake.options.prepro
|
209
|
+
taskType = "Preprocessing"
|
210
|
+
elsif Bake.options.linkOnly
|
211
|
+
taskType = "Linking"
|
212
|
+
elsif Bake.options.rebuild
|
213
|
+
taskType = "Rebuilding"
|
214
|
+
elsif Bake.options.clean
|
215
|
+
taskType = "Cleaning"
|
888
216
|
end
|
889
217
|
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
Printer.printError "Error: no executable to link"
|
900
|
-
ExitHelper.exit(1)
|
218
|
+
begin
|
219
|
+
@loadedConfig = Config.new
|
220
|
+
@loadedConfig.load
|
221
|
+
|
222
|
+
@mainConfig = @loadedConfig.referencedConfigs[Bake.options.main_project_name].select { |c| c.name == Bake.options.build_config }.first
|
223
|
+
|
224
|
+
if Bake.options.lint
|
225
|
+
@defaultToolchain = Utils.deep_copy(Bake::Toolchain::Provider["Lint"])
|
226
|
+
integrateToolchain(@defaultToolchain, @mainConfig.defaultToolchain)
|
901
227
|
else
|
902
|
-
|
228
|
+
@defaultToolchain = @loadedConfig.defaultToolchain
|
903
229
|
end
|
904
|
-
end
|
905
|
-
|
906
|
-
@bbs.each do |bb|
|
907
|
-
set_output_taskname(bb)
|
908
|
-
end
|
909
|
-
|
910
|
-
if @startupFilename
|
911
|
-
runTaskName = @parseBB.get_task_name
|
912
|
-
else
|
913
|
-
runTaskName = startBB.get_task_name
|
914
|
-
end
|
915
|
-
|
916
|
-
|
917
|
-
@runTask = Rake.application[runTaskName]
|
918
|
-
|
919
|
-
if @startupFilename
|
920
|
-
@runTask.prerequisites.clear
|
921
|
-
end
|
922
|
-
|
923
|
-
return true
|
924
|
-
end
|
925
|
-
|
926
|
-
def start()
|
927
|
-
|
928
|
-
if @options.clean
|
929
|
-
cleanTask = nil
|
930
|
-
if @startupFilename
|
931
|
-
Dir.chdir(@parseBB.project_dir) do
|
932
230
|
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
231
|
+
createBaseTcsForConfig
|
232
|
+
substVars
|
233
|
+
createTcsForConfig
|
234
|
+
|
235
|
+
convert2bb
|
236
|
+
|
237
|
+
Blocks::Show.includes if Bake.options.show_includes
|
238
|
+
Blocks::Show.includesAndDefines(@mainConfig, @configTcMap[@mainConfig]) if Bake.options.show_includes_and_defines
|
239
|
+
|
240
|
+
startBlocks = calcStartBlocks
|
939
241
|
|
940
|
-
|
941
|
-
FileUtils.rm @parseBB.get_dep_file(object), :force => true
|
942
|
-
end
|
943
|
-
else
|
944
|
-
if @options.clobber
|
945
|
-
cleanTask = Rake.application[:clobber]
|
946
|
-
cleanType = "Clobber"
|
947
|
-
else
|
948
|
-
cleanTask = Rake.application[:clean]
|
949
|
-
cleanType = "Clean"
|
950
|
-
end
|
951
|
-
cleanTask.invoke
|
952
|
-
end
|
242
|
+
Bake::IDEInterface.instance.set_build_info(@mainConfig.parent.name, @mainConfig.name, Blocks::ALL_BLOCKS.length)
|
953
243
|
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
244
|
+
begin
|
245
|
+
result = true
|
246
|
+
if Bake.options.clean or Bake.options.rebuild
|
247
|
+
result = callBlocks(startBlocks, :clean)
|
248
|
+
end
|
249
|
+
if Bake.options.rebuild or not Bake.options.clean
|
250
|
+
result = callBlocks(startBlocks, :execute) && result
|
251
|
+
end
|
252
|
+
rescue AbortException
|
253
|
+
Bake.formatter.printError("\n#{taskType} aborted.")
|
254
|
+
ExitHelper.set_exit_code(1)
|
255
|
+
return
|
963
256
|
end
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
buildType = @options.rebuild ? "Rebuild" : "Build"
|
971
|
-
|
972
|
-
if Rake.application.idei and Rake.application.idei.get_abort
|
973
|
-
Printer.printError "\n#{buildType} aborted."
|
974
|
-
return false
|
975
|
-
elsif @runTask.failure
|
976
|
-
if Rake::application.preproFlags
|
977
|
-
Printer.printSuccess "\nPreprocessing done."
|
978
|
-
return true
|
257
|
+
|
258
|
+
if result == false
|
259
|
+
Bake.formatter.printError("\n#{taskType} failed.")
|
260
|
+
ExitHelper.set_exit_code(1)
|
261
|
+
return
|
979
262
|
else
|
980
|
-
|
981
|
-
return false
|
263
|
+
Bake.formatter.printSuccess("\n#{taskType} done.")
|
982
264
|
end
|
983
|
-
|
984
|
-
|
985
|
-
# this "fun part" shall not fail in any case!
|
986
|
-
begin
|
987
|
-
#if Time.now.year == 2012 and Time.now.month == 1
|
988
|
-
# text = " -- The munich software team wishes you a happy new year 2012!"
|
989
|
-
#end
|
990
|
-
rescue Exception
|
991
|
-
end
|
992
|
-
Printer.printSuccess("\n#{buildType} done." + text)
|
993
|
-
return true
|
265
|
+
rescue SystemExit
|
266
|
+
Bake.formatter.printError("\n#{taskType} failed.")
|
994
267
|
end
|
268
|
+
|
995
269
|
end
|
996
270
|
|
997
271
|
def connect()
|
998
|
-
if
|
999
|
-
|
272
|
+
if Bake.options.socket != 0
|
273
|
+
Bake::IDEInterface.instance.connect(Bake.options.socket)
|
1000
274
|
end
|
1001
275
|
end
|
1002
276
|
|
1003
277
|
def disconnect()
|
1004
|
-
if
|
1005
|
-
|
278
|
+
if Bake.options.socket != 0
|
279
|
+
Bake::IDEInterface.instance.disconnect()
|
1006
280
|
end
|
1007
281
|
end
|
1008
282
|
|
1009
|
-
|
1010
283
|
end
|
1011
284
|
end
|
1012
|
-
|
1013
|
-
|
1014
|
-
# metamodel Files vs File vs Dir vs Make vs ... ? merge?
|
1015
|
-
|