VS: Add CMakeLists.txt re-run rules at start of generation

Since commit 328c0f65 (Simplify cmVisualStudio10TargetGenerator source
classification, 2012-03-19) the VS 10 generator uses the
cmGeneratorTarget source classification instead of directly getting the
list of source files from the target.  This accidentally dropped the
CMakeLists.txt files from generated projects because they are added too
late for cmGeneratorTarget.

All generator-specific source files must be added to targets prior to
cmGeneratorTarget construction.  Refactor addition of the CMakeLists.txt
files with CMake re-run custom commands to take place before normal
generation begins, and therefore early enough to be included in the
cmGeneratorTarget classification.
This commit is contained in:
Brad King 2012-03-28 13:49:01 -04:00
parent 9a2c60eb83
commit 01e979acef
7 changed files with 53 additions and 48 deletions

View File

@ -95,6 +95,16 @@ void cmGlobalVisualStudioGenerator::Generate()
// of Visual Studio.
this->ConfigureCMakeVisualStudioMacros();
// Add CMakeLists.txt with custom command to rerun CMake.
for(std::vector<cmLocalGenerator*>::const_iterator
lgi = this->LocalGenerators.begin();
lgi != this->LocalGenerators.end(); ++lgi)
{
cmLocalVisualStudioGenerator* lg =
static_cast<cmLocalVisualStudioGenerator*>(*lgi);
lg->AddCMakeListsRules();
}
// Run all the local generators.
this->cmGlobalGenerator::Generate();
}

View File

@ -74,24 +74,6 @@ void cmLocalVisualStudio10Generator::Generate()
{
cmTargets &tgts = this->Makefile->GetTargets();
// Create the regeneration custom rule.
if(!this->Makefile->IsOn("CMAKE_SUPPRESS_REGENERATION"))
{
// Create a rule to regenerate the build system when the target
// specification source changes.
if(cmSourceFile* sf = this->CreateVCProjBuildRule())
{
// Add the rule to targets that need it.
for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
{
if(l->first != CMAKE_CHECK_BUILD_SYSTEM_TARGET)
{
l->second.AddSourceFile(sf);
}
}
}
}
for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
{
if(static_cast<cmGlobalVisualStudioGenerator*>(this->GlobalGenerator)

View File

@ -85,6 +85,23 @@ void cmLocalVisualStudio6Generator::AddHelperCommands()
this->CreateCustomTargetsAndCommands(lang);
}
void cmLocalVisualStudio6Generator::AddCMakeListsRules()
{
cmTargets &tgts = this->Makefile->GetTargets();
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
// Add a rule to regenerate the build system when the target
// specification source changes.
const char* suppRegenRule =
this->Makefile->GetDefinition("CMAKE_SUPPRESS_REGENERATION");
if (!cmSystemTools::IsOn(suppRegenRule))
{
this->AddDSPBuildRule(l->second);
}
}
}
void cmLocalVisualStudio6Generator::Generate()
{
this->OutputDSPFile();
@ -107,18 +124,6 @@ void cmLocalVisualStudio6Generator::OutputDSPFile()
// Create the DSP or set of DSP's for libraries and executables
cmTargets &tgts = this->Makefile->GetTargets();
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
// Add a rule to regenerate the build system when the target
// specification source changes.
const char* suppRegenRule =
this->Makefile->GetDefinition("CMAKE_SUPPRESS_REGENERATION");
if (!cmSystemTools::IsOn(suppRegenRule))
{
this->AddDSPBuildRule(l->second);
}
}
// build any targets
for(cmTargets::iterator l = tgts.begin();

View File

@ -34,6 +34,7 @@ public:
virtual ~cmLocalVisualStudio6Generator();
virtual void AddHelperCommands();
virtual void AddCMakeListsRules();
/**
* Generate the makefile for this directory.

View File

@ -100,6 +100,28 @@ void cmLocalVisualStudio7Generator::Generate()
this->WriteStampFiles();
}
void cmLocalVisualStudio7Generator::AddCMakeListsRules()
{
cmTargets &tgts = this->Makefile->GetTargets();
// Create the regeneration custom rule.
if(!this->Makefile->IsOn("CMAKE_SUPPRESS_REGENERATION"))
{
// Create a rule to regenerate the build system when the target
// specification source changes.
if(cmSourceFile* sf = this->CreateVCProjBuildRule())
{
// Add the rule to targets that need it.
for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
{
if(l->first != CMAKE_CHECK_BUILD_SYSTEM_TARGET)
{
l->second.AddSourceFile(sf);
}
}
}
}
}
void cmLocalVisualStudio7Generator::FixGlobalTargets()
{
// Visual Studio .NET 2003 Service Pack 1 will not run post-build
@ -156,24 +178,6 @@ void cmLocalVisualStudio7Generator::WriteProjectFiles()
// Get the set of targets in this directory.
cmTargets &tgts = this->Makefile->GetTargets();
// Create the regeneration custom rule.
if(!this->Makefile->IsOn("CMAKE_SUPPRESS_REGENERATION"))
{
// Create a rule to regenerate the build system when the target
// specification source changes.
if(cmSourceFile* sf = this->CreateVCProjBuildRule())
{
// Add the rule to targets that need it.
for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
{
if(l->first != CMAKE_CHECK_BUILD_SYSTEM_TARGET)
{
l->second.AddSourceFile(sf);
}
}
}
}
// Create the project file for each target.
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)

View File

@ -64,6 +64,7 @@ public:
virtual void ReadAndStoreExternalGUID(const char* name,
const char* path);
virtual void AddCMakeListsRules();
protected:
void CreateSingleVCProj(const char *lname, cmTarget &tgt);
private:

View File

@ -58,6 +58,8 @@ public:
virtual std::string ComputeLongestObjectDirectory(cmTarget&) const = 0;
virtual void AddCMakeListsRules() = 0;
protected:
virtual const char* ReportErrorLabel() const;
virtual bool CustomCommandUseLocal() const { return false; }