bake-toolkit 1.8.0.1 → 2.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bake +14 -53
  3. data/bin/bakery +50 -43
  4. data/bin/createVSProjects +3 -3
  5. data/doc/cmd/install.html +1 -5
  6. data/doc/cmd/usecmd.html +29 -5
  7. data/doc/dyk/lint.html +21 -4
  8. data/doc/dyk/tipps.html +0 -6
  9. data/doc/eclipse/import.html +3 -1
  10. data/doc/eclipse/import/Import.png +0 -0
  11. data/doc/eclipse/use.html +8 -5
  12. data/doc/further/change.html +134 -1
  13. data/doc/further/issues.html +1 -0
  14. data/doc/further/wish.html +24 -21
  15. data/doc/index.html +1 -1
  16. data/doc/syntax/subst.html +8 -1
  17. data/doc/syntax/syntax.html +42 -14
  18. data/lib/bake/cache.rb +51 -59
  19. data/lib/bake/config/loader.rb +289 -0
  20. data/lib/bake/libElement.rb +134 -0
  21. data/lib/bake/mergeConfig.rb +1 -1
  22. data/lib/bake/model/language.rb +1 -1
  23. data/lib/bake/model/loader.rb +88 -0
  24. data/lib/bake/model/metamodel.rb +24 -16
  25. data/lib/bake/model/metamodel_ext.rb +9 -4
  26. data/lib/bake/options/options.rb +222 -0
  27. data/lib/bake/options/showConfigNames.rb +44 -0
  28. data/lib/bake/options/showDoc.rb +19 -0
  29. data/lib/bake/options/showLicense.rb +9 -0
  30. data/lib/bake/options/showToolchains.rb +39 -0
  31. data/lib/bake/options/usage.rb +54 -0
  32. data/lib/bake/process_output.rb +10 -0
  33. data/lib/bake/subst.rb +105 -40
  34. data/lib/bake/toolchain/clang.rb +44 -0
  35. data/lib/bake/toolchain/colorizing_formatter.rb +125 -0
  36. data/lib/bake/toolchain/diab.rb +53 -0
  37. data/lib/bake/toolchain/errorparser/diab_compiler_error_parser.rb +40 -0
  38. data/lib/bake/toolchain/errorparser/diab_linker_error_parser.rb +41 -0
  39. data/lib/bake/toolchain/errorparser/error_parser.rb +71 -0
  40. data/lib/bake/toolchain/errorparser/gcc_compiler_error_parser.rb +35 -0
  41. data/lib/bake/toolchain/errorparser/gcc_linker_error_parser.rb +35 -0
  42. data/lib/bake/toolchain/errorparser/greenhills_compiler_error_parser.rb +32 -0
  43. data/lib/bake/toolchain/errorparser/greenhills_linker_error_parser.rb +44 -0
  44. data/lib/bake/toolchain/errorparser/keil_compiler_error_parser.rb +40 -0
  45. data/lib/bake/toolchain/errorparser/keil_linker_error_parser.rb +30 -0
  46. data/lib/bake/toolchain/errorparser/lint_error_parser.rb +34 -0
  47. data/lib/bake/toolchain/errorparser/process_output.rb +3 -0
  48. data/lib/bake/toolchain/errorparser/ti_compiler_error_parser.rb +30 -0
  49. data/lib/bake/toolchain/errorparser/ti_linker_error_parser.rb +30 -0
  50. data/lib/bake/toolchain/gcc.rb +49 -0
  51. data/lib/bake/toolchain/gcc_param.rb +7 -0
  52. data/lib/bake/toolchain/greenhills.rb +52 -0
  53. data/lib/bake/toolchain/keil.rb +55 -0
  54. data/lib/bake/toolchain/lint.rb +20 -0
  55. data/lib/bake/toolchain/provider.rb +136 -0
  56. data/lib/bake/toolchain/ti.rb +47 -0
  57. data/lib/bake/util.rb +27 -15
  58. data/lib/bakery/buildPattern.rb +1 -1
  59. data/lib/bakery/model/language.rb +1 -1
  60. data/lib/bakery/model/loader.rb +56 -0
  61. data/lib/bakery/model/metamodel.rb +1 -1
  62. data/lib/bakery/options/options.rb +87 -0
  63. data/lib/bakery/toBake.rb +10 -6
  64. data/lib/blocks/block.rb +225 -0
  65. data/lib/blocks/blockBase.rb +155 -0
  66. data/lib/blocks/commandLine.rb +25 -0
  67. data/lib/blocks/compile.rb +382 -0
  68. data/lib/blocks/docu.rb +28 -0
  69. data/lib/blocks/executable.rb +143 -0
  70. data/lib/blocks/has_execute_command.rb +31 -0
  71. data/lib/blocks/library.rb +78 -0
  72. data/lib/blocks/lint.rb +53 -0
  73. data/lib/blocks/makefile.rb +87 -0
  74. data/lib/blocks/showIncludes.rb +114 -0
  75. data/lib/common/abortException.rb +4 -0
  76. data/lib/common/cleanup.rb +9 -0
  77. data/lib/common/exit_helper.rb +28 -0
  78. data/lib/common/ext/file.rb +88 -0
  79. data/lib/common/ext/stdout.rb +45 -0
  80. data/lib/common/ide_interface.rb +194 -0
  81. data/lib/common/options/option.rb +13 -0
  82. data/lib/common/options/parser.rb +59 -0
  83. data/lib/common/process.rb +64 -0
  84. data/lib/common/utils.rb +52 -0
  85. data/lib/{bake → common}/version.rb +3 -10
  86. data/lib/multithread/job.rb +44 -0
  87. data/lib/tocxx.rb +201 -932
  88. data/lib/vs/options.rb +3 -2
  89. data/license.txt +47 -22
  90. metadata +90 -30
  91. data/bin/bake-doc +0 -12
  92. data/lib/alias/loader.rb +0 -56
  93. data/lib/alias/model/language.rb +0 -22
  94. data/lib/alias/model/metamodel.rb +0 -29
  95. data/lib/bake/loader.rb +0 -92
  96. data/lib/bake/options.rb +0 -421
  97. data/lib/bakery/loader.rb +0 -57
  98. data/lib/bakery/options.rb +0 -105
  99. data/lib/option/parser.rb +0 -73
