Add a clang subcommand. (#4322)

This makes something like `bazel run :toolchain -- clang -- -c test.cpp`
work, because that can be run in-process. Note that `bazel run
:toolchain -- clang -- test.cpp` still requires subprocessing, and does
not work.

Note, the vision here is that we are trying to align how clang and
carbon compile c++ code. This is work towards intertwining command
execution.

---------

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
Jon Ross-Perkins
2024-09-23 23:21:20 +00:00
committed by GitHub
co-authored by Chandler Carruth
parent c7057eff89
commit c107aaad13
7 changed files with 172 additions and 13 deletions
+42
View File
@@ -152,5 +152,47 @@ TEST(ClangRunnerTest, LinkCommandEcho) {
EXPECT_THAT(out, StrEq(""));
}
TEST(ClangRunnerTest, NoArgs) {
const auto install_paths =
InstallPaths::MakeForBazelRunfiles(Testing::GetExePath());
std::string verbose_out;
llvm::raw_string_ostream verbose_os(verbose_out);
std::string target = llvm::sys::getDefaultTargetTriple();
ClangRunner runner(&install_paths, target, &verbose_os);
std::string out;
std::string err;
EXPECT_FALSE(RunWithCapturedOutput(out, err, [&] { return runner.Run({}); }))
<< "Verbose output from runner:\n"
<< verbose_out << "\n";
EXPECT_THAT(out, StrEq(""));
EXPECT_THAT(err, HasSubstr("error: no input files"));
}
TEST(ClangRunnerTest, DashC) {
std::filesystem::path test_file =
WriteTestFile("test.cpp", "int test() { return 0; }");
const auto install_paths =
InstallPaths::MakeForBazelRunfiles(Testing::GetExePath());
std::string verbose_out;
llvm::raw_string_ostream verbose_os(verbose_out);
std::string target = llvm::sys::getDefaultTargetTriple();
ClangRunner runner(&install_paths, target, &verbose_os);
std::string out;
std::string err;
EXPECT_TRUE(
RunWithCapturedOutput(out, err,
[&] {
return runner.Run({"-c", test_file.string()});
}))
<< "Verbose output from runner:\n"
<< verbose_out << "\n";
// No output should be produced.
EXPECT_THAT(out, StrEq(""));
EXPECT_THAT(err, StrEq(""));
}
} // namespace
} // namespace Carbon