diff --git a/source/dub/commandline.d b/source/dub/commandline.d
index 2651cba..7d34440 100644
--- a/source/dub/commandline.d
+++ b/source/dub/commandline.d
@@ -30,13 +30,12 @@
import std.exception;
import std.file;
import std.getopt;
-import std.path : expandTilde, absolutePath, buildNormalizedPath;
-import std.process;
+import std.path : absolutePath, buildNormalizedPath, expandTilde, setExtension;
+import std.process : environment, spawnProcess, wait;
import std.stdio;
import std.string;
import std.typecons : Tuple, tuple;
import std.variant;
-import std.path: setExtension;
/** Retrieves a list of all available commands.
@@ -759,7 +758,7 @@
Dub dub;
if (options.bare) {
- dub = new Dub(NativePath(options.root_path), NativePath(getcwd()));
+ dub = new Dub(NativePath(options.root_path), getWorkingDirectory());
dub.defaultPlacementLocation = options.placementLocation;
return dub;
@@ -2209,7 +2208,7 @@
auto source = VersionRange.fromString(free_args[1]);
if (existsFile(NativePath(free_args[2]))) {
auto target = NativePath(free_args[2]);
- if (!target.absolute) target = NativePath(getcwd()) ~ target;
+ if (!target.absolute) target = getWorkingDirectory() ~ target;
dub.packageManager.addOverride_(scope_, pack, source, target);
logInfo("Added override %s %s => %s", pack, source, target);
} else {
@@ -2368,7 +2367,7 @@
{
if (!m_testPackage.length)
return super.prepareDub(options);
- return new Dub(NativePath(options.root_path), NativePath(getcwd()));
+ return new Dub(NativePath(options.root_path), getWorkingDirectory());
}
override int execute(Dub dub, string[] free_args, string[] app_args)
@@ -2402,7 +2401,7 @@
auto path = NativePath(free_args[0]);
path.normalize();
enforceUsage(!path.empty, "Destination path must not be empty.");
- if (!path.absolute) path = NativePath(getcwd()) ~ path;
+ if (!path.absolute) path = getWorkingDirectory() ~ path;
enforceUsage(!path.startsWith(dub.rootPath), "Destination path must not be a sub directory of the tested package!");
setupPackage(dub, null);
diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d
index a8dacd0..ece4884 100644
--- a/source/dub/compilers/compiler.d
+++ b/source/dub/compilers/compiler.d
@@ -12,6 +12,7 @@
public import dub.platform : BuildPlatform, matchesSpecification;
import dub.internal.vibecompat.inet.path;
+import dub.internal.vibecompat.core.file;
import dub.internal.logging;
@@ -108,10 +109,24 @@
void setTarget(ref BuildSettings settings, in BuildPlatform platform, string targetPath = null) const;
/// Invokes the compiler using the given flags
- void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback);
+ deprecated("specify the working directory")
+ final void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback)
+ {
+ invoke(settings, platform, output_callback, getWorkingDirectory());
+ }
+
+ /// ditto
+ void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd);
/// Invokes the underlying linker directly
- void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback);
+ deprecated("specify the working directory")
+ final void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
+ {
+ invokeLinker(settings, platform, objects, output_callback, getWorkingDirectory());
+ }
+
+ /// ditto
+ void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd);
/// Convert linker flags to compiler format
string[] lflagsToDFlags(const string[] lflags) const;
@@ -124,17 +139,26 @@
This method should be used by `Compiler` implementations to invoke the
compiler or linker binary.
*/
+ deprecated("specify the working directory")
protected final void invokeTool(string[] args, void delegate(int, string) output_callback, string[string] env = null)
{
+ invokeTool(args, output_callback, getWorkingDirectory(), env);
+ }
+
+ /// ditto
+ protected final void invokeTool(string[] args, void delegate(int, string) output_callback, NativePath cwd, string[string] env = null)
+ {
import std.string;
int status;
if (output_callback) {
- auto result = executeShell(escapeShellCommand(args), env);
+ auto result = executeShell(escapeShellCommand(args),
+ env, Config.none, size_t.max, cwd.toNativeString());
output_callback(result.status, result.output);
status = result.status;
} else {
- auto compiler_pid = spawnShell(escapeShellCommand(args), env);
+ auto compiler_pid = spawnShell(escapeShellCommand(args),
+ env, Config.none, cwd.toNativeString());
status = compiler_pid.wait();
}
diff --git a/source/dub/compilers/dmd.d b/source/dub/compilers/dmd.d
index a181222..2039747 100644
--- a/source/dub/compilers/dmd.d
+++ b/source/dub/compilers/dmd.d
@@ -360,22 +360,26 @@
settings.addDFlags("-of"~tpath);
}
- void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback)
+ void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd)
{
auto res_file = getTempFile("dub-build", ".rsp");
+ // clean-up early to avoid build-up of temporaries when invoke is called
+ // many times in one DUB session. (e.g. when using DUB as a library)
+ scope (exit)
+ removeFile(res_file);
const(string)[] args = settings.dflags;
if (platform.frontendVersion >= 2066) args ~= "-vcolumns";
writeFile(res_file, escapeArgs(args).join("\n"));
- logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
+ logDiagnostic("[cwd=%s] %s %s", cwd, platform.compilerBinary, escapeArgs(args).join(" "));
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
+ invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, cwd, env);
}
- void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
+ void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd)
{
import std.string;
auto tpath = NativePath(settings.targetPath) ~ getTargetFileName(settings, platform);
@@ -396,12 +400,12 @@
auto res_file = getTempFile("dub-build", ".lnk");
writeFile(res_file, escapeArgs(args).join("\n"));
- logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
+ logDiagnostic("[cwd=%s] %s %s", cwd, platform.compilerBinary, escapeArgs(args).join(" "));
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
+ invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, cwd, env);
}
string[] lflagsToDFlags(const string[] lflags) const
diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d
index 9b42b33..d7a8e4c 100644
--- a/source/dub/compilers/gdc.d
+++ b/source/dub/compilers/gdc.d
@@ -17,7 +17,7 @@
import std.algorithm;
import std.array;
import std.exception;
-import std.process;
+import std.process : execute;
import std.typecons;
@@ -205,7 +205,7 @@
settings.addDFlags("-o", tpath);
}
- void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback)
+ void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd)
{
auto res_file = getTempFile("dub-build", ".rsp");
writeFile(res_file, join(settings.dflags.map!(s => escape(s)), "\n"));
@@ -215,10 +215,10 @@
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
+ invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, cwd, env);
}
- void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
+ void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd)
{
import std.string;
string[] args;
@@ -237,7 +237,7 @@
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool(args, output_callback, env);
+ invokeTool(args, output_callback, cwd, env);
}
string[] lflagsToDFlags(const string[] lflags) const
diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d
index f071d7b..6b8f545 100644
--- a/source/dub/compilers/ldc.d
+++ b/source/dub/compilers/ldc.d
@@ -245,7 +245,7 @@
settings.addDFlags("-of"~tpath);
}
- void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback)
+ void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd)
{
auto res_file = getTempFile("dub-build", ".rsp");
const(string)[] args = settings.dflags;
@@ -257,10 +257,10 @@
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
+ invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, cwd, env);
}
- void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
+ void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd)
{
import std.string;
auto tpath = NativePath(settings.targetPath) ~ getTargetFileName(settings, platform);
@@ -280,7 +280,7 @@
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
- invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
+ invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, cwd, env);
}
string[] lflagsToDFlags(const string[] lflags) const
diff --git a/source/dub/dub.d b/source/dub/dub.d
index 24fd4de..e2dad1e 100644
--- a/source/dub/dub.d
+++ b/source/dub/dub.d
@@ -158,7 +158,7 @@
SkipPackageSuppliers skip_registry = SkipPackageSuppliers.none)
{
m_rootPath = NativePath(root_path);
- if (!m_rootPath.absolute) m_rootPath = NativePath(getcwd()) ~ m_rootPath;
+ if (!m_rootPath.absolute) m_rootPath = getWorkingDirectory() ~ m_rootPath;
init();
@@ -384,7 +384,7 @@
@property void rootPath(NativePath root_path)
{
m_rootPath = root_path;
- if (!m_rootPath.absolute) m_rootPath = NativePath(getcwd()) ~ m_rootPath;
+ if (!m_rootPath.absolute) m_rootPath = getWorkingDirectory() ~ m_rootPath;
}
/// Returns the name listed in the dub.json of the current
@@ -686,6 +686,8 @@
void generateProject(string ide, GeneratorSettings settings)
{
settings.cache = this.m_dirs.cache;
+ if (settings.overrideToolWorkingDirectory is NativePath.init)
+ settings.overrideToolWorkingDirectory = m_rootPath;
// With a requested `unittest` config, switch to the special test runner
// config (which doesn't require an existing `unittest` configuration).
if (settings.config == "unittest") {
@@ -705,7 +707,9 @@
void testProject(GeneratorSettings settings, string config, NativePath custom_main_file)
{
settings.cache = this.m_dirs.cache;
- if (!custom_main_file.empty && !custom_main_file.absolute) custom_main_file = getWorkingDirectory() ~ custom_main_file;
+ if (settings.overrideToolWorkingDirectory is NativePath.init)
+ settings.overrideToolWorkingDirectory = m_rootPath;
+ if (!custom_main_file.empty && !custom_main_file.absolute) custom_main_file = m_rootPath ~ custom_main_file;
const test_config = m_project.addTestRunnerConfiguration(settings, !m_dryRun, config, custom_main_file);
if (!test_config) return; // target type "none"
@@ -761,6 +765,9 @@
import std.stdio;
import std.ascii : newline;
+ if (settings.overrideToolWorkingDirectory is NativePath.init)
+ settings.overrideToolWorkingDirectory = m_rootPath;
+
// Split comma-separated lists
string[] requestedDataSplit =
requestedData
@@ -1313,8 +1320,8 @@
if (!run) {
// TODO: ddox should copy those files itself
- version(Windows) runCommand(`xcopy /S /D "`~tool_path~`public\*" docs\`);
- else runCommand("rsync -ru '"~tool_path~"public/' docs/");
+ version(Windows) runCommand(`xcopy /S /D "`~tool_path~`public\*" docs\`, null, m_rootPath.toNativeString());
+ else runCommand("rsync -ru '"~tool_path~"public/' docs/", null, m_rootPath.toNativeString());
}
}
@@ -1369,6 +1376,7 @@
if (this.defaultPostRunEnvironments)
settings.buildSettings.addPostRunEnvironments(this.defaultPostRunEnvironments);
settings.run = true;
+ settings.overrideToolWorkingDirectory = m_rootPath;
return settings;
}
@@ -1887,7 +1895,7 @@
result.systemSettings = NativePath("/var/lib/dub/");
result.userSettings = NativePath(environment.get("HOME")) ~ ".dub/";
if (!result.userSettings.absolute)
- result.userSettings = NativePath(getcwd()) ~ result.userSettings;
+ result.userSettings = getWorkingDirectory() ~ result.userSettings;
result.userPackages = result.userSettings;
}
result.cache = result.userPackages ~ "cache";
diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d
index d0f295c..e10d87d 100644
--- a/source/dub/generators/build.d
+++ b/source/dub/generators/build.d
@@ -203,7 +203,7 @@
{
import std.path : absolutePath;
- auto cwd = NativePath(getcwd());
+ auto cwd = settings.toolWorkingDirectory;
bool generate_binary = !(buildsettings.options & BuildOption.syntaxOnly);
auto build_id = buildsettings.computeBuildID(config, settings);
@@ -233,7 +233,9 @@
if (!cached && buildsettings.postBuildCommands.length) {
logInfo("Post-build", Color.light_green, "Running commands");
runBuildCommands(CommandType.postBuild, buildsettings.postBuildCommands, pack, m_project, settings, buildsettings,
- [["DUB_BUILD_PATH" : target_path is NativePath.init ? "" : target_path.parentPath.toNativeString.absolutePath]]);
+ [["DUB_BUILD_PATH" : target_path is NativePath.init
+ ? ""
+ : target_path.parentPath.toNativeString.absolutePath(settings.toolWorkingDirectory.toNativeString)]]);
}
return cached;
@@ -242,7 +244,7 @@
private bool performCachedBuild(GeneratorSettings settings, BuildSettings buildsettings, in Package pack, string config,
string build_id, in Package[] packages, in NativePath[] additional_dep_files, out NativePath target_binary_path)
{
- auto cwd = NativePath(getcwd());
+ auto cwd = settings.toolWorkingDirectory;
NativePath target_path;
if (settings.tempBuild) {
@@ -290,7 +292,7 @@
private void performRDMDBuild(GeneratorSettings settings, ref BuildSettings buildsettings, in Package pack, string config, out NativePath target_path)
{
- auto cwd = NativePath(getcwd());
+ auto cwd = settings.toolWorkingDirectory;
//Added check for existence of [AppNameInPackagejson].d
//If exists, use that as the starting file.
NativePath mainsrc;
@@ -335,14 +337,14 @@
if (buildsettings.preBuildCommands.length){
logInfo("Pre-build", Color.light_green, "Running commands");
- runCommands(buildsettings.preBuildCommands);
+ runCommands(buildsettings.preBuildCommands, null, cwd.toNativeString());
}
logInfo("Building", Color.light_green, "%s %s [%s]", pack.name.color(Mode.bold), pack.version_, config.color(Color.blue));
logInfo("Running rdmd...");
logDiagnostic("rdmd %s", join(flags, " "));
- auto rdmd_pid = spawnProcess("rdmd" ~ flags);
+ auto rdmd_pid = spawnProcess("rdmd" ~ flags, null, Config.none, cwd.toNativeString());
auto result = rdmd_pid.wait();
enforce(result == 0, "Build command failed with exit code "~to!string(result));
@@ -355,7 +357,7 @@
private void performDirectBuild(GeneratorSettings settings, ref BuildSettings buildsettings, in Package pack, string config, out NativePath target_path)
{
- auto cwd = NativePath(getcwd());
+ auto cwd = settings.toolWorkingDirectory;
auto generate_binary = !(buildsettings.options & BuildOption.syntaxOnly);
// make file paths relative to shrink the command line
@@ -483,13 +485,19 @@
/// Output an unique name to represent the source file.
/// Calls with path that resolve to the same file on the filesystem will return the same,
/// unless they include different symbolic links (which are not resolved).
-
+ deprecated("Use the overload taking in the current working directory")
static string pathToObjName(const scope ref BuildPlatform platform, string path)
{
+ return pathToObjName(platform, path, getWorkingDirectory);
+ }
+
+ /// ditto
+ static string pathToObjName(const scope ref BuildPlatform platform, string path, NativePath cwd)
+ {
import std.digest.crc : crc32Of;
import std.path : buildNormalizedPath, dirSeparator, relativePath, stripDrive;
if (path.endsWith(".d")) path = path[0 .. $-2];
- auto ret = buildNormalizedPath(getcwd(), path).replace(dirSeparator, ".");
+ auto ret = buildNormalizedPath(cwd.toNativeString(), path).replace(dirSeparator, ".");
auto idx = ret.lastIndexOf('.');
const objSuffix = getObjSuffix(platform);
return idx < 0 ? ret ~ objSuffix : format("%s_%(%02x%)%s", ret[idx+1 .. $], crc32Of(ret[0 .. idx]), objSuffix);
@@ -505,7 +513,7 @@
bs.targetType = TargetType.object;
gs.compiler.prepareBuildSettings(bs, gs.platform, BuildSetting.commandLine);
gs.compiler.setTarget(bs, gs.platform, objPath);
- gs.compiler.invoke(bs, gs.platform, gs.compileCallback);
+ gs.compiler.invoke(bs, gs.platform, gs.compileCallback, gs.toolWorkingDirectory);
return objPath;
}
@@ -529,7 +537,7 @@
void compileSource(size_t i, string src) {
logInfo("Compiling", Color.light_green, "%s", src);
- const objPath = pathToObjName(settings.platform, src);
+ const objPath = pathToObjName(settings.platform, src, settings.toolWorkingDirectory);
objs[i] = compileUnit(src, objPath, buildsettings, settings);
}
@@ -543,7 +551,7 @@
lbuildsettings.sourceFiles = is_static_library ? [] : lbuildsettings.sourceFiles.filter!(f => isLinkerFile(settings.platform, f)).array;
settings.compiler.setTarget(lbuildsettings, settings.platform);
settings.compiler.prepareBuildSettings(lbuildsettings, settings.platform, BuildSetting.commandLineSeparate|BuildSetting.sourceFiles);
- settings.compiler.invokeLinker(lbuildsettings, settings.platform, objs, settings.linkCallback);
+ settings.compiler.invokeLinker(lbuildsettings, settings.platform, objs, settings.linkCallback, settings.toolWorkingDirectory);
// NOTE: separate compile/link is not yet enabled for GDC.
} else if (generate_binary && (settings.buildMode == BuildMode.allAtOnce || settings.compiler.name == "gdc" || is_static_library)) {
@@ -555,7 +563,7 @@
settings.compiler.prepareBuildSettings(buildsettings, settings.platform, BuildSetting.commandLine);
// invoke the compiler
- settings.compiler.invoke(buildsettings, settings.platform, settings.compileCallback);
+ settings.compiler.invoke(buildsettings, settings.platform, settings.compileCallback, settings.toolWorkingDirectory);
} else {
// determine path for the temporary object file
string tempobjname = buildsettings.targetName ~ getObjSuffix(settings.platform);
@@ -575,7 +583,7 @@
settings.compiler.prepareBuildSettings(buildsettings, settings.platform, BuildSetting.commandLine);
- settings.compiler.invoke(buildsettings, settings.platform, settings.compileCallback);
+ settings.compiler.invoke(buildsettings, settings.platform, settings.compileCallback, settings.toolWorkingDirectory);
if (generate_binary) {
if (settings.tempBuild) {
@@ -583,7 +591,7 @@
} else {
logInfo("Linking", Color.light_green, "%s", buildsettings.targetName.color(Mode.bold));
}
- settings.compiler.invokeLinker(lbuildsettings, settings.platform, [tempobj.toNativeString()], settings.linkCallback);
+ settings.compiler.invokeLinker(lbuildsettings, settings.platform, [tempobj.toNativeString()], settings.linkCallback, settings.toolWorkingDirectory);
}
}
}
@@ -591,7 +599,7 @@
private void runTarget(NativePath exe_file_path, in BuildSettings buildsettings, string[] run_args, GeneratorSettings settings)
{
if (buildsettings.targetType == TargetType.executable) {
- auto cwd = NativePath(getcwd());
+ auto cwd = settings.toolWorkingDirectory;
auto runcwd = cwd;
if (buildsettings.workingDirectory.length) {
runcwd = NativePath(buildsettings.workingDirectory);
@@ -737,10 +745,10 @@
auto prj = new Project(pman, pack);
final static class TestCompiler : GDCCompiler {
- override void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback) {
+ override void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd) {
assert(!settings.dflags[].any!(f => f.canFind("bar")));
}
- override void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback) {
+ override void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd) {
assert(false);
}
}
diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d
index 7f4fc90..7cd98ed 100644
--- a/source/dub/generators/generator.d
+++ b/source/dub/generators/generator.d
@@ -806,6 +806,7 @@
BuildSettings buildSettings;
BuildMode buildMode = BuildMode.separate;
int targetExitStatus;
+ NativePath overrideToolWorkingDirectory;
bool combined; // compile all in one go instead of each dependency separately
bool filterVersions;
@@ -820,6 +821,16 @@
void delegate(int status, string output) compileCallback;
void delegate(int status, string output) linkCallback;
void delegate(int status, string output) runCallback;
+
+ /// Returns `overrideToolWorkingDirectory` or if that's not set, just the
+ /// current working directory of the application. This may differ if dub is
+ /// called with the `--root` parameter or when using DUB as a library.
+ NativePath toolWorkingDirectory() const
+ {
+ return overrideToolWorkingDirectory is NativePath.init
+ ? getWorkingDirectory()
+ : overrideToolWorkingDirectory;
+ }
}
@@ -1167,10 +1178,10 @@
auto prj = new Project(pman, pack);
final static class TestCompiler : GDCCompiler {
- override void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback) {
+ override void invoke(in BuildSettings settings, in BuildPlatform platform, void delegate(int, string) output_callback, NativePath cwd) {
assert(false);
}
- override void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback) {
+ override void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback, NativePath cwd) {
assert(false);
}
}
diff --git a/source/dub/generators/sublimetext.d b/source/dub/generators/sublimetext.d
index d46fbd9..f1d3689 100644
--- a/source/dub/generators/sublimetext.d
+++ b/source/dub/generators/sublimetext.d
@@ -34,7 +34,7 @@
auto root = Json([
"folders": targets.byValue.map!(f => targetFolderJson(f)).array.Json,
- "build_systems": buildSystems(settings.platform),
+ "build_systems": buildSystems(settings.platform, settings.toolWorkingDirectory.toNativeString()),
"settings": [ "include_paths": buildSettings.importPaths.map!Json.array.Json ].Json,
]);
@@ -61,7 +61,7 @@
}
-private Json buildSystems(BuildPlatform buildPlatform, string workingDiretory = getcwd())
+private Json buildSystems(BuildPlatform buildPlatform, string workingDiretory)
{
static immutable BUILD_TYPES = [
//"plain",
@@ -123,5 +123,5 @@
auto buildPlatform = BuildPlatform();
buildPlatform.architecture ~= "x86_64";
- auto result = buildPlatform.buildSystems.toString;
+ auto result = buildPlatform.buildSystems(getcwd()).toString;
}
diff --git a/source/dub/generators/visuald.d b/source/dub/generators/visuald.d
index 9b86ef9..a5feb5f 100644
--- a/source/dub/generators/visuald.d
+++ b/source/dub/generators/visuald.d
@@ -183,7 +183,7 @@
auto sp = NativePath(s);
assert(sp.absolute, format("Source path in %s expected to be absolute: %s", packname, s));
//if( !sp.absolute ) sp = pack.path ~ sp;
- addSourceFile(sp.relativeTo(getWorkingDirectory() ~ basepath), determineStructurePath(sp, targets[packname]), action);
+ addSourceFile(sp.relativeTo(settings.toolWorkingDirectory ~ basepath), determineStructurePath(sp, targets[packname]), action);
}
foreach (p; targets[packname].packages)
@@ -245,6 +245,7 @@
void generateProjectConfiguration(Appender!(char[]) ret, string pack, string type, GeneratorSettings settings, in TargetInfo[string] targets)
{
+ auto cwd = settings.toolWorkingDirectory;
auto buildsettings = targets[pack].buildSettings.dup;
auto basepath = NativePath(".dub/");
@@ -255,7 +256,7 @@
auto ret = new string[settings.length];
foreach (i; 0 .. settings.length) {
// \" is interpreted as an escaped " by cmd.exe, so we need to avoid that
- auto p = NativePath(settings[i]).relativeTo(getWorkingDirectory() ~ basepath);
+ auto p = NativePath(settings[i]).relativeTo(cwd ~ basepath);
p.endsWithSlash = false;
ret[i] = '"' ~ p.toNativeString() ~ '"';
}
@@ -328,7 +329,7 @@
// compute directory for intermediate files (need dummy/ because of how -op determines the resulting path)
size_t ndummy = 0;
foreach (f; buildsettings.sourceFiles) {
- auto rpath = NativePath(f).relativeTo(getWorkingDirectory() ~ basepath);
+ auto rpath = NativePath(f).relativeTo(cwd ~ basepath);
size_t nd = 0;
foreach (s; rpath.bySegment)
if (s == "..")
@@ -423,7 +424,7 @@
auto wdir = NativePath(buildsettings.workingDirectory);
if (!wdir.absolute) wdir = m_project.rootPackage.path ~ wdir;
ret.formattedWrite(" %s\n",
- wdir.relativeTo(getWorkingDirectory() ~ basepath).toNativeString());
+ wdir.relativeTo(cwd ~ basepath).toNativeString());
ret.put(" \n");
ret.put(" \n");
ret.put(" *.obj;*.cmd;*.build;*.dep\n");
diff --git a/source/dub/init.d b/source/dub/init.d
index 80ca046..8c08fdd 100644
--- a/source/dub/init.d
+++ b/source/dub/init.d
@@ -16,7 +16,7 @@
import std.exception;
import std.file;
import std.format;
-import std.process;
+import std.process : environment;
import std.string;
diff --git a/source/dub/internal/utils.d b/source/dub/internal/utils.d
index fe3b4e7..5b68728 100644
--- a/source/dub/internal/utils.d
+++ b/source/dub/internal/utils.d
@@ -145,12 +145,24 @@
moveFile(tmppath, path);
}
-void runCommand(string command, string[string] env = null, string workDir = null)
+deprecated("specify a working directory explicitly")
+void runCommand(string command, string[string] env = null)
+{
+ runCommands((&command)[0 .. 1], env, null);
+}
+
+void runCommand(string command, string[string] env, string workDir)
{
runCommands((&command)[0 .. 1], env, workDir);
}
-void runCommands(in string[] commands, string[string] env = null, string workDir = null)
+deprecated("specify a working directory explicitly")
+void runCommands(in string[] commands, string[string] env = null)
+{
+ runCommands(commands, env, null);
+}
+
+void runCommands(in string[] commands, string[string] env, string workDir)
{
import std.stdio : stdin, stdout, stderr, File;
diff --git a/source/dub/package_.d b/source/dub/package_.d
index 010ee79..1c5b14f 100644
--- a/source/dub/package_.d
+++ b/source/dub/package_.d
@@ -418,7 +418,7 @@
*/
void addBuildTypeSettings(ref BuildSettings settings, in BuildPlatform platform, string build_type)
const {
- import std.process;
+ import std.process : environment;
string dflags = environment.get("DFLAGS", "");
settings.addDFlags(dflags.split());
diff --git a/source/dub/project.d b/source/dub/project.d
index 84027d7..07e79e3 100644
--- a/source/dub/project.d
+++ b/source/dub/project.d
@@ -1405,10 +1405,21 @@
}
if (i == res.length) //no globbing found in the path
return [res];
- import std.path : globMatch;
import std.file : dirEntries, SpanMode;
- return dirEntries(res[0 .. sepIdx], SpanMode.depth)
- .map!(de => de.name)
+ import std.path : buildNormalizedPath, globMatch, isAbsolute, relativePath;
+ auto cwd = gsettings.toolWorkingDirectory.toNativeString;
+ auto path = res[0 .. sepIdx];
+ bool prependCwd = false;
+ if (!isAbsolute(path))
+ {
+ prependCwd = true;
+ path = buildNormalizedPath(cwd, path);
+ }
+
+ return dirEntries(path, SpanMode.depth)
+ .map!(de => prependCwd
+ ? de.name.relativePath(cwd)
+ : de.name)
.filter!(name => globMatch(name, res))
.array;
}