diff --git a/build_tests/install_running_exe/Rsconscript b/build_tests/install_running_exe/Rsconscript new file mode 100644 index 0000000..00b2dee --- /dev/null +++ b/build_tests/install_running_exe/Rsconscript @@ -0,0 +1,6 @@ +build do + Environment.new do |env| + env.Program("program.exe", "program.c") + env.Install("install/program.exe", "program.exe") + end +end diff --git a/build_tests/install_running_exe/program.c b/build_tests/install_running_exe/program.c new file mode 100644 index 0000000..8c63093 --- /dev/null +++ b/build_tests/install_running_exe/program.c @@ -0,0 +1,8 @@ +#include +#include + +int main(int argc, char * argv[]) +{ + sleep(2); + return 0; +} diff --git a/lib/rscons/builders/copy.rb b/lib/rscons/builders/copy.rb index 6b2ad61..e0dad5a 100644 --- a/lib/rscons/builders/copy.rb +++ b/lib/rscons/builders/copy.rb @@ -57,6 +57,7 @@ module Rscons printed_message = true end @cache.mkdir_p(File.dirname(dest), install: @install_builder) + FileUtils.rm_f(dest) FileUtils.cp(src, dest, :preserve => true) end @cache.register_build(dest, :Copy, [src], @env, install: @install_builder) diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 09880f8..c859b34 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -337,6 +337,20 @@ EOF expect(result.stderr).to match /Could not find a registered build target "foo"/ end + it "allows replacing a running executable when performing an 'install' operation" do + test_dir("install_running_exe") + result = run_rscons(op: "install") + expect(result.stderr).to eq "" + fcontents = File.read("program.c", mode: "rb") + File.open("program.c", "wb") do |fh| + fh.write(fcontents.sub(/2/, '3')) + end + pid = Process.spawn("install/program.exe") + result = run_rscons(op: "install") + expect(result.stderr).to eq "" + Process.wait(pid) + end + context "clean operation" do it 'cleans built files' do test_dir("simple")