diff --git a/build_tests/build_dir/Rsconsfile b/build_tests/build_dir/Rsconsfile new file mode 100644 index 0000000..03459b3 --- /dev/null +++ b/build_tests/build_dir/Rsconsfile @@ -0,0 +1,5 @@ +Rscons::Environment.new do |env| + env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') + env.Program('build_dir.exe', Dir['src/**/*.c']) +end diff --git a/build_tests/build_dir/build_dirs_and_root.rb b/build_tests/build_dir/build_dirs_and_root.rb new file mode 100644 index 0000000..e70df71 --- /dev/null +++ b/build_tests/build_dir/build_dirs_and_root.rb @@ -0,0 +1,6 @@ +env = Rscons::Environment.new do |env| + env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.build_dir("src", "build") + env.build_root = "build_root" + env.Program('build_dir.exe', Dir['src/**/*.c']) +end diff --git a/build_tests/build_dir/build_hooks.rb b/build_tests/build_dir/build_hooks.rb new file mode 100644 index 0000000..3646b2c --- /dev/null +++ b/build_tests/build_dir/build_hooks.rb @@ -0,0 +1,12 @@ +Rscons::Environment.new(echo: :command) do |env| + env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') + env.add_build_hook do |build_op| + if build_op[:target] =~ %r{build_one/.*\.o} + build_op[:vars]["CFLAGS"] << "-O1" + elsif build_op[:target] =~ %r{build_two/.*\.o} + build_op[:vars]["CFLAGS"] << "-O2" + end + end + env.Program('build_hook.exe', Dir['src/**/*.c'].sort) +end diff --git a/build_tests/build_dir/carat.rb b/build_tests/build_dir/carat.rb new file mode 100644 index 0000000..8f74526 --- /dev/null +++ b/build_tests/build_dir/carat.rb @@ -0,0 +1,8 @@ +Rscons::Environment.new(echo: :command) do |env| + env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.build_root = "build_root" + FileUtils.mkdir_p(env.build_root) + FileUtils.mv("src/one/one.c", "build_root") + env.Object("^/one.o", "^/one.c") + env.Program("build_dir.exe", Dir['src/**/*.c'] + ["^/one.o"]) +end diff --git a/build_tests/build_dir/copy.rb b/build_tests/build_dir/copy.rb new file mode 100644 index 0000000..fce7294 --- /dev/null +++ b/build_tests/build_dir/copy.rb @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Copy("inst.exe", "copy.rb") +end diff --git a/build_tests/build_dir/csuffix.rb b/build_tests/build_dir/csuffix.rb new file mode 100644 index 0000000..9b25719 --- /dev/null +++ b/build_tests/build_dir/csuffix.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new do |env| + env["CSUFFIX"] = %w[.yargh .c] + env["CFLAGS"] += %w[-x c] + env["CPPPATH"] += Dir["src/**/"] + env.Program("build_dir.exe", Dir["src/**/*.{c,yargh}"]) +end diff --git a/build_tests/build_dir/install.rb b/build_tests/build_dir/install.rb new file mode 100644 index 0000000..1e39ca8 --- /dev/null +++ b/build_tests/build_dir/install.rb @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Install("inst.exe", "install.rb") +end diff --git a/build_tests/build_dir/install_directory.rb b/build_tests/build_dir/install_directory.rb new file mode 100644 index 0000000..2381af7 --- /dev/null +++ b/build_tests/build_dir/install_directory.rb @@ -0,0 +1,9 @@ +Rscons::Environment.new do |env| + env.Directory("inst") + env.Install("inst", "install_directory.rb") + + env.Install("noexist/src", "src") + + env.Directory("exist/src") + env.Install("exist/src", "src") +end diff --git a/build_tests/build_dir/multiple_targets_same_name.rb b/build_tests/build_dir/multiple_targets_same_name.rb new file mode 100644 index 0000000..e74bbc9 --- /dev/null +++ b/build_tests/build_dir/multiple_targets_same_name.rb @@ -0,0 +1,5 @@ +Rscons::Environment.new do |env| + env["CPPPATH"] << "src/two" + env.Object("one.o", "src/one/one.c") + env.Object("one.o", "src/two/two.c") +end diff --git a/build_tests/build_dir/no_match_build_dir.rb b/build_tests/build_dir/no_match_build_dir.rb new file mode 100644 index 0000000..42c6e48 --- /dev/null +++ b/build_tests/build_dir/no_match_build_dir.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new do |env| + env.append('CPPPATH' => Dir['src/**/*/'].sort) + env.build_dir("src2", "build") + env.build_root = "build_root" + env.Program('build_dir.exe', Dir['src/**/*.c']) +end diff --git a/build_tests/build_dir/post_build_hook_expansion.rb b/build_tests/build_dir/post_build_hook_expansion.rb new file mode 100644 index 0000000..26b7a33 --- /dev/null +++ b/build_tests/build_dir/post_build_hook_expansion.rb @@ -0,0 +1,10 @@ +Rscons::Environment.new do |env| + env["CPPPATH"] << "src/two" + env.Object("one.o", "src/one/one.c") + env.add_post_build_hook do |build_op| + if build_op[:target] == "one.o" + env["MODULE"] = "two" + env.Object("${MODULE}.o", "src/${MODULE}/${MODULE}.c") + end + end +end diff --git a/build_tests/build_dir/slashes.rb b/build_tests/build_dir/slashes.rb new file mode 100644 index 0000000..4b619ff --- /dev/null +++ b/build_tests/build_dir/slashes.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new do |env| + env.append("CPPPATH" => Dir["src/**/*/"].sort) + env.build_dir("src/one/", "build_one/") + env.build_dir("src/two", "build_two") + env.Program("build_dir.exe", Dir["src/**/*.c"]) +end diff --git a/build_tests/clone_env/Rsconsfile b/build_tests/clone_env/Rsconsfile new file mode 100644 index 0000000..5f919b3 --- /dev/null +++ b/build_tests/clone_env/Rsconsfile @@ -0,0 +1,12 @@ +debug = Rscons::Environment.new(echo: :command) do |env| + env.build_dir('src', 'debug') + env['CFLAGS'] = '-O2' + env['CPPFLAGS'] = '-DSTRING="Debug Version"' + env.Program('program-debug.exe', Dir['src/*.c']) +end + +release = debug.clone do |env| + env["CPPFLAGS"] = '-DSTRING="Release Version"' + env.build_dir('src', 'release') + env.Program('program-release.exe', Dir['src/*.c']) +end diff --git a/build_tests/clone_env/clone_all.rb b/build_tests/clone_env/clone_all.rb new file mode 100644 index 0000000..eaeb542 --- /dev/null +++ b/build_tests/clone_env/clone_all.rb @@ -0,0 +1,15 @@ +env1 = Rscons::Environment.new(echo: :command) do |env| + env.build_dir('src', 'build') + env['CFLAGS'] = '-O2' + env.add_build_hook do |build_op| + build_op[:vars]['CPPFLAGS'] = '-DSTRING="Hello"' + end + env.add_post_build_hook do |build_op| + $stdout.puts "post #{build_op[:target]}" + end + env.Program('program.exe', Dir['src/*.c']) +end + +env2 = env1.clone(clone: :all) do |env| + env.Program('program2.exe', Dir['src/*.c']) +end diff --git a/build_tests/custom_builder/Rsconsfile b/build_tests/custom_builder/Rsconsfile new file mode 100644 index 0000000..fb32ba1 --- /dev/null +++ b/build_tests/custom_builder/Rsconsfile @@ -0,0 +1,16 @@ +class MySource < Rscons::Builder + def run(target, sources, cache, env, vars) + File.open(target, 'w') do |fh| + fh.puts < ['-Dmake_lib']) +end diff --git a/build_tests/preprocess/Rsconsfile b/build_tests/preprocess/Rsconsfile new file mode 100644 index 0000000..5a5e9e4 --- /dev/null +++ b/build_tests/preprocess/Rsconsfile @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Preprocess("pp", "foo.h") +end diff --git a/build_tests/simple/Rsconsfile b/build_tests/simple/Rsconsfile new file mode 100644 index 0000000..9775f9a --- /dev/null +++ b/build_tests/simple/Rsconsfile @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Program('simple', Dir['*.c']) +end diff --git a/build_tests/simple/build_root_builder_no_sources.rb b/build_tests/simple/build_root_builder_no_sources.rb new file mode 100644 index 0000000..86a74f2 --- /dev/null +++ b/build_tests/simple/build_root_builder_no_sources.rb @@ -0,0 +1,10 @@ +class TestBuilder < Rscons::Builder + def run(target, sources, cache, env, vars) + target + end +end +Rscons::Environment.new do |env| + env.build_root = "build" + env.add_builder(TestBuilder.new) + env.TestBuilder("file") +end diff --git a/build_tests/simple/cache_successful_builds_when_one_fails.rb b/build_tests/simple/cache_successful_builds_when_one_fails.rb new file mode 100644 index 0000000..d68520c --- /dev/null +++ b/build_tests/simple/cache_successful_builds_when_one_fails.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env.Object("simple.o", "simple.c") + env.Object("two.o", "two.c") +end diff --git a/build_tests/simple/clear_targets.rb b/build_tests/simple/clear_targets.rb new file mode 100644 index 0000000..c42ad92 --- /dev/null +++ b/build_tests/simple/clear_targets.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env.Program("simple.exe", "simple.c") + env.clear_targets +end diff --git a/build_tests/simple/command.rb b/build_tests/simple/command.rb new file mode 100644 index 0000000..7e80141 --- /dev/null +++ b/build_tests/simple/command.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new(echo: :command) do |env| + env["LD"] = "gcc" + env.Program('simple.exe', Dir['*.c']) +end diff --git a/build_tests/simple/cvar_array.rb b/build_tests/simple/cvar_array.rb new file mode 100644 index 0000000..f5de90e --- /dev/null +++ b/build_tests/simple/cvar_array.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env["sources"] = Dir["*.c"].sort + env.Program("simple.exe", "${sources}") +end diff --git a/build_tests/simple/directory.rb b/build_tests/simple/directory.rb new file mode 100644 index 0000000..9031c36 --- /dev/null +++ b/build_tests/simple/directory.rb @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Directory("teh_dir") +end diff --git a/build_tests/simple/disassemble.rb b/build_tests/simple/disassemble.rb new file mode 100644 index 0000000..113e163 --- /dev/null +++ b/build_tests/simple/disassemble.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env.Object("simple.o", "simple.c") + env.Disassemble("simple.txt", "simple.o") +end diff --git a/build_tests/simple/dump.rb b/build_tests/simple/dump.rb new file mode 100644 index 0000000..df80212 --- /dev/null +++ b/build_tests/simple/dump.rb @@ -0,0 +1,5 @@ +env = Rscons::Environment.new do |env| + env["CFLAGS"] += %w[-O2 -fomit-frame-pointer] + env[:foo] = :bar +end +env.dump diff --git a/build_tests/simple/link_flag_change.rb b/build_tests/simple/link_flag_change.rb new file mode 100644 index 0000000..585f941 --- /dev/null +++ b/build_tests/simple/link_flag_change.rb @@ -0,0 +1,5 @@ +Rscons::Environment.new(echo: :command) do |env| + env["LD"] = "gcc" + env["LIBPATH"] += ["libdir"] + env.Program('simple.exe', Dir['*.c']) +end diff --git a/build_tests/simple/phony_target.rb b/build_tests/simple/phony_target.rb new file mode 100644 index 0000000..af83d86 --- /dev/null +++ b/build_tests/simple/phony_target.rb @@ -0,0 +1,12 @@ +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 + cache.register_build(target, :Checker, sources, env) + end + target + end + env.Program("simple.exe", "simple.c") + env.Checker(:checker, "simple.exe") +end diff --git a/build_tests/simple/preprocess.rb b/build_tests/simple/preprocess.rb new file mode 100644 index 0000000..793206d --- /dev/null +++ b/build_tests/simple/preprocess.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env.Preprocess("simplepp.c", "simple.c") + env.Program("simple.exe", "simplepp.c") +end diff --git a/build_tests/simple/register_target_in_build_hook.rb b/build_tests/simple/register_target_in_build_hook.rb new file mode 100644 index 0000000..73d44db --- /dev/null +++ b/build_tests/simple/register_target_in_build_hook.rb @@ -0,0 +1,8 @@ +Rscons::Environment.new do |env| + env.Program("simple.exe", Dir["*.c"]) + env.add_build_hook do |build_op| + if build_op[:target].end_with?(".o") + env.Disassemble("#{build_op[:target]}.txt", build_op[:target]) + end + end +end diff --git a/build_tests/simple/user_dependencies.rb b/build_tests/simple/user_dependencies.rb new file mode 100644 index 0000000..910a694 --- /dev/null +++ b/build_tests/simple/user_dependencies.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + program = env.Program("simple.exe", Dir["*.c"]) + env.depends(program, "program.ld") +end diff --git a/build_tests/simple_cc/Rsconsfile b/build_tests/simple_cc/Rsconsfile new file mode 100644 index 0000000..b3239ab --- /dev/null +++ b/build_tests/simple_cc/Rsconsfile @@ -0,0 +1,3 @@ +Rscons::Environment.new do |env| + env.Program('simple.exe', Dir['*.cc']) +end diff --git a/build_tests/simple_cc/cxxsuffix.rb b/build_tests/simple_cc/cxxsuffix.rb new file mode 100644 index 0000000..eff56f6 --- /dev/null +++ b/build_tests/simple_cc/cxxsuffix.rb @@ -0,0 +1,5 @@ +Rscons::Environment.new do |env| + env["CXXSUFFIX"] = %w[.cccc .cc] + env["CXXFLAGS"] += %w[-x c++] + env.Program("simple.exe", Dir["*.cc"] + Dir["*.cccc"]) +end diff --git a/build_tests/simple_cc/preprocess.rb b/build_tests/simple_cc/preprocess.rb new file mode 100644 index 0000000..bef6a82 --- /dev/null +++ b/build_tests/simple_cc/preprocess.rb @@ -0,0 +1,4 @@ +Rscons::Environment.new do |env| + env.Preprocess("simplepp.cc", "simple.cc") + env.Program("simple.exe", "simplepp.cc") +end diff --git a/build_tests/two_sources/Rsconsfile b/build_tests/two_sources/Rsconsfile new file mode 100644 index 0000000..b30faa1 --- /dev/null +++ b/build_tests/two_sources/Rsconsfile @@ -0,0 +1,4 @@ +Rscons::Environment.new(echo: :command) do |env| + env.Object("one.o", "one.c", 'CPPFLAGS' => ['-DONE']) + env.Program('two_sources.exe', ['one.o', 'two.c']) +end diff --git a/build_tests/two_sources/assuffix.rb b/build_tests/two_sources/assuffix.rb new file mode 100644 index 0000000..a1f5597 --- /dev/null +++ b/build_tests/two_sources/assuffix.rb @@ -0,0 +1,7 @@ +Rscons::Environment.new do |env| + env["ASSUFFIX"] = %w[.ssss .sss] + env["CFLAGS"] += %w[-S] + env.Object("one.ssss", "one.c", "CPPFLAGS" => ["-DONE"]) + env.Object("two.sss", "two.c") + env.Program("two_sources.exe", %w[one.ssss two.sss], "ASFLAGS" => env["ASFLAGS"] + %w[-x assembler]) +end diff --git a/build_tests/two_sources/libsuffix.rb b/build_tests/two_sources/libsuffix.rb new file mode 100644 index 0000000..58e0a9f --- /dev/null +++ b/build_tests/two_sources/libsuffix.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new() do |env| + env["LIBSUFFIX"] = %w[.aaaa .aaa] + env.Library("one.aaaa", "one.c", "CPPFLAGS" => ["-DONE"]) + env.Library("two.aaa", "two.c") + env.Program("two_sources.exe", %w[one.aaaa two.aaa]) +end diff --git a/build_tests/two_sources/objsuffix.rb b/build_tests/two_sources/objsuffix.rb new file mode 100644 index 0000000..6be2f16 --- /dev/null +++ b/build_tests/two_sources/objsuffix.rb @@ -0,0 +1,6 @@ +Rscons::Environment.new do |env| + env["OBJSUFFIX"] = %w[.oooo .ooo] + env.Object("one.oooo", "one.c", "CPPFLAGS" => ["-DONE"]) + env.Object("two.ooo", "two.c") + env.Program("two_sources.exe", %w[one.oooo two.ooo]) +end diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 44a3a5f..3d150e1 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -1,18 +1,9 @@ require 'fileutils' - -class Dir - class << self - alias_method :orig_bracket, :[] - end - def self.[](*args) - orig_bracket(*args).sort - end -end +require "open3" +require "set" describe Rscons do - BUILD_TEST_RUN_DIR = "build_test_run" - def rm_rf(dir) FileUtils.rm_rf(dir) if File.exists?(dir) @@ -33,28 +24,23 @@ describe Rscons do end before(:all) do - rm_rf(BUILD_TEST_RUN_DIR) + @statics = {} + @build_test_run_dir = "build_test_run" + @run_results = Struct.new(:stdout, :stderr, :status) @owd = Dir.pwd - end - - before(:each) do - @saved_stdout = $stdout - $stdout = StringIO.new - @saved_stderr = $stderr - $stderr = StringIO.new + rm_rf(@build_test_run_dir) end after(:each) do - $stdout = @saved_stdout - $stderr = @saved_stderr Dir.chdir(@owd) - rm_rf(BUILD_TEST_RUN_DIR) + rm_rf(@build_test_run_dir) end def test_dir(build_test_directory) - FileUtils.cp_r("build_tests/#{build_test_directory}", BUILD_TEST_RUN_DIR) - Dir.chdir(BUILD_TEST_RUN_DIR) - @saved_stderr.reopen(".stderr") + Dir.chdir(@owd) + rm_rf(@build_test_run_dir) + FileUtils.cp_r("build_tests/#{build_test_directory}", @build_test_run_dir) + Dir.chdir(@build_test_run_dir) end def file_sub(fname) @@ -68,11 +54,42 @@ describe Rscons do end end - def lines - rv = ($stdout.string + $stderr.string).lines.map(&:rstrip) - $stdout.string = "" - $stderr.string = "" - rv + def run_test(options = {}) + rsconsfile = options[:rsconsfile] || "Rsconsfile" + rscons_args = options[:rscons_args] || [] + command = %w[rscons -f _build_test.rb] + rscons_args + @statics[:build_test_id] ||= 0 + @statics[:build_test_id] += 1 + command_name = "b#{@statics[:build_test_id]}" + rsconsfile_contents = File.read(rsconsfile) + File.open("_build_test.rb", "w") do |fh| + fh.puts < Dir['src/**/*/']) - env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') - env.Program('build_dir', Dir['src/**/*.c']) - end - expect(`./build_dir`).to eq "Hello from two()\n" + result = run_test + expect(result.stderr).to eq "" + expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(File.exists?('build_one/one.o')).to be_truthy expect(File.exists?('build_two/two.o')).to be_truthy end it "supports trailing slashes at the end of build_dir sources and destinations" do test_dir("build_dir") - Rscons::Environment.new do |env| - env.append("CPPPATH" => Dir["src/**/*/"]) - env.build_dir("src/one/", "build_one/") - env.build_dir("src/two", "build_two") - env.Program("build_dir", Dir["src/**/*.c"]) - end - expect(`./build_dir`).to eq "Hello from two()\n" + result = run_test(rsconsfile: "slashes.rb") + expect(result.stderr).to eq "" + expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(File.exists?("build_one/one.o")).to be_truthy expect(File.exists?("build_two/two.o")).to be_truthy end it 'uses build directories before build root' do test_dir('build_dir') - env = Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_dir("src", "build") - env.build_root = "build_root" - env.Program('build_dir', Dir['src/**/*.c']) - end - expect(lines).to eq ["CC build/one/one.o", "CC build/two/two.o", "LD build_dir#{env["PROGSUFFIX"]}"] + result = run_test(rsconsfile: "build_dirs_and_root.rb") + expect(result.stderr).to eq "" + expect(Set[*lines(result.stdout)]).to eq Set[ + "CC build/one/one.o", + "CC build/two/two.o", + "LD build_dir.exe", + ] end it 'uses build_root if no build directories match' do test_dir('build_dir') - Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_dir("src2", "build") - env.build_root = "build_root" - env.Program('build_dir.exe', Dir['src/**/*.c']) - end - expect(lines).to eq ["CC build_root/src/one/one.o", "CC build_root/src/two/two.o", "LD build_dir.exe"] + result = run_test(rsconsfile: "no_match_build_dir.rb") + expect(result.stderr).to eq "" + expect(Set[*lines(result.stdout)]).to eq Set[ + "CC build_root/src/one/one.o", + "CC build_root/src/two/two.o", + "LD build_dir.exe", + ] end it "expands target and source paths starting with ^/ to be relative to the build root" do test_dir('build_dir') - env = Rscons::Environment.new(echo: :command) do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_root = "build_root" - FileUtils.mkdir_p(env.build_root) - FileUtils.mv("src/one/one.c", "build_root") - env.Object("^/one.o", "^/one.c") - env.Program('build_dir', Dir['src/**/*.c'] + ["^/one.o"]) - end - expect(lines).to eq [ + result = run_test(rsconsfile: "carat.rb") + expect(result.stderr).to eq "" + expect(Set[*lines(result.stdout)]).to eq Set[ %q{gcc -c -o build_root/one.o -MMD -MF build_root/one.mf -Isrc/one/ -Isrc/two/ build_root/one.c}, %q{gcc -c -o build_root/src/two/two.o -MMD -MF build_root/src/two/two.mf -Isrc/one/ -Isrc/two/ src/two/two.c}, - %Q{gcc -o build_dir#{env["PROGSUFFIX"]} build_root/src/two/two.o build_root/one.o}, + %Q{gcc -o build_dir.exe build_root/src/two/two.o build_root/one.o}, ] end it 'supports simple builders' do test_dir('json_to_yaml') - Rscons::Environment.new do |env| - require 'json' - require 'yaml' - env.add_builder(:JsonToYaml) do |target, sources, cache, env, vars| - unless cache.up_to_date?(target, :JsonToYaml, sources, env) - cache.mkdir_p(File.dirname(target)) - File.open(target, 'w') do |f| - f.write(YAML.dump(JSON.load(IO.read(sources.first)))) - end - cache.register_build(target, :JsonToYaml, sources, env) - end - target - end - env.JsonToYaml('foo.yml','foo.json') - end + result = run_test + expect(result.stderr).to eq "" expect(File.exists?('foo.yml')).to be_truthy expect(IO.read('foo.yml')).to eq("---\nkey: value\n") end it 'cleans built files' do test_dir('build_dir') - Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') - env.Program('build_dir', Dir['src/**/*.c']) - end - expect(`./build_dir`).to eq "Hello from two()\n" + result = run_test + expect(result.stderr).to eq "" + expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(File.exists?('build_one/one.o')).to be_truthy expect(File.exists?('build_two/two.o')).to be_truthy - Rscons.clean + result = run_test(rscons_args: %w[-c]) expect(File.exists?('build_one/one.o')).to be_falsey expect(File.exists?('build_two/two.o')).to be_falsey expect(File.exists?('build_one')).to be_falsey expect(File.exists?('build_two')).to be_falsey + expect(File.exists?('build_dir.exe')).to be_falsey expect(File.exists?('src/one/one.c')).to be_truthy end it 'does not clean created directories if other non-rscons-generated files reside there' do test_dir('build_dir') - Rscons::Environment.new do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') - env.Program('build_dir', Dir['src/**/*.c']) - end - expect(`./build_dir`).to eq "Hello from two()\n" + result = run_test + expect(result.stderr).to eq "" + expect(`./build_dir.exe`).to eq "Hello from two()\n" expect(File.exists?('build_one/one.o')).to be_truthy expect(File.exists?('build_two/two.o')).to be_truthy File.open('build_two/tmp', 'w') { |fh| fh.puts "dum" } - Rscons.clean + result = run_test(rscons_args: %w[-c]) expect(File.exists?('build_one/one.o')).to be_falsey expect(File.exists?('build_two/two.o')).to be_falsey expect(File.exists?('build_one')).to be_falsey expect(File.exists?('build_two')).to be_truthy + expect(File.exists?('build_dir.exe')).to be_falsey expect(File.exists?('src/one/one.c')).to be_truthy end it 'allows Ruby classes as custom builders to be used to construct files' do test_dir('custom_builder') - class MySource < Rscons::Builder - def run(target, sources, cache, env, vars) - File.open(target, 'w') do |fh| - fh.puts < ['-DONE']) - env.Program('two_sources', ['one.o', 'two.c']) - end - expect(lines).to eq [ + 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 -DONE one.c', 'gcc -c -o two.o -MMD -MF two.mf two.c', - "gcc -o two_sources#{env["PROGSUFFIX"]} one.o two.o", + "gcc -o two_sources.exe one.o two.o", ] - expect(File.exists?("two_sources#{env["PROGSUFFIX"]}")).to be_truthy - expect(`./two_sources`).to eq "This is a C program with two sources.\n" + expect(File.exists?("two_sources.exe")).to be_truthy + expect(`./two_sources.exe`).to eq "This is a C program with two sources.\n" end it 'builds a static library archive' do test_dir('library') - env = Rscons::Environment.new(echo: :command) do |env| - env.Program('library', ['lib.a', 'three.c']) - env.Library("lib.a", ['one.c', 'two.c'], 'CPPFLAGS' => ['-Dmake_lib']) - end - expect(lines).to eq [ + 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#{env["PROGSUFFIX"]} lib.a three.o", + "gcc -o library.exe lib.a three.o", ] - expect(File.exists?("library#{env["PROGSUFFIX"]}")).to be_truthy + expect(File.exists?("library.exe")).to be_truthy expect(`ar t lib.a`).to eq "one.o\ntwo.o\n" end it 'supports build hooks to override construction variables' do test_dir("build_dir") - env = Rscons::Environment.new(echo: :command) do |env| - env.append('CPPPATH' => Dir['src/**/*/']) - env.build_dir(%r{^src/([^/]+)/}, 'build_\\1/') - env.add_build_hook do |build_op| - if build_op[:target] =~ %r{build_one/.*\.o} - build_op[:vars]["CFLAGS"] << "-O1" - elsif build_op[:target] =~ %r{build_two/.*\.o} - build_op[:vars]["CFLAGS"] << "-O2" - end - end - env.Program('build_hook.exe', Dir['src/**/*.c']) - end - expect(`./build_hook.exe`).to eq "Hello from two()\n" - expect(lines).to match_array [ + result = run_test(rsconsfile: "build_hooks.rb") + expect(result.stderr).to eq "" + expect(Set[*lines(result.stdout)]).to eq Set[ 'gcc -c -o build_one/one.o -MMD -MF build_one/one.mf -Isrc/one/ -Isrc/two/ -O1 src/one/one.c', 'gcc -c -o build_two/two.o -MMD -MF build_two/two.mf -Isrc/one/ -Isrc/two/ -O2 src/two/two.c', 'gcc -o build_hook.exe build_one/one.o build_two/two.o', ] + expect(`./build_hook.exe`).to eq "Hello from two()\n" end it 'rebuilds when user-specified dependencies change' do test_dir('simple') - env = Rscons::Environment.new do |env| - env.Program('simple.exe', Dir['*.c']).depends("file.ld") - File.open("file.ld", "w") do |fh| - fh.puts("foo") - end - end - expect(lines).to eq ["CC simple.o", "LD simple.exe"] + + 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(`./simple.exe`).to eq "This is a simple C program\n" - e2 = Rscons::Environment.new do |env| - program = env.Program('simple.exe', Dir['*.c']) - env.depends(program, "file.ld") - File.open("file.ld", "w") do |fh| - fh.puts("bar") - end - end - expect(lines).to eq ["LD simple.exe"] - e3 = Rscons::Environment.new do |env| - env.Program('simple.exe', Dir['*.c']) - File.unlink("file.ld") - end - expect(lines).to eq ["LD simple.exe"] - Rscons::Environment.new do |env| - env.Program('simple.exe', Dir['*.c']) - end - expect(lines).to eq [] + + File.open("program.ld", "w") {|fh| fh.puts("2")} + result = run_test(rsconsfile: "user_dependencies.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq(["LD simple.exe"]) + + File.unlink("program.ld") + result = run_test(rsconsfile: "user_dependencies.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq ["LD simple.exe"] + + result = run_test(rsconsfile: "user_dependencies.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" end unless ENV["omit_gdc_tests"] it "supports building D sources" do test_dir("d") - Rscons::Environment.new(echo: :command) do |env| - env.Program("hello-d.exe", Dir["*.d"]) - end - expect(lines).to eq [ + 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", ] @@ -534,246 +423,157 @@ EOF it "supports disassembling object files" do test_dir("simple") - Rscons::Environment.new do |env| - env.Object("simple.o", "simple.c") - env.Disassemble("simple.txt", "simple.o") - end + result = run_test(rsconsfile: "disassemble.rb") + expect(result.stderr).to eq "" expect(File.exists?("simple.txt")).to be_truthy expect(File.read("simple.txt")).to match /Disassembly of section .text:/ end it "supports preprocessing C sources" do test_dir("simple") - Rscons::Environment.new do |env| - env.Preprocess("simplepp.c", "simple.c") - env.Program("simple", "simplepp.c") - end + result = run_test(rsconsfile: "preprocess.rb") + expect(result.stderr).to eq "" expect(File.read("simplepp.c")).to match /# \d+ "simple.c"/ - expect(`./simple`).to eq "This is a simple C program\n" + expect(`./simple.exe`).to eq "This is a simple C program\n" end it "supports preprocessing C++ sources" do test_dir("simple_cc") - Rscons::Environment.new do |env| - env.Preprocess("simplepp.cc", "simple.cc") - env.Program("simple", "simplepp.cc") - end + result = run_test(rsconsfile: "preprocess.rb") + expect(result.stderr).to eq "" expect(File.read("simplepp.cc")).to match /# \d+ "simple.cc"/ - expect(`./simple`).to eq "This is a simple C++ program\n" + expect(`./simple.exe`).to eq "This is a simple C++ program\n" end it "supports invoking builders with no sources and a build_root defined" do - class TestBuilder < Rscons::Builder - def run(target, sources, cache, env, vars) - target - end - end test_dir("simple") - Rscons::Environment.new do |env| - env.build_root = "build" - env.add_builder(TestBuilder.new) - env.TestBuilder("file") - end + result = run_test(rsconsfile: "build_root_builder_no_sources.rb") + expect(result.stderr).to eq "" end it "expands construction variables in builder target and sources before invoking the builder" do test_dir('custom_builder') - class MySource < Rscons::Builder - def run(target, sources, cache, env, vars) - File.open(target, 'w') do |fh| - fh.puts < ["-DONE"]) - env.Object("two.ooo", "two.c") - env.Program("two_sources", %w[one.oooo two.ooo]) - end - expect(File.exists?("two_sources#{env["PROGSUFFIX"]}")).to be_truthy - expect(`./two_sources`).to eq "This is a C program with two sources.\n" + result = run_test(rsconsfile: "objsuffix.rb") + expect(result.stderr).to eq "" + expect(File.exists?("two_sources.exe")).to be_truthy + expect(File.exists?("one.oooo")).to be_truthy + expect(File.exists?("two.ooo")).to be_truthy + expect(`./two_sources.exe`).to eq "This is a C program with two sources.\n" end it "supports multiple values for LIBSUFFIX" do test_dir("two_sources") - env = Rscons::Environment.new() do |env| - env["LIBSUFFIX"] = %w[.aaaa .aaa] - env.Library("one.aaaa", "one.c", "CPPFLAGS" => ["-DONE"]) - env.Library("two.aaa", "two.c") - env.Program("two_sources", %w[one.aaaa two.aaa]) - end - expect(File.exists?("two_sources#{env["PROGSUFFIX"]}")).to be_truthy - expect(`./two_sources`).to eq "This is a C program with two sources.\n" + result = run_test(rsconsfile: "libsuffix.rb") + expect(result.stderr).to eq "" + expect(File.exists?("two_sources.exe")).to be_truthy + expect(`./two_sources.exe`).to eq "This is a C program with two sources.\n" end it "supports multiple values for ASSUFFIX" do test_dir("two_sources") - env = Rscons::Environment.new() do |env| - env["ASSUFFIX"] = %w[.ssss .sss] - env["CFLAGS"] += %w[-S] - env.Object("one.ssss", "one.c", "CPPFLAGS" => ["-DONE"]) - env.Object("two.sss", "two.c") - env.Program("two_sources", %w[one.ssss two.sss], "ASFLAGS" => env["ASFLAGS"] + %w[-x assembler]) - end - expect(lines).to eq([ + result = run_test(rsconsfile: "assuffix.rb") + expect(result.stderr).to eq "" + expect(Set[*lines(result.stdout)]).to eq Set[ "CC one.ssss", "CC two.sss", "AS one.o", "AS two.o", - "LD two_sources#{env["PROGSUFFIX"]}", - ]) - expect(File.exists?("two_sources#{env["PROGSUFFIX"]}")).to be_truthy - expect(`./two_sources`).to eq "This is a C program with two sources.\n" + "LD two_sources.exe", + ] + expect(File.exists?("two_sources.exe")).to be_truthy + expect(`./two_sources.exe`).to eq "This is a C program with two sources.\n" end it "supports dumping an Environment's construction variables" do test_dir("simple") - env = Rscons::Environment.new do |env| - env["CFLAGS"] += %w[-O2 -fomit-frame-pointer] - env[:foo] = :bar - end - env.dump - result = lines - expect(result.include?(%{:foo => :bar})).to be_truthy - expect(result.include?(%{CFLAGS => ["-O2", "-fomit-frame-pointer"]})).to be_truthy - expect(result.include?(%{CPPPATH => []})).to be_truthy + result = run_test(rsconsfile: "dump.rb") + expect(result.stderr).to eq "" + slines = lines(result.stdout) + expect(slines.include?(%{:foo => :bar})).to be_truthy + expect(slines.include?(%{CFLAGS => ["-O2", "-fomit-frame-pointer"]})).to be_truthy + expect(slines.include?(%{CPPPATH => []})).to be_truthy end it "considers deep dependencies when deciding whether to rerun Preprocess builder" do test_dir("preprocess") - env = Rscons::Environment.new do |env| - env.Preprocess("pp", "foo.h") - end + + result = run_test + expect(result.stderr).to eq "" + expect(result.stdout).to eq("Preprocess pp\n") expect(File.read("pp")).to match(%r{xyz42abc}m) - expect(lines).to eq(["Preprocess pp"]) - env.Preprocess("pp", "foo.h") - env.process - expect(lines).to eq([]) + + result = run_test + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" + File.open("bar.h", "w") do |fh| fh.puts "#define BAR abc88xyz" end - $ttt = true - env.Preprocess("pp", "foo.h") - env.process - expect(lines).to eq(["Preprocess pp"]) + result = run_test + expect(result.stderr).to eq "" + expect(result.stdout).to eq("Preprocess pp\n") expect(File.read("pp")).to match(%r{abc88xyz}m) end it "allows construction variable references which expand to arrays in sources of a build target" do test_dir("simple") - Rscons::Environment.new do |env| - env["sources"] = Dir["*.c"] - env.Program("simple", "${sources}") - end + result = run_test(rsconsfile: "cvar_array.rb") + expect(result.stderr).to eq "" expect(File.exists?("simple.o")).to be_truthy - expect(`./simple`).to eq "This is a simple C program\n" + expect(`./simple.exe`).to eq "This is a simple C program\n" end it "supports registering multiple build targets with the same target path" do test_dir("build_dir") - Rscons::Environment.new do |env| - env["CPPPATH"] << "src/two" - env.Object("one.o", "src/one/one.c") - env.Object("one.o", "src/two/two.c") - end + result = run_test(rsconsfile: "multiple_targets_same_name.rb") + expect(result.stderr).to eq "" expect(File.exists?("one.o")).to be_truthy - expect(lines).to eq([ + expect(lines(result.stdout)).to eq([ "CC one.o", "CC one.o", ]) @@ -781,19 +581,11 @@ EOF it "expands target and source paths when builders are registered in build hooks" do test_dir("build_dir") - Rscons::Environment.new do |env| - env["CPPPATH"] << "src/two" - env.Object("one.o", "src/one/one.c") - env.add_post_build_hook do |build_op| - if build_op[:target] == "one.o" - env["MODULE"] = "two" - env.Object("${MODULE}.o", "src/${MODULE}/${MODULE}.c") - end - end - end + result = run_test(rsconsfile: "post_build_hook_expansion.rb") + expect(result.stderr).to eq "" expect(File.exists?("one.o")).to be_truthy expect(File.exists?("two.o")).to be_truthy - expect(lines).to eq([ + expect(lines(result.stdout)).to eq([ "CC one.o", "CC two.o", ]) @@ -804,208 +596,168 @@ EOF File.open("two.c", "w") do |fh| fh.puts("FOO") end - expect do - Rscons::Environment.new do |env| - env.Program("simple.exe", %w[simple.c two.c]) - end - end.to raise_error /Failed to build two\.o/ - result = lines - expect(Set[*result]).to eq Set[ - "CC simple.o", - "CC two.o", - ] + result = run_test(rsconsfile: "cache_successful_builds_when_one_fails.rb", + rscons_args: %w[-j1]) + expect(result.stderr).to match /FOO/ expect(File.exists?("simple.o")).to be_truthy expect(File.exists?("two.o")).to be_falsey - expect(File.exists?("simple.exe")).to be_falsey - - Rscons::Cache.reset! File.open("two.c", "w") {|fh|} - Rscons::Environment.new do |env| - env.Program("simple.exe", %w[simple.c two.c]) - end - expect(lines).to eq [ + result = run_test(rsconsfile: "cache_successful_builds_when_one_fails.rb", + rscons_args: %w[-j1]) + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq [ "CC two.o", - "LD simple.exe", ] end context "Directory builder" do it "creates the requested directory" do test_dir("simple") - Rscons::Environment.new do |env| - env.Directory("teh_dir") - end + result = run_test(rsconsfile: "directory.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq(["Directory teh_dir"]) expect(File.directory?("teh_dir")).to be_truthy - expect(lines).to eq(["Directory teh_dir"]) end it "succeeds when the requested directory already exists" do test_dir("simple") FileUtils.mkdir("teh_dir") - Rscons::Environment.new do |env| - env.Directory("teh_dir") - end + result = run_test(rsconsfile: "directory.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" expect(File.directory?("teh_dir")).to be_truthy - expect(lines).to eq([]) end it "fails when the target path is a file" do test_dir("simple") FileUtils.touch("teh_dir") - expect do - Rscons::Environment.new do |env| - env.Directory("teh_dir") - end - end.to raise_error /Failed to build teh_dir/ - expect(lines).to eq([ - "Error: `teh_dir' already exists and is not a directory", - ]) + result = run_test(rsconsfile: "directory.rb") + expect(result.stderr).to match %r{Error: `teh_dir' already exists and is not a directory} end end context "Install buildler" do - let(:base_env) do - test_dir("build_dir") - Rscons::Environment.new do |env| - env["CPPPATH"] = Dir["src/**/"] - env["sources"] = Dir["src/**/*.c"] - env.Program("simple.exe", "${sources}") - end - end - it "copies a file to the target file name" do - env = base_env.clone do |env| - lines - env.Install("inst.exe", "simple.exe") - end - expect(lines).to eq(["Install inst.exe"]) - env.Install("inst.exe", "simple.exe") - env.process - expect(lines).to eq([]) + test_dir("build_dir") + + result = run_test(rsconsfile: "install.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq ["Install inst.exe"] + + result = run_test(rsconsfile: "install.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" + expect(File.exists?("inst.exe")).to be_truthy - expect(File.read("inst.exe", mode: "rb")).to eq(File.read("simple.exe", mode: "rb")) + expect(File.read("inst.exe", mode: "rb")).to eq(File.read("install.rb", mode: "rb")) + FileUtils.rm("inst.exe") - env.Install("inst.exe", "simple.exe") - env.process - expect(lines).to eq(["Install inst.exe"]) + result = run_test(rsconsfile: "install.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq ["Install inst.exe"] end it "operates the same as a Copy builder" do - env = base_env.clone do |env| - lines - env.Copy("inst.exe", "simple.exe") - end - expect(lines).to eq(["Copy inst.exe"]) - env.Copy("inst.exe", "simple.exe") - env.process - expect(lines).to eq([]) + test_dir("build_dir") + + result = run_test(rsconsfile: "copy.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq ["Copy inst.exe"] + + result = run_test(rsconsfile: "copy.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" + expect(File.exists?("inst.exe")).to be_truthy - expect(File.read("inst.exe", mode: "rb")).to eq(File.read("simple.exe", mode: "rb")) + expect(File.read("inst.exe", mode: "rb")).to eq(File.read("copy.rb", mode: "rb")) + FileUtils.rm("inst.exe") - env.Copy("inst.exe", "simple.exe") - env.process - expect(lines).to eq(["Copy inst.exe"]) + result = run_test(rsconsfile: "copy.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to eq ["Copy inst.exe"] end it "copies a file to the target directory name" do - env = base_env.clone do |env| - lines - env.Directory("inst") - env.Install("inst", "simple.exe") - end - expect(lines).to eq([ - "Directory inst", - "Install inst", - ]) - env.Install("inst", "simple.exe") - env.process - expect(lines).to eq([]) - expect(File.exists?("inst/simple.exe")).to be_truthy - expect(File.read("inst/simple.exe", mode: "rb")).to eq(File.read("simple.exe", mode: "rb")) + test_dir "build_dir" + + result = run_test(rsconsfile: "install_directory.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to include("Install inst") + expect(File.exists?("inst/install_directory.rb")).to be_truthy + expect(File.read("inst/install_directory.rb", mode: "rb")).to eq(File.read("install_directory.rb", mode: "rb")) + + result = run_test(rsconsfile: "install_directory.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" end it "copies a directory to the non-existent target directory name" do - env = base_env.clone do |env| - lines - env.Install("dist/src", "src") - end - expect(lines).to eq(["Install dist/src"]) - env.Install("dist/src", "src") - env.process - expect(lines).to eq([]) + test_dir "build_dir" + result = run_test(rsconsfile: "install_directory.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to include("Install noexist/src") %w[src/one/one.c src/two/two.c src/two/two.h].each do |f| - expect(File.exists?("dist/#{f}")).to be_truthy - expect(File.read("dist/#{f}", mode: "rb")).to eq(File.read(f, mode: "rb")) + expect(File.exists?("noexist/#{f}")).to be_truthy + expect(File.read("noexist/#{f}", mode: "rb")).to eq(File.read(f, mode: "rb")) end end it "copies a directory to the existent target directory name" do - env = base_env.clone do |env| - lines - env.Directory("dist/src") - env.Install("dist/src", "src") - end - expect(lines).to eq([ - "Directory dist/src", - "Install dist/src", - ]) - env.Install("dist/src", "src") - env.process - expect(lines).to eq([]) + test_dir "build_dir" + result = run_test(rsconsfile: "install_directory.rb") + expect(result.stderr).to eq "" + expect(lines(result.stdout)).to include("Install exist/src") %w[src/one/one.c src/two/two.c src/two/two.h].each do |f| - expect(File.exists?("dist/#{f}")).to be_truthy - expect(File.read("dist/#{f}", mode: "rb")).to eq(File.read(f, mode: "rb")) + expect(File.exists?("exist/#{f}")).to be_truthy + expect(File.read("exist/#{f}", mode: "rb")).to eq(File.read(f, mode: "rb")) end - FileUtils.rm("dist/src/two/two.c") - env.Install("dist/src", "src") - env.process - expect(lines).to eq(["Install dist/src"]) end end context "phony targets" do [false, true].each do |with_build_root| - it "allows specifying a Symbol as a target name and reruns the builder if the sources or command have changed" do - test_dir("simple") - env = Rscons::Environment.new do |env| - env.build_root = "bld" if with_build_root - 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 - cache.register_build(target, :Checker, sources, env) - end - target + 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 - env.Program("simple.exe", "simple.c") - env.Checker(:checker, "simple.exe") - end - expect(lines).to eq(["CC #{with_build_root ? 'bld/' : ''}simple.o", "LD simple.exe", "Checker simple.exe"]) + 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", + ]) - env.clone do |env| - env.Checker(:checker, "simple.exe") - end - expect(lines).to eq([]) + result = run_test(rsconsfile: "phony_target2.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" - File.open("simple.exe", "w") do |fh| - fh.puts "Changed simple.exe" + 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 - env.clone do |env| - env.Checker(:checker, "simple.exe") - end - expect(lines).to eq(["Checker simple.exe"]) end end end context "Environment#clear_targets" do it "clears registered targets" do - test_dir('header') - env = Rscons::Environment.new do |env| - env.Program('header', Dir['*.c']) - env.clear_targets - end - expect(lines).to eq [] + test_dir("simple") + result = run_test(rsconsfile: "clear_targets.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" end end