rscons 1.4.2 → 1.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTA0YjY5YjRkMGY4Y2QxOGFjNzhlOTJjMmRjMzA5MjZiZjI2MTUzOQ==
4
+ NTNkMDYxN2I0NGJlMTJlOTQxYjYwMzA3MDI4ZGYxZTdjNzM3NjM4OA==
5
5
  data.tar.gz: !binary |-
6
- MmJjM2ZmZjRkMGUwMTdjNjE3ZmFmNTI5NTVlYjFhNTg0YzNhMmNmNg==
6
+ MTY0ZTBlY2QxMTQwNDE5ZTQ2OWJhYmEwZDZlZjAyYTYzZDliY2Q3MQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- N2M3YjM1ZGI4ODEyNjI4M2E5YzhkNTU5NTI2MDFiMjE2MDY0ODRhNDI2YzM1
10
- MTg1YmFlMTRkNWYyMjdjMzBiZTU2M2QzY2NjMDA2NzZlMDEwYmVhMGIxZjYy
11
- NWY2YzAxNDQxMmFiZWNhNzk0MjZkODA4ZWEzMzMyZGNhMjFkMWU=
9
+ MjU3M2FlNzE3M2YyZmFmMjJlMThmYWQzNjVjM2M0MGU1MjM0ZTc0ZTU0YjZh
10
+ NjM1ODM2ZDBhYjhmYzdkZTM0MTNiMDNiNzU2Mzc2ODdiOWJiM2Q3NjZiNzBl
11
+ YzE4YmQ5ODdmM2RlNTg4YjNmOGJlMTc1YWQ5M2EyNTUxY2I4OGM=
12
12
  data.tar.gz: !binary |-
13
- MmEwNDAzZTc1ZDgyMjEzODJhOGQ4Njk2ZDlkY2ZkZDc2ZGU1ZDk0ZGU3MDgw
14
- NjdmZjNkMmZmNmQzZjI5NmFlN2NmMDg0ZWU1ZjczYzQyNjZmYWMzN2ZhMTcz
15
- NWRlYjcxZDc3NWY5ODYyYmFjMmFmMGMwNTE2MDNmNmNiNjMxYTA=
13
+ MTI1MTgxZmQ5M2I3YTMxYzVmZTM5ZWUzNDRjMmFjMGZkNzZmMGRmMDlmMzA3
14
+ ODJlZGQ0YzNlNzIxOGUxNTdlNGY2NmQ0MzVlMmRkZmU5Y2U3MDE0NjQ0Mjg0
15
+ NzY3ZjA4ZjdmN2QzZWY4N2ZmY2RjYTQ2YWYwNzkzMzcxM2I2MzU=
data/README.md CHANGED
@@ -329,6 +329,11 @@ http://rubydoc.info/github/holtrop/rscons/frames.
329
329
 
330
330
  ## Release Notes
331
331
 
332
+ ### v1.4.3
333
+
334
+ - fix builders properly using construction variable overrides
335
+ - expand nil construction variables to empty strings
336
+
332
337
  ### v1.4.2
333
338
 
334
339
  - add Environment#expand_path
@@ -32,7 +32,7 @@ module Rscons
32
32
  else
33
33
  raise "Unknown source file #{sources.first.inspect} for CFile builder"
34
34
  end
35
- command = env.build_command(env["#{cmd}_CMD"], vars)
35
+ command = env.build_command("${#{cmd}_CMD}", vars)
36
36
  standard_build("#{cmd} #{target}", target, command, sources, env, cache)
37
37
  end
38
38
  end
@@ -12,7 +12,7 @@ module Rscons
12
12
 
13
13
  def run(target, sources, cache, env, vars)
14
14
  vars = vars.merge("_SOURCES" => sources)
15
- command = env.build_command(env["DISASM_CMD"], vars)
15
+ command = env.build_command("${DISASM_CMD}", vars)
16
16
  unless cache.up_to_date?(target, command, sources, env)
