include_external_msproject: Add TYPE, GUID, PLATFORM options (#13120)

These allow one to reference more external VS project file variations.
This commit is contained in:
Leonid Yurchenko 2012-04-16 10:07:19 -04:00 committed by Brad King
parent 31e7fadbb3
commit 59139031a1
9 changed files with 122 additions and 25 deletions

View File

@ -241,9 +241,12 @@ void cmGlobalVisualStudio71Generator
::WriteExternalProject(std::ostream& fout, ::WriteExternalProject(std::ostream& fout,
const char* name, const char* name,
const char* location, const char* location,
const char* typeGuid,
const std::set<cmStdString>& depends) const std::set<cmStdString>& depends)
{ {
fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" fout << "Project(\"{"
<< (typeGuid ? typeGuid : "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942")
<< "}\") = \""
<< name << "\", \"" << name << "\", \""
<< this->ConvertToSolutionPath(location) << "\", \"{" << this->ConvertToSolutionPath(location) << "\", \"{"
<< this->GetGUID(name) << this->GetGUID(name)
@ -279,18 +282,20 @@ void cmGlobalVisualStudio71Generator
// executables to the libraries it uses are also done here // executables to the libraries it uses are also done here
void cmGlobalVisualStudio71Generator void cmGlobalVisualStudio71Generator
::WriteProjectConfigurations(std::ostream& fout, const char* name, ::WriteProjectConfigurations(std::ostream& fout, const char* name,
bool partOfDefaultBuild) bool partOfDefaultBuild, const char* platformMapping)
{ {
std::string guid = this->GetGUID(name); std::string guid = this->GetGUID(name);
for(std::vector<std::string>::iterator i = this->Configurations.begin(); for(std::vector<std::string>::iterator i = this->Configurations.begin();
i != this->Configurations.end(); ++i) i != this->Configurations.end(); ++i)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< ".ActiveCfg = " << *i << "|Win32\n"; << ".ActiveCfg = " << *i << "|"
<< (platformMapping ? platformMapping : "Win32") << std::endl;
if(partOfDefaultBuild) if(partOfDefaultBuild)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< ".Build.0 = " << *i << "|Win32\n"; << ".Build.0 = " << *i << "|"
<< (platformMapping ? platformMapping : "Win32") << std::endl;
} }
} }
} }

View File

@ -64,10 +64,12 @@ protected:
const char* name, const char* path, cmTarget &t); const char* name, const char* path, cmTarget &t);
virtual void WriteProjectConfigurations(std::ostream& fout, virtual void WriteProjectConfigurations(std::ostream& fout,
const char* name, const char* name,
bool partOfDefaultBuild); bool partOfDefaultBuild,
const char* platformMapping = NULL);
virtual void WriteExternalProject(std::ostream& fout, virtual void WriteExternalProject(std::ostream& fout,
const char* name, const char* name,
const char* path, const char* path,
const char* typeGuid,
const std::set<cmStdString>& depends); const std::set<cmStdString>& depends);
virtual void WriteSLNFooter(std::ostream& fout); virtual void WriteSLNFooter(std::ostream& fout);
virtual void WriteSLNHeader(std::ostream& fout); virtual void WriteSLNHeader(std::ostream& fout);

View File

