Index: cfe/trunk/include/clang/Tooling/Tooling.h =================================================================== --- cfe/trunk/include/clang/Tooling/Tooling.h +++ cfe/trunk/include/clang/Tooling/Tooling.h @@ -330,6 +330,9 @@ /// Runs an action over all files specified in the command line. /// /// \param Action Tool action. + /// + /// \returns 0 on success; 1 if any error occured; 2 if there is no error but + /// some files are skipped due to missing compile commands. int run(ToolAction *Action); /// \brief Create an AST for each file specified in the command line and Index: cfe/trunk/lib/Tooling/Tooling.cpp =================================================================== --- cfe/trunk/lib/Tooling/Tooling.cpp +++ cfe/trunk/lib/Tooling/Tooling.cpp @@ -388,6 +388,7 @@ llvm::MemoryBuffer::getMemBuffer(MappedFile.second)); bool ProcessingFailed = false; + bool FileSkipped = false; for (const auto &SourcePath : SourcePaths) { std::string File(getAbsolutePath(SourcePath)); @@ -401,12 +402,8 @@ std::vector CompileCommandsForFile = Compilations.getCompileCommands(File); if (CompileCommandsForFile.empty()) { - // FIXME: There are two use cases here: doing a fuzzy - // "find . -name '*.cc' |xargs tool" match, where as a user I don't care - // about the .cc files that were not found, and the use case where I - // specify all files I want to run over explicitly, where this should - // be an error. We'll want to add an option for this. llvm::errs() << "Skipping " << File << ". Compile command not found.\n"; + FileSkipped = true; continue; } for (CompileCommand &CompileCommand : CompileCommandsForFile) { @@ -466,7 +463,7 @@ Twine(InitialDirectory) + "\n!"); } } - return ProcessingFailed ? 1 : 0; + return ProcessingFailed ? 1 : (FileSkipped ? 2 : 0); } namespace {