17
17
  cache.mkdir_p(File.dirname(target))
18
18
  return false unless env.execute("Disassemble #{target}", command, options: {out: target})
@@ -13,13 +13,13 @@ module Rscons
13
13
 
14
14
  def run(target, sources, cache, env, vars)
15
15
  # build sources to linkable objects
16
- objects = env.build_sources(sources, [env['OBJSUFFIX'], env['LIBSUFFIX']].flatten, cache, vars)
16
+ objects = env.build_sources(sources, env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars).flatten, cache, vars)
17
17
  if objects
18
18
  vars = vars.merge({
19
19
  '_TARGET' => target,
20
20
  '_SOURCES' => objects,
21
21
  })
22
- command = env.build_command(env['ARCMD'], vars)
22
+ command = env.build_command("${ARCMD}", vars)
23
23
  standard_build("AR #{target}", target, command, objects, env, cache)
24
24
  end
25
25
  end
@@ -58,11 +58,11 @@ module Rscons
58
58
  '_DEPFILE' => Rscons.set_suffix(target, '.mf'),
59
59
  })
60
60
  com_prefix = KNOWN_SUFFIXES.find do |compiler, suffix_var|
61
- sources.first.end_with?(*env[suffix_var])
61
+ sources.first.end_with?(*env.expand_varref("${#{suffix_var}}"))
62
62
  end.tap do |v|
63
63
  v.nil? and raise "Error: unknown input file type: #{sources.first.inspect}"
64
64
  end.first
65
- command = env.build_command(env["#{com_prefix}CMD"], vars)
65
+ command = env.build_command("${#{com_prefix}CMD}", vars)
66
66
  unless cache.up_to_date?(target, command, sources, env)
67
67
  cache.mkdir_p(File.dirname(target))
68
68
  FileUtils.rm_f(target)
@@ -9,15 +9,15 @@ module Rscons
9
9
  end
10
10
 
11
11
  def run(target, sources, cache, env, vars)
12
- pp_cc = if sources.find {|s| s.end_with?(*env["CXXSUFFIX"])}
13
- env["CXX"]
12
+ pp_cc = if sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
13
+ "${CXX}"
14
14
  else
15
- env["CC"]
15
+ "${CC}"
16
16
  end
17
17
  vars = vars.merge("_PREPROCESS_CC" => pp_cc,
18
18
  "_TARGET" => target,
19
19
  "_SOURCES" => sources)
20
- command = env.build_command(env["CPP_CMD"], vars)
20
+ command = env.build_command("${CPP_CMD}", vars)
21
21
  standard_build("Preprocess #{target}", target, command, sources, env, cache)
22
22
  end
23
23
  end
@@ -17,23 +17,24 @@ module Rscons
17
17
 
18
18
  def run(target, sources, cache, env, vars)
19
19
  # build sources to linkable objects
20
- objects = env.build_sources(sources, [env['OBJSUFFIX'], env['LIBSUFFIX']].flatten, cache, vars)
20
+ objects = env.build_sources(sources, env.expand_varref(["${OBJSUFFIX}", "${LIBSUFFIX}"], vars).flatten, cache, vars)
21
21
  return false unless objects
22
- ld = if env["LD"]
23
- env["LD"]
24
- elsif sources.find {|s| s.end_with?(*env["DSUFFIX"])}
25
- env["DC"]
26
- elsif sources.find {|s| s.end_with?(*env["CXXSUFFIX"])}
27
- env["CXX"]
22
+ ld = env.expand_varref("${LD}", vars)
23
+ ld = if ld != ""
24
+ ld
25
+ elsif sources.find {|s| s.end_with?(*env.expand_varref("${DSUFFIX}", vars))}
26
+ "${DC}"
27
+ elsif sources.find {|s| s.end_with?(*env.expand_varref("${CXXSUFFIX}", vars))}
28
+ "${CXX}"
28
29
  else