@@ -0,0 +1,31 @@
1
+ module Bake
2
+
3
+ module Blocks
4
+
5
+ module HasExecuteCommand
6
+
7
+ def executeCommand(commandLine, ignoreStr=nil)
8
+ puts commandLine if not Bake.options.verboseLow
9
+ puts "(executed in '#{@projectDir}')" if Bake.options.verboseHigh
10
+ cmd_result = false
11
+ output = ""
12
+ begin
13
+ Dir.chdir(@projectDir) do
14
+ cmd_result, output = ProcessHelper.run([commandLine], true)
15
+ end
16
+ rescue Exception=>e
17
+ puts e.message
18
+ puts e.backtrace if Bake.options.debug
19
+ end
20
+
21
+ if (cmd_result == false and (not ignoreStr or not output.include?ignoreStr))
22
+ Bake.formatter.printError("Command \"#{commandLine}\" failed", @config)
23
+ puts "(executed in '#{@projectDir}')" if not Bake.options.verboseHigh
24
+ raise SystemCommandFailed.new
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,78 @@
1
+ require 'blocks/blockBase'
2
+
3
+ module Bake
4
+
5
+ module Blocks
6
+
7
+ class Library < BlockBase
8
+
9
+ def initialize(block, config, referencedConfigs, tcs, compileBlock)
10
+ super(block,config, referencedConfigs, tcs)
11
+ @compileBlock = compileBlock
12
+
13
+ block.set_library(self)
14
+ end
15
+
16
+ def archive_name()
17
+ @archive_name ||= File.join([@output_dir, "lib#{@projectName}.a"])
18
+ end
19
+
20
+ def needed?
21
+ return false if Bake.options.linkOnly
22
+ return false if Bake.options.prepro
23
+
24
+ # lib
25
+ return "because library does not exist" if not File.exists?(archive_name)
26
+
27
+ aTime = File.mtime(archive_name)
28
+
29
+ # config
30
+ return "because config file has been changed" if aTime < File.mtime(@config.file_name)
31
+ return "because DefaultToolchain has been changed" if aTime < Bake::Config.defaultToolchainTime
32
+
33
+ # sources
34
+ @compileBlock.objects.each do |obj|
35
+ return "because object #{obj} does not exist" if not File.exists?(obj)
36
+ return "because object #{obj} is newer than executable" if aTime < File.mtime(obj)
37
+ end
38
+
39
+ false
40
+ end
41
+
42
+ def execute
43
+
44
+ Dir.chdir(@projectDir) do
45
+ reason = needed?
46
+ return unless reason
47
+
48
+ prepareOutput(archive_name)
49
+
50
+ archiver = @tcs[:ARCHIVER]
51
+
52
+ cmd = Utils.flagSplit(archiver[:COMMAND], false) # ar
53
+ cmd += Bake::Utils::flagSplit(archiver[:FLAGS],true) # --all_load
54
+ cmd += archiver[:ARCHIVE_FLAGS].split(" ")
55
+ cmd << archive_name
56
+ cmd += @compileBlock.objects
57
+
58
+ success, consoleOutput = ProcessHelper.run(cmd, false, false)
59
+ process_result(cmd, consoleOutput, archiver[:ERROR_PARSER], "Creating #{archive_name}", reason, success)
60
+
61
+ check_config_file()
62
+ end
63
+ end
64
+
65
+ def clean
66
+ Dir.chdir(@projectDir) do
67
+ if File.exist?@output_dir
68
+ puts "Deleting folder #{@output_dir}" if Bake.options.verboseHigh
69
+ FileUtils.rm_rf(@output_dir)
70
+ end
71
+ end unless Bake.options.filename
72
+ end
73
+
74
+
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,53 @@
1
+ require 'blocks/compile'
2
+
3
+ module Bake
4
+ module Blocks
5
+ class Lint < Compile
6
+
7
+ def initialize(block, config, referencedConfigs, tcs)
8
+ super(block,config, referencedConfigs, tcs)
9
+ end
10
+
11
+ def execute
12
+ Dir.chdir(@projectDir) do
13
+ compiler = @tcs[:COMPILER][:CPP]
14
+ calcSources
15
+
16
+ noFilesToLint = (@source_files.length == 0)
17
+
18
+ if Bake.options.lint_min >= 1 and Bake.options.lint_min >= @source_files.length
19
+ noFilesToLint = true
20
+ end
21
+
22
+ if Bake.options.lint_max >= 0 and Bake.options.lint_max < Bake.options.lint_min
23
+ noFilesToLint = true
24
+ end
25
+
26
+ if noFilesToLint
27
+ Bake.formatter.printInfo("No files to lint", @config)
28
+ else
29
+ @source_files = @source_files[Bake.options.lint_min..Bake.options.lint_max]
30
+
31
+ cmd = [compiler[:COMMAND]]
32
+ cmd += compiler[:COMPILE_FLAGS]
33
+
34
+ cmd += @include_array[:CPP]
35
+ cmd += @define_array[:CPP]
36
+
37
+ cmd += @tcs[:LINT_POLICY]
38
+
39
+ cmd += @source_files
40
+
41
+ printCmd(cmd, "Linting #{@source_files.length} file(s)...", nil, false)
42
+ success, consoleOutput = ProcessHelper.run(cmd, false)
43
+ process_result(cmd, consoleOutput, compiler[:ERROR_PARSER], "Linting...", nil, success)
44
+ end
45
+ end
46
+ end
47
+
48
+ def clean
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,87 @@
1
+ require 'blocks/has_execute_command'
2
+
3
+ module Bake
4
+ module Blocks
5
+
6
+ class Makefile
7
+ include HasExecuteCommand
8
+
9
+ MAKE_COMMAND = "make"
10
+ MAKE_FILE_FLAG = "-f"
11
+ MAKE_DIR_FLAG = "-C"
12
+ MAKE_CLEAN = "clean"
13
+
14
+ def initialize(config, referencedConfigs, block)
15
+ @config = config
16
+ @projectDir = config.get_project_dir
17
+ @path_to = ""
18
+ @flags = adjustFlags("",config.flags) if config.flags
19
+ @makefile = config.name
20
+ @target = config.target != "" ? config.target : "all"
21
+ calcPathTo(referencedConfigs)
22
+ calcCommandLine
23
+ calcCleanLine
24
+
25
+ block.lib_elements[config.line_number] = [LibElement.new(LibElement::LIB_WITH_PATH, config.lib)] if config.lib != ""
26
+ end
27
+
28
+ def calcCommandLine
29
+ @commandLine = remove_empty_strings_and_join([
30
+ MAKE_COMMAND, @target,
31
+ @flags,
32
+ MAKE_DIR_FLAG, File.dirname(@makefile),
33
+ MAKE_FILE_FLAG, File.basename(@makefile),
34
+ @path_to])
35
+ end
36
+
37
+ def calcCleanLine
38
+ @cleanLine = remove_empty_strings_and_join([
39
+ MAKE_COMMAND, MAKE_CLEAN,
40
+ MAKE_DIR_FLAG, File.dirname(@makefile),
41
+ MAKE_FILE_FLAG, File.basename(@makefile),
42
+ @path_to])
43
+ end
44
+
45
+ def calcPathTo(referencedConfigs)
46
+ @path_to = ""
47
+ if @config.pathTo != ""
48
+ pathHash = {}
49
+ @config.pathTo.split(",").each do |p|
50
+ nameOfP = p.strip
51
+ dirOfP = nil
52
+ if referencedConfigs.include?nameOfP
53
+ dirOfP = referencedConfigs[nameOfP].first.get_project_dir
54
+ else
55
+ Bake.options.roots.each do |r|
56
+ absIncDir = r+"/"+nameOfP
57
+ if File.exists?(absIncDir)
58
+ dirOfP = absIncDir
59
+ break
60
+ end
61
+ end
62
+ end
63
+ if dirOfP == nil
64
+ Bake.formatter.printError("Project '#{nameOfP}' not found", @config)
65
+ ExitHelper.exit(1)
66
+ end
67
+ pathHash[nameOfP] = File.rel_from_to_project(File.dirname(@projectDir),File.dirname(dirOfP))
68
+ end
69
+ path_to_array = []
70
+ pathHash.each { |k,v| path_to_array << "PATH_TO_#{k}=#{v}" }
71
+ @path_to = path_to_array.join(" ")
72
+ end
73
+
74
+ end
75
+
76
+ def execute
77
+ executeCommand(@commandLine)
78
+ end
79
+
80
+ def clean
81
+ executeCommand(@cleanLine, "No rule to make target 'clean'.") unless Bake.options.filename
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,114 @@
1
+ module Bake
2
+ module Blocks
3
+ class Show
4
+
5
+ def self.secureShow
6
+ begin
7
+ yield
8
+ rescue Exception => e
9
+ if (not SystemExit === e)
10
+ puts e
11
+ puts e.backtrace
12
+ ExitHelper.exit(1)
13
+ else
14
+ raise e
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.includes
20
+ secureShow {
21
+ Blocks::ALL_COMPILE_BLOCKS.sort.each do |projName, blocks|
22
+ print projName
23
+ incs = []
24
+ blocks.each { |block| incs += block.include_list }
25
+ incs.uniq.each { |inc| print "##{inc}" }
26
+ print "\n"
27
+ end
28
+ ExitHelper.exit(0) }
29
+ end
30
+
31
+ def self.readInternalIncludes(mainConfig, mainBlock, mainTcs)
32
+ intIncs = []
33
+ iinc = mainConfig.defaultToolchain.internalIncludes
34
+ Dir.chdir(Bake.options.main_dir) do
35
+ if (iinc)
36
+
37
+ cppExe = File.which(mainTcs[:COMPILER][:CPP][:COMMAND])
38
+ cExe = File.which(mainTcs[:COMPILER][:C][:COMMAND])
39
+ asmExe = File.which(mainTcs[:COMPILER][:ASM][:COMMAND])
40
+ archiverExe = File.which(mainTcs[:ARCHIVER][:COMMAND])
41
+ linkerExe = File.which(mainTcs[:LINKER][:COMMAND])
42
+
43
+ iname = mainBlock.convPath(iinc)
44
+ if iname != ""
45
+ if not File.exists?(iname)
46
+ Bake.formatter.printError("InternalIncludes file #{iname} does not exist", iinc)
47
+ ExitHelper.exit(1)
48
+ end
49
+ IO.foreach(iname) do |x|
50
+ x.sub!("$(CPPPath)", cppExe)
51
+ x.sub!("$(CPath)", cExe)
52
+ x.sub!("$(ASMPath)", asmExe)
53
+ x.sub!("$(ArchiverPath)", archiverExe)
54
+ x.sub!("$(LinkerPath)", linkerExe)
55
+ add_line_if_no_comment(intIncs,x)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ return intIncs
61
+ end
62
+
63
+ def self.readInternalDefines(mainConfig, mainBlock)
64
+ intDefs = {:CPP => [], :C => [], :ASM => []}
65
+ Dir.chdir(Bake.options.main_dir) do
66
+ mainConfig.defaultToolchain.compiler.each do |c|
67
+ if (c.internalDefines)
68
+ dname = mainBlock.convPath(c.internalDefines)
69
+ if dname != ""
70
+ if not File.exists?(dname)
71
+ Bake.formatter.printError("InternalDefines file #{dname} does not exist", c.internalDefines)
72
+ ExitHelper.exit(1)
73
+ end
74
+ IO.foreach(dname) {|x| add_line_if_no_comment(intDefs[c.ctype],x) }
75
+ end
76
+ end
77
+ end
78
+ end
79
+ return intDefs
80
+ end
81
+
82
+ def self.includesAndDefines(mainConfig, mainTcs)
83
+ secureShow {
84
+ mainBlock = Blocks::ALL_BLOCKS[Bake.options.main_project_name+","+Bake.options.build_config]
85
+
86
+ intIncs = readInternalIncludes(mainConfig, mainBlock, mainTcs)
87
+ intDefs = readInternalDefines(mainConfig, mainBlock)
88
+
89
+
90
+ Blocks::ALL_COMPILE_BLOCKS.sort.each do |projName, blocks|
91
+
92
+ blockIncs = []
93
+ blockDefs = {:CPP => [], :C => [], :ASM => []}
94
+ blocks.each do |block|
95
+ blockIncs += block.include_list
96
+ [:CPP, :C, :ASM].each { |type| blockDefs[type] += block.tcs[:COMPILER][type][:DEFINES] }
97
+ end
98
+
99
+ puts projName
100
+ puts " includes"
101
+ (blockIncs + intIncs).uniq.each { |i| puts " #{i}" }
102
+ [:CPP, :C, :ASM].each do |type|
103
+ puts " #{type} defines"
104
+ (blockDefs[type] + intDefs[type]).uniq.each { |d| puts " #{d}" }
105
+ end
106
+ puts " done"
107
+
108
+ end
109
+ ExitHelper.exit(0) }
110
+ end
111
+
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,4 @@
1
+ module Bake
2
+ class AbortException < StandardError
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ module Bake
2
+
3
+ def self.cleanup()
4
+ Blocks::ALL_BLOCKS.clear
5
+ Blocks::ALL_COMPILE_BLOCKS.clear
6
+ Bake::IDEInterface.instance.set_abort(false)
7
+ end
8
+
9
+ end
@@ -0,0 +1,28 @@
1
+ module Bake
2
+
3
+ class ExitHelper
4
+ @@exit_code = 0
5
+
6
+ def self.set_exit_code(val)
7
+ @@exit_code = val
8
+ end
9
+
10
+ def self.exit_code()
11
+ @@exit_code
12
+ end
13
+
14
+ def self.reset_exit_code()
15
+ @@exit_code = 0
16
+ end
17
+
18
+ def self.exit(val)
19
+ @@exit_code = val
20
+ Kernel::exit
21
+ end
22
+
23
+ end
24
+ end
25
+
26
+ at_exit do
27
+ exit(Bake::ExitHelper.exit_code)
28
+ end
@@ -0,0 +1,88 @@
1
+ require 'common/utils'
2
+
3
+ class File
4
+
5
+ SLASH = '/'
6
+
7
+ def self.is_absolute?(filename)
8
+ filename[0] == SLASH or filename[1] == ':'
9
+ end
10
+
11
+ # seems both are rel or both are abs in all cases
12
+ def self.rel_from_to_project(from,to,endWithSlash = true)
13
+
14
+ return nil if from.nil? or to.nil?
15
+
16
+ toSplitted = to.split('/')
17
+ fromSplitted = from.split('/')
18
+
19
+ max = [toSplitted.length, fromSplitted.length].min
20
+
21
+
22
+ return nil if max < 1
23
+
24
+ i = 0
25
+
26
+ # path letter in windows may be case different
27
+ toIsWindowsAbs = false
28
+ if toSplitted[0].length > 1 and fromSplitted[0].length > 1
29
+ toIsWindowsAbs = toSplitted[0][1] == ':'
30
+ i = 1 if toIsWindowsAbs and fromSplitted[0][1] == ':' and toSplitted[0][0].downcase == fromSplitted[0][0].downcase
31
+ end
32
+
33
+ if (toIsWindowsAbs and i==0)
34
+ res = to
35
+ res += "/" if endWithSlash
36
+ return res
37
+ end
38
+
39
+ while i < max
40
+ break if toSplitted[i] != fromSplitted[i]
41
+ i += 1
42
+ end
43
+ j = i
44
+
45
+ res = []
46
+ while i < fromSplitted.length
47
+ res << ".."
48
+ i += 1
49
+ end
50
+
51
+ while j < toSplitted.length
52
+ res << toSplitted[j]
53
+ j += 1
54
+ end
55
+
56
+ if res.length == 0
57
+ return ""
58
+ end
59
+
60
+ res = res.join('/')
61
+ res += "/" if endWithSlash
62
+ res
63
+ end
64
+
65
+
66
+ def self.add_prefix(prefix, file)
67
+ if not prefix or is_absolute?(file)
68
+ file
69
+ else
70
+ prefix + file
71
+ end
72
+ end
73
+
74
+ def self.which(cmd)
75
+ return "" if not cmd
76
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
77
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
78
+ exts.each { |ext|
79
+ exe = File.join(path, "#{cmd}#{ext}")
80
+ if File.executable?(exe) && !File.directory?(exe)
81
+ return File.dirname(exe.gsub(/[\\]/,'/'))
82
+ end
83
+ }
84
+ end
85
+ return ""
86
+ end
87
+
88
+ end