diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index 085d88c..15e284b 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -76,8 +76,8 @@ Path exe_file_path; bool is_temp_target = false; - if( generate_binary ){ - if( settings.run ){ + if (generate_binary) { + if (settings.run && !isWritableDir(Path(buildsettings.targetPath))) { import std.random; auto rnd = to!string(uniform(uint.min, uint.max)); buildsettings.targetPath = (tmp~"dub/"~rnd).toNativeString(); @@ -116,7 +116,7 @@ // invoke the compiler logInfo("Running %s...", settings.platform.compilerBinary); - if (generate_binary && settings.run) cleanup_files ~= exe_file_path; + if (generate_binary && is_temp_target) cleanup_files ~= exe_file_path; settings.compiler.invoke(buildsettings, settings.platform); } else { // determine path for the temporary object file @@ -143,7 +143,7 @@ settings.compiler.invoke(buildsettings, settings.platform); logInfo("Linking..."); - if( settings.run ) cleanup_files ~= exe_file_path; + if (is_temp_target) cleanup_files ~= exe_file_path; settings.compiler.invokeLinker(lbuildsettings, settings.platform, [tempobj.toNativeString()]); } diff --git a/source/dub/generators/rdmd.d b/source/dub/generators/rdmd.d index 44f9fed..ac627ff 100644 --- a/source/dub/generators/rdmd.d +++ b/source/dub/generators/rdmd.d @@ -57,14 +57,16 @@ // build "rdmd --force %DFLAGS% -I%~dp0..\source -Jviews -Isource @deps.txt %LIBS% source\app.d" ~ application arguments // or with "/" instead of "\" Path run_exe_file; - if( generate_binary ){ - if( settings.run ){ + bool tmp_target = false; + if (generate_binary) { + if (settings.run && !isWritableDir(Path(buildsettings.targetPath))) { import std.random; auto rnd = to!string(uniform(uint.min, uint.max)) ~ "-"; buildsettings.targetPath = (getTempDir()~".rdmd/source/").toNativeString(); buildsettings.targetName = rnd ~ buildsettings.targetName; - run_exe_file = Path(buildsettings.targetPath) ~ getTargetFileName(buildsettings, settings.platform); + tmp_target = true; } + run_exe_file = Path(buildsettings.targetPath) ~ getTargetFileName(buildsettings, settings.platform); settings.compiler.setTarget(buildsettings, settings.platform); } @@ -107,9 +109,11 @@ logInfo("Running %s...", run_exe_file.toNativeString()); auto prg_pid = spawnProcess(run_exe_file.toNativeString() ~ settings.runArgs); result = prg_pid.wait(); - remove(run_exe_file.toNativeString()); - foreach( f; buildsettings.copyFiles ) - remove((run_exe_file.parentPath ~ Path(f).head).toNativeString()); + if (tmp_target) { + remove(run_exe_file.toNativeString()); + foreach( f; buildsettings.copyFiles ) + remove((run_exe_file.parentPath ~ Path(f).head).toNativeString()); + } enforce(result == 0, "Program exited with code "~to!string(result)); } else logInfo("Target is a library. Skipping execution."); } diff --git a/source/dub/internal/utils.d b/source/dub/internal/utils.d index 698a95c..47e2c59 100644 --- a/source/dub/internal/utils.d +++ b/source/dub/internal/utils.d @@ -43,6 +43,16 @@ return true; } +bool isWritableDir(Path p) +{ + import std.random; + auto fname = p ~ format("__dub_write_test_%08X", uniform(0, uint.max)); + try openFile(fname, FileMode.CreateTrunc).close(); + catch return false; + remove(fname.toNativeString()); + return true; +} + Json jsonFromFile(Path file, bool silent_fail = false) { if( silent_fail && !existsFile(file) ) return Json.EmptyObject; auto f = openFile(file.toNativeString(), FileMode.Read);