29
- env["CC"]
30
+ "${CC}"
30
31
  end
31
32
  vars = vars.merge({
32
33
  '_TARGET' => target,
33
34
  '_SOURCES' => objects,
34
35
  'LD' => ld,
35
36
  })
36
- command = env.build_command(env['LDCMD'], vars)
37
+ command = env.build_command("${LDCMD}", vars)
37
38
  standard_build("LD #{target}", target, command, objects, env, cache)
38
39
  end
39
40
  end
@@ -209,22 +209,22 @@ module Rscons
209
209
  @targets = {}
210
210
  end
211
211
 
212
- # Build a command line from the given template, resolving references to
213
- # variables using the Environment's construction variables and any extra
214
- # variables specified.
215
- # @param command_template [Array] template for the command with variable
216
- # references
217
- # @param extra_vars [Hash, VarSet] extra variables to use in addition to
218
- # (or replace) the Environment's construction variables when building
219
- # the command
220
- def build_command(command_template, extra_vars)
221
- @varset.merge(extra_vars).expand_varref(command_template)
222
- end
223
-
224
- # Expand a construction variable reference (String or Array)
225
- def expand_varref(varref)
226
- @varset.expand_varref(varref)
212
+ # Expand a construction variable reference.
213
+ #
214
+ # @param varref [Array, String] Variable reference to expand.
215
+ # @param extra_vars [Hash, VarSet]
216
+ # Extra variables to use in addition to (or replace) the Environment's
217
+ # construction variables when expanding the variable reference.
218
+ #
219
+ # @return [Array, String] Expansion of the variable reference.
220
+ def expand_varref(varref, extra_vars = nil)
221
+ if extra_vars.nil?
222
+ @varset
223
+ else
224
+ @varset.merge(extra_vars)
225
+ end.expand_varref(varref)
227
226
  end
227
+ alias_method :build_command, :expand_varref
228
228
 
229
229
  # Execute a builder command
230
230
  # @param short_desc [String] Message to print if the Environment's echo
data/lib/rscons/varset.rb CHANGED
@@ -83,7 +83,7 @@ module Rscons
83
83
  if varref =~ /^(.*)\$\{([^}]+)\}(.*)$/
84
84
  prefix, varname, suffix = $1, $2, $3
85
85
  varval = expand_varref(self[varname])
86
- if varval.is_a?(String)
86
+ if varval.is_a?(String) or varval.nil?
87
87
  expand_varref("#{prefix}#{varval}#{suffix}")
88
88
  elsif varval.is_a?(Array)
89
89
  varval.map {|vv| expand_varref("#{prefix}#{vv}#{suffix}")}.flatten
@@ -1,4 +1,4 @@
1
1
  module Rscons
2
2
  # gem version
3
- VERSION = "1.4.2"
3
+ VERSION = "1.4.3"
4
4
  end
@@ -15,6 +15,11 @@ module Rscons
15
15
  subject.run("lexer.cc", ["parser.ll"], :cache, env, {})
16
16
  end
17
17
 
18
+ it "supports overriding construction variables" do
19
+ subject.should_receive(:standard_build).with("LEX lexer.c", "lexer.c", ["hi", "parser.l"], ["parser.l"], env, :cache)
20
+ subject.run("lexer.c", ["parser.l"], :cache, env, "LEX_CMD" => ["hi", "${_SOURCES}"])
21
+ end
22
+
18
23
  it "raises an error when an unknown source file is specified" do
19
24
  expect {subject.run("file.c", ["foo.bar"], :cache, env, {})}.to raise_error /Unknown source file .foo.bar. for CFile builder/
20
25
  end