@ -251,7 +251,8 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
if(expath) if(expath)
{ {
this->WriteProjectConfigurations(fout, target->GetName(), this->WriteProjectConfigurations(fout, target->GetName(),
true); true,
target->GetProperty("VS_PLATFORM_MAPPING"));
} }
else else
{ {
@ -286,8 +287,12 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
{ {
std::string project = target->GetName(); std::string project = target->GetName();
std::string location = expath; std::string location = expath;
this->WriteExternalProject(fout, project.c_str(),
location.c_str(), target->GetUtilities()); this->WriteExternalProject(fout,
project.c_str(),
location.c_str(),
target->GetProperty("VS_PROJECT_TYPE"),
target->GetUtilities());
written = true; written = true;
} }
else else
@ -580,18 +585,20 @@ cmGlobalVisualStudio7Generator
// executables to the libraries it uses are also done here // executables to the libraries it uses are also done here
void cmGlobalVisualStudio7Generator void cmGlobalVisualStudio7Generator
::WriteProjectConfigurations(std::ostream& fout, const char* name, ::WriteProjectConfigurations(std::ostream& fout, const char* name,
bool partOfDefaultBuild) bool partOfDefaultBuild, const char* platformMapping)
{ {
std::string guid = this->GetGUID(name); std::string guid = this->GetGUID(name);
for(std::vector<std::string>::iterator i = this->Configurations.begin(); for(std::vector<std::string>::iterator i = this->Configurations.begin();
i != this->Configurations.end(); ++i) i != this->Configurations.end(); ++i)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< ".ActiveCfg = " << *i << "|Win32\n"; << ".ActiveCfg = " << *i << "|"
<< (platformMapping ? platformMapping : "Win32") << "\n";
if(partOfDefaultBuild) if(partOfDefaultBuild)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< ".Build.0 = " << *i << "|Win32\n"; << ".Build.0 = " << *i << "|"
<< (platformMapping ? platformMapping : "Win32") << "\n";
} }
} }
} }
@ -604,10 +611,14 @@ void cmGlobalVisualStudio7Generator
void cmGlobalVisualStudio7Generator::WriteExternalProject(std::ostream& fout, void cmGlobalVisualStudio7Generator::WriteExternalProject(std::ostream& fout,
const char* name, const char* name,
const char* location, const char* location,
const char* typeGuid,
const std::set<cmStdString>&) const std::set<cmStdString>&)
{ {
std::string d = cmSystemTools::ConvertToOutputPath(location); std::string d = cmSystemTools::ConvertToOutputPath(location);
fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" fout << "Project("
<< "\"{"
<< (typeGuid ? typeGuid : "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942")
<< "}\") = \""
<< name << "\", \"" << name << "\", \""
<< this->ConvertToSolutionPath(location) << "\", \"{" << this->ConvertToSolutionPath(location) << "\", \"{"
<< this->GetGUID(name) << this->GetGUID(name)

View File

@ -107,7 +107,8 @@ protected:
const char* name, const char* path, cmTarget &t); const char* name, const char* path, cmTarget &t);
virtual void WriteProjectConfigurations(std::ostream& fout, virtual void WriteProjectConfigurations(std::ostream& fout,
const char* name, const char* name,
bool partOfDefaultBuild); bool partOfDefaultBuild,
const char* platformMapping = NULL);
virtual void WriteSLNFooter(std::ostream& fout); virtual void WriteSLNFooter(std::ostream& fout);
virtual void WriteSLNHeader(std::ostream& fout); virtual void WriteSLNHeader(std::ostream& fout);
virtual std::string WriteUtilityDepend(cmTarget* target); virtual std::string WriteUtilityDepend(cmTarget* target);
@ -130,6 +131,7 @@ protected:
virtual void WriteExternalProject(std::ostream& fout, virtual void WriteExternalProject(std::ostream& fout,
const char* name, const char* name,
const char* path, const char* path,
const char* typeGuid,
const std::set<cmStdString>& const std::set<cmStdString>&
dependencies); dependencies);

View File

@ -270,20 +270,20 @@ cmGlobalVisualStudio8Generator
void void
cmGlobalVisualStudio8Generator cmGlobalVisualStudio8Generator
::WriteProjectConfigurations(std::ostream& fout, const char* name, ::WriteProjectConfigurations(std::ostream& fout, const char* name,
bool partOfDefaultBuild) bool partOfDefaultBuild, const char* platformMapping)
{ {
std::string guid = this->GetGUID(name); std::string guid = this->GetGUID(name);
for(std::vector<std::string>::iterator i = this->Configurations.begin(); for(std::vector<std::string>::iterator i = this->Configurations.begin();
i != this->Configurations.end(); ++i) i != this->Configurations.end(); ++i)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< "|" << this->GetPlatformName() << ".ActiveCfg = " << "|" << this->GetPlatformName() << ".ActiveCfg = " << *i << "|"
<< *i << "|" << this->GetPlatformName() << "\n"; << (platformMapping ? platformMapping : this->GetPlatformName()) << "\n";
if(partOfDefaultBuild) if(partOfDefaultBuild)
{ {
fout << "\t\t{" << guid << "}." << *i fout << "\t\t{" << guid << "}." << *i
<< "|" << this->GetPlatformName() << ".Build.0 = " << "|" << this->GetPlatformName() << ".Build.0 = " << *i << "|"
<< *i << "|" << this->GetPlatformName() << "\n"; << (platformMapping ? platformMapping : this->GetPlatformName()) << "\n";
} }
} }
} }

View File

@ -77,7 +77,8 @@ protected:
virtual void WriteSolutionConfigurations(std::ostream& fout); virtual void WriteSolutionConfigurations(std::ostream& fout);
virtual void WriteProjectConfigurations(std::ostream& fout, virtual void WriteProjectConfigurations(std::ostream& fout,
const char* name, const char* name,
bool partOfDefaultBuild); bool partOfDefaultBuild,
const char* platformMapping = NULL);
virtual bool ComputeTargetDepends(); virtual bool ComputeTargetDepends();
virtual void WriteProjectDepends(std::ostream& fout, const char* name, virtual void WriteProjectDepends(std::ostream& fout, const char* name,
const char* path, cmTarget &t); const char* path, cmTarget &t);

