bake-toolkit 2.20.4 → 2.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile.rb +3 -3
  3. data/bin/bake +46 -46
  4. data/bin/bake-doc +11 -11
  5. data/bin/bakery +179 -179
  6. data/bin/createVSProjects +213 -213
  7. data/documentation/_build/html/_sources/changelog.txt +456 -451
  8. data/documentation/_build/html/_sources/commandline/commandline.txt +107 -107
  9. data/documentation/_build/html/_sources/concepts/build_hierarchy.txt +34 -34
  10. data/documentation/_build/html/_sources/concepts/concepts.txt +14 -14
  11. data/documentation/_build/html/_sources/concepts/inject.txt +65 -65
  12. data/documentation/_build/html/_sources/concepts/link_order.txt +91 -91
  13. data/documentation/_build/html/_sources/concepts/prebuild.txt +56 -56
  14. data/documentation/_build/html/_sources/concepts/the_main_project.txt +45 -45
  15. data/documentation/_build/html/_sources/concepts/the_project_meta_file.txt +72 -72
  16. data/documentation/_build/html/_sources/ide/eclipse/eclipse.txt +25 -25
  17. data/documentation/_build/html/_sources/ide/eclipse/how_to_convert_existing_cdt_workspace.txt +31 -31
  18. data/documentation/_build/html/_sources/ide/eclipse/how_to_create_a_new_project_in_eclipse.txt +18 -18
  19. data/documentation/_build/html/_sources/ide/eclipse/how_to_create_a_workspace_in_eclipse.txt +27 -27
  20. data/documentation/_build/html/_sources/ide/eclipse/how_to_debug_in_eclipse.txt +38 -38
  21. data/documentation/_build/html/_sources/ide/eclipse/how_to_install_eclipse_plugin.txt +44 -44
  22. data/documentation/_build/html/_sources/ide/eclipse/how_to_use_bake_in_eclipse.txt +86 -86
  23. data/documentation/_build/html/_sources/ide/ide_integrations.txt +8 -8
  24. data/documentation/_build/html/_sources/ide/vs/how_to_create_vs_projects.txt +15 -15
  25. data/documentation/_build/html/_sources/ide/vs/how_to_debug_in_vs.txt +35 -35
  26. data/documentation/_build/html/_sources/ide/vs/how_to_used_bake_in_vs.txt +35 -35
  27. data/documentation/_build/html/_sources/ide/vs/vs.txt +10 -10
  28. data/documentation/_build/html/_sources/ide/vs/vs_install.txt +43 -43
  29. data/documentation/_build/html/_sources/index.txt +33 -33
  30. data/documentation/_build/html/_sources/install/install_bake.txt +112 -112
  31. data/documentation/_build/html/_sources/internal.txt +50 -50
  32. data/documentation/_build/html/_sources/known_issues.txt +9 -9
  33. data/documentation/_build/html/_sources/license.txt +4 -4
  34. data/documentation/_build/html/_sources/performance/performance.txt +104 -104
  35. data/documentation/_build/html/_sources/quickstart/quickstart.txt +70 -70
  36. data/documentation/_build/html/_sources/syntax/adapt_configs.txt +143 -143
  37. data/documentation/_build/html/_sources/syntax/auto_adjustment.txt +43 -43
  38. data/documentation/_build/html/_sources/syntax/derive_configs.txt +93 -94
  39. data/documentation/_build/html/_sources/syntax/project_meta_syntax.txt +19 -19
  40. data/documentation/_build/html/_sources/syntax/syntax.txt +11 -11
  41. data/documentation/_build/html/_sources/syntax/variable_substitutions.txt +147 -147
  42. data/documentation/_build/html/_sources/tips_and_tricks/dot.txt +34 -34
  43. data/documentation/_build/html/_sources/tips_and_tricks/how_to_use_bake_with_cygwin.txt +62 -62
  44. data/documentation/_build/html/_sources/tips_and_tricks/static_code_analysis.txt +122 -122
  45. data/documentation/_build/html/_sources/tips_and_tricks/the_bakery.txt +72 -72
  46. data/documentation/_build/html/_sources/tips_and_tricks/the_clang.txt +43 -43
  47. data/documentation/_build/html/_sources/tips_and_tricks/tips_and_tricks.txt +34 -34
  48. data/documentation/_build/html/_sources/why_bake/why_bake.txt +40 -40
  49. data/documentation/_build/html/changelog.html +7 -0
  50. data/documentation/_build/html/commandline/commandline.html +2 -2
  51. data/documentation/_build/html/concepts/link_order.html +2 -2
  52. data/documentation/_build/html/concepts/prebuild.html +2 -2
  53. data/documentation/_build/html/index.html +4 -4
  54. data/documentation/_build/html/performance/performance.html +2 -2
  55. data/documentation/_build/html/searchindex.js +1 -1
  56. data/documentation/_build/html/syntax/adapt_configs.html +2 -2
  57. data/documentation/_build/html/syntax/syntax.html +2 -2
  58. data/documentation/_build/html/tips_and_tricks/the_clang.html +2 -2
  59. data/documentation/_build/html/why_bake/why_bake.html +2 -2
  60. data/lib/adapt/config/loader.rb +112 -112
  61. data/lib/bake/bundle.rb +158 -158
  62. data/lib/bake/cache.rb +179 -180
  63. data/lib/bake/config/checks.rb +68 -68
  64. data/lib/bake/config/loader.rb +363 -363
  65. data/lib/bake/libElement.rb +176 -176
  66. data/lib/bake/mergeConfig.rb +208 -208
  67. data/lib/bake/model/language.rb +45 -45
  68. data/lib/bake/model/loader.rb +99 -99
  69. data/lib/bake/model/metamodel.rb +307 -307
  70. data/lib/bake/model/metamodel_ext.rb +27 -27
  71. data/lib/bake/options/create.rb +95 -95
  72. data/lib/bake/options/options.rb +315 -310
  73. data/lib/bake/options/showDoc.rb +20 -20
  74. data/lib/bake/options/showLicense.rb +9 -9
  75. data/lib/bake/options/showToolchains.rb +38 -38
  76. data/lib/bake/options/usage.rb +79 -68
  77. data/lib/bake/subst.rb +313 -313
  78. data/lib/bake/toolchain/clang.rb +44 -44
  79. data/lib/bake/toolchain/clang_analyze.rb +31 -31
  80. data/lib/bake/toolchain/colorizing_formatter.rb +125 -125
  81. data/lib/bake/toolchain/diab.rb +53 -53
  82. data/lib/bake/toolchain/errorparser/diab_compiler_error_parser.rb +40 -40
  83. data/lib/bake/toolchain/errorparser/diab_linker_error_parser.rb +41 -41
  84. data/lib/bake/toolchain/errorparser/error_parser.rb +71 -71
  85. data/lib/bake/toolchain/errorparser/gcc_compiler_error_parser.rb +35 -35
  86. data/lib/bake/toolchain/errorparser/gcc_linker_error_parser.rb +35 -35
  87. data/lib/bake/toolchain/errorparser/greenhills_compiler_error_parser.rb +32 -32
  88. data/lib/bake/toolchain/errorparser/greenhills_linker_error_parser.rb +44 -44
  89. data/lib/bake/toolchain/errorparser/keil_compiler_error_parser.rb +40 -40
  90. data/lib/bake/toolchain/errorparser/keil_linker_error_parser.rb +30 -30
  91. data/lib/bake/toolchain/errorparser/lint_error_parser.rb +34 -34
  92. data/lib/bake/toolchain/errorparser/msvc_compiler_error_parser.rb +63 -63
  93. data/lib/bake/toolchain/errorparser/msvc_linker_error_parser.rb +42 -42
  94. data/lib/bake/toolchain/errorparser/process_output.rb +2 -2
  95. data/lib/bake/toolchain/errorparser/ti_compiler_error_parser.rb +30 -30
  96. data/lib/bake/toolchain/errorparser/ti_linker_error_parser.rb +30 -30
  97. data/lib/bake/toolchain/gcc.rb +49 -49
  98. data/lib/bake/toolchain/gcc_env.rb +55 -55
  99. data/lib/bake/toolchain/greenhills.rb +52 -52
  100. data/lib/bake/toolchain/keil.rb +53 -53
  101. data/lib/bake/toolchain/lint.rb +20 -20
  102. data/lib/bake/toolchain/msvc.rb +58 -58
  103. data/lib/bake/toolchain/provider.rb +146 -146
  104. data/lib/bake/toolchain/ti.rb +47 -47
  105. data/lib/bake/util.rb +149 -149
  106. data/lib/bakery/buildPattern.rb +24 -24
  107. data/lib/bakery/model/language.rb +22 -22
  108. data/lib/bakery/model/loader.rb +55 -55
  109. data/lib/bakery/model/metamodel.rb +48 -48
  110. data/lib/bakery/options/options.rb +87 -87
  111. data/lib/bakery/toBake.rb +81 -81
  112. data/lib/blocks/block.rb +324 -324
  113. data/lib/blocks/blockBase.rb +204 -204
  114. data/lib/blocks/commandLine.rb +38 -38
  115. data/lib/blocks/compile.rb +529 -528
  116. data/lib/blocks/convert.rb +41 -41
  117. data/lib/blocks/docu.rb +30 -30
  118. data/lib/blocks/executable.rb +174 -174
  119. data/lib/blocks/has_execute_command.rb +31 -31
  120. data/lib/blocks/library.rb +114 -114
  121. data/lib/blocks/lint.rb +56 -56
  122. data/lib/blocks/makefile.rb +100 -100
  123. data/lib/blocks/showIncludes.rb +140 -125
  124. data/lib/common/abortException.rb +4 -4
  125. data/lib/common/cleanup.rb +10 -10
  126. data/lib/common/exit_helper.rb +38 -38
  127. data/lib/common/ext/file.rb +88 -88
  128. data/lib/common/ext/rtext.rb +11 -11
  129. data/lib/common/ext/stdout.rb +45 -45
  130. data/lib/common/ide_interface.rb +194 -194
  131. data/lib/common/options/parser.rb +95 -85
  132. data/lib/common/process.rb +64 -64
  133. data/lib/common/utils.rb +52 -52
  134. data/lib/common/version.rb +31 -23
  135. data/lib/multithread/job.rb +44 -44
  136. data/lib/tocxx.rb +558 -555
  137. data/lib/vs/options.rb +69 -69
  138. data/license.txt +90 -90
  139. metadata +2 -2
