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,25 @@
|
|
1
|
+
require 'blocks/has_execute_command'
|
2
|
+
|
3
|
+
module Bake
|
4
|
+
module Blocks
|
5
|
+
|
6
|
+
class CommandLine
|
7
|
+
include HasExecuteCommand
|
8
|
+
|
9
|
+
def initialize(config, referencedConfigs)
|
10
|
+
@config = config # Bake::Metamodel::CommandLine
|
11
|
+
@commandLine = config.name
|
12
|
+
@projectDir = config.get_project_dir
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute
|
16
|
+
executeCommand(@commandLine)
|
17
|
+
end
|
18
|
+
def clean
|
19
|
+
# nothing to do here
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,382 @@
|
|
1
|
+
require 'blocks/blockBase'
|
2
|
+
require 'multithread/job'
|
3
|
+
require 'common/process'
|
4
|
+
require 'common/utils'
|
5
|
+
require 'bake/toolchain/colorizing_formatter'
|
6
|
+
require 'bake/config/loader'
|
7
|
+
|
8
|
+
module Bake
|
9
|
+
|
10
|
+
module Blocks
|
11
|
+
|
12
|
+
class Compile < BlockBase
|
13
|
+
|
14
|
+
attr_reader :objects, :include_list
|
15
|
+
|
16
|
+
def initialize(block, config, referencedConfigs, tcs)
|
17
|
+
super(block, config, referencedConfigs, tcs)
|
18
|
+
@objects = []
|
19
|
+
|
20
|
+
calcFileTcs
|
21
|
+
calcIncludes
|
22
|
+
calcDefines # not for files with changed tcs
|
23
|
+
calcFlags # not for files with changed tcs
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_object_file(source)
|
27
|
+
adaptedSource = source.chomp(File.extname(source)).gsub(/\.\./, "##") + (Bake.options.prepro ? ".i" : ".o")
|
28
|
+
return adaptedSource if File.is_absolute?source
|
29
|
+
File.join([@output_dir, adaptedSource])
|
30
|
+
end
|
31
|
+
|
32
|
+
def needed?(source, object, type, dep_filename_conv)
|
33
|
+
return false if Bake.options.linkOnly
|
34
|
+
|
35
|
+
return "because prepro was specified" if Bake.options.prepro
|
36
|
+
|
37
|
+
return "because object does not exist" if not File.exist?(object)
|
38
|
+
oTime = File.mtime(object)
|
39
|
+
|
40
|
+
return "because config file has been changed" if oTime < File.mtime(@config.file_name)
|
41
|
+
return "Compiling #{source} because DefaultToolchain has been changed" if oTime < Bake::Config.defaultToolchainTime
|
42
|
+
|
43
|
+
return "because source is newer than object" if oTime < File.mtime(source)
|
44
|
+
|
45
|
+
if type != :ASM
|
46
|
+
return "because dependency file does not exist" if not File.exist?(dep_filename_conv)
|
47
|
+
|
48
|
+
begin
|
49
|
+
File.readlines(dep_filename_conv).map{|line| line.strip}.each do |dep|
|
50
|
+
return "because dependent header #{dep} does not exist" if not File.exist?(dep)
|
51
|
+
return "because dependent header #{dep} is newer than object" if oTime < File.mtime(dep)
|
52
|
+
end
|
53
|
+
rescue Exception => ex
|
54
|
+
if Bake.options.debug
|
55
|
+
puts "While reading #{dep_filename_conv}:"
|
56
|
+
puts ex.message
|
57
|
+
puts ex.backtrace
|
58
|
+
end
|
59
|
+
return "because dependency file could not be loaded"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
def calcDepFile(object, type)
|
67
|
+
dep_filename = nil
|
68
|
+
if type != :ASM
|
69
|
+
dep_filename = object[0..-3] + ".d"
|
70
|
+
end
|
71
|
+
dep_filename
|
72
|
+
end
|
73
|
+
|
74
|
+
def calcDepFileConv(dep_filename)
|
75
|
+
dep_filename + ".bake"
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_source_type(source)
|
79
|
+
ex = File.extname(source)
|
80
|
+
[:CPP, :C, :ASM].each do |t|
|
81
|
+
return t if @tcs[:COMPILER][t][:SOURCE_FILE_ENDINGS].include?(ex)
|
82
|
+
end
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
|
86
|
+
def compileFile(source)
|
87
|
+
type = get_source_type(source)
|
88
|
+
return true if type.nil?
|
89
|
+
|
90
|
+
object = get_object_file(source)
|
91
|
+
@objects << object
|
92
|
+
|
93
|
+
dep_filename = calcDepFile(object, type)
|
94
|
+
dep_filename_conv = calcDepFileConv(dep_filename) if type != :ASM
|
95
|
+
|
96
|
+
reason = needed?(source, object, type, dep_filename_conv)
|
97
|
+
return true unless reason
|
98
|
+
|
99
|
+
if @fileTcs.include?(source)
|
100
|
+
compiler = @fileTcs[source][:COMPILER][type]
|
101
|
+
defines = getDefines(compiler)
|
102
|
+
flags = getFlags(compiler)
|
103
|
+
else
|
104
|
+
compiler = @tcs[:COMPILER][type]
|
105
|
+
defines = @define_array[type]
|
106
|
+
flags = @flag_array[type]
|
107
|
+
end
|
108
|
+
includes = @include_array[type]
|
109
|
+
|
110
|
+
if Bake.options.prepro and compiler[:PREPRO_FLAGS] == ""
|
111
|
+
Bake.formatter.printError("Error: No preprocessor option available for " + source)
|
112
|
+
raise SystemCommandFailed.new
|
113
|
+
end
|
114
|
+
|
115
|
+
prepareOutput(object)
|
116
|
+
|
117
|
+
cmd = Utils.flagSplit(compiler[:COMMAND], false)
|
118
|
+
cmd += compiler[:COMPILE_FLAGS].split(" ")
|
119
|
+
|
120
|
+
if dep_filename
|
121
|
+
cmd += @tcs[:COMPILER][type][:DEP_FLAGS].split(" ")
|
122
|
+
if @tcs[:COMPILER][type][:DEP_FLAGS_FILENAME]
|
123
|
+
if @tcs[:COMPILER][type][:DEP_FLAGS_SPACE]
|
124
|
+
cmd << dep_filename
|
125
|
+
else
|
126
|
+
if dep_filename.include?" "
|
127
|
+
cmd[cmd.length-1] << "\"" + dep_filename + "\""
|
128
|
+
else
|
129
|
+
cmd[cmd.length-1] << dep_filename
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
cmd += compiler[:PREPRO_FLAGS].split(" ") if Bake.options.prepro
|
137
|
+
cmd += flags
|
138
|
+
cmd += includes
|
139
|
+
cmd += defines
|
140
|
+
|
141
|
+
if compiler[:OBJ_FLAG_SPACE]
|
142
|
+
cmd << compiler[:OBJECT_FILE_FLAG]
|
143
|
+
cmd << object
|
144
|
+
else
|
145
|
+
if object.include?" "
|
146
|
+
cmd << compiler[:OBJECT_FILE_FLAG] + "\"" + object + "\""
|
147
|
+
else
|
148
|
+
cmd << compiler[:OBJECT_FILE_FLAG] + object
|
149
|
+
end
|
150
|
+
end
|
151
|
+
cmd << source
|
152
|
+
|
153
|
+
success, consoleOutput = ProcessHelper.run(cmd, false, false)
|
154
|
+
outputType = Bake.options.prepro ? "Preprocessing" : "Compiling"
|
155
|
+
process_result(cmd, consoleOutput, compiler[:ERROR_PARSER], "#{outputType} #{source}", reason, success)
|
156
|
+
|
157
|
+
Compile.convert_depfile(dep_filename, dep_filename_conv, @projectDir, @tcs[:COMPILER][:DEP_FILE_SINGLE_LINE]) if type != :ASM
|
158
|
+
check_config_file
|
159
|
+
end
|
160
|
+
|
161
|
+
def self.read_depfile(dep_filename, projDir, singeLine)
|
162
|
+
deps = []
|
163
|
+
begin
|
164
|
+
if singeLine
|
165
|
+
File.readlines(dep_filename).each do |line|
|
166
|
+
splitted = line.split(": ")
|
167
|
+
deps << splitted[1].gsub(/[\\]/,'/') if splitted.length > 1
|
168
|
+
end
|
169
|
+
else
|
170
|
+
deps_string = File.read(dep_filename)
|
171
|
+
deps_string = deps_string.gsub(/\\\n/,'')
|
172
|
+
dep_splitted = deps_string.split(/([^\\]) /).each_slice(2).map(&:join)[2..-1]
|
173
|
+
deps = dep_splitted.map { |d| d.gsub(/[\\] /,' ').gsub(/[\\]/,'/').strip }.delete_if {|d| d == "" }
|
174
|
+
end
|
175
|
+
rescue Exception
|
176
|
+
Bake.formatter.printWarning("Could not read '#{dep_filename}'", projDir)
|
177
|
+
return nil
|
178
|
+
end
|
179
|
+
deps
|
180
|
+
end
|
181
|
+
|
182
|
+
# todo: move to toolchain util file
|
183
|
+
def self.convert_depfile(dep_filename, dep_filename_conv, projDir, singleLine)
|
184
|
+
deps = read_depfile(dep_filename, projDir, singleLine)
|
185
|
+
if deps
|
186
|
+
begin
|
187
|
+
File.open(dep_filename_conv, 'wb') do |f|
|
188
|
+
deps.each do |dep|
|
189
|
+
f.puts(dep)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
rescue Exception
|
193
|
+
Bake.formatter.printWarning("Could not write '#{dep_filename_conv}'", projDir)
|
194
|
+
return nil
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def mutex
|
200
|
+
@mutex ||= Mutex.new
|
201
|
+
end
|
202
|
+
|
203
|
+
def execute
|
204
|
+
Dir.chdir(@projectDir) do
|
205
|
+
|
206
|
+
calcSources
|
207
|
+
|
208
|
+
@error_strings = {}
|
209
|
+
|
210
|
+
compileJobs = Multithread::Jobs.new(@source_files) do |jobs|
|
211
|
+
while source = jobs.get_next_or_nil do
|
212
|
+
|
213
|
+
if (jobs.failed and Bake.options.stopOnFirstError) or Bake::IDEInterface.instance.get_abort
|
214
|
+
break
|
215
|
+
end
|
216
|
+
|
217
|
+
s = StringIO.new
|
218
|
+
tmp = Thread.current[:stdout]
|
219
|
+
Thread.current[:stdout] = s unless tmp
|
220
|
+
|
221
|
+
result = false
|
222
|
+
begin
|
223
|
+
compileFile(source)
|
224
|
+
result = true
|
225
|
+
rescue Bake::SystemCommandFailed => scf # normal compilation error
|
226
|
+
rescue SystemExit => exSys
|
227
|
+
rescue Exception => ex1
|
228
|
+
if not Bake::IDEInterface.instance.get_abort
|
229
|
+
Bake.formatter.printError("Error: #{ex1.message}")
|
230
|
+
puts ex1.backtrace if Bake.options.debug
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
jobs.set_failed if not result
|
235
|
+
|
236
|
+
Thread.current[:stdout] = tmp
|
237
|
+
|
238
|
+
mutex.synchronize do
|
239
|
+
if s.string.length > 0
|
240
|
+
if Bake.options.stopOnFirstError and not result
|
241
|
+
@error_strings[source] = s.string
|
242
|
+
else
|
243
|
+
puts s.string
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
end
|
250
|
+
compileJobs.join
|
251
|
+
|
252
|
+
# can only happen in case of bail_on_first_error.
|
253
|
+
# if not sorted, it may be confusing when builing more than once and the order of the error appearances changes from build to build
|
254
|
+
# (it is not deterministic which file compilation finishes first)
|
255
|
+
@error_strings.sort.each {|es| puts es[1]}
|
256
|
+
|
257
|
+
raise SystemCommandFailed.new if compileJobs.failed
|
258
|
+
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def clean
|
263
|
+
if Bake.options.filename
|
264
|
+
Dir.chdir(@projectDir) do
|
265
|
+
calcSources(true)
|
266
|
+
@source_files.each do |source|
|
267
|
+
|
268
|
+
type = get_source_type(source)
|
269
|
+
next if type.nil?
|
270
|
+
object = get_object_file(source)
|
271
|
+
dep_filename = calcDepFile(object, type)
|
272
|
+
if File.exist?object
|
273
|
+
puts "Deleting file #{object}" if Bake.options.verboseHigh
|
274
|
+
FileUtils.rm_rf(object)
|
275
|
+
end
|
276
|
+
if File.exist?dep_filename
|
277
|
+
puts "Deleting file #{dep_filename}" if Bake.options.verboseHigh
|
278
|
+
FileUtils.rm_rf(dep_filename)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def calcSources(cleaning = false)
|
286
|
+
@source_files = []
|
287
|
+
|
288
|
+
exclude_files = Set.new
|
289
|
+
@config.excludeFiles.each do |p|
|
290
|
+
Dir.glob(p.name).each {|f| exclude_files << f}
|
291
|
+
end
|
292
|
+
|
293
|
+
source_files = Set.new
|
294
|
+
@config.files.each do |sources|
|
295
|
+
p = sources.name
|
296
|
+
res = Dir.glob(p)
|
297
|
+
if res.length == 0 and cleaning == false
|
298
|
+
if not p.include?"*" and not p.include?"?"
|
299
|
+
Bake.formatter.printError("Source file '#{p}' not found", sources)
|
300
|
+
raise SystemCommandFailed.new
|
301
|
+
elsif not Bake.options.verboseLow
|
302
|
+
Bake.formatter.printInfo("Source file pattern '#{p}' does not match to any file", sources)
|
303
|
+
end
|
304
|
+
end
|
305
|
+
res.each do |f|
|
306
|
+
next if exclude_files.include?(f)
|
307
|
+
source_files << f
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
if Bake.options.filename
|
312
|
+
source_files.keep_if do |source|
|
313
|
+
source.include?Bake.options.filename
|
314
|
+
end
|
315
|
+
if source_files.length == 0 and cleaning == false
|
316
|
+
Bake.formatter.printInfo("#{Bake.options.filename} does not match to any source", @config)
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
@source_files = source_files.sort.to_a
|
321
|
+
end
|
322
|
+
|
323
|
+
def calcIncludes
|
324
|
+
@include_list = @config.includeDir.map do |dir|
|
325
|
+
(dir.name == "___ROOTS___") ? (Bake.options.roots.map { |r| File.rel_from_to_project(@projectDir,r,false) }) : @block.convPath(dir)
|
326
|
+
end.flatten
|
327
|
+
|
328
|
+
@include_array = {}
|
329
|
+
[:CPP, :C, :ASM].each do |type|
|
330
|
+
@include_array[type] = @include_list.map {|k| "#{@tcs[:COMPILER][type][:INCLUDE_PATH_FLAG]}#{k}"}
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
def getDefines(compiler)
|
335
|
+
compiler[:DEFINES].map {|k| "#{compiler[:DEFINE_FLAG]}#{k}"}
|
336
|
+
end
|
337
|
+
|
338
|
+
def getFlags(compiler)
|
339
|
+
Bake::Utils::flagSplit(compiler[:FLAGS],true)
|
340
|
+
end
|
341
|
+
|
342
|
+
def calcDefines
|
343
|
+
@define_array = {}
|
344
|
+
[:CPP, :C, :ASM].each do |type|
|
345
|
+
@define_array[type] = getDefines(@tcs[:COMPILER][type])
|
346
|
+
end
|
347
|
+
end
|
348
|
+
def calcFlags
|
349
|
+
@flag_array = {}
|
350
|
+
[:CPP, :C, :ASM].each do |type|
|
351
|
+
@flag_array[type] = getFlags(@tcs[:COMPILER][type])
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
def calcFileTcs
|
356
|
+
@fileTcs = {}
|
357
|
+
@config.files.each do |f|
|
358
|
+
if (f.define.length > 0 or f.flags.length > 0)
|
359
|
+
if f.name.include?"*"
|
360
|
+
Bake.formatter.printWarning("Toolchain settings not allowed for file pattern #{f.name}", f)
|
361
|
+
err_res = ErrorDesc.new
|
362
|
+
err_res.file_name = @config.file_name
|
363
|
+
err_res.line_number = f.line_number
|
364
|
+
err_res.severity = ErrorParser::SEVERITY_WARNING
|
365
|
+
err_res.message = "Toolchain settings not allowed for file patterns"
|
366
|
+
Bake::IDEInterface.instance.set_errors([err_res])
|
367
|
+
else
|
368
|
+
@fileTcs[f.name] = integrateCompilerFile(Utils.deep_copy(@tcs),f)
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
def tcs4source(source)
|
375
|
+
@fileTcs[source] || @tcs
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
end
|
380
|
+
|
381
|
+
end
|
382
|
+
end
|
data/lib/blocks/docu.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'blocks/compile'
|
2
|
+
|
3
|
+
module Bake
|
4
|
+
module Blocks
|
5
|
+
class Docu
|
6
|
+
include HasExecuteCommand
|
7
|
+
|
8
|
+
def initialize(config, tcs)
|
9
|
+
@config = config # Bake::Metamodel::CommandLine
|
10
|
+
@commandLine = tcs[:DOCU]
|
11
|
+
@projectDir = config.get_project_dir
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
if @commandLine.empty?
|
16
|
+
Bake.formatter.printInfo("No documentation command specified", @config)
|
17
|
+
else
|
18
|
+
executeCommand(@commandLine)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def clean
|
23
|
+
# nothing to do here
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'blocks/blockBase'
|
2
|
+
|
3
|
+
module Bake
|
4
|
+
|
5
|
+
module Blocks
|
6
|
+
|
7
|
+
class Executable < BlockBase
|
8
|
+
|
9
|
+
def initialize(block, config, referencedConfigs, tcs, compileBlock)
|
10
|
+
super(block, config, referencedConfigs, tcs)
|
11
|
+
@compileBlock = compileBlock
|
12
|
+
|
13
|
+
calcArtifactName
|
14
|
+
calcMapFile
|
15
|
+
calcLinkerScript
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def calcLinkerScript
|
20
|
+
@linker_script = @config.linkerScript.nil? ? nil : @block.convPath(@config.linkerScript)
|
21
|
+
end
|
22
|
+
|
23
|
+
def calcArtifactName
|
24
|
+
if not @config.artifactName.nil? and @config.artifactName.name != ""
|
25
|
+
baseFilename = @config.artifactName.name
|
26
|
+
else
|
27
|
+
baseFilename = "#{@projectName}#{@tcs[:LINKER][:OUTPUT_ENDING]}"
|
28
|
+
end
|
29
|
+
@exe_name ||= File.join([@output_dir, baseFilename])
|
30
|
+
end
|
31
|
+
|
32
|
+
def calcMapFile
|
33
|
+
@mapfile = nil
|
34
|
+
if (not Bake.options.docu) and (not Bake.options.lint) and (not @config.mapFile.nil?)
|
35
|
+
if @config.mapFile.name == ""
|
36
|
+
@mapfile = @exe_name.chomp(File.extname(@exe_name)) + ".map"
|
37
|
+
else
|
38
|
+
@mapfile = @config.mapFile.name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def depHasError(block)
|
44
|
+
block.dependencies.each do |dep|
|
45
|
+
subBlock = Blocks::ALL_BLOCKS[dep]
|
46
|
+
return true unless subBlock.result
|
47
|
+
return depHasError(subBlock)
|
48
|
+
end
|
49
|
+
return false
|
50
|
+
end
|
51
|
+
|
52
|
+
def needed?(libs)
|
53
|
+
return false if depHasError(@block)
|
54
|
+
return false if Bake.options.prepro
|
55
|
+
return "because linkOnly was specified" if Bake.options.linkOnly
|
56
|
+
|
57
|
+
# exe
|
58
|
+
return "because executable does not exist" if not File.exists?(@exe_name)
|
59
|
+
|
60
|
+
eTime = File.mtime(@exe_name)
|
61
|
+
|
62
|
+
# config
|
63
|
+
return "because config file has been changed" if eTime < File.mtime(@config.file_name)
|
64
|
+
return "because DefaultToolchain has been changed" if eTime < Bake::Config.defaultToolchainTime
|
65
|
+
|
66
|
+
# linkerscript
|
67
|
+
if @linker_script
|
68
|
+
return "because linker script does not exist - will most probably result in an error" if not File.exists?(@linker_script)
|
69
|
+
return "because linker script is newer than executable" if eTime < File.mtime(@linker_script)
|
70
|
+
end
|
71
|
+
|
72
|
+
# sources
|
73
|
+
@compileBlock.objects.each do |obj|
|
74
|
+
return "because object #{obj} does not exist" if not File.exists?(obj)
|
75
|
+
return "because object #{obj} is newer than executable" if eTime < File.mtime(obj)
|
76
|
+
end
|
77
|
+
|
78
|
+
# libs
|
79
|
+
libs.each do |lib|
|
80
|
+
return "because library #{lib} does not exist" if not File.exists?(lib)
|
81
|
+
return "because library #{lib} is newer than executable" if eTime < File.mtime(lib)
|
82
|
+
end
|
83
|
+
false
|
84
|
+
end
|
85
|
+
|
86
|
+
def execute
|
87
|
+
|
88
|
+
Dir.chdir(@projectDir) do
|
89
|
+
|
90
|
+
libs, linker_libs_array = LibElements.calc_linker_lib_string(@block, @tcs)
|
91
|
+
|
92
|
+
reason = needed?(libs)
|
93
|
+
return unless reason
|
94
|
+
|
95
|
+
prepareOutput(@exe_name)
|
96
|
+
|
97
|
+
linker = @tcs[:LINKER]
|
98
|
+
|
99
|
+
cmd = Utils.flagSplit(linker[:COMMAND], false) # g++
|
100
|
+
cmd += linker[:MUST_FLAGS].split(" ")
|
101
|
+
cmd += Bake::Utils::flagSplit(linker[:FLAGS],true)
|
102
|
+
cmd << linker[:EXE_FLAG]
|
103
|
+
cmd << @exe_name # -o debug/x.exe
|
104
|
+
cmd += @compileBlock.objects
|
105
|
+
cmd << linker[:SCRIPT] if @linker_script # -T
|
106
|
+
cmd << @linker_script if @linker_script # xy/xy.dld
|
107
|
+
cmd += linker[:MAP_FILE_FLAG].split(" ") if @mapfile # -Wl,-m6
|
108
|
+
if not linker[:MAP_FILE_PIPE] and @mapfile
|
109
|
+
cmd[cmd.length-1] << @mapfile
|
110
|
+
end
|
111
|
+
cmd += Bake::Utils::flagSplit(linker[:LIB_PREFIX_FLAGS],true) # "-Wl,--whole-archive "
|
112
|
+
cmd += linker_libs_array
|
113
|
+
cmd += Bake::Utils::flagSplit(linker[:LIB_POSTFIX_FLAGS],true) # "-Wl,--no-whole-archive "
|
114
|
+
|
115
|
+
mapfileStr = (@mapfile and linker[:MAP_FILE_PIPE]) ? " >#{@mapfile}" : ""
|
116
|
+
|
117
|
+
# pre print because linking can take much time
|
118
|
+
cmdLinePrint = cmd.dup
|
119
|
+
outPipe = (@mapfile and linker[:MAP_FILE_PIPE]) ? "#{@mapfile}" : nil
|
120
|
+
cmdLinePrint << "> #{outPipe}" if outPipe
|
121
|
+
|
122
|
+
printCmd(cmdLinePrint, "Linking #{@exe_name}", reason, false)
|
123
|
+
success, consoleOutput = ProcessHelper.run(cmd, false, false, outPipe)
|
124
|
+
process_result(cmdLinePrint, consoleOutput, linker[:ERROR_PARSER], nil, reason, success)
|
125
|
+
|
126
|
+
check_config_file()
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
def clean
|
132
|
+
Dir.chdir(@projectDir) do
|
133
|
+
if File.exist?@output_dir
|
134
|
+
puts "Deleting folder #{@output_dir}" if Bake.options.verboseHigh
|
135
|
+
FileUtils.rm_rf(@output_dir)
|
136
|
+
end
|
137
|
+
end unless Bake.options.filename
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|