View File

@ -25,18 +25,76 @@ bool cmIncludeExternalMSProjectCommand
#ifdef _WIN32 #ifdef _WIN32
if(this->Makefile->GetDefinition("WIN32")) if(this->Makefile->GetDefinition("WIN32"))
{ {
enum Doing { DoingNone, DoingType, DoingGuid, DoingPlatform };
Doing doing = DoingNone;
std::string customType;
std::string customGuid;
std::string platformMapping;
std::vector<std::string> depends;
for (unsigned int i=2; i<args.size(); ++i)
{
if (args[i] == "TYPE")
{
doing = DoingType;
}
else if (args[i] == "GUID")
{
doing = DoingGuid;
}
else if (args[i] == "PLATFORM")
{
doing = DoingPlatform;
}
else
{
switch (doing)
{
case DoingNone: depends.push_back(args[i]); break;
case DoingType: customType = args[i]; break;
case DoingGuid: customGuid = args[i]; break;
case DoingPlatform: platformMapping = args[i]; break;
}
doing = DoingNone;
}
}
// Hack together a utility target storing enough information
// to reproduce the target inclusion.
std::string utility_name = args[0];
std::string path = args[1]; std::string path = args[1];
cmSystemTools::ConvertToUnixSlashes(path); cmSystemTools::ConvertToUnixSlashes(path);
if (!customGuid.empty())
{
std::string guidVariable = utility_name + "_GUID_CMAKE";
this->Makefile->GetCMakeInstance()->AddCacheEntry(guidVariable.c_str(),
customGuid.c_str(),
"Stored GUID",
cmCacheManager::INTERNAL);
}
// Create a target instance for this utility. // Create a target instance for this utility.
cmTarget* target=this->Makefile->AddNewTarget(cmTarget::UTILITY, cmTarget* target=this->Makefile->AddNewTarget(cmTarget::UTILITY,
args[0].c_str()); utility_name.c_str());
target->SetProperty("GENERATOR_FILE_NAME", utility_name.c_str());
target->SetProperty("EXTERNAL_MSPROJECT", path.c_str()); target->SetProperty("EXTERNAL_MSPROJECT", path.c_str());
target->SetProperty("EXCLUDE_FROM_ALL","FALSE"); target->SetProperty("EXCLUDE_FROM_ALL", "FALSE");
target->SetProperty("GENERATOR_FILE_NAME", args[0].c_str());
for (unsigned int i=2; i<args.size(); ++i) if (!customType.empty())
target->SetProperty("VS_PROJECT_TYPE",customType.c_str());
if (!platformMapping.empty())
target->SetProperty("VS_PLATFORM_MAPPING",platformMapping.c_str());
for (std::vector<std::string>::const_iterator it = depends.begin();
it != depends.end();
++it)
{ {
target->AddUtility(args[i].c_str()); target->AddUtility(it->c_str());
} }
} }
#endif #endif

View File

@ -59,11 +59,21 @@ public:
{ {
return return
" include_external_msproject(projectname location\n" " include_external_msproject(projectname location\n"
" [TYPE projectTypeGUID]\n"
" [GUID projectGUID]\n"
" [PLATFORM platformName]\n"
" dep1 dep2 ...)\n" " dep1 dep2 ...)\n"
"Includes an external Microsoft project in the generated workspace " "Includes an external Microsoft project in the generated workspace "
"file. Currently does nothing on UNIX. This will create a " "file. Currently does nothing on UNIX. This will create a "
"target named [projectname]. This can be used in the add_dependencies " "target named [projectname]. This can be used in the add_dependencies "
"command to make things depend on the external project."; "command to make things depend on the external project."
"\n"
"TYPE, GUID and PLATFORM are optional parameters that allow one "
"to specify the type of project, id (GUID) of the project and "
"the name of the target platform. "
"This is useful for projects requiring values other than the default "
"(e.g. WIX projects). "
"These options are not supported by the Visual Studio 6 generator.";
} }
cmTypeMacro(cmIncludeExternalMSProjectCommand, cmCommand); cmTypeMacro(cmIncludeExternalMSProjectCommand, cmCommand);

View File

@ -99,6 +99,14 @@ void cmLocalVisualStudio10Generator
{ {
cmVS10XMLParser parser; cmVS10XMLParser parser;
parser.ParseFile(path); parser.ParseFile(path);
// if we can not find a GUID then create one
if(parser.GUID.empty())
{
this->GlobalGenerator->CreateGUID(name);
return;
}
std::string guidStoreName = name; std::string guidStoreName = name;
guidStoreName += "_GUID_CMAKE"; guidStoreName += "_GUID_CMAKE";
// save the GUID in the cache // save the GUID in the cache