Always use a build root and default it to "build"

This commit is contained in:
Josh Holtrop 2017-05-30 11:06:32 -04:00
parent 43df46018c
commit c7e4e1ad9b
5 changed files with 76 additions and 85 deletions

View File

@ -3,6 +3,6 @@ Rscons::Environment.new do |env|
[],
"CMD" => %w[ruby gen.rb ${_TARGET}],
"CMD_DESC" => "Generating")
env.build_after("program.o", "inc.c")
env.build_after("#{env.build_root}/program.o", "inc.c")
env.Program("program.exe", ["program.c", "inc.c"])
end

View File

@ -1,5 +1,4 @@
Rscons::Environment.new do |env|
env.build_root = "build"
env.add_builder(:Checker) do |target, sources, cache, env, vars|
unless cache.up_to_date?(target, :Checker, sources, env)
puts "Checker #{sources.first}" if env.echo != :off

View File

@ -14,15 +14,15 @@ module Rscons
# @return [Symbol] :command, :short, or :off
attr_accessor :echo
# @return [String, nil] The build root.
# @return [String] The build root.
attr_reader :build_root
# Set the build root.
#
# @param build_root [String] The build root.
def build_root=(build_root)
@build_root = build_root
@build_root.gsub!('\\', '/') if @build_root
raise "build_root must be non-nil" unless build_root
@build_root = build_root.gsub("\\", "/")
end
# Create an Environment object.
@ -31,7 +31,7 @@ module Rscons
# @option options [Symbol] :echo
# :command, :short, or :off (default :short)
# @option options [String] :build_root
# Build root directory (default nil)
# Build root directory (default "build")
# @option options [Boolean] :exclude_builders
# Whether to omit adding default builders (default false)
#
@ -54,7 +54,7 @@ module Rscons
end
end
@echo = options[:echo] || :short
@build_root = options[:build_root]
@build_root = options[:build_root] || "build"
if block_given?
yield self
@ -244,7 +244,7 @@ module Rscons
build_fname.sub!(%r{^#{src_dir}/}, "#{obj_dir}/")
end
end
if @build_root and not found_match
unless found_match
if Rscons.absolute_path?(build_fname)
if build_fname =~ %r{^(\w):(.*)$}
build_fname = "#{@build_root}/_#{$1}#{$2}"
@ -432,10 +432,10 @@ module Rscons
#
# @return [void]
def add_target(target, builder, sources, vars, args)
target = expand_path(target) if @build_root
target = expand_path(target)
target = expand_varref(target)
sources = sources.map do |source|
source = expand_path(source) if @build_root
source = expand_path(source)
expand_varref(source)
end.flatten
setup_info = builder.setup(

View File

@ -116,7 +116,7 @@ EOF
test_dir('simple')
result = run_test
expect(result.stderr).to eq ""
expect(File.exists?('simple.o')).to be_truthy
expect(File.exists?('build/simple.o')).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C program\n"
end
@ -125,8 +125,8 @@ EOF
result = run_test(rsconsfile: "command.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
'gcc -c -o simple.o -MMD -MF simple.mf simple.c',
"gcc -o simple.exe simple.o",
'gcc -c -o build/simple.o -MMD -MF build/simple.mf simple.c',
"gcc -o simple.exe build/simple.o",
]
end
@ -135,7 +135,7 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
'CC header.o',
'CC build/header.o',
"LD header.exe",
]
end
@ -144,7 +144,7 @@ EOF
test_dir('header')
result = run_test
expect(result.stderr).to eq ""
expect(File.exists?('header.o')).to be_truthy
expect(File.exists?('build/header.o')).to be_truthy
expect(`./header.exe`).to eq "The value is 2\n"
end
@ -164,7 +164,7 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
'CC header.o',
'CC build/header.o',
"LD header.exe",
]
expect(`./header.exe`).to eq "The value is 2\n"
@ -178,7 +178,7 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
'CC header.o',
'CC build/header.o',
"LD header.exe",
]
expect(`./header.exe`).to eq "The value is 2\n"
@ -194,13 +194,13 @@ EOF
result = run_test(rsconsfile: "command.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
'gcc -c -o simple.o -MMD -MF simple.mf simple.c',
"gcc -o simple.exe simple.o",
'gcc -c -o build/simple.o -MMD -MF build/simple.mf simple.c',
"gcc -o simple.exe build/simple.o",
]
result = run_test(rsconsfile: "link_flag_change.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"gcc -o simple.exe simple.o -Llibdir",
"gcc -o simple.exe build/simple.o -Llibdir",
]
end
@ -300,7 +300,7 @@ EOF
test_dir('custom_builder')
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq ["CC program.o", "LD program.exe"]
expect(lines(result.stdout)).to eq ["CC build/program.o", "LD program.exe"]
expect(File.exists?('inc.h')).to be_truthy
expect(`./program.exe`).to eq "The value is 5678\n"
end
@ -311,7 +311,7 @@ EOF
expect(result.stderr).to eq ""
slines = lines(result.stdout)
expect(slines[0]).to eq("CHGen inc.c")
expect(Set[*slines[1..2]]).to eq(Set["CC program.o", "CC inc.o"])
expect(Set[*slines[1..2]]).to eq(Set["CC build/program.o", "CC build/inc.o"])
expect(slines[3]).to eq("LD program.exe")
expect(File.exists?("inc.c")).to be_truthy
expect(File.exists?("inc.h")).to be_truthy
@ -355,7 +355,7 @@ EOF
test_dir('simple_cc')
result = run_test
expect(result.stderr).to eq ""
expect(File.exists?('simple.o')).to be_truthy
expect(File.exists?('build/simple.o')).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C++ program\n"
end
@ -365,8 +365,8 @@ EOF
expect(result.stderr).to eq ""
expect(Set[*lines(result.stdout)]).to eq Set[
'gcc -c -o one.o -MMD -MF one.mf -DONE one.c',
'gcc -c -o two.o -MMD -MF two.mf two.c',
"gcc -o two_sources.exe one.o two.o",
'gcc -c -o build/two.o -MMD -MF build/two.mf two.c',
"gcc -o two_sources.exe one.o build/two.o",
]
expect(File.exists?("two_sources.exe")).to be_truthy
expect(`./two_sources.exe`).to eq "This is a C program with two sources.\n"
@ -377,11 +377,11 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(Set[*lines(result.stdout)]).to eq Set[
'gcc -c -o one.o -MMD -MF one.mf -Dmake_lib one.c',
'gcc -c -o two.o -MMD -MF two.mf -Dmake_lib two.c',
'ar rcs lib.a one.o two.o',
'gcc -c -o three.o -MMD -MF three.mf three.c',
"gcc -o library.exe lib.a three.o",
'gcc -c -o build/one.o -MMD -MF build/one.mf -Dmake_lib one.c',
'gcc -c -o build/two.o -MMD -MF build/two.mf -Dmake_lib two.c',
'ar rcs lib.a build/one.o build/two.o',
'gcc -c -o build/three.o -MMD -MF build/three.mf three.c',
"gcc -o library.exe lib.a build/three.o",
]
expect(File.exists?("library.exe")).to be_truthy
expect(`ar t lib.a`).to eq "one.o\ntwo.o\n"
@ -405,8 +405,8 @@ EOF
File.open("program.ld", "w") {|fh| fh.puts("1")}
result = run_test(rsconsfile: "user_dependencies.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq ["CC simple.o", "LD simple.exe"]
expect(File.exists?('simple.o')).to be_truthy
expect(lines(result.stdout)).to eq ["CC build/simple.o", "LD simple.exe"]
expect(File.exists?('build/simple.o')).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C program\n"
File.open("program.ld", "w") {|fh| fh.puts("2")}
@ -430,8 +430,8 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"gdc -c -o main.o main.d",
"gdc -o hello-d.exe main.o",
"gdc -c -o build/main.o main.d",
"gdc -o hello-d.exe build/main.o",
]
expect(`./hello-d.exe`.rstrip).to eq "Hello from D!"
end
@ -476,7 +476,7 @@ EOF
test_dir('custom_builder')
result = run_test(rsconsfile: "cvar_expansion.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq ["CC program.o", "LD program.exe"]
expect(lines(result.stdout)).to eq ["CC build/program.o", "LD program.exe"]
expect(File.exists?('inc.h')).to be_truthy
expect(`./program.exe`).to eq "The value is 678\n"
end
@ -492,8 +492,8 @@ EOF
test_dir("simple")
result = run_test(rsconsfile: "register_target_in_build_hook.rb")
expect(result.stderr).to eq ""
expect(File.exists?("simple.o")).to be_truthy
expect(File.exists?("simple.o.txt")).to be_truthy
expect(File.exists?("build/simple.o")).to be_truthy
expect(File.exists?("build/simple.o.txt")).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C program\n"
end
@ -502,8 +502,8 @@ EOF
File.open("other.cccc", "w") {|fh| fh.puts}
result = run_test(rsconsfile: "cxxsuffix.rb")
expect(result.stderr).to eq ""
expect(File.exists?("simple.o")).to be_truthy
expect(File.exists?("other.o")).to be_truthy
expect(File.exists?("build/simple.o")).to be_truthy
expect(File.exists?("build/other.o")).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C++ program\n"
end
@ -512,8 +512,8 @@ EOF
FileUtils.mv("src/one/one.c", "src/one/one.yargh")
result = run_test(rsconsfile: "csuffix.rb")
expect(result.stderr).to eq ""
expect(File.exists?("src/one/one.o")).to be_truthy
expect(File.exists?("src/two/two.o")).to be_truthy
expect(File.exists?("build/src/one/one.o")).to be_truthy
expect(File.exists?("build/src/two/two.o")).to be_truthy
expect(`./build_dir.exe`).to eq "Hello from two()\n"
end
@ -542,8 +542,8 @@ EOF
expect(Set[*lines(result.stdout)]).to eq Set[
"CC one.ssss",
"CC two.sss",
"AS one.o",
"AS two.o",
"AS build/one.o",
"AS build/two.o",
"LD two_sources.exe",
]
expect(File.exists?("two_sources.exe")).to be_truthy
@ -585,7 +585,7 @@ EOF
test_dir("simple")
result = run_test(rsconsfile: "cvar_array.rb")
expect(result.stderr).to eq ""
expect(File.exists?("simple.o")).to be_truthy
expect(File.exists?("build/simple.o")).to be_truthy
expect(`./simple.exe`).to eq "This is a simple C program\n"
end
@ -637,7 +637,7 @@ EOF
result = run_test(rsconsfile: "progsuffix.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.out",
]
end
@ -647,7 +647,7 @@ EOF
result = run_test(rsconsfile: "progsuffix2.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.out",
]
end
@ -657,7 +657,7 @@ EOF
result = run_test(rsconsfile: "progsuffix3.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.xyz",
]
end
@ -688,7 +688,7 @@ EOF
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC two.o",
"CC build/two.o",
"MyProgram simple.exe",
]
end
@ -867,24 +867,18 @@ EOF
end
context "phony targets" do
[false, true].each do |with_build_root|
context "with#{with_build_root ? "" : "out"} build root" do
it "allows specifying a Symbol as a target name and reruns the builder if the sources or command have changed" do
test_dir("simple")
FileUtils.cp("phony_target.rb", "phony_target2.rb")
unless with_build_root
file_sub("phony_target2.rb") {|line| line.sub(/.*build_root.*/, "")}
end
result = run_test(rsconsfile: "phony_target2.rb")
result = run_test(rsconsfile: "phony_target.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq([
"CC #{with_build_root ? "build/" : ""}simple.o",
"CC build/simple.o",
"LD simple.exe",
"Checker simple.exe",
])
result = run_test(rsconsfile: "phony_target2.rb")
result = run_test(rsconsfile: "phony_target.rb")
expect(result.stderr).to eq ""
expect(result.stdout).to eq ""
@ -900,8 +894,6 @@ EOF
])
end
end
end
end
context "Environment#clear_targets" do
it "clears registered targets" do
@ -971,7 +963,7 @@ EOF
result = run_test
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.exe",
]
@ -1044,7 +1036,7 @@ EOF
result = run_test(rsconsfile: "cache_user_dep.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.exe",
]
@ -1064,7 +1056,7 @@ EOF
result = run_test(rsconsfile: "cache_user_dep.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to eq [
"CC simple.o",
"CC build/simple.o",
"LD simple.exe",
]
@ -1112,7 +1104,7 @@ EOF
test_dir("library")
result = run_test(rsconsfile: "override_arcmd.rb")
expect(result.stderr).to eq ""
expect(lines(result.stdout)).to include "ar rcf lib.a one.o three.o two.o"
expect(lines(result.stdout)).to include "ar rcf lib.a build/one.o build/three.o build/two.o"
end
end

