diff options
Diffstat (limited to 'Source/cmVisualStudio10TargetGenerator.cxx')
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 193 |
1 files changed, 124 insertions, 69 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index f472d8a..1dff675 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -250,11 +250,10 @@ cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator( this->TargetCompileAsWinRT = false; this->IsMissingFiles = false; this->DefaultArtifactDir = - this->LocalGenerator->GetCurrentBinaryDirectory() + std::string("/") + + this->LocalGenerator->GetCurrentBinaryDirectory() + "/" + this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget); - this->InSourceBuild = - (strcmp(this->Makefile->GetCurrentSourceDirectory(), - this->Makefile->GetCurrentBinaryDirectory()) == 0); + this->InSourceBuild = (this->Makefile->GetCurrentSourceDirectory() == + this->Makefile->GetCurrentBinaryDirectory()); } cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator() @@ -370,7 +369,7 @@ void cmVisualStudio10TargetGenerator::Generate() path += "/"; path += this->Name; path += ProjectFileExtension; - cmGeneratedFileStream BuildFileStream(path.c_str()); + cmGeneratedFileStream BuildFileStream(path); const std::string PathToProjectFile = path; BuildFileStream.SetCopyIfDifferent(true); @@ -722,8 +721,7 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0) if (!name.empty()) { std::string path = i.second.GetValue(); if (!cmsys::SystemTools::FileIsFullPath(path)) { - path = std::string(this->Makefile->GetCurrentSourceDirectory()) + - "/" + path; + path = this->Makefile->GetCurrentSourceDirectory() + "/" + path; } ConvertToWindowsSlash(path); this->DotNetHintReferences[""].push_back( @@ -929,8 +927,10 @@ void cmVisualStudio10TargetGenerator::WriteXamlFilesGroup(Elem& e0) e2.SetHasElements(); if (this->ProjectType == csproj && !this->InSourceBuild) { // add <Link> tag to written XAML source if necessary - const std::string srcDir = this->Makefile->GetCurrentSourceDirectory(); - const std::string binDir = this->Makefile->GetCurrentBinaryDirectory(); + const std::string& srcDir = + this->Makefile->GetCurrentSourceDirectory(); + const std::string& binDir = + this->Makefile->GetCurrentBinaryDirectory(); std::string link; if (obj.find(srcDir) == 0) { link = obj.substr(srcDir.length() + 1); @@ -1402,7 +1402,7 @@ void cmVisualStudio10TargetGenerator::WriteGroups() path += computeProjectFileExtension(this->GeneratorTarget, *this->Configurations.begin()); path += ".filters"; - cmGeneratedFileStream fout(path.c_str()); + cmGeneratedFileStream fout(path); fout.SetCopyIfDifferent(true); char magic[] = { char(0xEF), char(0xBB), char(0xBF) }; fout.write(magic, 3); @@ -1746,10 +1746,8 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, e2.Element("Link", deployLocation + "\\%(FileName)%(Extension)"); } for (size_t i = 0; i != this->Configurations.size(); ++i) { - if (0 == - strcmp( - cge->Evaluate(this->LocalGenerator, this->Configurations[i]), - "1")) { + if (cge->Evaluate(this->LocalGenerator, this->Configurations[i]) == + "1") { e2.WritePlatformConfigTag("DeploymentContent", "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] + "|" + @@ -1797,14 +1795,14 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, ge.Parse(shaderEnableDebug); for (size_t i = 0; i != this->Configurations.size(); ++i) { - const char* enableDebug = + const std::string& enableDebug = cge->Evaluate(this->LocalGenerator, this->Configurations[i]); - if (strlen(enableDebug) > 0) { + if (!enableDebug.empty()) { e2.WritePlatformConfigTag( "EnableDebuggingInformation", "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] + "|" + this->Platform + "'", - cmSystemTools::IsOn(enableDebug) ? "true" : "false"); + cmSystemTools::IsOn(enableDebug.c_str()) ? "true" : "false"); } } } @@ -1814,14 +1812,15 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, ge.Parse(shaderDisableOptimizations); for (size_t i = 0; i != this->Configurations.size(); ++i) { - const char* disableOptimizations = + const std::string& disableOptimizations = cge->Evaluate(this->LocalGenerator, this->Configurations[i]); - if (strlen(disableOptimizations) > 0) { + if (!disableOptimizations.empty()) { e2.WritePlatformConfigTag( "DisableOptimizations", "'$(Configuration)|$(Platform)'=='" + this->Configurations[i] + "|" + this->Platform + "'", - (cmSystemTools::IsOn(disableOptimizations) ? "true" : "false")); + (cmSystemTools::IsOn(disableOptimizations.c_str()) ? "true" + : "false")); } } } @@ -1882,7 +1881,7 @@ void cmVisualStudio10TargetGenerator::WriteSource(Elem& e2, std::string sourceRel = this->ConvertPath(sf->GetFullPath(), true); size_t const maxLen = 250; if (sf->GetCustomCommand() || - ((strlen(this->LocalGenerator->GetCurrentBinaryDirectory()) + 1 + + ((this->LocalGenerator->GetCurrentBinaryDirectory().length() + 1 + sourceRel.length()) <= maxLen)) { forceRelative = true; sourceFile = sourceRel; @@ -1891,7 +1890,7 @@ void cmVisualStudio10TargetGenerator::WriteSource(Elem& e2, } } ConvertToWindowsSlash(sourceFile); - e2.StartElement(tool.c_str()); + e2.StartElement(tool); e2.Attribute("Include", sourceFile); ToolSource toolSource = { sf, forceRelative }; @@ -2133,7 +2132,7 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( if (configDependentFlags) { clOptions.Parse(genexInterpreter.Evaluate(flags, "COMPILE_FLAGS")); } else { - clOptions.Parse(flags.c_str()); + clOptions.Parse(flags); } if (!options.empty()) { std::string expandedOptions; @@ -2144,7 +2143,7 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( } else { this->LocalGenerator->AppendCompileOptions(expandedOptions, options); } - clOptions.Parse(expandedOptions.c_str()); + clOptions.Parse(expandedOptions); } if (clOptions.HasFlag("DisableSpecificWarnings")) { clOptions.AppendFlag("DisableSpecificWarnings", @@ -2290,14 +2289,51 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions( if (const char* workingDir = this->GeneratorTarget->GetProperty( "VS_DEBUGGER_WORKING_DIRECTORY")) { + cmGeneratorExpression ge; + std::unique_ptr<cmCompiledGeneratorExpression> cge = + ge.Parse(workingDir); + std::string genWorkingDir = + cge->Evaluate(this->LocalGenerator, config); + e1.WritePlatformConfigTag("LocalDebuggerWorkingDirectory", cond, - workingDir); + genWorkingDir); + } + + if (const char* environment = + this->GeneratorTarget->GetProperty("VS_DEBUGGER_ENVIRONMENT")) { + cmGeneratorExpression ge; + std::unique_ptr<cmCompiledGeneratorExpression> cge = + ge.Parse(environment); + std::string genEnvironment = + cge->Evaluate(this->LocalGenerator, config); + + e1.WritePlatformConfigTag("LocalDebuggerEnvironment", cond, + genEnvironment); } if (const char* debuggerCommand = this->GeneratorTarget->GetProperty("VS_DEBUGGER_COMMAND")) { + + cmGeneratorExpression ge; + std::unique_ptr<cmCompiledGeneratorExpression> cge = + ge.Parse(debuggerCommand); + std::string genDebuggerCommand = + cge->Evaluate(this->LocalGenerator, config); + e1.WritePlatformConfigTag("LocalDebuggerCommand", cond, - debuggerCommand); + genDebuggerCommand); + } + + if (const char* commandArguments = this->GeneratorTarget->GetProperty( + "VS_DEBUGGER_COMMAND_ARGUMENTS")) { + cmGeneratorExpression ge; + std::unique_ptr<cmCompiledGeneratorExpression> cge = + ge.Parse(commandArguments); + std::string genCommandArguments = + cge->Evaluate(this->LocalGenerator, config); + + e1.WritePlatformConfigTag("LocalDebuggerCommandArguments", cond, + genCommandArguments); } std::string name = @@ -2458,6 +2494,16 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( if (this->MSTools) { if (this->ProjectType == vcxproj) { clOptions.FixExceptionHandlingDefault(); + if (this->GlobalGenerator->GetVersion() >= + cmGlobalVisualStudioGenerator::VS15) { + // Toolsets that come with VS 2017 may now enable UseFullPaths + // by default and there is no negative /FC option that projects + // can use to switch it back. Older toolsets disable this by + // default anyway so this will not hurt them. If the project + // is using an explicit /FC option then parsing flags will + // replace this setting with "true" below. + clOptions.AddFlag("UseFullPaths", "false"); + } clOptions.AddFlag("PrecompiledHeader", "NotUsing"); std::string asmLocation = configName + "/"; clOptions.AddFlag("AssemblerListingLocation", asmLocation); @@ -2491,8 +2537,8 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( } } - clOptions.Parse(flags.c_str()); - clOptions.Parse(defineFlags.c_str()); + clOptions.Parse(flags); + clOptions.Parse(defineFlags); std::vector<std::string> targetDefines; switch (this->ProjectType) { case vcxproj: @@ -2529,8 +2575,10 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( } if (this->MSTools) { - // If we have the VS_WINRT_COMPONENT set then force Compile as WinRT. - if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT")) { + // If we have the VS_WINRT_COMPONENT or CMAKE_VS_WINRT_BY_DEFAULT + // set then force Compile as WinRT. + if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT") || + this->Makefile->IsOn("CMAKE_VS_WINRT_BY_DEFAULT")) { clOptions.AddFlag("CompileAsWinRT", "true"); // For WinRT components, add the _WINRT_DLL define to produce a lib if (this->GeneratorTarget->GetType() == cmStateEnums::SHARED_LIBRARY || @@ -2659,7 +2707,7 @@ bool cmVisualStudio10TargetGenerator::ComputeRcOptions( std::string(" ") + std::string(this->Makefile->GetSafeDefinition(rcConfigFlagsVar)); - rcOptions.Parse(flags.c_str()); + rcOptions.Parse(flags); // For historical reasons, add the C preprocessor defines to RC. Options& clOptions = *(this->ClOptions[configName]); @@ -2721,8 +2769,8 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions( // Get preprocessor definitions for this directory. std::string defineFlags = this->Makefile->GetDefineFlags(); - cudaOptions.Parse(flags.c_str()); - cudaOptions.Parse(defineFlags.c_str()); + cudaOptions.Parse(flags); + cudaOptions.Parse(defineFlags); cudaOptions.ParseFinish(); // If we haven't explicitly enabled GPU debug information @@ -2929,7 +2977,7 @@ bool cmVisualStudio10TargetGenerator::ComputeMasmOptions( std::string(" ") + std::string(this->Makefile->GetSafeDefinition(configFlagsVar)); - masmOptions.Parse(flags.c_str()); + masmOptions.Parse(flags); // Get includes for this target masmOptions.AddIncludes(this->GetIncludes(configName, "ASM_MASM")); @@ -2986,7 +3034,7 @@ bool cmVisualStudio10TargetGenerator::ComputeNasmOptions( this->Makefile->GetSafeDefinition("CMAKE_ASM_NASM_OBJECT_FORMAT")) + std::string(" ") + std::string(this->Makefile->GetSafeDefinition(configFlagsVar)); - nasmOptions.Parse(flags.c_str()); + nasmOptions.Parse(flags); // Get includes for this target nasmOptions.AddIncludes(this->GetIncludes(configName, "ASM_NASM")); @@ -3023,16 +3071,21 @@ void cmVisualStudio10TargetGenerator::WriteLibOptions( this->GeneratorTarget->GetType() != cmStateEnums::OBJECT_LIBRARY) { return; } + + const std::string& linkLanguage = + this->GeneratorTarget->GetLinkClosure(config)->LinkerLanguage; + std::string libflags; this->LocalGenerator->GetStaticLibraryFlags( - libflags, cmSystemTools::UpperCase(config), this->GeneratorTarget); + libflags, cmSystemTools::UpperCase(config), linkLanguage, + this->GeneratorTarget); if (!libflags.empty()) { Elem e2(e1, "Lib"); cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator; cmVS10GeneratorOptions libOptions(this->LocalGenerator, cmVisualStudioGeneratorOptions::Linker, gg->GetLibFlagTable(), this); - libOptions.Parse(libflags.c_str()); + libOptions.Parse(libflags); OptionsHelper oh(libOptions, e2); oh.PrependInheritedString("AdditionalOptions"); oh.OutputFlagMap(); @@ -3239,6 +3292,11 @@ bool cmVisualStudio10TargetGenerator::ComputeLinkOptions( flags += flagsConfig; } + std::vector<std::string> opts; + this->GeneratorTarget->GetLinkOptions(opts, config, linkLanguage); + // LINK_OPTIONS are escaped. + this->LocalGenerator->AppendCompileOptions(flags, opts); + cmComputeLinkInformation* pcli = this->GeneratorTarget->GetLinkInformation(config); if (!pcli) { @@ -3373,7 +3431,7 @@ bool cmVisualStudio10TargetGenerator::ComputeLinkOptions( linkOptions.AddFlag("SoName", targetNameSO); } - linkOptions.Parse(flags.c_str()); + linkOptions.Parse(flags); linkOptions.FixManifestUACFlags(); if (this->MSTools) { @@ -3740,31 +3798,29 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences(Elem& e0) e2.Element("Project", "{" + this->GlobalGenerator->GetGUID(name) + "}"); e2.Element("Name", name); this->WriteDotNetReferenceCustomTags(e2, name); - if (this->Managed) { - // If the dependency target is not managed (compiled with /clr or - // C# target) we cannot reference it and have to set - // 'ReferenceOutputAssembly' to false. - auto referenceNotManaged = - dt->GetManagedType("") < cmGeneratorTarget::ManagedType::Mixed; - // Workaround to check for manually set /clr flags. - if (referenceNotManaged) { - if (const auto* flags = dt->GetProperty("COMPILE_OPTIONS")) { - std::string flagsStr = flags; - if (flagsStr.find("clr") != std::string::npos) { - // There is a warning already issued when building the flags. - referenceNotManaged = false; - } + + // If the dependency target is not managed (compiled with /clr or + // C# target) we cannot reference it and have to set + // 'ReferenceOutputAssembly' to false. + auto referenceNotManaged = + dt->GetManagedType("") < cmGeneratorTarget::ManagedType::Mixed; + // Workaround to check for manually set /clr flags. + if (referenceNotManaged) { + if (const auto* flags = dt->GetProperty("COMPILE_OPTIONS")) { + std::string flagsStr = flags; + if (flagsStr.find("clr") != std::string::npos) { + // There is a warning already issued when building the flags. + referenceNotManaged = false; } } - // Workaround for static library C# targets - if (referenceNotManaged && - dt->GetType() == cmStateEnums::STATIC_LIBRARY) { - referenceNotManaged = !dt->HasLanguage("CSharp", ""); - } - if (referenceNotManaged) { - e2.Element("ReferenceOutputAssembly", "false"); - e2.Element("CopyToOutputDirectory", "Never"); - } + } + // Workaround for static library C# targets + if (referenceNotManaged && dt->GetType() == cmStateEnums::STATIC_LIBRARY) { + referenceNotManaged = !dt->HasLanguage("CSharp", ""); + } + if (referenceNotManaged) { + e2.Element("ReferenceOutputAssembly", "false"); + e2.Element("CopyToOutputDirectory", "Never"); } } } @@ -4094,8 +4150,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWP80(Elem& e1) // this can cause an overwrite problem if projects aren't organized in // folders std::string manifestFile = - this->LocalGenerator->GetCurrentBinaryDirectory() + - std::string("/WMAppManifest.xml"); + this->LocalGenerator->GetCurrentBinaryDirectory() + "/WMAppManifest.xml"; std::string artifactDir = this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget); ConvertToWindowsSlash(artifactDir); @@ -4103,7 +4158,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWP80(Elem& e1) std::string targetNameXML = cmVS10EscapeXML(this->GeneratorTarget->GetName()); - cmGeneratedFileStream fout(manifestFile.c_str()); + cmGeneratedFileStream fout(manifestFile); fout.SetCopyIfDifferent(true); /* clang-format off */ @@ -4186,7 +4241,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWP81(Elem& e1) std::string targetNameXML = cmVS10EscapeXML(this->GeneratorTarget->GetName()); - cmGeneratedFileStream fout(manifestFile.c_str()); + cmGeneratedFileStream fout(manifestFile); fout.SetCopyIfDifferent(true); /* clang-format off */ @@ -4249,7 +4304,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWS80(Elem& e1) std::string targetNameXML = cmVS10EscapeXML(this->GeneratorTarget->GetName()); - cmGeneratedFileStream fout(manifestFile.c_str()); + cmGeneratedFileStream fout(manifestFile); fout.SetCopyIfDifferent(true); /* clang-format off */ @@ -4304,7 +4359,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWS81(Elem& e1) std::string targetNameXML = cmVS10EscapeXML(this->GeneratorTarget->GetName()); - cmGeneratedFileStream fout(manifestFile.c_str()); + cmGeneratedFileStream fout(manifestFile); fout.SetCopyIfDifferent(true); /* clang-format off */ @@ -4364,7 +4419,7 @@ void cmVisualStudio10TargetGenerator::WriteMissingFilesWS10_0(Elem& e1) std::string targetNameXML = cmVS10EscapeXML(this->GeneratorTarget->GetName()); - cmGeneratedFileStream fout(manifestFile.c_str()); + cmGeneratedFileStream fout(manifestFile); fout.SetCopyIfDifferent(true); /* clang-format off */ @@ -4531,7 +4586,7 @@ void cmVisualStudio10TargetGenerator::GetCSharpSourceLink( std::string const& binaryDir = LocalGenerator->GetCurrentBinaryDirectory(); if (!cmSystemTools::IsSubDirectory(sourceFilePath, binaryDir)) { - const std::string stripFromPath = + const std::string& stripFromPath = this->Makefile->GetCurrentSourceDirectory(); if (sourceFilePath.find(stripFromPath) == 0) { if (const char* l = sf->GetProperty("VS_CSHARP_Link")) { |