@@ -1,42 +1,42 @@
1
- require 'blocks/compile'
2
-
3
- module Bake
4
-
5
- module Blocks
6
-
7
- class Convert < Compile
8
-
9
- def initialize(block, config, referencedConfigs, tcs)
10
- super(block, config, referencedConfigs, tcs)
11
- end
12
-
13
- def execute
14
- Dir.chdir(@projectDir) do
15
- calcSources
16
-
17
- puts "START_INFO"
18
- puts " BAKE_PROJECTDIR"
19
- puts " #{File.expand_path(@projectDir)}"
20
- puts " BAKE_SOURCES"
21
- @source_files.each { |s| puts " #{s}" }
22
- puts " BAKE_INCLUDES"
23
- @include_list.each { |s| puts " #{s}" }
24
- puts " BAKE_DEFINES"
25
- (@tcs[:COMPILER][:CPP][:DEFINES] + @tcs[:COMPILER][:C][:DEFINES] + @tcs[:COMPILER][:ASM][:DEFINES]).uniq.each { |s| puts " #{s}" }
26
- puts " BAKE_DEPENDENCIES"
27
- @block.childs.each { |dep| puts " #{dep.projectName}" }
28
- puts " BAKE_DEPENDENCIES_FILTERED"
29
- @block.childs.each { |dep| puts " #{dep.projectName}" unless @projectName == dep.projectName or dep.projectName == "gmock" or dep.projectName == "gtest" }
30
- puts "END_INFO"
31
- end
32
- return true
33
- end
34
-
35
- def clean
36
- # nothing to do here
37
- end
38
-
39
- end
40
-
41
- end
1
+ require 'blocks/compile'
2
+
3
+ module Bake
4
+
5
+ module Blocks
6
+
7
+ class Convert < Compile
8
+
9
+ def initialize(block, config, referencedConfigs, tcs)
10
+ super(block, config, referencedConfigs, tcs)
11
+ end
12
+
13
+ def execute
14
+ Dir.chdir(@projectDir) do
15
+ calcSources
16
+
17
+ puts "START_INFO"
18
+ puts " BAKE_PROJECTDIR"
19
+ puts " #{File.expand_path(@projectDir)}"
20
+ puts " BAKE_SOURCES"
21
+ @source_files.each { |s| puts " #{s}" }
22
+ puts " BAKE_INCLUDES"
23
+ @include_list.each { |s| puts " #{s}" }
24
+ puts " BAKE_DEFINES"
25
+ (@tcs[:COMPILER][:CPP][:DEFINES] + @tcs[:COMPILER][:C][:DEFINES] + @tcs[:COMPILER][:ASM][:DEFINES]).uniq.each { |s| puts " #{s}" }
26
+ puts " BAKE_DEPENDENCIES"
27
+ @block.childs.each { |dep| puts " #{dep.projectName}" }
28
+ puts " BAKE_DEPENDENCIES_FILTERED"
29
+ @block.childs.each { |dep| puts " #{dep.projectName}" unless @projectName == dep.projectName or dep.projectName == "gmock" or dep.projectName == "gtest" }
30
+ puts "END_INFO"
31
+ end
32
+ return true
33
+ end
34
+
35
+ def clean
36
+ # nothing to do here
37
+ end
38
+
39
+ end
40
+
41
+ end
42
42
  end