View File

@ -85,9 +85,9 @@ module Rscons
context "with no build directories" do
it "returns the name of the source file with suffix changed" do
env = Environment.new
expect(env.get_build_fname("src/dir/file.c", ".o")).to eq "src/dir/file.o"
expect(env.get_build_fname("src\\dir\\other.d", ".a")).to eq "src/dir/other.a"
expect(env.get_build_fname("source.cc", ".o")).to eq "source.o"
expect(env.get_build_fname("src/dir/file.c", ".o")).to eq "build/src/dir/file.o"
expect(env.get_build_fname("src\\dir\\other.d", ".a")).to eq "build/src/dir/other.a"
expect(env.get_build_fname("source.cc", ".o")).to eq "build/source.o"
end
context "with a build_root" do
@ -112,7 +112,7 @@ module Rscons
expect(env.get_build_fname("src/input.cc", ".o")).to eq "bld/input.o"
expect(env.get_build_fname("libs/lib1/some/file.c", ".o")).to eq "build/libs/lib1/some/file.o"
expect(env.get_build_fname("libs/otherlib/otherlib.cc", ".o")).to eq "build/libs/otherlib/otherlib.o"
expect(env.get_build_fname("other_directory/o.d", ".a")).to eq "other_directory/o.a"
expect(env.get_build_fname("other_directory/o.d", ".a")).to eq "build/other_directory/o.a"
end
context "with a build_root" do