rscons 1.4.2 → 1.4.3

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,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