summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/CMakeVS10FindMake.cmake8
-rw-r--r--Source/cmCTest.cxx5
-rw-r--r--Source/cmGlobalVisualStudio10Generator.cxx61
-rw-r--r--Source/cmGlobalVisualStudio10Generator.h6
-rw-r--r--Source/cmGlobalVisualStudio71Generator.cxx4
-rw-r--r--Source/cmGlobalVisualStudio7Generator.cxx35
-rw-r--r--Source/cmGlobalVisualStudio7Generator.h7
-rw-r--r--Source/cmGlobalVisualStudioGenerator.cxx18
-rw-r--r--Source/cmLocalVisualStudio10Generator.cxx2
-rw-r--r--Source/cmLocalVisualStudio7Generator.cxx50
-rw-r--r--Source/cmLocalVisualStudio7Generator.h5
-rw-r--r--Source/cmLocalVisualStudioGenerator.cxx21
-rw-r--r--Source/cmLocalVisualStudioGenerator.h3
-rw-r--r--Source/cmTarget.cxx1
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx218
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h6
-rw-r--r--Tests/Complex/Library/CMakeLists.txt4
-rw-r--r--Tests/ComplexOneConfig/Library/CMakeLists.txt4
-rw-r--r--Tests/ComplexRelativePaths/Library/CMakeLists.txt4
19 files changed, 347 insertions, 115 deletions
diff --git a/Modules/CMakeVS10FindMake.cmake b/Modules/CMakeVS10FindMake.cmake
index 04d5e81..ce79641 100644
--- a/Modules/CMakeVS10FindMake.cmake
+++ b/Modules/CMakeVS10FindMake.cmake
@@ -6,6 +6,13 @@ IF(NOT CMAKE_CROSSCOMPILING)
ENDIF(NOT CMAKE_CROSSCOMPILING)
FIND_PROGRAM(CMAKE_MAKE_PROGRAM
+ NAMES MSBuild
+ HINTS
+ "$ENV{SYSTEMROOT}/Microsoft.NET/Framework/v4.0.20506/"
+ c:/WINDOWS/Microsoft.NET/Framework/v4.0.20506/
+ )
+
+FIND_PROGRAM(CMAKE_MAKE_PROGRAM
NAMES ${_CMAKE_MAKE_PROGRAM_NAMES}
HINTS
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VS;EnvironmentDirectory]
@@ -25,6 +32,7 @@ FIND_PROGRAM(CMAKE_MAKE_PROGRAM
"$ENV{ProgramFiles}/Microsoft Visual Studio .NET/Common7/IDE"
)
+
MARK_AS_ADVANCED(CMAKE_MAKE_PROGRAM)
SET(MSVC10 1)
SET(MSVC_VERSION 1600)
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 0cd5d56..85aac75 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -2767,7 +2767,10 @@ double cmCTest::GetRemainingTimeAllowed()
void cmCTest::OutputTestErrors(std::vector<char> const &process_output)
{
std::string test_outputs("\n*** Test Failed:\n");
- test_outputs.append(&*process_output.begin(), process_output.size());
+ if(process_output.size())
+ {
+ test_outputs.append(&*process_output.begin(), process_output.size());
+ }
cmCTestLog(this, HANDLER_OUTPUT, test_outputs << std::endl << std::flush);
}
diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index a0af05c..4127a6c 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -96,3 +96,64 @@ std::string cmGlobalVisualStudio10Generator::GetUserMacrosRegKeyBase()
{
return "Software\\Microsoft\\VisualStudio\\10.0\\vsmacros";
}
+
+
+std::string cmGlobalVisualStudio10Generator
+::GenerateBuildCommand(const char* makeProgram,
+ const char *projectName,
+ const char* additionalOptions, const char *targetName,
+ const char* config, bool ignoreErrors, bool)
+{
+ // Ingoring errors is not implemented in visual studio 6
+ (void) ignoreErrors;
+
+
+ // now build the test
+ std::string makeCommand
+ = cmSystemTools::ConvertToOutputPath(makeProgram);
+ std::string lowerCaseCommand = makeCommand;
+ cmSystemTools::LowerCase(lowerCaseCommand);
+
+ // if there are spaces in the makeCommand, assume a full path
+ // and convert it to a path with no spaces in it as the
+ // RunSingleCommand does not like spaces
+ if(makeCommand.find(' ') != std::string::npos)
+ {
+ cmSystemTools::GetShortPath(makeCommand.c_str(), makeCommand);
+ }
+ // msbuild.exe CxxOnly.sln /t:Build /p:Configuration=Debug /target:ALL_BUILD
+ if(!targetName || strlen(targetName) == 0)
+ {
+ targetName = "ALL_BUILD";
+ }
+ bool clean = false;
+ if ( targetName && strcmp(targetName, "clean") == 0 )
+ {
+ clean = true;
+ makeCommand += " ";
+ makeCommand += projectName;
+ makeCommand += ".sln ";
+ makeCommand += "/t:Clean ";
+ }
+ else
+ {
+ makeCommand += " ";
+ makeCommand += targetName;
+ makeCommand += ".vcxproj ";
+ }
+ makeCommand += "/p:Configuration=";
+ if(config && strlen(config))
+ {
+ makeCommand += config;
+ }
+ else
+ {
+ makeCommand += "Debug";
+ }
+ if ( additionalOptions )
+ {
+ makeCommand += " ";
+ makeCommand += additionalOptions;
+ }
+ return makeCommand;
+}
diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h
index 2733289..562b546 100644
--- a/Source/cmGlobalVisualStudio10Generator.h
+++ b/Source/cmGlobalVisualStudio10Generator.h
@@ -33,6 +33,12 @@ public:
static cmGlobalGenerator* New() {
return new cmGlobalVisualStudio10Generator; }
+ virtual std::string
+ GenerateBuildCommand(const char* makeProgram,
+ const char *projectName,
+ const char* additionalOptions, const char *targetName,
+ const char* config, bool ignoreErrors, bool);
+
///! Get the name for the generator.
virtual const char* GetName() const {
return cmGlobalVisualStudio10Generator::GetActualName();}
diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx
index 157176d..7c2752c 100644
--- a/Source/cmGlobalVisualStudio71Generator.cxx
+++ b/Source/cmGlobalVisualStudio71Generator.cxx
@@ -116,8 +116,7 @@ void cmGlobalVisualStudio71Generator
originalTargets,
root, generators);
OrderedTargetDependSet orderedProjectTargets(projectTargets);
- this->WriteTargetsToSolution(fout, root, orderedProjectTargets,
- originalTargets);
+ this->WriteTargetsToSolution(fout, root, orderedProjectTargets);
// Write out the configurations information for the solution
fout << "Global\n";
// Write out the configurations for the solution
@@ -257,7 +256,6 @@ void cmGlobalVisualStudio71Generator
const char* location,
const std::vector<std::string>& depends)
{
- std::cout << "WriteExternalProject vs71\n";
fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \""
<< name << "\", \""
<< this->ConvertToSolutionPath(location) << "\", \"{"
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index e43afc0..1a5a5b8 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -194,7 +194,6 @@ void cmGlobalVisualStudio7Generator::Generate()
// Now write out the DSW
this->OutputSLNFile();
-
// If any solution or project files changed during the generation,
// tell Visual Studio to reload them...
if(!cmSystemTools::GetErrorOccuredFlag())
@@ -240,24 +239,6 @@ void cmGlobalVisualStudio7Generator::OutputSLNFile()
}
-void cmGlobalVisualStudio7Generator::AddAllBuildDepends(
- cmLocalGenerator* root,
- cmTarget* target,
- cmGlobalGenerator::TargetDependSet& originalTargets)
-{
- // if this is the special ALL_BUILD utility, then
- // make it depend on every other non UTILITY project.
- for(cmGlobalGenerator::TargetDependSet::iterator ot =
- originalTargets.begin(); ot != originalTargets.end(); ++ot)
- {
- cmTarget* t = const_cast<cmTarget*>(*ot);
- if(!this->IsExcluded(root, *t))
- {
- target->AddUtility(t->GetName());
- }
- }
-}
-
void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
std::ostream& fout,
cmLocalGenerator* root,
@@ -296,9 +277,7 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
std::ostream& fout,
cmLocalGenerator* root,
- OrderedTargetDependSet const& projectTargets,
- cmGlobalGenerator::TargetDependSet& originalTargets
- )
+ OrderedTargetDependSet const& projectTargets)
{
std::string rootdir = root->GetMakefile()->GetStartOutputDirectory();
rootdir += "/";
@@ -306,14 +285,6 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
projectTargets.begin(); tt != projectTargets.end(); ++tt)
{
cmTarget* target = *tt;
- cmMakefile* mf = target->GetMakefile();
- // look for the all_build rule and add depends to all
- // of the original targets (none that were "pulled" into this project)
- if(mf == root->GetMakefile() &&
- strcmp(target->GetName(), "ALL_BUILD") == 0)
- {
- this->AddAllBuildDepends(root, target, originalTargets);
- }
// handle external vc project files
if (strncmp(target->GetName(), "INCLUDE_EXTERNAL_MSPROJECT", 26) == 0)
{
@@ -427,8 +398,7 @@ void cmGlobalVisualStudio7Generator
originalTargets,
root, generators);
OrderedTargetDependSet orderedProjectTargets(projectTargets);
- this->WriteTargetsToSolution(fout, root, orderedProjectTargets,
- originalTargets);
+ this->WriteTargetsToSolution(fout, root, orderedProjectTargets);
// Write out the configurations information for the solution
fout << "Global\n"
<< "\tGlobalSection(SolutionConfiguration) = preSolution\n";
@@ -594,7 +564,6 @@ void cmGlobalVisualStudio7Generator::WriteExternalProject(std::ostream& fout,
const char* location,
const std::vector<std::string>&)
{
- std::cout << "WriteExternalProject vs7\n";
std::string d = cmSystemTools::ConvertToOutputPath(location);
fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \""
<< name << "\", \""
diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h
index a116fe9..c2930db 100644
--- a/Source/cmGlobalVisualStudio7Generator.h
+++ b/Source/cmGlobalVisualStudio7Generator.h
@@ -128,8 +128,7 @@ protected:
virtual void WriteTargetsToSolution(
std::ostream& fout,
cmLocalGenerator* root,
- OrderedTargetDependSet const& projectTargets,
- cmGlobalGenerator::TargetDependSet& originalTargets);
+ OrderedTargetDependSet const& projectTargets);
virtual void WriteTargetDepends(
std::ostream& fout,
OrderedTargetDependSet const& projectTargets);
@@ -138,10 +137,6 @@ protected:
cmLocalGenerator* root,
OrderedTargetDependSet const& projectTargets);
- void AddAllBuildDepends(cmLocalGenerator* root,
- cmTarget* target,
- cmGlobalGenerator::TargetDependSet& targets);
-
void GenerateConfigurations(cmMakefile* mf);
virtual void WriteExternalProject(std::ostream& fout,
diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx
index 4e1b851..e204681 100644
--- a/Source/cmGlobalVisualStudioGenerator.cxx
+++ b/Source/cmGlobalVisualStudioGenerator.cxx
@@ -48,10 +48,26 @@ void cmGlobalVisualStudioGenerator::Generate()
{
// Use no actual command lines so that the target itself is not
// considered always out of date.
- gen[0]->GetMakefile()->
+ cmTarget* allBuild =
+ gen[0]->GetMakefile()->
AddUtilityCommand("ALL_BUILD", true, no_working_dir,
no_depends, no_commands, false,
"Build all projects");
+ // Now make all targets depend on the ALL_BUILD target
+ cmTargets targets;
+ for(std::vector<cmLocalGenerator*>::iterator i = gen.begin();
+ i != gen.end(); ++i)
+ {
+ cmTargets& targets = (*i)->GetMakefile()->GetTargets();
+ for(cmTargets::iterator t = targets.begin();
+ t != targets.end(); ++t)
+ {
+ if(!this->IsExcluded(gen[0], t->second))
+ {
+ allBuild->AddUtility(t->second.GetName());
+ }
+ }
+ }
}
}
diff --git a/Source/cmLocalVisualStudio10Generator.cxx b/Source/cmLocalVisualStudio10Generator.cxx
index cdcf7e1..8106e7e 100644
--- a/Source/cmLocalVisualStudio10Generator.cxx
+++ b/Source/cmLocalVisualStudio10Generator.cxx
@@ -23,7 +23,7 @@
//----------------------------------------------------------------------------
cmLocalVisualStudio10Generator::cmLocalVisualStudio10Generator()
{
-
+ this->NeedXMLEscape = true;
}
cmLocalVisualStudio10Generator::~cmLocalVisualStudio10Generator()
diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx
index 7fb04b1..e0baa18 100644
--- a/Source/cmLocalVisualStudio7Generator.cxx
+++ b/Source/cmLocalVisualStudio7Generator.cxx
@@ -1405,6 +1405,38 @@ cmLocalVisualStudio7GeneratorFCInfo
}
}
+
+void cmLocalVisualStudio7Generator
+::ComputeMaxDirectoryLength(std::string& maxdir,
+ cmTarget& target)
+{
+ std::vector<std::string> *configs =
+ static_cast<cmGlobalVisualStudio7Generator *>
+ (this->GlobalGenerator)->GetConfigurations();
+ // Compute the maximum length configuration name.
+ std::string config_max;
+ for(std::vector<std::string>::iterator i = configs->begin();
+ i != configs->end(); ++i)
+ {
+ if(i->size() > config_max.size())
+ {
+ config_max = *i;
+ }
+ }
+
+ // Compute the maximum length full path to the intermediate
+ // files directory for any configuration. This is used to construct
+ // object file names that do not produce paths that are too long.
+ std::string dir_max;
+ dir_max += this->Makefile->GetCurrentOutputDirectory();
+ dir_max += "/";
+ dir_max += this->GetTargetDirectory(target);
+ dir_max += "/";
+ dir_max += config_max;
+ dir_max += "/";
+ maxdir = dir_max;
+}
+
void cmLocalVisualStudio7Generator
::WriteGroup(const cmSourceGroup *sg, cmTarget& target,
std::ostream &fout, const char *libName,
@@ -1425,27 +1457,11 @@ void cmLocalVisualStudio7Generator
this->WriteVCProjBeginGroup(fout, name.c_str(), "");
}
- // Compute the maximum length configuration name.
- std::string config_max;
- for(std::vector<std::string>::iterator i = configs->begin();
- i != configs->end(); ++i)
- {
- if(i->size() > config_max.size())
- {
- config_max = *i;
- }
- }
-
// Compute the maximum length full path to the intermediate
// files directory for any configuration. This is used to construct
// object file names that do not produce paths that are too long.
std::string dir_max;
- dir_max += this->Makefile->GetCurrentOutputDirectory();
- dir_max += "/";
- dir_max += this->GetTargetDirectory(target);
- dir_max += "/";
- dir_max += config_max;
- dir_max += "/";
+ this->ComputeMaxDirectoryLength(dir_max, target);
// Loop through each source in the source group.
std::string objectName;
diff --git a/Source/cmLocalVisualStudio7Generator.h b/Source/cmLocalVisualStudio7Generator.h
index 70f25e8..2d951ec 100644
--- a/Source/cmLocalVisualStudio7Generator.h
+++ b/Source/cmLocalVisualStudio7Generator.h
@@ -72,10 +72,15 @@ public:
virtual std::string GetTargetDirectory(cmTarget const&) const;
cmSourceFile* CreateVCProjBuildRule();
void WriteStampFiles();
+ void ComputeMaxDirectoryLength(std::string& maxdir,
+ cmTarget& target);
private:
typedef cmLocalVisualStudio7GeneratorOptions Options;
typedef cmLocalVisualStudio7GeneratorFCInfo FCInfo;
+ // Compute the maximum length full path to the intermediate
+ // files directory for any configuration. This is used to construct
+ // object file names that do not produce paths that are too long.
void ReadAndStoreExternalGUID(const char* name,
const char* path);
std::string GetBuildTypeLinkerFlags(std::string rootLinkerFlags,
diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx
index 4706a96..da214cf 100644
--- a/Source/cmLocalVisualStudioGenerator.cxx
+++ b/Source/cmLocalVisualStudioGenerator.cxx
@@ -26,6 +26,7 @@ cmLocalVisualStudioGenerator::cmLocalVisualStudioGenerator()
{
this->WindowsShell = true;
this->WindowsVSIDE = true;
+ this->NeedXMLEscape = false;
}
//----------------------------------------------------------------------------
@@ -231,8 +232,26 @@ cmLocalVisualStudioGenerator
}
else
{
- script += this->EscapeForShell(commandLine[j].c_str(),
+ if(this->NeedXMLEscape)
+ {
+ std::string arg = commandLine[j];
+ cmSystemTools::ReplaceString(arg, "&", "&amp;");
+ cmSystemTools::ReplaceString(arg, "<", "&lt;");
+ cmSystemTools::ReplaceString(arg, ">", "&gt;");
+ if(arg.find(" ") != arg.npos)
+ {
+ std::string q("\"");
+ arg = q + arg +q;
+ }
+ script += arg;
+ //script += this->EscapeForShell(arg.c_str(),
+ //escapeAllowMakeVars);
+ }
+ else
+ {
+ script += this->EscapeForShell(commandLine[j].c_str(),
escapeAllowMakeVars);
+ }
}
}
}
diff --git a/Source/cmLocalVisualStudioGenerator.h b/Source/cmLocalVisualStudioGenerator.h
index 0bb630b..4b31599 100644
--- a/Source/cmLocalVisualStudioGenerator.h
+++ b/Source/cmLocalVisualStudioGenerator.h
@@ -56,8 +56,9 @@ protected:
std::map<cmStdString, int>& count);
void InsertNeedObjectNames(const std::vector<cmSourceGroup>& groups,
std::map<cmStdString, int>& count);
-
+ bool NeedXMLEscape;
std::set<const cmSourceFile*> NeedObjectName;
+ friend class cmVisualStudio10TargetGenerator;
};
#endif
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 6c9197c..5f2217d 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1992,6 +1992,7 @@ cmTarget::OutputInfo const* cmTarget::GetOutputInfo(const char* config)
msg += " which has type ";
msg += cmTarget::TargetTypeNames[this->GetType()];
this->GetMakefile()->IssueMessage(cmake::INTERNAL_ERROR, msg);
+ abort();
return 0;
}
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 065f454..05196ff 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -43,10 +43,16 @@ cmVisualStudio10TargetGenerator(cmTarget* target,
(cmLocalVisualStudio7Generator*)
this->Makefile->GetLocalGenerator();
this->Platform = "|Win32";
+ this->ComputeObjectNames();
}
cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
{
+ if (this->BuildFileStream->Close())
+ {
+ this->GlobalGenerator
+ ->FileReplacedDuringGenerate(this->PathToVcxproj);
+ }
delete this->BuildFileStream;
}
@@ -104,6 +110,7 @@ void cmVisualStudio10TargetGenerator::Generate()
path += ".vcxproj";
this->BuildFileStream =
new cmGeneratedFileStream(path.c_str());
+ this->PathToVcxproj = path;
this->BuildFileStream->SetCopyIfDifferent(true);
// Write the encoding header into the file
@@ -382,45 +389,39 @@ void cmVisualStudio10TargetGenerator::WriteObjSources()
void cmVisualStudio10TargetGenerator::WriteCLSources()
{
- this->WriteString("<ItemGroup>\n", 1);
if(this->Target->GetType() > cmTarget::MODULE_LIBRARY)
{
- this->WriteString("<None Include=\"", 2);
- (*this->BuildFileStream ) << this->Target->GetDirectory()
- << "\\" << this->Target->GetName()
- << "\" />\n";
+ return;
}
- else
+ this->WriteString("<ItemGroup>\n", 1);
+ std::vector<cmSourceFile*>const& sources = this->Target->GetSourceFiles();
+ for(std::vector<cmSourceFile*>::const_iterator source = sources.begin();
+ source != sources.end(); ++source)
{
- std::vector<cmSourceFile*>const& sources = this->Target->GetSourceFiles();
- for(std::vector<cmSourceFile*>::const_iterator source = sources.begin();
- source != sources.end(); ++source)
+ // if it is not a custom command then add it as a c/c++ file,
+ // TODO: need to check for idl or rc
+ if(!(*source)->GetCustomCommand()
+ && !(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")
+ && !this->GlobalGenerator->IgnoreFile
+ ((*source)->GetExtension().c_str()))
{
- // if it is not a custom command then add it as a c/c++ file,
- // TODO: need to check for idl or rc
- if(!(*source)->GetCustomCommand()
- && !(*source)->GetPropertyAsBool("HEADER_FILE_ONLY")
- && !this->GlobalGenerator->IgnoreFile
- ((*source)->GetExtension().c_str()))
+ const char* lang = (*source)->GetLanguage();
+ if(lang && (strcmp(lang, "C") == 0 || strcmp(lang, "CXX") ==0))
{
- const char* lang = (*source)->GetLanguage();
- if(lang && (strcmp(lang, "C") == 0 || strcmp(lang, "CXX") ==0))
+ std::string sourceFile = (*source)->GetFullPath();
+ // output the source file
+ this->WriteString("<ClCompile Include=\"", 2);
+ (*this->BuildFileStream ) << sourceFile << "\"";
+ // ouput any flags specific to this source file
+ if(this->OutputSourceSpecificFlags(*source))
{
- std::string sourceFile = (*source)->GetFullPath();
- // output the source file
- this->WriteString("<ClCompile Include=\"", 2);
- (*this->BuildFileStream ) << sourceFile << "\"";
- // ouput any flags specific to this source file
- if(this->OutputSourceSpecificFlags(*source))
- {
- // if the source file has specific flags the tag
- // is ended on a new line
- this->WriteString("</ClCompile>\n", 2);
- }
- else
- {
- (*this->BuildFileStream ) << " />\n";
- }
+ // if the source file has specific flags the tag
+ // is ended on a new line
+ this->WriteString("</ClCompile>\n", 2);
+ }
+ else
+ {
+ (*this->BuildFileStream ) << " />\n";
}
}
}
@@ -428,10 +429,48 @@ void cmVisualStudio10TargetGenerator::WriteCLSources()
this->WriteString("</ItemGroup>\n", 1);
}
+void cmVisualStudio10TargetGenerator::ComputeObjectNames()
+{
+ // We may be modifying the source groups temporarily, so make a copy.
+ std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();
+
+ // get the classes from the source lists then add them to the groups
+ std::vector<cmSourceFile*>const & classes = this->Target->GetSourceFiles();
+ for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
+ i != classes.end(); i++)
+ {
+ // Add the file to the list of sources.
+ std::string source = (*i)->GetFullPath();
+ if(cmSystemTools::UpperCase((*i)->GetExtension()) == "DEF")
+ {
+ this->ModuleDefinitionFile = (*i)->GetFullPath();
+ }
+ cmSourceGroup& sourceGroup =
+ this->Makefile->FindSourceGroup(source.c_str(), sourceGroups);
+ sourceGroup.AssignSource(*i);
+ }
+
+ // Compute which sources need unique object computation.
+ this->LocalGenerator->ComputeObjectNameRequirements(sourceGroups);
+}
+
bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
cmSourceFile* source)
-{
+{
cmSourceFile& sf = *source;
+ cmLocalVisualStudio7Generator* lg = this->LocalGenerator;
+
+ // Compute the maximum length full path to the intermediate
+ // files directory for any configuration. This is used to construct
+ // object file names that do not produce paths that are too long.
+ std::string dir_max;
+ lg->ComputeMaxDirectoryLength(dir_max, *this->Target);
+
+ std::string objectName;
+ if(lg->NeedObjectName.find(&sf) != lg->NeedObjectName.end())
+ {
+ objectName = lg->GetObjectFileNameWithoutTarget(sf, dir_max);
+ }
std::string flags;
std::string defines;
if(const char* cflags = sf.GetProperty("COMPILE_FLAGS"))
@@ -470,13 +509,22 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
flags += " /TC ";
}
}
+ bool hasFlags = false;
// for the first time we need a new line if there is something
// produced here.
const char* firstString = ">\n";
+ if(objectName.size())
+ {
+ (*this->BuildFileStream ) << firstString;
+ firstString = "";
+ hasFlags = true;
+ this->WriteString("<ObjectFileName>", 3);
+ (*this->BuildFileStream )
+ << "$(Configuration)/" << objectName << "</ObjectFileName>\n";
+ }
std::vector<std::string> *configs =
static_cast<cmGlobalVisualStudio7Generator *>
(this->GlobalGenerator)->GetConfigurations();
- bool hasFlags = false;
for( std::vector<std::string>::iterator config = configs->begin();
config != configs->end(); ++config)
{
@@ -519,6 +567,10 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions()
{
+ if(this->Target->GetType() > cmTarget::MODULE_LIBRARY)
+ {
+ return;
+ }
this->WriteString("<PropertyGroup>\n", 2);
this->WriteString("<_ProjectFileVersion>10.0.20506.1"
"</_ProjectFileVersion>\n", 3);
@@ -672,6 +724,12 @@ WriteClOptions(std::string const& configName,
flags += " /TP ";
}
}
+ // Add the target-specific flags.
+ if(const char* targetFlags = this->Target->GetProperty("COMPILE_FLAGS"))
+ {
+ flags += " ";
+ flags += targetFlags;
+ }
std::string configUpper = cmSystemTools::UpperCase(configName);
std::string defPropName = "COMPILE_DEFINITIONS_";
defPropName += configUpper;
@@ -877,8 +935,13 @@ void cmVisualStudio10TargetGenerator::WriteLinkOptions(std::string const&
for(std::vector<std::string>::const_iterator d = ldirs.begin();
d != ldirs.end(); ++d)
{
+ // first just full path
+ linkDirs += sep;
+ linkDirs += *d;
linkDirs += sep;
+ // next path with configuration type Debug, Release, etc
linkDirs += *d;
+ linkDirs += "/$(Configuration)";
sep = ";";
}
linkDirs += "%(AdditionalLibraryDirectories)";
@@ -910,9 +973,10 @@ void cmVisualStudio10TargetGenerator::WriteLinkOptions(std::string const&
targetNameImport, targetNamePDB,
config.c_str());
}
- std::string dir = this->Target->GetDirectory(config.c_str());
+ std::string imLib = this->Target->GetDirectory(config.c_str(), true);
+ std::string dir = this->Target->GetDirectory(config.c_str(), true);
dir += "/";
- std::string imLib = dir;
+ imLib += "/";
imLib += targetNameImport;
std::string pdb = dir;
pdb += targetNamePDB;
@@ -997,6 +1061,8 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups()
}
// output midl flags <Midl></Midl>
this->WriteMidlOptions(*i, includes);
+ // write events
+ this->WriteEvents(*i);
// output link flags <Link></Link>
this->WriteLinkOptions(*i);
// output lib flags <Lib></Lib>
@@ -1005,16 +1071,78 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups()
}
}
+void
+cmVisualStudio10TargetGenerator::WriteEvents(std::string const& configName)
+{
+ this->WriteEvent("PreLinkEvent",
+ this->Target->GetPreLinkCommands(), configName);
+ this->WriteEvent("PreBuildEvent",
+ this->Target->GetPreBuildCommands(), configName);
+ this->WriteEvent("PostBuildEvent",
+ this->Target->GetPostBuildCommands(), configName);
+}
+
+void cmVisualStudio10TargetGenerator::WriteEvent(
+ const char* name,
+ std::vector<cmCustomCommand> & commands,
+ std::string const& configName)
+{
+ if(commands.size() == 0)
+ {
+ return;
+ }
+ this->WriteString("<", 2);
+ (*this->BuildFileStream ) << name << ">\n";
+ cmLocalVisualStudio7Generator* lg = this->LocalGenerator;
+ std::string script;
+ const char* pre = "";
+ std::string comment;
+ for(std::vector<cmCustomCommand>::iterator i = commands.begin();
+ i != commands.end(); ++i)
+ {
+ cmCustomCommand& command = *i;
+ comment += pre;
+ comment += lg->ConstructComment(command);
+ script += pre;
+ pre = "\n";
+ script +=
+ lg->ConstructScript(command.GetCommandLines(),
+ command.GetWorkingDirectory(),
+ configName.c_str(),
+ command.GetEscapeOldStyle(),
+ command.GetEscapeAllowMakeVars());
+ }
+ this->WriteString("<Message>",3);
+ (*this->BuildFileStream ) << comment << "</Message>\n";
+ this->WriteString("<Command>", 3);
+ (*this->BuildFileStream ) << script;
+ (*this->BuildFileStream ) << "</Command>" << "\n";
+ this->WriteString("</", 2);
+ (*this->BuildFileStream ) << name << ">\n";
+}
+
void cmVisualStudio10TargetGenerator::WriteProjectReferences()
{
- // TODO
- // This should have dependent targets listed like this:
- /*
- <ItemGroup>
- <ProjectReference Include="ZERO_CHECK.vcxproj">
- <Project>{2f1e4f3c-0a51-46c3-aaf9-e486599604f2}</Project>
- </ProjectReference>
- </ItemGroup>
- */
+ cmGlobalGenerator::TargetDependSet& depends
+ = this->GlobalGenerator->GetTargetDirectDepends(*this->Target);
+ this->WriteString("<ItemGroup>\n", 1);
+ for( cmGlobalGenerator::TargetDependSet::const_iterator i = depends.begin();
+ i != depends.end(); ++i)
+ {
+ cmTarget* dt = *i;
+ this->WriteString("<ProjectReference Include=\"", 2);
+ cmMakefile* mf = dt->GetMakefile();
+ std::string path = mf->GetStartOutputDirectory();
+ path += "/";
+ path += dt->GetName();
+ path += ".vcxproj";
+ (*this->BuildFileStream) << path << "\">\n";
+ this->WriteString("<Project>", 3);
+ (*this->BuildFileStream)
+ << this->GlobalGenerator->GetGUID(dt->GetName())
+ << "</Project>\n";
+ this->WriteString("</ProjectReference>\n", 2);
+ }
+ this->WriteString("</ItemGroup>\n", 1);
}
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 77f5b91..7564a86 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -70,7 +70,13 @@ private:
bool OutputSourceSpecificFlags(cmSourceFile* source);
void AddLibraries(cmComputeLinkInformation& cli, std::string& libstring);
void WriteLibOptions(std::string const& config);
+ void WriteEvents(std::string const& configName);
+ void WriteEvent(const char* name, std::vector<cmCustomCommand> & commands,
+ std::string const& configName);
+ void ComputeObjectNames();
private:
+ std::string ModuleDefinitionFile;
+ std::string PathToVcxproj;
cmTarget* Target;
cmMakefile* Makefile;
std::string Platform;
diff --git a/Tests/Complex/Library/CMakeLists.txt b/Tests/Complex/Library/CMakeLists.txt
index d21e959..281e48a 100644
--- a/Tests/Complex/Library/CMakeLists.txt
+++ b/Tests/Complex/Library/CMakeLists.txt
@@ -52,9 +52,9 @@ DEFINE_PROPERTY(
FULL_DOCS "A simple etst proerty that means nothign and is used for nothing"
)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
-IF(NOT BEOS) # No libm on BeOS.
+IF(NOT BEOS AND NOT WIN32) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
-ENDIF(NOT BEOS)
+ENDIF(NOT BEOS AND NOT WIN32)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR")
diff --git a/Tests/ComplexOneConfig/Library/CMakeLists.txt b/Tests/ComplexOneConfig/Library/CMakeLists.txt
index d21e959..281e48a 100644
--- a/Tests/ComplexOneConfig/Library/CMakeLists.txt
+++ b/Tests/ComplexOneConfig/Library/CMakeLists.txt
@@ -52,9 +52,9 @@ DEFINE_PROPERTY(
FULL_DOCS "A simple etst proerty that means nothign and is used for nothing"
)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
-IF(NOT BEOS) # No libm on BeOS.
+IF(NOT BEOS AND NOT WIN32) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
-ENDIF(NOT BEOS)
+ENDIF(NOT BEOS AND NOT WIN32)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR")
diff --git a/Tests/ComplexRelativePaths/Library/CMakeLists.txt b/Tests/ComplexRelativePaths/Library/CMakeLists.txt
index d21e959..281e48a 100644
--- a/Tests/ComplexRelativePaths/Library/CMakeLists.txt
+++ b/Tests/ComplexRelativePaths/Library/CMakeLists.txt
@@ -52,9 +52,9 @@ DEFINE_PROPERTY(
FULL_DOCS "A simple etst proerty that means nothign and is used for nothing"
)
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR)
-IF(NOT BEOS) # No libm on BeOS.
+IF(NOT BEOS AND NOT WIN32) # No libm on BeOS.
SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm")
-ENDIF(NOT BEOS)
+ENDIF(NOT BEOS AND NOT WIN32)
GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO)
IF(${FOO_BAR_VAR} MATCHES "BAR")
ELSE(${FOO_BAR_VAR} MATCHES "BAR")