Support passing a directory to rscons() method - close #128
This commit is contained in:
parent
a7b46093e9
commit
ca747232cd
10
build_tests/subsidiary/Rsconscript_dir
Normal file
10
build_tests/subsidiary/Rsconscript_dir
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
configure do
|
||||||
|
rscons "sub"
|
||||||
|
rscons "sub", "-f", "Rsconscript2", "configure"
|
||||||
|
puts "top configure"
|
||||||
|
end
|
||||||
|
|
||||||
|
build do
|
||||||
|
rscons "sub", "-f", "Rsconscript2", "build"
|
||||||
|
puts "top build"
|
||||||
|
end
|
4
build_tests/subsidiary/Rsconscript_samedir
Normal file
4
build_tests/subsidiary/Rsconscript_samedir
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
build do
|
||||||
|
rscons "second", "build"
|
||||||
|
puts "top build"
|
||||||
|
end
|
3
build_tests/subsidiary/second
Normal file
3
build_tests/subsidiary/second
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
build do
|
||||||
|
puts "second build"
|
||||||
|
end
|
@ -882,11 +882,18 @@ This can be used, for example, when a subproject is imported and a top-level
|
|||||||
`configure` or `build` operation should also perform the same operation in the
|
`configure` or `build` operation should also perform the same operation in the
|
||||||
subproject directory.
|
subproject directory.
|
||||||
|
|
||||||
|
The first argument to the `rscons` method specifies either a directory name, or
|
||||||
|
the path to the subsidiary Rsconscript file to execute.
|
||||||
|
Any additional arguments are passed to `rscons` when it executes the subsidiary
|
||||||
|
script.
|
||||||
|
`rscons` will change working directories to the directory containing the
|
||||||
|
subsidiary script when executing it.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
configure do
|
configure do
|
||||||
rscons "subproject/Rsconscript", "configure"
|
rscons "subproject", "configure"
|
||||||
end
|
end
|
||||||
|
|
||||||
build do
|
build do
|
||||||
|
@ -8,21 +8,28 @@ module Rscons
|
|||||||
|
|
||||||
# Invoke rscons in a subprocess for a subsidiary Rsconscript file.
|
# Invoke rscons in a subprocess for a subsidiary Rsconscript file.
|
||||||
#
|
#
|
||||||
# @param script_path [String]
|
# @param path [String]
|
||||||
# Path to subsidiary Rsconscript to execute.
|
# Path to subsidiary Rsconscript to execute, or path to subsidiary
|
||||||
|
# directory to run rscons in.
|
||||||
# @param args[Array<String>]
|
# @param args[Array<String>]
|
||||||
# Arguments to pass to rscons subprocess.
|
# Arguments to pass to rscons subprocess.
|
||||||
def rscons(script_path, *args)
|
def rscons(path, *args)
|
||||||
script_path = File.expand_path(script_path)
|
|
||||||
me = File.expand_path($0)
|
me = File.expand_path($0)
|
||||||
command = [me, "-f", script_path, *args]
|
path = File.expand_path(path)
|
||||||
|
if File.directory?(path)
|
||||||
|
command = [me, *args]
|
||||||
|
dir = path
|
||||||
|
else
|
||||||
|
command = [me, "-f", path, *args]
|
||||||
|
dir = File.dirname(path)
|
||||||
|
end
|
||||||
|
print_dir = dir != "." && dir != File.expand_path(Dir.pwd)
|
||||||
if ENV["specs"] and not ENV["dist_specs"] # specs
|
if ENV["specs"] and not ENV["dist_specs"] # specs
|
||||||
command = ["ruby", $LOAD_PATH.map {|p| ["-I", p]}, command].flatten # specs
|
command = ["ruby", $LOAD_PATH.map {|p| ["-I", p]}, command].flatten # specs
|
||||||
end # specs
|
end # specs
|
||||||
dir = File.dirname(script_path)
|
puts "rscons: Entering directory '#{dir}'" if print_dir
|
||||||
puts "Entering directory '#{dir}'..."
|
|
||||||
result = system(*command, chdir: dir)
|
result = system(*command, chdir: dir)
|
||||||
puts "Leaving directory '#{dir}'..."
|
puts "rscons: Leaving directory '#{dir}'" if print_dir
|
||||||
unless result
|
unless result
|
||||||
raise RsconsError.new("Failed command: " + command.join(" "))
|
raise RsconsError.new("Failed command: " + command.join(" "))
|
||||||
end
|
end
|
||||||
|
@ -2607,28 +2607,84 @@ EOF
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "with subsidiary scripts" do
|
context "with subsidiary scripts" do
|
||||||
it "executes the subsidiary script from configure block" do
|
context "with a script specified" do
|
||||||
test_dir "subsidiary"
|
it "executes the subsidiary script from configure block" do
|
||||||
|
test_dir "subsidiary"
|
||||||
|
|
||||||
result = run_rscons(op: %W[configure])
|
result = run_rscons(op: %W[configure])
|
||||||
expect(result.stderr).to eq ""
|
expect(result.stderr).to eq ""
|
||||||
verify_lines(lines(result.stdout), [
|
verify_lines(lines(result.stdout), [
|
||||||
%r{sub Rsconscript configure},
|
%r{Entering directory '.*/sub'},
|
||||||
%r{sub Rsconscript build},
|
%r{sub Rsconscript configure},
|
||||||
%r{sub Rsconscript2 configure},
|
%r{Leaving directory '.*/sub'},
|
||||||
%r{top configure},
|
%r{Entering directory '.*/sub'},
|
||||||
])
|
%r{sub Rsconscript build},
|
||||||
|
%r{Leaving directory '.*/sub'},
|
||||||
|
%r{Entering directory '.*/sub'},
|
||||||
|
%r{sub Rsconscript2 configure},
|
||||||
|
%r{Leaving directory '.*/sub'},
|
||||||
|
%r{top configure},
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "executes the subsidiary script from build block" do
|
||||||
|
test_dir "subsidiary"
|
||||||
|
|
||||||
|
result = run_rscons(op: %W[configure])
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
result = run_rscons(op: %W[build])
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
verify_lines(lines(result.stdout), [
|
||||||
|
%r{sub Rsconscript2 build},
|
||||||
|
%r{top build},
|
||||||
|
])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "executes the subsidiary script from build block" do
|
context "with a directory specified" do
|
||||||
|
it "executes the subsidiary script from configure block" do
|
||||||
|
test_dir "subsidiary"
|
||||||
|
|
||||||
|
result = run_rscons(rsconscript: "Rsconscript_dir", op: %W[configure])
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
verify_lines(lines(result.stdout), [
|
||||||
|
%r{Entering directory '.*/sub'},
|
||||||
|
%r{sub Rsconscript configure},
|
||||||
|
%r{Leaving directory '.*/sub'},
|
||||||
|
%r{Entering directory '.*/sub'},
|
||||||
|
%r{sub Rsconscript build},
|
||||||
|
%r{Leaving directory '.*/sub'},
|
||||||
|
%r{Entering directory '.*/sub'},
|
||||||
|
%r{sub Rsconscript2 configure},
|
||||||
|
%r{Leaving directory '.*/sub'},
|
||||||
|
%r{top configure},
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "executes the subsidiary script from build block" do
|
||||||
|
test_dir "subsidiary"
|
||||||
|
|
||||||
|
result = run_rscons(rsconscript: "Rsconscript_dir", op: %W[configure])
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
result = run_rscons(rsconscript: "Rsconscript_dir", op: %W[build])
|
||||||
|
expect(result.stderr).to eq ""
|
||||||
|
verify_lines(lines(result.stdout), [
|
||||||
|
%r{sub Rsconscript2 build},
|
||||||
|
%r{top build},
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not print entering/leaving directory messages when the subsidiary script is in the same directory" do
|
||||||
test_dir "subsidiary"
|
test_dir "subsidiary"
|
||||||
|
|
||||||
result = run_rscons(op: %W[configure])
|
result = run_rscons(rsconscript: "Rsconscript_samedir", op: %W[configure])
|
||||||
expect(result.stderr).to eq ""
|
expect(result.stderr).to eq ""
|
||||||
result = run_rscons(op: %W[build])
|
result = run_rscons(rsconscript: "Rsconscript_samedir", op: %W[build])
|
||||||
expect(result.stderr).to eq ""
|
expect(result.stderr).to eq ""
|
||||||
|
expect(result.stdout).to_not match(%{(Entering|Leaving) directory})
|
||||||
verify_lines(lines(result.stdout), [
|
verify_lines(lines(result.stdout), [
|
||||||
%r{sub Rsconscript2 build},
|
%r{second build},
|
||||||
%r{top build},
|
%r{top build},
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user