aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/tools/clang.pod7
-rw-r--r--include/clang/Driver/Options.td2
-rw-r--r--lib/Driver/Driver.cpp7
3 files changed, 16 insertions, 0 deletions
diff --git a/docs/tools/clang.pod b/docs/tools/clang.pod
index 704cc8743b..abecd1c8ef 100644
--- a/docs/tools/clang.pod
+++ b/docs/tools/clang.pod
@@ -407,6 +407,13 @@ Print timing summary of each stage of compilation.
Show commands to run and use verbose output.
+=item B<--working-directory>
+
+Use the given argument as the effective working directory to run the compiler
+in. This is useful for running the compiler as if in a specific working
+directory without the overhead of having to change directory using an auxiliary
+process.
+
=back
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 3f48b96d75..770b7d86f9 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -855,6 +855,8 @@ def _verbose : Flag<"--verbose">, Alias<v>;
def _version : Flag<"--version">;
def _warn__EQ : Joined<"--warn-=">, Alias<W_Joined>;
def _warn_ : Joined<"--warn-">, Alias<W_Joined>;
+def _working_directory : Separate<"--working-directory">,
+ HelpText<"Use the given argument as the effective working directory">;
def _write_dependencies : Flag<"--write-dependencies">, Alias<MD>;
def _write_user_dependencies : Flag<"--write-user-dependencies">, Alias<MMD>;
def _ : Joined<"--">, Flags<[Unsupported]>;
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index ec9295d6fb..d64eab5999 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -323,6 +323,13 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
if (Args->hasArg(options::OPT_nostdlib))
UseStdLib = false;
+ // Honor --working-directory. Eventually we want to handle this completely
+ // internally to support good use as a library, but for now we just change our
+ // working directory.
+ if (const Arg *A = Args->getLastArg(options::OPT__working_directory)) {
+ ::chdir(A->getValue(*Args));
+ }
+
Host = GetHostInfo(DefaultHostTriple.c_str());
// Perform the default argument translations.