rmk-ruby 0.1.0 → 0.1.1
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/exe/rmk +66 -43
- data/lib/rmk/build.rb +5 -16
- data/lib/rmk/rmk.rb +36 -7
- data/lib/rmk/vdir.rb +2 -2
- data/lib/rmk/version.rb +1 -1
- data/rmk.gemspec +1 -3
- metadata +7 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2f8e946c94da26efa07f21a22538d1c03a41def9990c7a51123366fff63f6dc
|
4
|
+
data.tar.gz: 6484a1d3da557c05b7b8b9356fd99f319ede7616e65122282fbf0f19add6f3c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ce6f5455e2e95323c1222fbb3ddb7f2c17f93f773789fff69810ae5103dbe62f5b35b004eec91805248721c5d85a004011e1e6d57e1ef11deef423dff4a7d3f
|
7
|
+
data.tar.gz: 6aea3ab211a8297850136e56deaeb6c735d5716863c93eb9ee3b5f86adfa567b33d9b01529f8c20696efe64f76f4a98e8e77565b5645a449d978b82d2dda4a83
|
data/exe/rmk
CHANGED
@@ -1,23 +1,36 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'optparse'
|
4
|
-
require 'iniparse'
|
5
4
|
require "rmk"
|
6
5
|
|
7
6
|
options = {}
|
7
|
+
cache_options = {}
|
8
8
|
parser = OptionParser.new{ |opts|
|
9
9
|
opts.summary_width = 48
|
10
10
|
opts.banner = 'Usage: rmk [Options] [targets]'
|
11
|
-
opts.separator ''
|
12
|
-
opts.on '-
|
13
|
-
options[:
|
11
|
+
opts.separator 'repository options:'
|
12
|
+
opts.on '-C', '--directory=dir', 'repository root dir, will change to this dir before other operation, default pwd' do |dir|
|
13
|
+
options[:prjroot] = dir
|
14
14
|
end
|
15
|
-
|
16
|
-
|
15
|
+
|
16
|
+
opts.separator 'directory options(will be cached when seted):'
|
17
|
+
opts.on '-O', '--outdir=dir', 'output root dir, can be absolute or relative to repository root, default _Build' do |dir|
|
18
|
+
cache_options[:outroot] = dir
|
19
|
+
end
|
20
|
+
opts.on '-S', '--srcdir=dir', 'source root dir, can be absolute or relative to output root(start with ..), default ..' do |dir|
|
21
|
+
cache_options[:srcroot] = dir
|
17
22
|
end
|
18
|
-
opts.on '-
|
19
|
-
|
23
|
+
opts.on '--link-outdir=dir', 'symbol link outdir to this dir, default <system temp dir>/<repository name>, set / to disable' do |dir|
|
24
|
+
cache_options[:link] = dir
|
20
25
|
end
|
26
|
+
opts.on '--name=name', "repository name, default repository root dir's name" do |name| cache_options[:name] = name end
|
27
|
+
|
28
|
+
opts.separator 'variant options:'
|
29
|
+
opts.on '-V', '--variant x,y,z', Array, 'variant list to build' do |list|
|
30
|
+
options[:variants] = list
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.separator 'info options:'
|
21
34
|
opts.on '-h', '--help', 'show this help' do
|
22
35
|
puts opts
|
23
36
|
exit
|
@@ -28,47 +41,57 @@ parser = OptionParser.new{ |opts|
|
|
28
41
|
end
|
29
42
|
}
|
30
43
|
targets = parser.parse(ARGV)
|
31
|
-
if options[:
|
32
|
-
|
33
|
-
|
44
|
+
Dir.chdir options[:prjroot] if options[:prjroot]
|
45
|
+
options_file = '.rmk/options'
|
46
|
+
loaded_options = File.exist?(options_file) ? Marshal.load(IO.binread options_file) : {}
|
47
|
+
changed = false
|
48
|
+
%i(outroot srcroot link name).each do |key|
|
49
|
+
next changed = true if cache_options.include? key
|
50
|
+
next cache_options[key] = loaded_options[key] if loaded_options[key]
|
51
|
+
changed = true
|
52
|
+
end
|
53
|
+
cache_options[:outroot] ||= '_Build'
|
54
|
+
cache_options[:srcroot] ||= '..'
|
55
|
+
cache_options[:name] ||= File.basename Dir.pwd
|
56
|
+
cache_options[:link] ||= File.join ENV['TMP'], cache_options[:name]
|
57
|
+
if changed
|
58
|
+
Dir.mkdir '.rmk' unless Dir.exist? '.rmk'
|
59
|
+
IO.binwrite options_file, Marshal.dump(cache_options)
|
60
|
+
end
|
61
|
+
dir, link = cache_options[:outroot], cache_options[:link]
|
62
|
+
if link && link != '/'
|
63
|
+
require 'fileutils'
|
64
|
+
link = link.gsub(/\$(?:(\$)|{(.*?)})/){$1 || ENV[$2]}.gsub! ?\\, ?\/
|
65
|
+
FileUtils.mkpath link unless Dir.exist? link
|
66
|
+
if File.symlink? dir
|
67
|
+
if File.readlink(dir) != link
|
68
|
+
Dir.rmdir dir
|
69
|
+
File.symlink link, dir
|
70
|
+
end
|
71
|
+
elsif Dir.exist?(dir) || File.exist?(dir)
|
72
|
+
raise "need symlink '#{dir}' as outroot, but file(or dir) '#{dir}' already exist"
|
73
|
+
else
|
74
|
+
FileUtils.mkpath File.dirname dir
|
75
|
+
File.symlink link, dir
|
76
|
+
end
|
77
|
+
else
|
78
|
+
FileUtils.mkpath dir
|
79
|
+
end
|
80
|
+
variants = options[:variants]
|
81
|
+
if variants && variants.size != 1
|
34
82
|
targets = targets.map{|tgt| %|"#{tgt}"|}.join ' '
|
35
83
|
exe = File.join RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']
|
36
84
|
thrs = []
|
37
|
-
|
38
|
-
variant = inifile[vn]
|
39
|
-
warn "variant '#{vn}' doesn't exist" unless variant
|
40
|
-
variant
|
41
|
-
}).each do |variant|
|
42
|
-
next unless variant
|
43
|
-
thrs << Thread.new{ system %|"#{exe}" "#{__FILE__}" -O"#{variant['outdir']}" -S"#{variant['srcdir']}" #{targets}|}
|
44
|
-
end
|
85
|
+
variants.each {|name| thrs << Thread.new {system %|"#{exe}" "#{__FILE__}" -V #{name} #{targets}|}}
|
45
86
|
thrs.each{|thr| thr.join}
|
46
87
|
exit
|
47
88
|
end
|
48
|
-
if
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
FileUtils.mkpath link unless Dir.exist? link
|
55
|
-
if File.symlink? dir
|
56
|
-
if File.readlink(dir) != link
|
57
|
-
Dir.rmdir dir
|
58
|
-
File.symlink link, dir
|
59
|
-
end
|
60
|
-
elsif Dir.exist?(dir) || File.exist?(dir)
|
61
|
-
raise "need symlink '#{dir}' as outroot, but file(or dir) '#{dir}' already exist"
|
62
|
-
else
|
63
|
-
FileUtils.mkpath File.dirname dir
|
64
|
-
File.symlink link, dir
|
65
|
-
end
|
66
|
-
else
|
67
|
-
FileUtils.mkpath dir
|
68
|
-
end
|
69
|
-
options[:srcroot] ||= inifile['Srcdir']['Path']
|
70
|
-
options[:outroot] ||= dir
|
89
|
+
if variants
|
90
|
+
variants = variants[0]
|
91
|
+
src = cache_options[:srcroot].match?(/^[a-z]:\//i) ? cache_options[:srcroot] : File.join('..', cache_options[:srcroot])
|
92
|
+
rmk = Rmk.new srcroot:src, outroot:File.join(cache_options[:outroot], variants), variant:variants
|
93
|
+
else
|
94
|
+
rmk = Rmk.new srcroot:cache_options[:srcroot], outroot:cache_options[:outroot]
|
71
95
|
end
|
72
|
-
rmk = Rmk.new srcroot:options[:srcroot] || '..', outroot:options[:outroot] || '_Build'
|
73
96
|
rmk.parse
|
74
97
|
rmk.build *targets
|
data/lib/rmk/build.rb
CHANGED
@@ -124,16 +124,6 @@ class Rmk::Build
|
|
124
124
|
storage.sync{|data| data[@outfiles[0].path] = digest}
|
125
125
|
end
|
126
126
|
|
127
|
-
@output_mutex = Thread::Mutex.new
|
128
|
-
def self.puts(*parms) @output_mutex.synchronize{$stdout.puts *parms} end
|
129
|
-
def self.err_puts(*parms) @output_mutex.synchronize{$stderr.puts *parms} end
|
130
|
-
def self.log_cmd_out(out, err)
|
131
|
-
@output_mutex.synchronize do
|
132
|
-
$stdout.puts out unless out.empty?
|
133
|
-
$stderr.puts err unless err.empty?
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
127
|
def parser_force_run!
|
138
128
|
return if @runed
|
139
129
|
@runed = :force
|
@@ -182,14 +172,13 @@ class Rmk::Build
|
|
182
172
|
env['PATH'] = @vars['PATH_prepend'] + ENV['PATH'] if @vars['PATH_prepend']
|
183
173
|
@vars['ENV_export'].split(/\s+/).each{|name| env[name] = @vars[name] if @vars.include? name} if @vars['ENV_export']
|
184
174
|
std, err, result = env.empty? ? Open3.capture3(cmd) : Open3.capture3(env, cmd)
|
185
|
-
std = std.empty? ? @vars['echo'] || "Rmk: run: #{cmd}" : (@vars['echo'] || "Rmk: run: #{cmd}") + ?\n + std
|
186
175
|
if result.exitstatus != 0
|
187
176
|
err = "execute faild: '#{cmd}'" if err.empty?
|
188
|
-
|
177
|
+
@dir.rmk.log_cmd_out @vars['echo'] || cmd, std, err
|
189
178
|
@outfiles.each{|file| File.delete file.path if File.exist? file.path}
|
190
179
|
return false
|
191
180
|
end
|
192
|
-
|
181
|
+
@dir.rmk.log_cmd_out @vars['echo'] || cmd, std, err
|
193
182
|
end
|
194
183
|
true
|
195
184
|
end
|
@@ -197,12 +186,12 @@ class Rmk::Build
|
|
197
186
|
private def process_depfile
|
198
187
|
return unless @vars['deptype']
|
199
188
|
unless File.exist? @vars['depfile']
|
200
|
-
|
189
|
+
@dir.rmk.err_puts 'error: ', "depend file '#{@vars['depfile']}' which must be created by build '#{@vars['out']}' not found"
|
201
190
|
end
|
202
191
|
if @vars['deptype'] == 'make'
|
203
192
|
files = parse_make_depfile @vars['depfile']
|
204
193
|
File.delete @vars['depfile']
|
205
|
-
return
|
194
|
+
return @dir.rmk.err_puts 'error: ' "syntax of depend file '#{@vars['depfile']}' not support yet" unless files
|
206
195
|
@dir.rmk.dep_storage[@outfiles[0].path] = files
|
207
196
|
files.each do |file|
|
208
197
|
file = File.absolute_path Rmk.normalize_path(file), @dir.rmk.outroot
|
@@ -211,7 +200,7 @@ class Rmk::Build
|
|
211
200
|
end
|
212
201
|
files
|
213
202
|
else
|
214
|
-
|
203
|
+
@dir.rmk.err_puts 'warn: ', "depend type '#{@vars['deptype']}' not support"
|
215
204
|
end
|
216
205
|
end
|
217
206
|
|
data/lib/rmk/rmk.rb
CHANGED
@@ -8,11 +8,37 @@ class Rmk
|
|
8
8
|
# @return [String]
|
9
9
|
def self.normalize_path(path) path.gsub(?\\, ?/).sub(/^[a-z](?=:)/){|ch|ch.upcase} end
|
10
10
|
|
11
|
+
private def log(stream, mark, *parms)
|
12
|
+
return stream.puts *parms unless mark
|
13
|
+
stream.print @log_prefix, mark
|
14
|
+
return stream.puts *parms unless parms.size > 1
|
15
|
+
stream.puts ''
|
16
|
+
parms.each{|parm| stream.print ?\t; stream.puts parm}
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def std_puts(mark, *parms) @stdoe_mutex.synchronize{log $stdout, mark, *parms} end
|
21
|
+
|
22
|
+
def err_puts(mark, *parms) @stdoe_mutex.synchronize{log $stderr, mark, *parms} end
|
23
|
+
|
24
|
+
private def split_log(stream, mark, lines)
|
25
|
+
begin stream.print @log_prefix; stream.puts mark end if mark
|
26
|
+
lines.each_line{|line| stream.print ?\t; stream.puts line}
|
27
|
+
end
|
28
|
+
|
29
|
+
def log_cmd_out(mark, out, err)
|
30
|
+
@stdoe_mutex.synchronize do
|
31
|
+
split_log $stdout, mark, out
|
32
|
+
split_log $stderr, nil, err unless err.empty?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
11
36
|
# create Rmk object
|
12
37
|
# @param srcroot [String] source root dir,can be absolute or relative to output root(start with ..)
|
13
38
|
# @param outroot [String] output root dir,can be absolute or relative to pwd,default pwd
|
14
|
-
def initialize(srcroot:'', outroot:'')
|
39
|
+
def initialize(srcroot:'', outroot:'', variant:nil)
|
15
40
|
@files_mutex = Thread::Mutex.new # files operate mutex
|
41
|
+
@stdoe_mutex = Thread::Mutex.new # stdout and stderr mutex
|
16
42
|
|
17
43
|
srcroot = Rmk.normalize_path srcroot
|
18
44
|
@outroot = File.join Rmk.normalize_path(File.absolute_path outroot), ''
|
@@ -29,7 +55,10 @@ class Rmk
|
|
29
55
|
@srcfiles = {}
|
30
56
|
@outfiles = {}
|
31
57
|
@defaultfiles = []
|
32
|
-
@vars = {'srcroot'=>@srcroot[0..-2], 'outroot'=>@outroot[0..-2], 'src_rto_root'=>(@src_relative || @srcroot)[0..-2]}
|
58
|
+
@vars = {'srcroot'=>@srcroot[0..-2], 'outroot'=>@outroot[0..-2], 'src_rto_root'=>(@src_relative || @srcroot)[0..-2]}
|
59
|
+
@vars['variant'] = variant if variant
|
60
|
+
@vars.freeze
|
61
|
+
@log_prefix = variant ? "Rmk (#{variant}): " : 'Rmk: '
|
33
62
|
@virtual_root = Rmk::VDir.new self, nil
|
34
63
|
end
|
35
64
|
attr_reader :srcroot, :outroot, :vars, :virtual_root, :srcfiles, :outfiles
|
@@ -145,17 +174,17 @@ class Rmk
|
|
145
174
|
# parse project
|
146
175
|
# @return [self]
|
147
176
|
def parse
|
148
|
-
|
177
|
+
std_puts 'parse start'
|
149
178
|
@mid_storage.wait_ready
|
150
179
|
@dep_storage.wait_ready
|
151
180
|
@cml_storage.wait_ready
|
152
181
|
@virtual_root.parse
|
153
|
-
|
182
|
+
std_puts 'parse done'
|
154
183
|
self
|
155
184
|
end
|
156
185
|
|
157
186
|
def build(*tgts)
|
158
|
-
|
187
|
+
std_puts 'build start'
|
159
188
|
if tgts.empty?
|
160
189
|
files = @defaultfiles
|
161
190
|
else
|
@@ -178,14 +207,14 @@ class Rmk
|
|
178
207
|
fi.output_ref_build.orderfiles.each &checkproc
|
179
208
|
end
|
180
209
|
files.each &checkproc
|
181
|
-
exit
|
210
|
+
exit std_puts('','found nothing to build') || 0 if checklist.empty?
|
182
211
|
checklist.each {|file| file.check_for_build}
|
183
212
|
end
|
184
213
|
while Thread.list.size > 1
|
185
214
|
thr = Thread.list[-1]
|
186
215
|
thr.join unless thr == Thread.current
|
187
216
|
end
|
188
|
-
|
217
|
+
std_puts 'build end'
|
189
218
|
@mid_storage.save
|
190
219
|
@dep_storage.data!.each_key {|key| @dep_storage.data!.delete key unless @outfiles.include? key}
|
191
220
|
@dep_storage.save
|
data/lib/rmk/vdir.rb
CHANGED
@@ -490,8 +490,8 @@ class Rmk::VDir
|
|
490
490
|
state = begin_define_nonvar indent
|
491
491
|
parms = line.match /^((error)|warn|(info))\s+(.*)$/
|
492
492
|
raise 'syntax error' unless parms
|
493
|
-
line =
|
494
|
-
parms[3] ?
|
493
|
+
line = state[:vars].interpolate_str(parms[4])
|
494
|
+
parms[3] ? @rmk.std_puts(parms[1] + ': ', line) : @rmk.err_puts(parms[1] + ': ', line)
|
495
495
|
exit 2 if parms[2]
|
496
496
|
else
|
497
497
|
match = /^(?:(?<append>\+=)|=)(?(<append>)|\s*)(?<value>.*)$/.match line
|
data/lib/rmk/version.rb
CHANGED
data/rmk.gemspec
CHANGED
@@ -29,7 +29,5 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f)}
|
30
30
|
spec.require_paths = ['lib']
|
31
31
|
|
32
|
-
spec.add_development_dependency '
|
33
|
-
|
34
|
-
spec.add_dependency 'iniparse','~> 1.4'
|
32
|
+
spec.add_development_dependency 'rake', '>= 12.3.0'
|
35
33
|
end
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmk-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pbl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 12.3.0
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: iniparse
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.4'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.4'
|
26
|
+
version: 12.3.0
|
41
27
|
description: build tool like make, tup, ninja...
|
42
28
|
email:
|
43
29
|
- a@pbl.pw
|