@@ -1,30 +1,30 @@
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
- return executeCommand(@commandLine)
19
- end
20
- return true
21
- end
22
-
23
- def clean
24
- # nothing to do here
25
- return true
26
- end
27
-
28
- end
29
- end
30
- end
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
+ return executeCommand(@commandLine)
19
+ end
20
+ return true
21
+ end
22
+
23
+ def clean
24
+ # nothing to do here
25
+ return true
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -1,175 +1,175 @@
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 calcCmdlineFile()
33
- @exe_name + ".cmdline"
34
- end
35
-
36
- def calcMapFile
37
- @mapfile = nil
38
- if (not Bake.options.docu) and (not Bake.options.lint) and (not @config.mapFile.nil?)
39
- if @config.mapFile.name == ""
40
- @mapfile = @exe_name.chomp(File.extname(@exe_name)) + ".map"
41
- else
42
- @mapfile = @config.mapFile.name
43
- end
44
- end
45
- end
46
-
47
- def ignore?
48
- Bake.options.prepro
49
- end
50
-
51
- def needed?(libs)
52
- return "because linkOnly was specified" if Bake.options.linkOnly
53
-
54
- # exe
55
- return "because executable does not exist" if not File.exists?(@exe_name)
56
-
57
- eTime = File.mtime(@exe_name)
58
-
59
- # linkerscript
60
- if @linker_script
61
- return "because linker script does not exist - will most probably result in an error" if not File.exists?(@linker_script)
62
- return "because linker script is newer than executable" if eTime < File.mtime(@linker_script)
63
- end
64
-
65
- # sources
66
- @compileBlock.objects.each do |obj|
67
- return "because object #{obj} does not exist" if not File.exists?(obj)
68
- return "because object #{obj} is newer than executable" if eTime < File.mtime(obj)
69
- end
70
-
71
- # libs
72
- libs.each do |lib|
73
- return "because library #{lib} does not exist" if not File.exists?(lib)
74
- return "because library #{lib} is newer than executable" if eTime < File.mtime(lib)
75
- end
76
- false
77
- end
78
-
79
- def execute
80
- Dir.chdir(@projectDir) do
81
- childs = @block.getBlocks(:childs)
82
- return false if childs.any? { |b| b.result == false }
83
-
84
- allSources = []
85
- (childs + [@block]).each do |b|
86
- Dir.chdir(b.projectDir) do
87
- b.getCompileBlocks.each do |c|
88
- allSources += c.calcSources(true, true).map { |s| File.expand_path(s) }
89
- end
90
- end
91
- end
92
- duplicateSources = allSources.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
93
- duplicateSources.each do |d|
94
- Bake.formatter.printWarning("Source compiled more than once: #{d}")
95
- end
96
-
97
- libs, linker_libs_array = LibElements.calc_linker_lib_string(@block, @tcs)
98
-
99
- cmdLineCheck = false
100
- cmdLineFile = calcCmdlineFile()
101
-
102
- return true if ignore?
103
- reason = needed?(libs)
104
- if not reason
105
- cmdLineCheck = true
106
- reason = config_changed?(cmdLineFile)
107
- end
108
-
109
- linker = @tcs[:LINKER]
110
-
111
- cmd = Utils.flagSplit(linker[:COMMAND], false) # g++
112
- cmd += linker[:MUST_FLAGS].split(" ")
113
- cmd += Bake::Utils::flagSplit(linker[:FLAGS],true)
114
-
115
-
116
- cmd << linker[:EXE_FLAG]
117
- if linker[:EXE_FLAG_SPACE]
118
- cmd << @exe_name
119
- else
120
- cmd[cmd.length-1] += @exe_name
121
- end
122
-
123
- cmd += @compileBlock.objects
124
- cmd << linker[:SCRIPT] if @linker_script # -T
125
- cmd << @linker_script if @linker_script # xy/xy.dld
126
- cmd += linker[:MAP_FILE_FLAG].split(" ") if @mapfile # -Wl,-m6
127
- if not linker[:MAP_FILE_PIPE] and @mapfile
128
- cmd[cmd.length-1] << @mapfile
129
- end
130
- cmd += Bake::Utils::flagSplit(linker[:LIB_PREFIX_FLAGS],true) # "-Wl,--whole-archive "
131
- cmd += linker_libs_array
132
- cmd += Bake::Utils::flagSplit(linker[:LIB_POSTFIX_FLAGS],true) # "-Wl,--no-whole-archive "
133
-
134
- mapfileStr = (@mapfile and linker[:MAP_FILE_PIPE]) ? " >#{@mapfile}" : ""
135
-
136
- # pre print because linking can take much time
137
- cmdLinePrint = cmd.dup
138
- outPipe = (@mapfile and linker[:MAP_FILE_PIPE]) ? "#{@mapfile}" : nil
139
- cmdLinePrint << "> #{outPipe}" if outPipe
140
-
141
- if cmdLineCheck and BlockBase.isCmdLineEqual?(cmd, cmdLineFile)
142
- success = true
143
- else
144
- ToCxx.linkBlock
145
-
146
- BlockBase.prepareOutput(@exe_name)
147
-
148
- printCmd(cmdLinePrint, "Linking #{@exe_name}", reason, false)
149
- BlockBase.writeCmdLineFile(cmd, cmdLineFile)
150
- success, consoleOutput = ProcessHelper.run(cmd, false, false, outPipe)
151
- process_result(cmdLinePrint, consoleOutput, linker[:ERROR_PARSER], nil, reason, success)
152
-
153
- check_config_file()
154
- end
155
-
156
- Bake::Bundle.instance.addBinary(@exe_name, @linker_script, isMainProject? ? @config : nil)
157
-
158
- return success
159
- end
160
- end
161
-
162
- def clean
163
- Dir.chdir(@projectDir) do
164
- if File.exist?@output_dir
165
- puts "Deleting folder #{@output_dir}" if Bake.options.verbose >= 2
166
- FileUtils.rm_rf(@output_dir)
167
- end
168
- end unless Bake.options.filename
169
- return true
170
- end
171
-
172
- end
173
-
174
- end
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 calcCmdlineFile()
33
+ @exe_name + ".cmdline"
34
+ end
35
+
36
+ def calcMapFile
37
+ @mapfile = nil
38
+ if (not Bake.options.docu) and (not Bake.options.lint) and (not @config.mapFile.nil?)
39
+ if @config.mapFile.name == ""
40
+ @mapfile = @exe_name.chomp(File.extname(@exe_name)) + ".map"
41
+ else
42
+ @mapfile = @config.mapFile.name
43
+ end
44
+ end
45
+ end
46
+
47
+ def ignore?
48
+ Bake.options.prepro
49
+ end
50
+
51
+ def needed?(libs)
52
+ return "because linkOnly was specified" if Bake.options.linkOnly
53
+
54
+ # exe
55
+ return "because executable does not exist" if not File.exists?(@exe_name)
56
+
57
+ eTime = File.mtime(@exe_name)
58
+
59
+ # linkerscript
60
+ if @linker_script
61
+ return "because linker script does not exist - will most probably result in an error" if not File.exists?(@linker_script)
62
+ return "because linker script is newer than executable" if eTime < File.mtime(@linker_script)
63
+ end
64
+
65
+ # sources
66
+ @compileBlock.objects.each do |obj|
67
+ return "because object #{obj} does not exist" if not File.exists?(obj)
68
+ return "because object #{obj} is newer than executable" if eTime < File.mtime(obj)
69
+ end
70
+
71
+ # libs
72
+ libs.each do |lib|
73
+ return "because library #{lib} does not exist" if not File.exists?(lib)
74
+ return "because library #{lib} is newer than executable" if eTime < File.mtime(lib)
75
+ end
76
+ false
77
+ end
78
+
79
+ def execute
80
+ Dir.chdir(@projectDir) do
81
+ childs = @block.getBlocks(:childs)
82
+ return false if childs.any? { |b| b.result == false }
83
+
84
+ allSources = []
85
+ (childs + [@block]).each do |b|
86
+ Dir.chdir(b.projectDir) do
87
+ b.getCompileBlocks.each do |c|
88
+ allSources += c.calcSources(true, true).map { |s| File.expand_path(s) }
89
+ end
90
+ end
91
+ end
92
+ duplicateSources = allSources.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
93
+ duplicateSources.each do |d|
94
+ Bake.formatter.printWarning("Source compiled more than once: #{d}")
95
+ end
96
+
97
+ libs, linker_libs_array = LibElements.calc_linker_lib_string(@block, @tcs)
98
+
99
+ cmdLineCheck = false
100
+ cmdLineFile = calcCmdlineFile()
101
+
102
+ return true if ignore?
103
+ reason = needed?(libs)
104
+ if not reason
105
+ cmdLineCheck = true
106
+ reason = config_changed?(cmdLineFile)
107
+ end
108
+
109
+ linker = @tcs[:LINKER]
110
+
111
+ cmd = Utils.flagSplit(linker[:COMMAND], false) # g++
112
+ cmd += linker[:MUST_FLAGS].split(" ")
113
+ cmd += Bake::Utils::flagSplit(linker[:FLAGS],true)
114
+
115
+
116
+ cmd << linker[:EXE_FLAG]
117
+ if linker[:EXE_FLAG_SPACE]
118
+ cmd << @exe_name
119
+ else
120
+ cmd[cmd.length-1] += @exe_name
121
+ end
122
+
123
+ cmd += @compileBlock.objects
124
+ cmd << linker[:SCRIPT] if @linker_script # -T
125
+ cmd << @linker_script if @linker_script # xy/xy.dld
126
+ cmd += linker[:MAP_FILE_FLAG].split(" ") if @mapfile # -Wl,-m6
127
+ if not linker[:MAP_FILE_PIPE] and @mapfile
128
+ cmd[cmd.length-1] << @mapfile
129
+ end
130
+ cmd += Bake::Utils::flagSplit(linker[:LIB_PREFIX_FLAGS],true) # "-Wl,--whole-archive "
131
+ cmd += linker_libs_array
132
+ cmd += Bake::Utils::flagSplit(linker[:LIB_POSTFIX_FLAGS],true) # "-Wl,--no-whole-archive "
133
+
134
+ mapfileStr = (@mapfile and linker[:MAP_FILE_PIPE]) ? " >#{@mapfile}" : ""
135
+
136
+ # pre print because linking can take much time
137
+ cmdLinePrint = cmd.dup
138
+ outPipe = (@mapfile and linker[:MAP_FILE_PIPE]) ? "#{@mapfile}" : nil
139
+ cmdLinePrint << "> #{outPipe}" if outPipe
140
+
141
+ if cmdLineCheck and BlockBase.isCmdLineEqual?(cmd, cmdLineFile)
142
+ success = true
143
+ else
144
+ ToCxx.linkBlock
145
+
146
+ BlockBase.prepareOutput(@exe_name)
147
+
148
+ printCmd(cmdLinePrint, "Linking #{@exe_name}", reason, false)
149
+ BlockBase.writeCmdLineFile(cmd, cmdLineFile)
150
+ success, consoleOutput = ProcessHelper.run(cmd, false, false, outPipe)
151
+ process_result(cmdLinePrint, consoleOutput, linker[:ERROR_PARSER], nil, reason, success)
152
+
153
+ check_config_file()
154
+ end
155
+
156
+ Bake::Bundle.instance.addBinary(@exe_name, @linker_script, isMainProject? ? @config : nil)
157
+
158
+ return success
159
+ end
160
+ end
161
+
162
+ def clean
163
+ Dir.chdir(@projectDir) do
164
+ if File.exist?@output_dir
165
+ puts "Deleting folder #{@output_dir}" if Bake.options.verbose >= 2
166
+ FileUtils.rm_rf(@output_dir)
167
+ end
168
+ end unless Bake.options.filename
169
+ return true
170
+ end
171
+
172
+ end
173
+
174
+ end
175
175
  end