cmMakefile: Delay CheckTargetProperties and FinalPass to generate time

This commit is contained in:
Daniel Eiband 2019-10-17 15:40:09 +02:00
parent adc50529ac
commit bf76a6b801
9 changed files with 83 additions and 54 deletions

View File

@ -12,6 +12,7 @@
#include "cmExecutionStatus.h"
#include "cmGeneratedFileStream.h"
#include "cmGlobalGenerator.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
@ -20,6 +21,8 @@
#include "cmTargetLinkLibraryType.h"
#include "cmake.h"
class cmListFileBacktrace;
static void FinalAction(cmMakefile& makefile, std::string const& filename,
bool append)
{
@ -150,9 +153,9 @@ bool cmExportLibraryDependenciesCommand(std::vector<std::string> const& args,
std::string const& filename = args[0];
bool const append = args.size() > 1 && args[1] == "APPEND";
status.GetMakefile().AddFinalAction(
[filename, append](cmMakefile& makefile) {
FinalAction(makefile, filename, append);
status.GetMakefile().AddGeneratorAction(
[filename, append](cmLocalGenerator& lg, const cmListFileBacktrace&) {
FinalAction(*lg.GetMakefile(), filename, append);
});
return true;

View File

@ -6,15 +6,20 @@
#include "cmCustomCommandLines.h"
#include "cmExecutionStatus.h"
#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmRange.h"
#include "cmSourceFile.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmake.h"
class cmTarget;
static void FinalAction(cmMakefile& makefile, std::string const& name)
static void FinalAction(cmMakefile& makefile, std::string const& name,
const cmListFileBacktrace& lfbt)
{
// people should add the srcs to the target themselves, but the old command
// didn't support that, so check and see if they added the files in and if
@ -26,7 +31,8 @@ static void FinalAction(cmMakefile& makefile, std::string const& name)
". The problem was found while processing the source directory: ",
makefile.GetCurrentSourceDirectory(),
". This FLTK_WRAP_UI call will be ignored.");
cmSystemTools::Message(msg, "Warning");
makefile.GetCMakeInstance()->IssueMessage(MessageType::AUTHOR_ERROR, msg,
lfbt);
}
}
@ -116,7 +122,9 @@ bool cmFLTKWrapUICommand(std::vector<std::string> const& args,
std::string const varName = target + "_FLTK_UI_SRCS";
mf.AddDefinition(varName, sourceListValue);
mf.AddFinalAction(
[target](cmMakefile& makefile) { FinalAction(makefile, target); });
mf.AddGeneratorAction(
[target](cmLocalGenerator& lg, const cmListFileBacktrace& lfbt) {
FinalAction(*lg.GetMakefile(), target, lfbt);
});
return true;
}

View File

@ -34,6 +34,7 @@
#include "cmGeneratorTarget.h"
#include "cmInstallGenerator.h"
#include "cmLinkLineComputer.h"
#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
#include "cmMSVC60LinkLineComputer.h"
#include "cmMakefile.h"
@ -1262,10 +1263,6 @@ void cmGlobalGenerator::Configure()
"number of local generators",
cmStateEnums::INTERNAL);
// check for link libraries and include directories containing "NOTFOUND"
// and for infinite loops
this->CheckTargetProperties();
if (this->CMakeInstance->GetWorkingMode() == cmake::NORMAL_MODE) {
std::ostringstream msg;
if (cmSystemTools::GetErrorOccuredFlag()) {
@ -1288,6 +1285,10 @@ void cmGlobalGenerator::Configure()
void cmGlobalGenerator::CreateGenerationObjects(TargetTypes targetTypes)
{
this->CreateLocalGenerators();
// Commit side effects only if we are actually generating
if (this->GetConfigureDoneCMP0026()) {
this->CheckTargetProperties();
}
this->CreateGeneratorTargets(targetTypes);
this->ComputeBuildFileGenerators();
}
@ -1464,6 +1465,8 @@ void cmGlobalGenerator::Generate()
this->ProcessEvaluationFiles();
this->CMakeInstance->UpdateProgress("Generating", 0.1f);
// Generate project files
for (unsigned int i = 0; i < this->LocalGenerators.size(); ++i) {
this->SetCurrentMakefile(this->LocalGenerators[i]->GetMakefile());
@ -1475,8 +1478,9 @@ void cmGlobalGenerator::Generate()
this->LocalGenerators[i]->GenerateTestFiles();
this->CMakeInstance->UpdateProgress(
"Generating",
(static_cast<float>(i) + 1.0f) /
static_cast<float>(this->LocalGenerators.size()));
0.1f +
0.9f * (static_cast<float>(i) + 1.0f) /
static_cast<float>(this->LocalGenerators.size()));
}
this->SetCurrentMakefile(nullptr);
@ -1714,12 +1718,12 @@ void cmGlobalGenerator::ComputeTargetObjectDirectory(
void cmGlobalGenerator::CheckTargetProperties()
{
// check for link libraries and include directories containing "NOTFOUND"
// and for infinite loops
std::map<std::string, std::string> notFoundMap;
// std::set<std::string> notFoundMap;
// after it is all done do a ConfigureFinalPass
cmState* state = this->GetCMakeInstance()->GetState();
for (unsigned int i = 0; i < this->Makefiles.size(); ++i) {
this->Makefiles[i]->ConfigureFinalPass();
this->Makefiles[i]->Generate(*this->LocalGenerators[i]);
for (auto const& target : this->Makefiles[i]->GetTargets()) {
if (target.second.GetType() == cmStateEnums::INTERFACE_LIBRARY) {
continue;
@ -1763,11 +1767,6 @@ void cmGlobalGenerator::CheckTargetProperties()
}
}
}
this->CMakeInstance->UpdateProgress(
"Configuring",
0.9f +
0.1f * (static_cast<float>(i) + 1.0f) /
static_cast<float>(this->Makefiles.size()));
}
if (!notFoundMap.empty()) {
@ -2017,10 +2016,10 @@ void cmGlobalGenerator::AddMakefile(cmMakefile* mf)
}
int numGen = atoi(numGenC->c_str());
float prog = 0.9f * static_cast<float>(this->Makefiles.size()) /
static_cast<float>(numGen);
if (prog > 0.9f) {
prog = 0.9f;
float prog =
static_cast<float>(this->Makefiles.size()) / static_cast<float>(numGen);
if (prog > 1.0f) {
prog = 1.0f;
}
this->CMakeInstance->UpdateProgress("Configuring", prog);
}

View File

@ -7,11 +7,14 @@
#include "cmGlobalGenerator.h"
#include "cmInstallFilesGenerator.h"
#include "cmInstallGenerator.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmRange.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
class cmListFileBacktrace;
static std::string FindInstallSource(cmMakefile& makefile, const char* name);
static void CreateInstallGenerator(cmMakefile& makefile,
std::string const& dest,
@ -43,9 +46,10 @@ bool cmInstallFilesCommand(std::vector<std::string> const& args,
CreateInstallGenerator(mf, dest, files);
} else {
std::vector<std::string> finalArgs(args.begin() + 1, args.end());
mf.AddFinalAction([dest, finalArgs](cmMakefile& makefile) {
FinalAction(makefile, dest, finalArgs);
});
mf.AddGeneratorAction(
[dest, finalArgs](cmLocalGenerator& lg, const cmListFileBacktrace&) {
FinalAction(*lg.GetMakefile(), dest, finalArgs);
});
}
mf.GetGlobalGenerator()->AddInstallComponent(

View File

@ -7,10 +7,13 @@
#include "cmGlobalGenerator.h"
#include "cmInstallFilesGenerator.h"
#include "cmInstallGenerator.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
class cmListFileBacktrace;
static void FinalAction(cmMakefile& makefile, std::string const& dest,
std::vector<std::string> const& args);
static std::string FindInstallSource(cmMakefile& makefile, const char* name);
@ -33,9 +36,10 @@ bool cmInstallProgramsCommand(std::vector<std::string> const& args,
std::string const& dest = args[0];
std::vector<std::string> const finalArgs(args.begin() + 1, args.end());
mf.AddFinalAction([dest, finalArgs](cmMakefile& makefile) {
FinalAction(makefile, dest, finalArgs);
});
mf.AddGeneratorAction(
[dest, finalArgs](cmLocalGenerator& lg, const cmListFileBacktrace&) {
FinalAction(*lg.GetMakefile(), dest, finalArgs);
});
return true;
}

View File

@ -14,6 +14,7 @@
#include "cmCommand.h"
#include "cmDynamicLoader.h"
#include "cmExecutionStatus.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmState.h"
#include "cmStringAlgorithms.h"
@ -25,6 +26,8 @@
# include <malloc.h> /* for malloc/free on QNX */
#endif
class cmListFileBacktrace;
namespace {
const char* LastName = nullptr;
@ -158,8 +161,10 @@ bool cmLoadedCommand::InitialPass(std::vector<std::string> const& args,
if (result) {
if (this->Impl->FinalPass) {
auto impl = this->Impl;
this->Makefile->AddFinalAction(
[impl](cmMakefile& makefile) { impl->DoFinalPass(&makefile); });
this->Makefile->AddGeneratorAction(
[impl](cmLocalGenerator& lg, const cmListFileBacktrace&) {
impl->DoFinalPass(lg.GetMakefile());
});
}
return true;
}

View File

@ -36,6 +36,7 @@
#include "cmInstallGenerator.h" // IWYU pragma: keep
#include "cmInstallSubdirectoryGenerator.h"
#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
#include "cmMessageType.h"
#include "cmRange.h"
#include "cmSourceFile.h"
@ -780,21 +781,23 @@ struct file_not_persistent
};
}
void cmMakefile::AddFinalAction(FinalAction action)
void cmMakefile::AddGeneratorAction(GeneratorAction action)
{
this->FinalActions.push_back(std::move(action));
assert(!this->GeneratorActionsInvoked);
this->GeneratorActions.emplace_back(std::move(action), this->Backtrace);
}
void cmMakefile::FinalPass()
void cmMakefile::DoGenerate(cmLocalGenerator& lg)
{
// do all the variable expansions here
this->ExpandVariablesCMP0019();
// give all the commands a chance to do something
// after the file has been parsed before generation
for (FinalAction& action : this->FinalActions) {
action(*this);
for (const BT<GeneratorAction>& action : this->GeneratorActions) {
action.Value(lg, action.Backtrace);
}
this->GeneratorActionsInvoked = true;
// go through all configured files and see which ones still exist.
// we don't want cmake to re-run if a configured file is created and deleted
@ -809,9 +812,9 @@ void cmMakefile::FinalPass()
}
// Generate the output file
void cmMakefile::ConfigureFinalPass()
void cmMakefile::Generate(cmLocalGenerator& lg)
{
this->FinalPass();
this->DoGenerate(lg);
const char* oldValue = this->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY");
if (oldValue &&
cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, oldValue, "2.4")) {

View File

@ -49,6 +49,7 @@ class cmGeneratorExpressionEvaluationFile;
class cmGlobalGenerator;
class cmImplicitDependsList;
class cmInstallGenerator;
class cmLocalGenerator;
class cmMessenger;
class cmSourceFile;
class cmState;
@ -151,23 +152,19 @@ public:
bool EnforceUniqueName(std::string const& name, std::string& msg,
bool isCustom = false) const;
using FinalAction = std::function<void(cmMakefile&)>;
using GeneratorAction =
std::function<void(cmLocalGenerator&, const cmListFileBacktrace&)>;
/**
* Register an action that is executed during FinalPass
* Register an action that is executed during Generate
*/
void AddFinalAction(FinalAction action);
void AddGeneratorAction(GeneratorAction action);
/**
* Perform FinalPass, Library dependency analysis etc before output of the
* makefile.
* Perform generate actions, Library dependency analysis etc before output of
* the makefile.
*/
void ConfigureFinalPass();
/**
* run all FinalActions.
*/
void FinalPass();
void Generate(cmLocalGenerator& lg);
/**
* Get the target for PRE_BUILD, PRE_LINK, or POST_BUILD commands.
@ -1001,7 +998,6 @@ protected:
size_t ObjectLibrariesSourceGroupIndex;
#endif
std::vector<FinalAction> FinalActions;
cmGlobalGenerator* GlobalGenerator;
bool IsFunctionBlocked(const cmListFileFunction& lff,
cmExecutionStatus& status);
@ -1011,6 +1007,8 @@ private:
cmListFileBacktrace Backtrace;
int RecursionDepth;
void DoGenerate(cmLocalGenerator& lg);
void ReadListFile(cmListFile const& listFile,
const std::string& filenametoread);
@ -1113,6 +1111,9 @@ private:
bool uses_terminal, bool command_expand_lists,
const std::string& job_pool);
std::vector<BT<GeneratorAction>> GeneratorActions;
bool GeneratorActionsInvoked = false;
/**
* See LinearGetSourceFileWithOutput for background information
*/

View File

@ -15,6 +15,8 @@
#include "cmVariableWatch.h"
#include "cmake.h"
class cmLocalGenerator;
namespace {
struct cmVariableWatchCallbackData
{
@ -91,7 +93,7 @@ public:
{
}
void operator()(cmMakefile&) const {}
void operator()(cmLocalGenerator&, const cmListFileBacktrace&) const {}
private:
struct Impl
@ -145,7 +147,7 @@ bool cmVariableWatchCommand(std::vector<std::string> const& args,
return false;
}
status.GetMakefile().AddFinalAction(
status.GetMakefile().AddGeneratorAction(
FinalAction{ &status.GetMakefile(), variable });
return true;
}