From c7e4e1ad9b716231b967ca99ef64b99ad0d25a95 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 30 May 2017 11:06:32 -0400 Subject: [PATCH] Always use a build root and default it to "build" --- build_tests/custom_builder/build_after.rb | 2 +- build_tests/simple/phony_target.rb | 1 - lib/rscons/environment.rb | 16 +-- spec/build_tests_spec.rb | 134 ++++++++++------------ spec/rscons/environment_spec.rb | 8 +- 5 files changed, 76 insertions(+), 85 deletions(-) diff --git a/build_tests/custom_builder/build_after.rb b/build_tests/custom_builder/build_after.rb index 60259dc..e8c3e14 100644 --- a/build_tests/custom_builder/build_after.rb +++ b/build_tests/custom_builder/build_after.rb @@ -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 diff --git a/build_tests/simple/phony_target.rb b/build_tests/simple/phony_target.rb index af83d86..745fe89 100644 --- a/build_tests/simple/phony_target.rb +++ b/build_tests/simple/phony_target.rb @@ -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 diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 4f0bd74..6b4ffa3 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -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( diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index ea8869e..271de11 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -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,39 +867,31 @@ 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") + 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") - expect(result.stderr).to eq "" - expect(lines(result.stdout)).to eq([ - "CC #{with_build_root ? "build/" : ""}simple.o", - "LD simple.exe", - "Checker simple.exe", - ]) + result = run_test(rsconsfile: "phony_target.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq([ + "CC build/simple.o", + "LD simple.exe", + "Checker simple.exe", + ]) - result = run_test(rsconsfile: "phony_target2.rb") - expect(result.stderr).to eq "" - expect(result.stdout).to eq "" + result = run_test(rsconsfile: "phony_target.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" - FileUtils.cp("phony_target.rb", "phony_target2.rb") - file_sub("phony_target2.rb") {|line| line.sub(/.*Program.*/, "")} - File.open("simple.exe", "w") do |fh| - fh.puts "Changed simple.exe" - end - result = run_test(rsconsfile: "phony_target2.rb") - expect(result.stderr).to eq "" - expect(lines(result.stdout)).to eq([ - "Checker simple.exe", - ]) - end + FileUtils.cp("phony_target.rb", "phony_target2.rb") + file_sub("phony_target2.rb") {|line| line.sub(/.*Program.*/, "")} + File.open("simple.exe", "w") do |fh| + fh.puts "Changed simple.exe" end + result = run_test(rsconsfile: "phony_target2.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq([ + "Checker simple.exe", + ]) end end @@ -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 diff --git a/spec/rscons/environment_spec.rb b/spec/rscons/environment_spec.rb index 0d31220..c087ff8 100644 --- a/spec/rscons/environment_spec.rb +++ b/spec/rscons/environment_spec.rb @@ -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