Fix incremental linking setting for Fortran + VS

This commit fixes a bug where it was impossible to specify
/INCREMENTAL to Fortran projects built with Visual Studio.

The problem was due to the fact that .vfproj files expect
the value of this flag to be "linkIncremental{No,Yes},
whereas .vcproj files expect this value to be 0, 1, or 2.

The implementation of this fix adds a new data structure for
Visual Studio linker flags specific to Fortran.  This can
easily be extended in the future if more such discrepencies
between C/C++ and Fortran linking are discovered.
This commit is contained in:
Zack Galbreath 2014-11-14 13:47:00 -05:00
parent 0700f2ef19
commit 17b0fe0305
3 changed files with 61 additions and 5 deletions

View File

@ -592,6 +592,15 @@ cmVS7FlagTable cmLocalVisualStudio7GeneratorLinkFlagTable[] =
{0,0,0,0,0} {0,0,0,0,0}
}; };
cmVS7FlagTable cmLocalVisualStudio7GeneratorFortranLinkFlagTable[] =
{
{"LinkIncremental", "INCREMENTAL:NO", "link incremental",
"linkIncrementalNo", 0},
{"LinkIncremental", "INCREMENTAL:YES", "link incremental",
"linkIncrementalYes", 0},
{0,0,0,0,0}
};
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Helper class to write build event <Tool .../> elements. // Helper class to write build event <Tool .../> elements.
class cmLocalVisualStudio7Generator::EventWriter class cmLocalVisualStudio7Generator::EventWriter
@ -1056,8 +1065,13 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout,
extraLinkOptions += " "; extraLinkOptions += " ";
extraLinkOptions += targetLinkFlags; extraLinkOptions += targetLinkFlags;
} }
Options linkOptions(this, Options::Linker, Options linkOptions(this, Options::Linker);
cmLocalVisualStudio7GeneratorLinkFlagTable); if(this->FortranProject)
{
linkOptions.AddTable(cmLocalVisualStudio7GeneratorFortranLinkFlagTable);
}
linkOptions.AddTable(cmLocalVisualStudio7GeneratorLinkFlagTable);
linkOptions.Parse(extraLinkOptions.c_str()); linkOptions.Parse(extraLinkOptions.c_str());
if(!this->ModuleDefinitionFile.empty()) if(!this->ModuleDefinitionFile.empty())
{ {

View File

@ -24,6 +24,26 @@ std::string cmVisualStudioGeneratorOptionsEscapeForXML(std::string ret)
return ret; return ret;
} }
//----------------------------------------------------------------------------
cmVisualStudioGeneratorOptions
::cmVisualStudioGeneratorOptions(cmLocalVisualStudioGenerator* lg,
Tool tool,
cmVisualStudio10TargetGenerator* g):
cmIDEOptions(),
LocalGenerator(lg), Version(lg->GetVersion()), CurrentTool(tool),
TargetGenerator(g)
{
// Preprocessor definitions are not allowed for linker tools.
this->AllowDefine = (tool != Linker);
// Slash options are allowed for VS.
this->AllowSlash = true;
this->FortranRuntimeDebug = false;
this->FortranRuntimeDLL = false;
this->FortranRuntimeMT = false;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmVisualStudioGeneratorOptions cmVisualStudioGeneratorOptions
::cmVisualStudioGeneratorOptions(cmLocalVisualStudioGenerator* lg, ::cmVisualStudioGeneratorOptions(cmLocalVisualStudioGenerator* lg,
@ -36,9 +56,8 @@ cmVisualStudioGeneratorOptions
TargetGenerator(g) TargetGenerator(g)
{ {
// Store the given flag tables. // Store the given flag tables.
cmIDEFlagTable const** ft = this->FlagTable; this->AddTable(table);
if(table) { *ft++ = table; } this->AddTable(extraTable);
if(extraTable) { *ft++ = extraTable; }
// Preprocessor definitions are not allowed for linker tools. // Preprocessor definitions are not allowed for linker tools.
this->AllowDefine = (tool != Linker); this->AllowDefine = (tool != Linker);
@ -51,6 +70,22 @@ cmVisualStudioGeneratorOptions
this->FortranRuntimeMT = false; this->FortranRuntimeMT = false;
} }
//----------------------------------------------------------------------------
void cmVisualStudioGeneratorOptions::AddTable(cmVS7FlagTable const* table)
{
if(table)
{
for(int i=0; i < FlagTableCount; ++i)
{
if (!this->FlagTable[i])
{
this->FlagTable[i] = table;
break;
}
}
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmVisualStudioGeneratorOptions::FixExceptionHandlingDefault() void cmVisualStudioGeneratorOptions::FixExceptionHandlingDefault()
{ {

View File

@ -38,6 +38,13 @@ public:
cmVS7FlagTable const* extraTable = 0, cmVS7FlagTable const* extraTable = 0,
cmVisualStudio10TargetGenerator* g = 0); cmVisualStudio10TargetGenerator* g = 0);
cmVisualStudioGeneratorOptions(cmLocalVisualStudioGenerator* lg,
Tool tool,
cmVisualStudio10TargetGenerator* g = 0);
// Add a table of flags.
void AddTable(cmVS7FlagTable const* table);
// Store options from command line flags. // Store options from command line flags.
void Parse(const char* flags); void Parse(const char* flags);
void ParseFinish(); void ParseFinish();