@@ -0,0 +1,17 @@
1
+ module Rscons
2
+ module Builders
3
+ describe Disassemble do
4
+ let(:env) {Environment.new}
5
+ subject {Disassemble.new}
6
+
7
+ it "supports overriding DISASM_CMD construction variable" do
8
+ cache = "cache"
9
+ cache.stub(:up_to_date?) { false }
10
+ cache.stub(:mkdir_p) { }
11
+ cache.stub(:register_build) { }
12
+ env.should_receive(:execute).with("Disassemble a_file.txt", ["my_disasm", "a_file.exe"], anything).and_return(true)
13
+ subject.run("a_file.txt", ["a_file.exe"], cache, env, "DISASM_CMD" => ["my_disasm", "${_SOURCES}"])
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ module Rscons
2
+ module Builders
3
+ describe Library do
4
+ let(:env) {Environment.new}
5
+ subject {Library.new}
6
+
7
+ it "supports overriding AR construction variable" do
8
+ subject.should_receive(:standard_build).with("AR prog.a", "prog.a", ["sp-ar", "rcs", "prog.a", "prog.o"], ["prog.o"], env, :cache)
9
+ subject.run("prog.a", ["prog.o"], :cache, env, "AR" => "sp-ar")
10
+ end
11
+
12
+ it "supports overriding ARCMD construction variable" do
13
+ subject.should_receive(:standard_build).with("AR prog.a", "prog.a", ["special", "AR!", "prog.o"], ["prog.o"], env, :cache)
14
+ subject.run("prog.a", ["prog.o"], :cache, env, "ARCMD" => ["special", "AR!", "${_SOURCES}"])
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Rscons
2
+ module Builders
3
+ describe Object do
4
+ let(:env) {Environment.new}
5
+ subject {Object.new}
6
+
7
+ it "supports overriding CCCMD construction variable" do
8
+ cache = "cache"
9
+ cache.stub(:up_to_date?) { false }
10
+ cache.stub(:mkdir_p) { }
11
+ cache.stub(:register_build) { }
12
+ FileUtils.stub(:rm_f) { }
13
+ File.stub(:exists?) { false }
14
+ env.should_receive(:execute).with("CC mod.o", ["llc", "mod.c"]).and_return(true)
15
+ subject.run("mod.o", ["mod.c"], cache, env, "CCCMD" => ["llc", "${_SOURCES}"])
16
+ end
17
+
18
+ it "raises an error when given a source file with an unknown suffix" do
19
+ expect { subject.run("mod.o", ["mod.xyz"], :cache, env, {}) }.to raise_error /unknown input file type: "mod.xyz"/
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module Rscons
2
+ module Builders
3
+ describe Preprocess do
4
+ let(:env) {Environment.new}
5
+ subject {Preprocess.new}
6
+
7
+ it "supports overriding CC construction variable" do
8
+ subject.should_receive(:standard_build).with("Preprocess module.pp", "module.pp", ["my_cpp", "-E", "-o", "module.pp", "module.c"], ["module.c"], env, :cache)
9
+ subject.run("module.pp", ["module.c"], :cache, env, "CC" => "my_cpp")
10
+ end
11
+
12
+ it "supports overriding CPP_CMD construction variable" do
13
+ subject.should_receive(:standard_build).with("Preprocess module.pp", "module.pp", ["my_cpp", "module.c"], ["module.c"], env, :cache)
14
+ subject.run("module.pp", ["module.c"], :cache, env, "CPP_CMD" => ["my_cpp", "${_SOURCES}"])
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Rscons
2
+ module Builders
3
+ describe Program do
4
+ let(:env) {Environment.new}
5
+ subject {Program.new}
6
+
7
+ it "supports overriding CC construction variable" do
8
+ subject.should_receive(:standard_build).with("LD prog", "prog", ["sp-c++", "-o", "prog", "prog.o"], ["prog.o"], env, :cache)
9
+ subject.run("prog", ["prog.o"], :cache, env, "CC" => "sp-c++")
10
+ end
11
+
12
+ it "supports overriding LDCMD construction variable" do
13
+ subject.should_receive(:standard_build).with("LD prog", "prog", ["special", "LD!", "prog.o"], ["prog.o"], env, :cache)
14
+ subject.run("prog", ["prog.o"], :cache, env, "LDCMD" => ["special", "LD!", "${_SOURCES}"])
15
+ end
16
+ end
17
+ end
18
+ end
@@ -223,6 +223,7 @@ module Rscons
223
223
  env["path"] = ["dir1", "dir2"]
