diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 748fe7981d..f692a2ab5b 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -284,20 +284,34 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); // onlyFileName() is needed for cygwin - rerun |= runMakeIndex(onlyFileName(idxfile.absFileName()), - runparams); + int const ret = + runMakeIndex(onlyFileName(idxfile.absFileName()), runparams); + if (ret) + return ret; + rerun = true; } + FileName const nlofile(changeExtension(file.absFileName(), ".nlo")); // If all nomencl entries are removed, nomencl writes an empty nlo file. // DepTable::hasChanged() returns false in this case, since it does not // distinguish empty files from non-existing files. This is why we need // the extra checks here (to trigger a rerun). Cf. discussions in #8905. // FIXME: Sort out the real problem in DepTable. - if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) - rerun |= runMakeIndexNomencl(file, ".nlo", ".nls"); + if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) { + int const ret = runMakeIndexNomencl(file, ".nlo", ".nls"); + if (ret) + return ret; + rerun = true; + } + FileName const glofile(changeExtension(file.absFileName(), ".glo")); - if (head.haschanged(glofile)) - rerun |= runMakeIndexNomencl(file, ".glo", ".gls"); + if (head.haschanged(glofile)) { + int const ret = runMakeIndexNomencl(file, ".glo", ".gls"); + if (ret) + return ret; + rerun = true; + } + // check if we're using biber instead of bibtex // biber writes no info to the aux file, so we just check @@ -315,7 +329,10 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); - rerun |= runBibTeX(bibtex_info, runparams); + int exitCode; + rerun |= runBibTeX(bibtex_info, runparams, exitCode); + if (exitCode) + return exitCode; FileName const blgfile(changeExtension(file.absFileName(), ".blg")); if (blgfile.exists()) bscanres = scanBlgFile(head, terr); @@ -368,7 +385,10 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); - rerun |= runBibTeX(bibtex_info, runparams); + int exitCode; + rerun |= runBibTeX(bibtex_info, runparams, exitCode); + if (exitCode) + return exitCode; FileName const blgfile(changeExtension(file.absFileName(), ".blg")); if (blgfile.exists()) bscanres = scanBlgFile(head, terr); @@ -388,8 +408,11 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); // onlyFileName() is needed for cygwin - rerun = runMakeIndex(onlyFileName(changeExtension( + int const ret = runMakeIndex(onlyFileName(changeExtension( file.absFileName(), ".idx")), runparams); + if (ret) + return ret; + rerun = true; } // I am not pretty sure if need this twice. @@ -455,7 +478,7 @@ int LaTeX::startscript() } -bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, +int LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, string const & params) { string tmp = runparams.use_japanese ? @@ -478,12 +501,13 @@ bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, tmp += quoteName(f); tmp += params; Systemcall one; - one.startscript(Systemcall::Wait, tmp, path, lpath); - return true; + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + return one.startscript(starttype, tmp, path, lpath, true); } -bool LaTeX::runMakeIndexNomencl(FileName const & file, +int LaTeX::runMakeIndexNomencl(FileName const & file, string const & nlo, string const & nls) { LYXERR(Debug::LATEX, "Running MakeIndex for nomencl."); @@ -494,8 +518,9 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file, tmp += " -o " + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls)); Systemcall one; - one.startscript(Systemcall::Wait, tmp, path, lpath); - return true; + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + return one.startscript(starttype, tmp, path, lpath, true); } @@ -629,9 +654,10 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, bool LaTeX::runBibTeX(vector const & bibtex_info, - OutputParams const & runparams) + OutputParams const & runparams, int & exit_code) { bool result = false; + exit_code = 0; for (vector::const_iterator it = bibtex_info.begin(); it != bibtex_info.end(); ++it) { if (!biber && it->databases.empty()) @@ -644,7 +670,12 @@ bool LaTeX::runBibTeX(vector const & bibtex_info, tmp += quoteName(onlyFileName(removeExtension( it->aux_file.absFileName()))); Systemcall one; - one.startscript(Systemcall::Wait, tmp, path, lpath); + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + exit_code = one.startscript(starttype, tmp, path, lpath, true); + if (exit_code) { + return result; + } } // Return whether bibtex was run return result; diff --git a/src/LaTeX.h b/src/LaTeX.h index aa895cf640..a57cebc83b 100644 --- a/src/LaTeX.h +++ b/src/LaTeX.h @@ -188,12 +188,12 @@ private: /// void deplog(DepTable & head); - /// - bool runMakeIndex(std::string const &, OutputParams const &, + /// returns exit code + int runMakeIndex(std::string const &, OutputParams const &, std::string const & = std::string()); - /// - bool runMakeIndexNomencl(support::FileName const &, + /// returns exit code + int runMakeIndexNomencl(support::FileName const &, std::string const &, std::string const &); /// @@ -215,7 +215,7 @@ private: /// bool runBibTeX(std::vector const &, - OutputParams const &); + OutputParams const &, int & exit_code); /// void removeAuxiliaryFiles() const;