Fix use of module .def files for MS tools
We recognize .def source files and map them to the /DEF:<file> option in the MSVC tools. Previously this worked only for shared libraries. This commit cleans up the implementation and makes it work for executables too. See issue #9613.
This commit is contained in:
parent
caee3af3c5
commit
024d05adad
|
@ -887,6 +887,12 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout,
|
||||||
Options linkOptions(this, this->Version, Options::Linker,
|
Options linkOptions(this, this->Version, Options::Linker,
|
||||||
cmLocalVisualStudio7GeneratorLinkFlagTable);
|
cmLocalVisualStudio7GeneratorLinkFlagTable);
|
||||||
linkOptions.Parse(extraLinkOptions.c_str());
|
linkOptions.Parse(extraLinkOptions.c_str());
|
||||||
|
if(!this->ModuleDefinitionFile.empty())
|
||||||
|
{
|
||||||
|
std::string defFile =
|
||||||
|
this->ConvertToXMLOutputPath(this->ModuleDefinitionFile.c_str());
|
||||||
|
linkOptions.AddFlag("ModuleDefinitionFile", defFile.c_str());
|
||||||
|
}
|
||||||
switch(target.GetType())
|
switch(target.GetType())
|
||||||
{
|
{
|
||||||
case cmTarget::STATIC_LIBRARY:
|
case cmTarget::STATIC_LIBRARY:
|
||||||
|
@ -960,7 +966,6 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout,
|
||||||
fout << "\t\t\t\tAdditionalLibraryDirectories=\"";
|
fout << "\t\t\t\tAdditionalLibraryDirectories=\"";
|
||||||
this->OutputLibraryDirectories(fout, cli.GetDirectories());
|
this->OutputLibraryDirectories(fout, cli.GetDirectories());
|
||||||
fout << "\"\n";
|
fout << "\"\n";
|
||||||
this->OutputModuleDefinitionFile(fout, target);
|
|
||||||
temp = target.GetDirectory(configName);
|
temp = target.GetDirectory(configName);
|
||||||
temp += "/";
|
temp += "/";
|
||||||
temp += targetNamePDB;
|
temp += targetNamePDB;
|
||||||
|
@ -1080,26 +1085,6 @@ cmLocalVisualStudio7Generator
|
||||||
fout << "\t\t\t\tVersion=\"" << major << "." << minor << "\"\n";
|
fout << "\t\t\t\tVersion=\"" << major << "." << minor << "\"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmLocalVisualStudio7Generator
|
|
||||||
::OutputModuleDefinitionFile(std::ostream& fout,
|
|
||||||
cmTarget &target)
|
|
||||||
{
|
|
||||||
std::vector<cmSourceFile*> const& classes = target.GetSourceFiles();
|
|
||||||
for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
|
|
||||||
i != classes.end(); i++)
|
|
||||||
{
|
|
||||||
cmSourceFile* sf = *i;
|
|
||||||
if(cmSystemTools::UpperCase(sf->GetExtension()) == "DEF")
|
|
||||||
{
|
|
||||||
fout << "\t\t\t\tModuleDefinitionFile=\""
|
|
||||||
<< this->ConvertToXMLOutputPath(sf->GetFullPath().c_str())
|
|
||||||
<< "\"\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmLocalVisualStudio7GeneratorInternals
|
cmLocalVisualStudio7GeneratorInternals
|
||||||
|
@ -1174,6 +1159,7 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
||||||
std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();
|
std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();
|
||||||
|
|
||||||
// get the classes from the source lists then add them to the groups
|
// get the classes from the source lists then add them to the groups
|
||||||
|
this->ModuleDefinitionFile = "";
|
||||||
std::vector<cmSourceFile*>const & classes = target.GetSourceFiles();
|
std::vector<cmSourceFile*>const & classes = target.GetSourceFiles();
|
||||||
for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
|
for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
|
||||||
i != classes.end(); i++)
|
i != classes.end(); i++)
|
||||||
|
|
|
@ -102,7 +102,6 @@ private:
|
||||||
cmTarget& t, bool debug);
|
cmTarget& t, bool debug);
|
||||||
void OutputLibraryDirectories(std::ostream& fout,
|
void OutputLibraryDirectories(std::ostream& fout,
|
||||||
std::vector<std::string> const& dirs);
|
std::vector<std::string> const& dirs);
|
||||||
void OutputModuleDefinitionFile(std::ostream& fout, cmTarget &target);
|
|
||||||
void WriteProjectStart(std::ostream& fout, const char *libName,
|
void WriteProjectStart(std::ostream& fout, const char *libName,
|
||||||
cmTarget &tgt, std::vector<cmSourceGroup> &sgs);
|
cmTarget &tgt, std::vector<cmSourceGroup> &sgs);
|
||||||
void WriteProjectStartFortran(std::ostream& fout, const char *libName,
|
void WriteProjectStartFortran(std::ostream& fout, const char *libName,
|
||||||
|
|
|
@ -243,6 +243,8 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
|
||||||
this->LocalGenerator->AppendFlags
|
this->LocalGenerator->AppendFlags
|
||||||
(linkFlags, this->Target->GetProperty(linkFlagsConfig.c_str()));
|
(linkFlags, this->Target->GetProperty(linkFlagsConfig.c_str()));
|
||||||
|
|
||||||
|
this->AddModuleDefinitionFlag(linkFlags);
|
||||||
|
|
||||||
// Construct a list of files associated with this executable that
|
// Construct a list of files associated with this executable that
|
||||||
// may need to be cleaned.
|
// may need to be cleaned.
|
||||||
std::vector<std::string> exeCleanFiles;
|
std::vector<std::string> exeCleanFiles;
|
||||||
|
|
|
@ -146,27 +146,8 @@ void cmMakefileLibraryTargetGenerator::WriteSharedLibraryRules(bool relink)
|
||||||
|
|
||||||
this->LocalGenerator->AddConfigVariableFlags
|
this->LocalGenerator->AddConfigVariableFlags
|
||||||
(extraFlags, "CMAKE_SHARED_LINKER_FLAGS", this->ConfigName);
|
(extraFlags, "CMAKE_SHARED_LINKER_FLAGS", this->ConfigName);
|
||||||
if(this->Makefile->IsOn("WIN32") && !(this->Makefile->IsOn("CYGWIN")
|
this->AddModuleDefinitionFlag(extraFlags);
|
||||||
|| this->Makefile->IsOn("MINGW")))
|
|
||||||
{
|
|
||||||
const std::vector<cmSourceFile*>& sources =
|
|
||||||
this->Target->GetSourceFiles();
|
|
||||||
for(std::vector<cmSourceFile*>::const_iterator i = sources.begin();
|
|
||||||
i != sources.end(); ++i)
|
|
||||||
{
|
|
||||||
cmSourceFile* sf = *i;
|
|
||||||
if(sf->GetExtension() == "def")
|
|
||||||
{
|
|
||||||
extraFlags += " ";
|
|
||||||
extraFlags +=
|
|
||||||
this->Makefile->GetSafeDefinition("CMAKE_LINK_DEF_FILE_FLAG");
|
|
||||||
extraFlags +=
|
|
||||||
this->Convert(sf->GetFullPath().c_str(),
|
|
||||||
cmLocalGenerator::START_OUTPUT,
|
|
||||||
cmLocalGenerator::SHELL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,8 +172,8 @@ void cmMakefileLibraryTargetGenerator::WriteModuleLibraryRules(bool relink)
|
||||||
(extraFlags, this->Target->GetProperty(linkFlagsConfig.c_str()));
|
(extraFlags, this->Target->GetProperty(linkFlagsConfig.c_str()));
|
||||||
this->LocalGenerator->AddConfigVariableFlags
|
this->LocalGenerator->AddConfigVariableFlags
|
||||||
(extraFlags, "CMAKE_MODULE_LINKER_FLAGS", this->ConfigName);
|
(extraFlags, "CMAKE_MODULE_LINKER_FLAGS", this->ConfigName);
|
||||||
|
this->AddModuleDefinitionFlag(extraFlags);
|
||||||
|
|
||||||
// TODO: .def files should be supported here also.
|
|
||||||
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,7 +199,6 @@ void cmMakefileLibraryTargetGenerator::WriteFrameworkRules(bool relink)
|
||||||
this->LocalGenerator->AddConfigVariableFlags
|
this->LocalGenerator->AddConfigVariableFlags
|
||||||
(extraFlags, "CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS", this->ConfigName);
|
(extraFlags, "CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS", this->ConfigName);
|
||||||
|
|
||||||
// TODO: .def files should be supported here also.
|
|
||||||
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
this->WriteLibraryRules(linkRuleVar.c_str(), extraFlags.c_str(), relink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -170,6 +170,10 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules()
|
||||||
// This is an external object file. Just add it.
|
// This is an external object file. Just add it.
|
||||||
this->ExternalObjects.push_back((*source)->GetFullPath());
|
this->ExternalObjects.push_back((*source)->GetFullPath());
|
||||||
}
|
}
|
||||||
|
else if(cmSystemTools::UpperCase((*source)->GetExtension()) == "DEF")
|
||||||
|
{
|
||||||
|
this->ModuleDefinitionFile = (*source)->GetFullPath();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We only get here if a source file is not an external object
|
// We only get here if a source file is not an external object
|
||||||
|
@ -1734,3 +1738,27 @@ void cmMakefileTargetGenerator::AddFortranFlags(std::string& flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmMakefileTargetGenerator::AddModuleDefinitionFlag(std::string& flags)
|
||||||
|
{
|
||||||
|
if(this->ModuleDefinitionFile.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Create a per-language flag variable.
|
||||||
|
const char* defFileFlag =
|
||||||
|
this->Makefile->GetDefinition("CMAKE_LINK_DEF_FILE_FLAG");
|
||||||
|
if(!defFileFlag)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append the flag and value.
|
||||||
|
std::string flag = defFileFlag;
|
||||||
|
flag += this->Convert(this->ModuleDefinitionFile.c_str(),
|
||||||
|
cmLocalGenerator::START_OUTPUT,
|
||||||
|
cmLocalGenerator::SHELL);
|
||||||
|
this->LocalGenerator->AppendFlags(flags, flag.c_str());
|
||||||
|
}
|
||||||
|
|
|
@ -186,6 +186,9 @@ protected:
|
||||||
std::vector<std::string> Objects;
|
std::vector<std::string> Objects;
|
||||||
std::vector<std::string> ExternalObjects;
|
std::vector<std::string> ExternalObjects;
|
||||||
|
|
||||||
|
// The windows module definition source file (.def), if any.
|
||||||
|
std::string ModuleDefinitionFile;
|
||||||
|
|
||||||
// Set of object file names that will be built in this directory.
|
// Set of object file names that will be built in this directory.
|
||||||
std::set<cmStdString> ObjectFiles;
|
std::set<cmStdString> ObjectFiles;
|
||||||
|
|
||||||
|
@ -214,6 +217,9 @@ protected:
|
||||||
// Compute target-specific Fortran language flags.
|
// Compute target-specific Fortran language flags.
|
||||||
void AddFortranFlags(std::string& flags);
|
void AddFortranFlags(std::string& flags);
|
||||||
|
|
||||||
|
// Helper to add flag for windows .def file.
|
||||||
|
void AddModuleDefinitionFlag(std::string& flags);
|
||||||
|
|
||||||
//==================================================================
|
//==================================================================
|
||||||
// Convenience routines that do nothing more than forward to
|
// Convenience routines that do nothing more than forward to
|
||||||
// implementaitons
|
// implementaitons
|
||||||
|
|
|
@ -1125,6 +1125,11 @@ void cmVisualStudio10TargetGenerator::WriteLinkOptions(std::string const&
|
||||||
linkOptions.AddFlag("ImportLibrary", imLib.c_str());
|
linkOptions.AddFlag("ImportLibrary", imLib.c_str());
|
||||||
linkOptions.AddFlag("ProgramDataBaseFileName", pdb.c_str());
|
linkOptions.AddFlag("ProgramDataBaseFileName", pdb.c_str());
|
||||||
linkOptions.Parse(flags.c_str());
|
linkOptions.Parse(flags.c_str());
|
||||||
|
if(!this->ModuleDefinitionFile.empty())
|
||||||
|
{
|
||||||
|
linkOptions.AddFlag("ModuleDefinitionFile",
|
||||||
|
this->ModuleDefinitionFile.c_str());
|
||||||
|
}
|
||||||
linkOptions.OutputAdditionalOptions(*this->BuildFileStream, " ", "");
|
linkOptions.OutputAdditionalOptions(*this->BuildFileStream, " ", "");
|
||||||
linkOptions.OutputFlagMap(*this->BuildFileStream, " ");
|
linkOptions.OutputFlagMap(*this->BuildFileStream, " ");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue