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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be3404ff6e1f80db98d4853acdf332a936f94ed8619a42a9449f1ce582a4392a
4
- data.tar.gz: 828c0fb3c99466fec6ac8eb8ed66d48722565261ea19b19fdf317986f9e58f72
3
+ metadata.gz: a2f8e946c94da26efa07f21a22538d1c03a41def9990c7a51123366fff63f6dc
4
+ data.tar.gz: 6484a1d3da557c05b7b8b9356fd99f319ede7616e65122282fbf0f19add6f3c0
5
5
  SHA512:
6
- metadata.gz: 506fd0d6e89f221ba6d05f4bdef35bfc344c32f0fda511da4c93efdd27dad51abb2458e40d3cce834e19118c826ece4d182826f507a6331a02fb0b51c6f32a5f
7
- data.tar.gz: b1053e4e6612a23cd9433299d6f867380982ed3b78cbba64c89d26936740549909815464a3c6c24ff6e1e029332678a2077c0d28138d489856968b30241aac2d
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 '-O', '--outdir=dir', 'output root dir,can be absolute or relative to pwd,default _Build' do |dir|
13
- options[:outroot] = dir
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
- opts.on '-S', '--srcdir=dir', 'source root dir,can be absolute or relative to output root(start with ..),default ..' do |dir|
16
- options[:srcroot] = dir
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 '-V', '--variant [x,y,z]', Array, 'variant list to build, empty for build all variants' do |list|
19
- options[:variants] = list || []
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[:variants]
32
- raise "variants config file 'variants.rmk' not exist" unless File.exist? 'variants.rmk'
33
- inifile = IniParse.open 'variants.rmk'
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
- (options[:variants].empty? ? inifile : options[:variants].map!{|vn|
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 File.exist? 'ini.rmk'
49
- inifile = IniParse.open 'ini.rmk'
50
- dir, link = inifile['Outdir']['Path'], inifile['Outdir']['LinkTo']
51
- if link
52
- require 'fileutils'
53
- link = link.gsub(/\$(?:(\$)|{(.*?)})/){$1 || ENV[$2]}.gsub! ?\/, ?\\
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
- Rmk::Build.log_cmd_out std, err
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
- Rmk::Build.log_cmd_out std, err
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
- Rmk::Build.err_puts "Rmk: depend file '#{@vars['depfile']}' which must be created by build '#{@vars['out']}' not found"
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 Rmk::Build.err_puts "Rmk: syntax of depend file '#{@vars['depfile']}' not support yet" unless files
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
- Rmk::Build.err_puts "Rmk: depend type '#{@vars['deptype']}' not support"
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]}.freeze
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
- puts 'Rmk: parse start'
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
- puts 'Rmk: parse done'
182
+ std_puts 'parse done'
154
183
  self
155
184
  end
156
185
 
157
186
  def build(*tgts)
158
- puts 'Rmk: build start'
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 puts('found nothing to build') || 0 if checklist.empty?
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
- puts 'Rmk: build end'
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 = "Rmk: #{parms[1]}: " + state[:vars].interpolate_str(parms[4])
494
- parms[3] ? puts(line) : $stderr.puts(line)
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
@@ -1,3 +1,3 @@
1
1
  class Rmk
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
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 'bundler', '~> 1.15'
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.0
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-03 00:00:00.000000000 Z
11
+ date: 2018-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
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: '1.15'
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