224
224
  env["flags"] = ["-x", "-y", "${specialflag}"]
225
225
  env["specialflag"] = "-z"
226
+ env["foo"] = {}
226
227
  env.expand_varref(["-p${path}", "${flags}"]).should == ["-pdir1", "-pdir2", "-x", "-y", "-z"]
227
228
  env.expand_varref("foo").should == "foo"
228
229
  expect {env.expand_varref("${foo}")}.to raise_error /expand.a.variable.reference/
@@ -125,7 +125,8 @@ module Rscons
125
125
  "CC" => "gcc",
126
126
  "CPPPATH" => ["dir1", "dir2"],
127
127
  "compiler" => "${CC}",
128
- "cmd" => ["${CC}", "-c", "${CFLAGS}", "-I${CPPPATH}"])
128
+ "cmd" => ["${CC}", "-c", "${CFLAGS}", "-I${CPPPATH}"],
129
+ "hash" => {})
129
130
  it "expands to the string itself if the string is not a variable reference" do
130
131
  v.expand_varref("CC").should == "CC"
131
132
  v.expand_varref("CPPPATH").should == "CPPPATH"
@@ -151,8 +152,11 @@ module Rscons
151
152
  "cflag: -O2, cpppath: dir2, compiler: gcc",
152
153
  ]
153
154
  end
154
- it "raises an error when a variable reference refers to a non-existent variable" do
155
- expect { v.expand_varref("${not_here}") }.to raise_error /I do not know how to expand a variable reference to a NilClass/
155
+ it "returns an empty string when a variable reference refers to a non-existent variable" do
156
+ expect(v.expand_varref("${not_here}")).to eq("")
157
+ end
158
+ it "raises an error when a variable reference refers to an unhandled type" do
159
+ expect { v.expand_varref("${hash}") }.to raise_error /I do not know how to expand a variable reference to a Hash/
156
160
  end
157
161
  end
158
162
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscons
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtrop
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-09 00:00:00.000000000 Z
11
+ date: 2014-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core
@@ -179,6 +179,11 @@ files:
179
179
  - rscons.gemspec
180
180
  - spec/build_tests_spec.rb
181
181
  - spec/rscons/builders/cfile_spec.rb
182
+ - spec/rscons/builders/disassemble_spec.rb
183
+ - spec/rscons/builders/library_spec.rb
184
+ - spec/rscons/builders/object_spec.rb
185
+ - spec/rscons/builders/preprocess_spec.rb
186
+ - spec/rscons/builders/program_spec.rb
182
187
  - spec/rscons/cache_spec.rb
183
188
  - spec/rscons/environment_spec.rb
184
189
  - spec/rscons/varset_spec.rb
@@ -211,6 +216,11 @@ summary: Software construction library inspired by SCons and implemented in Ruby
211
216
  test_files:
212
217
  - spec/build_tests_spec.rb
213
218
  - spec/rscons/builders/cfile_spec.rb
219
+ - spec/rscons/builders/disassemble_spec.rb
220
+ - spec/rscons/builders/library_spec.rb
221
+ - spec/rscons/builders/object_spec.rb
222
+ - spec/rscons/builders/preprocess_spec.rb
223
+ - spec/rscons/builders/program_spec.rb
214
224
  - spec/rscons/cache_spec.rb
215
225
  - spec/rscons/environment_spec.rb
216
226
  - spec/rscons/varset_spec.rb