summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2018-05-08 12:36:20 (GMT)
committerKitware Robot <kwrobot@kitware.com>2018-05-08 12:36:57 (GMT)
commitf60e2eb3c59f8c2a8a1f4f8013da8eeedc0c459d (patch)
tree0ac9ad26e178c3795872f2af7a73a5cddc3cf84e /Source
parent42d198744b8645ee35633c7af6e122d152bda8e9 (diff)
parente76a0c6071337a6114c6a5851422aa735addb74b (diff)
downloadCMake-f60e2eb3c59f8c2a8a1f4f8013da8eeedc0c459d.zip
CMake-f60e2eb3c59f8c2a8a1f4f8013da8eeedc0c459d.tar.gz
CMake-f60e2eb3c59f8c2a8a1f4f8013da8eeedc0c459d.tar.bz2
Merge topic 'vs-improve-options'
e76a0c6071 VS: improve options generation Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !2044
Diffstat (limited to 'Source')
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx210
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h13
2 files changed, 99 insertions, 124 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 405d2ca..d1302fe 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -77,23 +77,14 @@ struct cmVisualStudio10TargetGenerator::Elem
this->WriteString("<") << tag;
return *this;
}
- template <typename T>
- void WriteElem(const char* tag, const T& val)
- {
- this->WriteString("<") << tag << ">" << val << "</" << tag << ">\n";
- }
void Element(const char* tag, const std::string& val)
{
- Elem(*this).WriteElem(tag, cmVS10EscapeXML(val));
- }
- template <typename T>
- void Attr(const char* an, const T& av)
- {
- this->S << " " << an << "=\"" << av << "\"";
+ Elem(*this).WriteString("<") << tag << ">" << cmVS10EscapeXML(val) << "</"
+ << tag << ">\n";
}
Elem& Attribute(const char* an, const std::string& av)
{
- Attr(an, cmVS10EscapeAttr(av));
+ this->S << " " << an << "=\"" << cmVS10EscapeAttr(av) << "\"";
return *this;
}
// This method for now assumes that this->Tag has been set, e.g. by calling
@@ -117,6 +108,7 @@ struct cmVisualStudio10TargetGenerator::Elem
class cmVS10GeneratorOptions : public cmVisualStudioGeneratorOptions
{
public:
+ typedef cmVisualStudio10TargetGenerator::Elem Elem;
cmVS10GeneratorOptions(cmLocalVisualStudioGenerator* lg, Tool tool,
cmVS7FlagTable const* table,
cmVisualStudio10TargetGenerator* g = nullptr)
@@ -125,48 +117,50 @@ public:
{
}
- void OutputFlag(std::ostream& fout, int indent, const char* tag,
+ void OutputFlag(std::ostream& /*fout*/, int /*indent*/, const char* tag,
const std::string& content) override
{
if (!this->GetConfiguration().empty()) {
// if there are configuration specific flags, then
// use the configuration specific tag for PreprocessorDefinitions
this->TargetGenerator->WritePlatformConfigTag(
- tag, this->GetConfiguration(), indent, content);
+ tag, this->GetConfiguration(), *Parent, content);
} else {
- fout.fill(' ');
- fout.width(indent * 2);
- // write an empty string to get the fill level indent to print
- fout << "";
- fout << "<" << tag << ">";
- fout << cmVS10EscapeXML(content);
- fout << "</" << tag << ">\n";
+ Parent->Element(tag, content);
}
}
private:
- cmVisualStudio10TargetGenerator* TargetGenerator;
+ cmVisualStudio10TargetGenerator* const TargetGenerator;
+ Elem* Parent = nullptr;
+ friend cmVisualStudio10TargetGenerator::OptionsHelper;
};
-inline void cmVisualStudio10TargetGenerator::WriteElem(const char* tag,
- const char* val,
- int indentLevel)
-{
- Elem(*this->BuildFileStream, indentLevel).WriteElem(tag, val);
-}
-
-inline void cmVisualStudio10TargetGenerator::WriteElem(const char* tag,
- std::string const& val,
- int indentLevel)
+struct cmVisualStudio10TargetGenerator::OptionsHelper
{
- Elem(*this->BuildFileStream, indentLevel).WriteElem(tag, val);
-}
+ cmVS10GeneratorOptions& O;
+ OptionsHelper(cmVS10GeneratorOptions& o, Elem& e)
+ : O(o)
+ {
+ O.Parent = &e;
+ }
+ ~OptionsHelper() { O.Parent = nullptr; }
-inline void cmVisualStudio10TargetGenerator::WriteElemEscapeXML(
- const char* tag, std::string const& val, int indentLevel)
-{
- this->WriteElem(tag, cmVS10EscapeXML(val), indentLevel);
-}
+ void OutputPreprocessorDefinitions(const std::string& lang)
+ {
+ O.OutputPreprocessorDefinitions(O.Parent->S, O.Parent->Indent + 1, lang);
+ }
+ void OutputAdditionalIncludeDirectories(const std::string& lang)
+ {
+ O.OutputAdditionalIncludeDirectories(O.Parent->S, O.Parent->Indent + 1,
+ lang);
+ }
+ void OutputFlagMap() { O.OutputFlagMap(O.Parent->S, O.Parent->Indent + 1); }
+ void PrependInheritedString(std::string const& key)
+ {
+ O.PrependInheritedString(key);
+ }
+};
static std::string cmVS10EscapeComment(std::string comment)
{
@@ -275,18 +269,12 @@ std::string cmVisualStudio10TargetGenerator::CalcCondition(
}
void cmVisualStudio10TargetGenerator::WritePlatformConfigTag(
- const char* tag, const std::string& config, int indentLevel,
+ const char* tag, const std::string& config, Elem& parent,
const std::string& content)
{
- std::ostream& stream = *this->BuildFileStream;
- stream.fill(' ');
- stream.width(indentLevel * 2);
- stream << ""; // applies indentation
- stream << "<" << tag << " Condition=\"";
- stream << this->CalcCondition(config);
- stream << "\"";
- stream << ">" << cmVS10EscapeXML(content);
- stream << "</" << tag << ">\n";
+ Elem(parent, tag)
+ .Attribute("Condition", this->CalcCondition(config))
+ .Content(content);
}
std::ostream& cmVisualStudio10TargetGenerator::Elem::WriteString(
@@ -855,7 +843,7 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
s = "$(RootNamespace).";
}
s += "%(Filename).resources";
- this->WritePlatformConfigTag("LogicalName", i, e2.Indent + 1, s);
+ this->WritePlatformConfigTag("LogicalName", i, e2, s);
}
} else {
std::string binDir = this->Makefile->GetCurrentBinaryDirectory();
@@ -1187,7 +1175,8 @@ void cmVisualStudio10TargetGenerator::WriteMSToolConfigurationValuesManaged(
e1.Element("StartProgram", outDir + assemblyName + ".exe");
}
- o.OutputFlagMap(e1.S, e1.Indent + 1);
+ OptionsHelper oh(o, e1);
+ oh.OutputFlagMap();
}
//----------------------------------------------------------------------------
@@ -2135,7 +2124,6 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
// use them
if (!flags.empty() || !options.empty() || !configDefines.empty() ||
!includes.empty() || compileAs || noWinRT) {
- e2.SetHasElements();
cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator;
cmIDEFlagTable const* flagtable = nullptr;
const std::string& srclang = source->GetLanguage();
@@ -2201,10 +2189,11 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
}
clOptions.AddIncludes(includeList);
clOptions.SetConfiguration(config);
- clOptions.PrependInheritedString("AdditionalOptions");
- clOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1, lang);
- clOptions.OutputFlagMap(e2.S, e2.Indent + 1);
- clOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, lang);
+ OptionsHelper oh(clOptions, e2);
+ oh.PrependInheritedString("AdditionalOptions");
+ oh.OutputAdditionalIncludeDirectories(lang);
+ oh.OutputFlagMap();
+ oh.OutputPreprocessorDefinitions(lang);
}
}
if (this->IsXamlSource(source->GetFullPath())) {
@@ -2258,7 +2247,7 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions(
for (std::string const& config : this->Configurations) {
if (ttype >= cmStateEnums::UTILITY) {
this->WritePlatformConfigTag(
- "IntDir", config, e1.Indent + 1,
+ "IntDir", config, e1,
"$(Platform)\\$(Configuration)\\$(ProjectName)\\");
} else {
std::string intermediateDir =
@@ -2279,68 +2268,67 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions(
ConvertToWindowsSlash(intermediateDir);
ConvertToWindowsSlash(outDir);
- this->WritePlatformConfigTag("OutDir", config, e1.Indent + 1, outDir);
+ this->WritePlatformConfigTag("OutDir", config, e1, outDir);
- this->WritePlatformConfigTag("IntDir", config, e1.Indent + 1,
- intermediateDir);
+ this->WritePlatformConfigTag("IntDir", config, e1, intermediateDir);
if (const char* sdkExecutableDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES")) {
- this->WritePlatformConfigTag("ExecutablePath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("ExecutablePath", config, e1,
sdkExecutableDirectories);
}
if (const char* sdkIncludeDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_INCLUDE_DIRECTORIES")) {
- this->WritePlatformConfigTag("IncludePath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("IncludePath", config, e1,
sdkIncludeDirectories);
}
if (const char* sdkReferenceDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_REFERENCE_DIRECTORIES")) {
- this->WritePlatformConfigTag("ReferencePath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("ReferencePath", config, e1,
sdkReferenceDirectories);
}
if (const char* sdkLibraryDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_LIBRARY_DIRECTORIES")) {
- this->WritePlatformConfigTag("LibraryPath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("LibraryPath", config, e1,
sdkLibraryDirectories);
}
if (const char* sdkLibraryWDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES")) {
- this->WritePlatformConfigTag("LibraryWPath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("LibraryWPath", config, e1,
sdkLibraryWDirectories);
}
if (const char* sdkSourceDirectories =
this->Makefile->GetDefinition("CMAKE_VS_SDK_SOURCE_DIRECTORIES")) {
- this->WritePlatformConfigTag("SourcePath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("SourcePath", config, e1,
sdkSourceDirectories);
}
if (const char* sdkExcludeDirectories = this->Makefile->GetDefinition(
"CMAKE_VS_SDK_EXCLUDE_DIRECTORIES")) {
- this->WritePlatformConfigTag("ExcludePath", config, e1.Indent + 1,
+ this->WritePlatformConfigTag("ExcludePath", config, e1,
sdkExcludeDirectories);
}
if (const char* workingDir = this->GeneratorTarget->GetProperty(
"VS_DEBUGGER_WORKING_DIRECTORY")) {
this->WritePlatformConfigTag("LocalDebuggerWorkingDirectory", config,
- e1.Indent + 1, workingDir);
+ e1, workingDir);
}
if (const char* debuggerCommand =
this->GeneratorTarget->GetProperty("VS_DEBUGGER_COMMAND")) {
- this->WritePlatformConfigTag("LocalDebuggerCommand", config,
- e1.Indent + 1, debuggerCommand);
+ this->WritePlatformConfigTag("LocalDebuggerCommand", config, e1,
+ debuggerCommand);
}
std::string name =
cmSystemTools::GetFilenameWithoutLastExtension(targetNameFull);
- this->WritePlatformConfigTag("TargetName", config, e1.Indent + 1, name);
+ this->WritePlatformConfigTag("TargetName", config, e1, name);
std::string ext =
cmSystemTools::GetFilenameLastExtension(targetNameFull);
@@ -2349,7 +2337,7 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions(
// A single "." appears to be treated as an empty extension.
ext = ".";
}
- this->WritePlatformConfigTag("TargetExt", config, e1.Indent + 1, ext);
+ this->WritePlatformConfigTag("TargetExt", config, e1, ext);
this->OutputLinkIncremental(e1, config);
}
@@ -2375,12 +2363,12 @@ void cmVisualStudio10TargetGenerator::OutputLinkIncremental(
Options& linkOptions = *(this->LinkOptions[configName]);
const char* incremental = linkOptions.GetFlag("LinkIncremental");
- this->WritePlatformConfigTag("LinkIncremental", configName, e1.Indent + 1,
+ this->WritePlatformConfigTag("LinkIncremental", configName, e1,
(incremental ? incremental : "true"));
linkOptions.RemoveFlag("LinkIncremental");
const char* manifest = linkOptions.GetFlag("GenerateManifest");
- this->WritePlatformConfigTag("GenerateManifest", configName, e1.Indent + 1,
+ this->WritePlatformConfigTag("GenerateManifest", configName, e1,
(manifest ? manifest : "true"));
linkOptions.RemoveFlag("GenerateManifest");
@@ -2390,7 +2378,7 @@ void cmVisualStudio10TargetGenerator::OutputLinkIncremental(
for (const char** f = flags; *f; ++f) {
const char* flag = *f;
if (const char* value = linkOptions.GetFlag(flag)) {
- this->WritePlatformConfigTag(flag, configName, e1.Indent + 1, value);
+ this->WritePlatformConfigTag(flag, configName, e1, value);
linkOptions.RemoveFlag(flag);
}
}
@@ -2620,13 +2608,11 @@ void cmVisualStudio10TargetGenerator::WriteClOptions(
return;
}
Elem e2(e1, "ClCompile");
- e2.SetHasElements();
- clOptions.PrependInheritedString("AdditionalOptions");
- clOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1,
- this->LangForClCompile);
- clOptions.OutputFlagMap(e2.S, e2.Indent + 1);
- clOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1,
- this->LangForClCompile);
+ OptionsHelper oh(clOptions, e2);
+ oh.PrependInheritedString("AdditionalOptions");
+ oh.OutputAdditionalIncludeDirectories(this->LangForClCompile);
+ oh.OutputFlagMap();
+ oh.OutputPreprocessorDefinitions(this->LangForClCompile);
if (this->NsightTegra) {
if (const char* processMax =
@@ -2722,13 +2708,12 @@ void cmVisualStudio10TargetGenerator::WriteRCOptions(
return;
}
Elem e2(e1, "ResourceCompile");
- e2.SetHasElements();
- Options& rcOptions = *(this->RcOptions[configName]);
- rcOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, "RC");
- rcOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1, "RC");
+ OptionsHelper rcOptions(*(this->RcOptions[configName]), e2);
+ rcOptions.OutputPreprocessorDefinitions("RC");
+ rcOptions.OutputAdditionalIncludeDirectories("RC");
rcOptions.PrependInheritedString("AdditionalOptions");
- rcOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ rcOptions.OutputFlagMap();
e2.EndElement();
}
@@ -2871,13 +2856,12 @@ void cmVisualStudio10TargetGenerator::WriteCudaOptions(
return;
}
Elem e2(e1, "CudaCompile");
- e2.SetHasElements();
- Options& cudaOptions = *(this->CudaOptions[configName]);
- cudaOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1, "CUDA");
- cudaOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, "CUDA");
+ OptionsHelper cudaOptions(*(this->CudaOptions[configName]), e2);
+ cudaOptions.OutputAdditionalIncludeDirectories("CUDA");
+ cudaOptions.OutputPreprocessorDefinitions("CUDA");
cudaOptions.PrependInheritedString("AdditionalOptions");
- cudaOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ cudaOptions.OutputFlagMap();
e2.EndElement();
}
@@ -2945,9 +2929,8 @@ void cmVisualStudio10TargetGenerator::WriteCudaLinkOptions(
}
Elem e2(e1, "CudaLink");
- e2.SetHasElements();
- Options& cudaLinkOptions = *(this->CudaLinkOptions[configName]);
- cudaLinkOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ OptionsHelper cudaLinkOptions(*(this->CudaLinkOptions[configName]), e2);
+ cudaLinkOptions.OutputFlagMap();
e2.EndElement();
}
@@ -2995,17 +2978,15 @@ void cmVisualStudio10TargetGenerator::WriteMasmOptions(
return;
}
Elem e2(e1, "MASM");
- e2.SetHasElements();
// Preprocessor definitions and includes are shared with clOptions.
- Options& clOptions = *(this->ClOptions[configName]);
- clOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, "ASM_MASM");
+ OptionsHelper clOptions(*(this->ClOptions[configName]), e2);
+ clOptions.OutputPreprocessorDefinitions("ASM_MASM");
- Options& masmOptions = *(this->MasmOptions[configName]);
- masmOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1,
- "ASM_MASM");
+ OptionsHelper masmOptions(*(this->MasmOptions[configName]), e2);
+ masmOptions.OutputAdditionalIncludeDirectories("ASM_MASM");
masmOptions.PrependInheritedString("AdditionalOptions");
- masmOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ masmOptions.OutputFlagMap();
e2.EndElement();
}
@@ -3055,20 +3036,18 @@ void cmVisualStudio10TargetGenerator::WriteNasmOptions(
return;
}
Elem e2(e1, "NASM");
- e2.SetHasElements();
std::vector<std::string> includes =
this->GetIncludes(configName, "ASM_NASM");
- Options& nasmOptions = *(this->NasmOptions[configName]);
- nasmOptions.OutputAdditionalIncludeDirectories(e2.S, e2.Indent + 1,
- "ASM_NASM");
- nasmOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ OptionsHelper nasmOptions(*(this->NasmOptions[configName]), e2);
+ nasmOptions.OutputAdditionalIncludeDirectories("ASM_NASM");
+ nasmOptions.OutputFlagMap();
nasmOptions.PrependInheritedString("AdditionalOptions");
- nasmOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, "ASM_NASM");
+ nasmOptions.OutputPreprocessorDefinitions("ASM_NASM");
// Preprocessor definitions and includes are shared with clOptions.
- Options& clOptions = *(this->ClOptions[configName]);
- clOptions.OutputPreprocessorDefinitions(e2.S, e2.Indent + 1, "ASM_NASM");
+ OptionsHelper clOptions(*(this->ClOptions[configName]), e2);
+ clOptions.OutputPreprocessorDefinitions("ASM_NASM");
e2.EndElement();
}
@@ -3085,14 +3064,14 @@ void cmVisualStudio10TargetGenerator::WriteLibOptions(
libflags, cmSystemTools::UpperCase(config), this->GeneratorTarget);
if (!libflags.empty()) {
Elem e2(e1, "Lib");
- e2.SetHasElements();
cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator;
cmVS10GeneratorOptions libOptions(this->LocalGenerator,
cmVisualStudioGeneratorOptions::Linker,
gg->GetLibFlagTable(), this);
libOptions.Parse(libflags.c_str());
- libOptions.PrependInheritedString("AdditionalOptions");
- libOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ OptionsHelper oh(libOptions, e2);
+ oh.PrependInheritedString("AdditionalOptions");
+ oh.OutputFlagMap();
e2.EndElement();
}
@@ -3522,13 +3501,12 @@ void cmVisualStudio10TargetGenerator::WriteLinkOptions(
if (this->ProjectType == csproj) {
return;
}
- Options& linkOptions = *(this->LinkOptions[config]);
{
Elem e2(e1, "Link");
- e2.SetHasElements();
+ OptionsHelper linkOptions(*(this->LinkOptions[config]), e2);
linkOptions.PrependInheritedString("AdditionalOptions");
- linkOptions.OutputFlagMap(e2.S, e2.Indent + 1);
+ linkOptions.OutputFlagMap();
e2.EndElement();
}
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index ecf19d7..38c7725 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -32,10 +32,6 @@ public:
cmGlobalVisualStudio10Generator* gg);
~cmVisualStudio10TargetGenerator();
void Generate();
- // used by cmVisualStudioGeneratorOptions
- std::string CalcCondition(const std::string& config) const;
- void WritePlatformConfigTag(const char* tag, const std::string& config,
- int indentLevel, const std::string& content);
private:
struct ToolSource
@@ -54,13 +50,13 @@ private:
};
struct Elem;
+ struct OptionsHelper;
std::string ConvertPath(std::string const& path, bool forceRelative);
void WriteString(const char* line, int indentLevel);
- void WriteElem(const char* tag, const char* val, int indentLevel);
- void WriteElem(const char* tag, std::string const& val, int indentLevel);
- void WriteElemEscapeXML(const char* tag, std::string const& val,
- int indentLevel);
+ std::string CalcCondition(const std::string& config) const;
+ void WritePlatformConfigTag(const char* tag, const std::string& config,
+ Elem& parent, const std::string& content);
void WriteProjectConfigurations(Elem& e0);
void WriteProjectConfigurationValues(Elem& e0);
void WriteMSToolConfigurationValues(Elem& e1, std::string const& config);
@@ -182,6 +178,7 @@ private:
void GetCSharpSourceLink(cmSourceFile const* sf, std::string& link);
private:
+ friend class cmVS10GeneratorOptions;
typedef cmVS10GeneratorOptions Options;
typedef std::map<std::string, std::unique_ptr<Options>> OptionsMap;
OptionsMap ClOptions;