bake-toolkit 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'rake'
2
+
3
+ require './rake_helper/spec.rb'
data/bin/bake ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $timeStart = Time.now
4
+
5
+ $:.unshift(File.dirname(__FILE__)+"/../lib")
6
+ require 'bake/version'
7
+
8
+ $:.unshift(File.dirname(__FILE__)+"/../../cxxproject_master.git/lib")
9
+
10
+ require "cxxproject/version"
11
+
12
+ STDOUT.sync = true
13
+ STDERR.sync = true
14
+
15
+ puts "-- bake #{Cxxproject::Version.bake}, ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}, platform #{RUBY_PLATFORM} --"
16
+
17
+ require 'tocxx'
18
+ require 'bake/options'
19
+ require 'socket'
20
+
21
+ module Cxxproject
22
+
23
+ def self.isNewer(oldVersion, newVersion)
24
+ oldSplitted = oldVersion.split(".")
25
+ newSplitted = newVersion.split(".")
26
+ if oldSplitted.length >= 3 and newSplitted.length >= 3
27
+ 3.times do |i|
28
+ return true if newSplitted[i].to_i > oldSplitted[i].to_i
29
+ return false if newSplitted[i].to_i < oldSplitted[i].to_i
30
+ end
31
+ end
32
+ return false;
33
+ end
34
+
35
+ earlyExit = nil
36
+ begin
37
+ options = Options.new(ARGV)
38
+ options.parse_options
39
+
40
+ tocxx = Cxxproject::ToCxx.new(options)
41
+
42
+ tocxx.connect()
43
+
44
+ if tocxx.doit()
45
+ tocxx.start()
46
+ end
47
+ tocxx.disconnect()
48
+
49
+ rescue SystemExit => e
50
+ earlyExit = e
51
+ begin
52
+ tocxx.disconnect()
53
+ rescue Exception => e2
54
+ end
55
+ end
56
+
57
+
58
+ timeEnd = Time.now
59
+ timeDiff = timeEnd - $timeStart
60
+ Printer.printInfo "\nTime: %02d:%02d minutes" % [timeDiff/60, timeDiff%60]
61
+
62
+ # update check
63
+ #begin
64
+ # versionWarningString = ""
65
+ # require 'net/http'
66
+ # vtext = Net::HTTP.get('10.40.38.84', '/bake/versions.txt')
67
+ # vtextSplitted = vtext.split(" ")
68
+ # if vtextSplitted.length > 0
69
+ # if isNewer(Cxxproject::Version.bake, vtextSplitted[0])
70
+ # versionWarningString = versionWarningString + "\nNewer version of bake gem available: #{vtextSplitted[0]} - please update!"
71
+ # end
72
+ # end
73
+ # if vtextSplitted.length > 1
74
+ # if isNewer(options.eclipse_version, vtextSplitted[1])
75
+ # versionWarningString = versionWarningString + "\nNewer version of bake Eclipse plugin available: #{vtextSplitted[1]} - please update!"
76
+ # end
77
+ # end
78
+ # if versionWarningString != ""
79
+ # Printer.printWarning versionWarningString
80
+ # end
81
+ #rescue Exception => e
82
+ #end
83
+
84
+
85
+ raise earlyExit if earlyExit
86
+ end
data/bin/bakery ADDED
@@ -0,0 +1,234 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $timeStart = Time.now
4
+
5
+ $:.unshift(File.dirname(__FILE__)+"/../lib")
6
+ require 'bake/version'
7
+
8
+ $:.unshift(File.dirname(__FILE__)+"/../../cxxproject_master.git/lib")
9
+
10
+ require "cxxproject/version"
11
+
12
+ puts "-- bakery #{Cxxproject::Version.bake}, ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}, platform #{RUBY_PLATFORM} --"
13
+
14
+ STDOUT.sync = true
15
+ STDERR.sync = true
16
+
17
+ require 'cxxproject/utils/printer'
18
+ require 'tocxx'
19
+ require "bakery/loader"
20
+ require "bakery/options"
21
+ require 'cxxproject/ext/stdout'
22
+ require 'cxxproject/utils/cleanup'
23
+
24
+ module Cxxproject
25
+
26
+ class BuildPattern
27
+ attr_reader :proj, :conf, :coll_p
28
+ def initialize(proj, conf, coll_p)
29
+ @proj = proj
30
+ @conf = conf
31
+ @coll_p = coll_p
32
+ end
33
+ def getId
34
+ proj + "*******" + conf
35
+ end
36
+ def hash
37
+ getId.hash
38
+ end
39
+ def eql?(comparee)
40
+ self == comparee
41
+ end
42
+ def ==(comparee)
43
+ self.getId == comparee.getId
44
+ end
45
+ end
46
+
47
+ @options = BakeryOptions.new(ARGV)
48
+ @options.parse_options
49
+
50
+ env = nil
51
+ begin
52
+ loader = BakeryLoader.new(@options)
53
+ env = loader.load(@options.collection_dir+"/Collection.meta")
54
+ rescue Exception => e
55
+ ExitHelper.exit(1)
56
+ end
57
+
58
+
59
+ if @options.collection_name.nil?
60
+ puts "Please specify a collection name (with -b). Possible values are:"
61
+ env.find(:class => BakeryModel::Collection).each { |e|
62
+ puts "* " + e.name
63
+ }
64
+ ExitHelper.exit(0)
65
+ end
66
+
67
+ cols = env.find(:class => BakeryModel::Collection, :name => @options.collection_name)
68
+ if (cols.length == 0)
69
+ Printer.printError "Collection #{@options.collection_name} not found in #{@options.collection_dir+"/Collection.meta"}"
70
+ ExitHelper.exit(1)
71
+ elsif (cols.length > 1)
72
+ Printer.printError "Collection #{@options.collection_name} found more than once in #{@options.collection_dir+"/Collection.meta"}"
73
+ ExitHelper.exit(1)
74
+ end
75
+
76
+ col = cols[0]
77
+
78
+ col.project.each do |p|
79
+ if p.name == ""
80
+ Printer.printError "Error in #{@options.collection_dir+"/Collection.meta"} (line #{p.line_number}): Project name empty"
81
+ ExitHelper.exit(1)
82
+ end
83
+ if p.config == ""
84
+ Printer.printError "Error in #{@options.collection_dir+"/Collection.meta"} (line #{p.line_number}): Config name empty"
85
+ ExitHelper.exit(1)
86
+ end
87
+ end
88
+
89
+ toBuildPattern = []
90
+ @options.roots.each do |r|
91
+ col.project.each do |p|
92
+ projs = Dir.glob(r+"/"+p.name+"/Project.meta")
93
+ if projs.length == 0
94
+ toBuildPattern << BuildPattern.new(nil, nil, p) # remember it for sorted info printout
95
+ end
96
+ projs.each do |f|
97
+ toBuildPattern << BuildPattern.new(f, "^"+p.config.gsub("*","(\\w*)")+"$", p)
98
+ end
99
+ end
100
+ end
101
+
102
+ toBuild = []
103
+ toBuildPattern.each do |bp|
104
+ next unless bp.proj
105
+ contents = File.open(bp.proj, "r") {|io| io.read }
106
+ contents.split("\n").each do |c|
107
+ res = c.match("\\s*(Library|Executable|Custom){1}Config\\s*(\\w*)")
108
+ if res
109
+ if res[2].match(bp.conf) != nil
110
+ toBuild << BuildPattern.new(bp.proj, res[2], nil)
111
+ bp.coll_p.found
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ toBuildPattern.each do |bp|
118
+ Printer.printInfo "Info in #{@options.collection_dir+"/Collection.meta"} (line #{bp.coll_p.line_number}): No match for project #{bp.coll_p.name} with config #{bp.coll_p.config}" unless bp.coll_p.isFound
119
+ end
120
+
121
+ col.exclude.each do |p|
122
+ p.name = "/"+p.name.gsub("*","(\\w*)")+"/Project.meta"
123
+ p.config = "^"+p.config.gsub("*","(\\w*)")+"$"
124
+ end
125
+
126
+ toBuild.delete_if do |bp|
127
+ exclude = false
128
+ col.exclude.each do |p|
129
+ exclude = true if (bp.proj.match(p.name) != nil and bp.conf.match(p.config) != nil)
130
+ end
131
+ exclude
132
+ end
133
+
134
+ toBuild.uniq!
135
+
136
+ maxRuns = toBuild.length
137
+ currentRun = 0
138
+ failedRuns = 0
139
+
140
+ passedParams = []
141
+ excludeParam = false
142
+ ARGV.each do |x|
143
+ if (x=="-b" or x=="-m" or x=="-p" or x=="-e" or x=="--socket")
144
+ excludeParam = true
145
+ next
146
+ end
147
+ if excludeParam
148
+ excludeParam = false
149
+ next
150
+ end
151
+ passedParams << x
152
+ end
153
+
154
+ if @options.socket != 0
155
+ Rake.application.idei.connect(@options.socket)
156
+ end
157
+
158
+ msg1 = "* bakery "
159
+
160
+ ExitHelper.enable_exit_test
161
+
162
+ exitValue = 0
163
+ abort = false
164
+ toBuild.each do |bp|
165
+ currentRun += 1
166
+ p = File.dirname(bp.proj)
167
+ cmd = (["-m #{p} -b #{bp.conf}"] + passedParams).join(" ")
168
+ cmdWithNum = "* bakery #{currentRun} of #{maxRuns}: bake " + cmd + " *"
169
+ print "\n"; cmdWithNum.length.times { print "*" }; print "\n";
170
+ Printer.printInfo cmdWithNum
171
+ cmdWithNum.length.times { print "*" }; print "\n";
172
+
173
+ runOk = true
174
+ begin
175
+ bakeOptions = Options.new(cmd.split(" "))
176
+ bakeOptions.parse_options
177
+ tocxx = ToCxx.new(bakeOptions)
178
+ if tocxx.doit()
179
+ runOk = tocxx.start()
180
+ else
181
+ runOk = false
182
+ end
183
+ rescue
184
+ runOk = false
185
+ end
186
+
187
+ Utils.cleanup_rake
188
+ ExitHelper.reset_exit_code
189
+
190
+ if runOk == false
191
+ exitValue = 1
192
+ failedRuns += 1
193
+ if @options.error
194
+ msg1 << "aborted, "
195
+ abort = true
196
+ break
197
+ end
198
+ end
199
+ end
200
+
201
+ print "\n"
202
+
203
+ if not abort
204
+ if failedRuns > 0
205
+ msg1 << "summary: #{failedRuns} of #{maxRuns} builds failed, "
206
+ else
207
+ msg1 << "summary: #{maxRuns-failedRuns} of #{maxRuns} builds ok, "
208
+ end
209
+ else
210
+ end
211
+
212
+ timeEnd = Time.now
213
+ timeDiff = timeEnd - $timeStart
214
+ msg1 << "time: %02d:%02d minutes *" % [timeDiff/60, timeDiff%60]
215
+
216
+ stars = ""
217
+ msg1.length.times { stars << "*" }
218
+
219
+ if failedRuns == 0
220
+ Printer.printSuccess stars
221
+ Printer.printSuccess msg1
222
+ Printer.printSuccess stars
223
+ else
224
+ Printer.printError stars
225
+ Printer.printError msg1
226
+ Printer.printError stars
227
+ end
228
+
229
+ Rake.application.idei.disconnect()
230
+
231
+ ExitHelper.disable_exit_test
232
+ ExitHelper.exit(exitValue)
233
+ end
234
+
@@ -0,0 +1,56 @@
1
+ require 'alias/model/metamodel'
2
+ require 'alias/model/language'
3
+
4
+ require 'rgen/environment'
5
+ require 'rgen/fragment/fragmented_model'
6
+
7
+ require 'rtext/default_loader'
8
+
9
+ require 'cxxproject/utils/exit_helper'
10
+ require 'cxxproject/utils/printer'
11
+
12
+ module Cxxproject
13
+
14
+ class AliasLoader
15
+
16
+ attr_reader :model
17
+
18
+ def initialize(options)
19
+ @env = RGen::Environment.new
20
+ @options = options
21
+ @model = RGen::Fragment::FragmentedModel.new(:env => @env)
22
+ end
23
+
24
+ def load(filename)
25
+
26
+ sumErrors = 0
27
+
28
+ if not File.exists?filename
29
+ Printer.printError "Error: #{filename} does not exist"
30
+ ExitHelper.exit(1)
31
+ end
32
+
33
+ loader = RText::DefaultLoader.new(
34
+ Cxxproject::AliasLanguage,
35
+ @model,
36
+ :file_provider => proc { [filename] },
37
+ :cache => @DumpFileCache)
38
+ loader.load()
39
+
40
+ f = @model.fragments[0]
41
+
42
+ f.data[:problems].each do |p|
43
+ Printer.printError "Error: "+p.file+"("+p.line.to_s+"): "+p.message
44
+ end
45
+
46
+ if f.data[:problems].length > 0
47
+ ExitHelper.exit(1)
48
+ end
49
+
50
+ return @env
51
+
52
+ end
53
+
54
+
55
+ end
56
+ end
@@ -0,0 +1,22 @@
1
+ require 'bake/model/metamodel'
2
+ require 'rtext/language'
3
+
4
+ module Cxxproject
5
+
6
+ AliasLanguage =
7
+ RText::Language.new(AliasModel.ecore,
8
+ :feature_provider => proc {|c|
9
+ RGen::Serializer::OppositeReferenceFilter.call(c.eAllStructuralFeatures).reject {|f|
10
+ f.eAnnotations.any? {|a|
11
+ a.details.any? {|d| d.key == 'internal' && d.value == 'true'}
12
+ }
13
+ }
14
+ },
15
+ :unlabled_arguments => proc {|c|
16
+ ["hdd_name", "logical_name"]
17
+ },
18
+ :line_number_attribute => "line_number",
19
+ :file_name_attribute => "file_name"
20
+ )
21
+
22
+ end
@@ -0,0 +1,29 @@
1
+ require 'rgen/metamodel_builder'
2
+ require 'rgen/metamodel_builder/data_types'
3
+
4
+ module Cxxproject
5
+
6
+ module AliasModel
7
+ extend RGen::MetamodelBuilder::ModuleExtension
8
+
9
+ class ModelElement < RGen::MetamodelBuilder::MMBase
10
+ abstract
11
+ has_attr 'line_number', Integer do
12
+ annotation :details => {'internal' => 'true'}
13
+ end
14
+ has_attr 'file_name', String do
15
+ annotation :details => {'internal' => 'true'}
16
+ end
17
+ end
18
+
19
+ class Alias < ModelElement
20
+ has_attr 'hdd_name', String, :defaultValueLiteral => ""
21
+ has_attr 'logical_name', String, :defaultValueLiteral => ""
22
+ end
23
+ class Aliases < ModelElement
24
+ contains_many 'alias', Alias, 'aliases'
25
+ end
26
+
27
+ end
28
+
29
+ end
data/lib/bake/cache.rb ADDED
@@ -0,0 +1,142 @@
1
+ require 'cxxproject/utils/exit_helper'
2
+ require 'cxxproject/utils/printer'
3
+ require 'bake/version'
4
+ require 'bake/options'
5
+
6
+ module Cxxproject
7
+
8
+ class Cache
9
+ attr_accessor :project2config
10
+ attr_accessor :files # project_files
11
+ attr_accessor :cache_file
12
+ attr_accessor :version
13
+ attr_accessor :workspace_roots
14
+ attr_accessor :include_filter
15
+ attr_accessor :exclude_filter
16
+ attr_accessor :defaultToolchain
17
+ attr_accessor :defaultToolchainTime
18
+ end
19
+
20
+ class CacheAccess
21
+ attr_reader :defaultToolchain
22
+ attr_reader :defaultToolchainTime
23
+ attr_reader :cacheFilename
24
+
25
+ def initialize(pm_filename, config_name, options)
26
+ @cacheFilename = File.dirname(pm_filename)+"/.bake/"+File.basename(pm_filename)+"."+sanitize_filename(config_name)+".cache"
27
+ FileUtils.mkdir_p(File.dirname(@cacheFilename))
28
+ @options = options
29
+ @defaultToolchain = nil
30
+ @defaultToolchainTime = nil
31
+ end
32
+
33
+ def load_cache
34
+ cache = nil
35
+ begin
36
+ allFiles = Dir.glob(File.dirname(@cacheFilename)+"/*.cache")
37
+ if allFiles.include?(@cacheFilename)
38
+ cacheTime = File.mtime(@cacheFilename)
39
+ contents = File.open(@cacheFilename, "rb") {|io| io.read }
40
+ cache = Marshal.load(contents)
41
+
42
+ if cache.version != Version.bake
43
+ Printer.printInfo("Info: cache version ("+cache.version+") does not match to bake version ("+Version.bake+"), reloading meta information")
44
+ cache = nil
45
+ @options.set_nocache # complete re-read
46
+ else
47
+ @defaultToolchain = cache.defaultToolchain
48
+ @defaultToolchainTime = cache.defaultToolchainTime
49
+ end
50
+
51
+ if cache != nil
52
+ if cache.cache_file != @cacheFilename
53
+ Printer.printInfo "Info: cache filename changed, reloading meta information"
54
+ cache = nil
55
+ @options.set_nocache # abs dir may wrong
56
+ end
57
+ end
58
+
59
+ if cache != nil
60
+ cache.files.each do |c|
61
+ if (not File.exists?(c))
62
+ Printer.printInfo "Info: meta file(s) renamed or deleted, reloading meta information"
63
+ cache = nil
64
+ @options.set_nocache # abs dir may wrong
65
+ break
66
+ end
67
+ end
68
+ end
69
+
70
+ if cache != nil
71
+ cache.files.each do |c|
72
+ if File.mtime(c) > cacheTime
73
+ Printer.printInfo "Info: cache is out-of-date, reloading meta information"
74
+ cache = nil
75
+ break
76
+ end
77
+ end
78
+ end
79
+
80
+ if cache != nil
81
+ if cache.workspace_roots.length == @options.roots.length
82
+ cache.workspace_roots.each do |r|
83
+ if not @options.roots.include?r
84
+ break
85
+ end
86
+ end
87
+ else
88
+ cache = nil
89
+ end
90
+ Printer.printInfo "Info: specified roots differ from cached roots, reloading meta information" if cache.nil?
91
+ end
92
+
93
+ if cache != nil
94
+ if (not @options.include_filter.eql?(cache.include_filter)) or (not @options.exclude_filter.eql?(cache.exclude_filter))
95
+ cache = nil
96
+ Printer.printInfo "Info: specified filters differ from cached filters, reloading meta information"
97
+ end
98
+ end
99
+
100
+ else
101
+ Printer.printInfo("Info: cache not found, reloading meta information")
102
+ end
103
+
104
+ rescue ExitHelperException
105
+ raise
106
+ rescue
107
+ Printer.printWarning "Warning: cache file corrupt, reloading meta information"
108
+ cache = nil
109
+ end
110
+
111
+ if cache != nil
112
+ Printer.printInfo "Info: cache is up-to-date, loading cached meta information" if @options.verbose
113
+ return cache.project2config
114
+ end
115
+ return nil
116
+
117
+ end
118
+
119
+ def write_cache(project_files, project2config, defaultToolchain, defaultToolchainTime)
120
+ cache = Cache.new
121
+ cache.project2config = project2config
122
+ cache.files = project_files
123
+ cache.cache_file = @cacheFilename
124
+ cache.version = Version.bake
125
+ cache.include_filter = @options.include_filter
126
+ cache.exclude_filter = @options.exclude_filter
127
+ cache.workspace_roots = @options.roots
128
+ cache.defaultToolchain = defaultToolchain
129
+ cache.defaultToolchainTime = defaultToolchainTime
130
+ bbdump = Marshal.dump(cache)
131
+ begin
132
+ File.delete(@cacheFilename)
133
+ rescue
134
+ end
135
+ File.open(@cacheFilename, 'wb') {|file| file.write(bbdump) }
136
+ end
137
+
138
+ end
139
+
140
+
141
+ end
142
+