From 7c8becc3f9d9f3cc22a321d8ecf79b09d3d81ba5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 22 Oct 2021 16:03:10 -0400 Subject: [PATCH] env.depends() does not work with build-root-relative "^/" paths - close #121 --- build_tests/simple/user_dependencies_carat.rb | 18 ++++++++++++++ lib/rscons/environment.rb | 4 ++-- spec/build_tests_spec.rb | 24 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 build_tests/simple/user_dependencies_carat.rb diff --git a/build_tests/simple/user_dependencies_carat.rb b/build_tests/simple/user_dependencies_carat.rb new file mode 100644 index 0000000..0e08f2d --- /dev/null +++ b/build_tests/simple/user_dependencies_carat.rb @@ -0,0 +1,18 @@ +class FileBuilder < Builder + def self.name + "File" + end + def run(options) + FileUtils.mkdir_p(File.dirname(@target)) + File.binwrite(@target, ENV["file_contents"]) + true + end +end +build do + Environment.new do |env| + env.add_builder(FileBuilder) + env.File("^/file.txt") + program = env.Program("^/simple.exe", Dir["*.c"]) + env.depends("^/simple.exe", "^/file.txt") + end +end diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index f0bef01..143ca64 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -346,12 +346,12 @@ module Rscons if target.is_a?(Builder) target = target.target end - target = expand_varref(target.to_s) + target = expand_path(expand_varref(target.to_s)) user_deps = user_deps.map do |ud| if ud.is_a?(Builder) ud = ud.target end - expand_varref(ud) + expand_path(expand_varref(ud)) end @user_deps[target] ||= [] @user_deps[target] = (@user_deps[target] + user_deps).uniq diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 7877575..8669577 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -55,6 +55,8 @@ describe Rscons do end end + let(:passenv) {{}} + def test_dir(build_test_directory) Dir.chdir(@owd) rm_rf(@build_test_run_dir) @@ -147,6 +149,7 @@ EOF stdout, stderr, status = nil, nil, nil Bundler.with_unbundled_env do env = ENV.to_h + env.merge!(passenv) path = ["#{@build_test_run_dir}/_bin", "#{env["PATH"]}"] if options[:path] path = Array(options[:path]) + path @@ -601,6 +604,27 @@ EOF expect(result.stdout).to eq "" end + it "rebuilds when user-specified dependencies using ^ change" do + test_dir("simple") + + passenv["file_contents"] = "1" + result = run_rscons(rsconscript: "user_dependencies_carat.rb") + expect(result.stderr).to eq "" + verify_lines(lines(result.stdout), [ + %r{Compiling simple.c}, + %r{Linking .*simple.exe}, + ]) + + passenv["file_contents"] = "2" + result = run_rscons(rsconscript: "user_dependencies_carat.rb") + expect(result.stderr).to eq "" + verify_lines(lines(result.stdout), [%r{Linking .*simple.exe}]) + + result = run_rscons(rsconscript: "user_dependencies_carat.rb") + expect(result.stderr).to eq "" + expect(result.stdout).to eq "" + end + unless RUBY_PLATFORM =~ /mingw|msys/ it "supports building D sources with gdc" do test_dir("d")