Merge topic 'include-flags-response-file'
86cb17b
Pass include directories with response files to GNU on Windows9a0b9bc
Optionally pass include directories with response files6e8a67f
Generate target-wide flags before individual build rulesd099546
Factor old-style -D flags out from -I flag generation
This commit is contained in:
commit
1c3233a850
|
@ -79,6 +79,7 @@ macro(__windows_compiler_gnu lang)
|
||||||
|
|
||||||
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "") # No -fPIC on Windows
|
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "") # No -fPIC on Windows
|
||||||
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS ${__WINDOWS_GNU_LD_RESPONSE})
|
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS ${__WINDOWS_GNU_LD_RESPONSE})
|
||||||
|
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1)
|
||||||
|
|
||||||
# We prefer "@" for response files but it is not supported by gcc 3.
|
# We prefer "@" for response files but it is not supported by gcc 3.
|
||||||
execute_process(COMMAND ${CMAKE_${lang}_COMPILER} --version OUTPUT_VARIABLE _ver ERROR_VARIABLE _ver)
|
execute_process(COMMAND ${CMAKE_${lang}_COMPILER} --version OUTPUT_VARIABLE _ver ERROR_VARIABLE _ver)
|
||||||
|
@ -92,6 +93,8 @@ macro(__windows_compiler_gnu lang)
|
||||||
# Use "-Wl,@" to pass the response file to the linker.
|
# Use "-Wl,@" to pass the response file to the linker.
|
||||||
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "-Wl,@")
|
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "-Wl,@")
|
||||||
endif()
|
endif()
|
||||||
|
# The GNU 3.x compilers do not support response files (only linkers).
|
||||||
|
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 0)
|
||||||
elseif(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS)
|
elseif(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS)
|
||||||
# Use "@" to pass the response file to the front-end.
|
# Use "@" to pass the response file to the front-end.
|
||||||
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "@")
|
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "@")
|
||||||
|
|
|
@ -1475,6 +1475,8 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
||||||
cmProperty::VARIABLE,0,0);
|
cmProperty::VARIABLE,0,0);
|
||||||
cm->DefineProperty("CMAKE_<LANG>_STANDARD_LIBRARIES_INIT",
|
cm->DefineProperty("CMAKE_<LANG>_STANDARD_LIBRARIES_INIT",
|
||||||
cmProperty::VARIABLE,0,0);
|
cmProperty::VARIABLE,0,0);
|
||||||
|
cm->DefineProperty("CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_INCLUDES",
|
||||||
|
cmProperty::VARIABLE,0,0);
|
||||||
cm->DefineProperty("CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_OBJECTS",
|
cm->DefineProperty("CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_OBJECTS",
|
||||||
cmProperty::VARIABLE,0,0);
|
cmProperty::VARIABLE,0,0);
|
||||||
cm->DefineProperty("CMAKE_EXECUTABLE_SUFFIX_<LANG>",
|
cm->DefineProperty("CMAKE_EXECUTABLE_SUFFIX_<LANG>",
|
||||||
|
|
|
@ -575,6 +575,7 @@ void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname,
|
||||||
flags += this->Makefile->GetSafeDefinition(varString.c_str());
|
flags += this->Makefile->GetSafeDefinition(varString.c_str());
|
||||||
flags += " ";
|
flags += " ";
|
||||||
flags += this->GetIncludeFlags(lang);
|
flags += this->GetIncludeFlags(lang);
|
||||||
|
flags += this->Makefile->GetDefineFlags();
|
||||||
|
|
||||||
// Construct the command lines.
|
// Construct the command lines.
|
||||||
cmCustomCommandLines commandLines;
|
cmCustomCommandLines commandLines;
|
||||||
|
@ -1184,15 +1185,18 @@ cmLocalGenerator::ConvertToOutputForExisting(RelativeRoot remote,
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
|
const char* cmLocalGenerator::GetIncludeFlags(const char* lang,
|
||||||
|
bool forResponseFile)
|
||||||
{
|
{
|
||||||
if(!lang)
|
if(!lang)
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
if(this->LanguageToIncludeFlags.count(lang))
|
std::string key = lang;
|
||||||
|
key += forResponseFile? "@" : "";
|
||||||
|
if(this->LanguageToIncludeFlags.count(key))
|
||||||
{
|
{
|
||||||
return this->LanguageToIncludeFlags[lang].c_str();
|
return this->LanguageToIncludeFlags[key].c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
cmOStringStream includeFlags;
|
cmOStringStream includeFlags;
|
||||||
|
@ -1250,10 +1254,10 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
|
||||||
frameworkDir = cmSystemTools::CollapseFullPath(frameworkDir.c_str());
|
frameworkDir = cmSystemTools::CollapseFullPath(frameworkDir.c_str());
|
||||||
if(emitted.insert(frameworkDir).second)
|
if(emitted.insert(frameworkDir).second)
|
||||||
{
|
{
|
||||||
|
OutputFormat format = forResponseFile? RESPONSE : SHELL;
|
||||||
includeFlags
|
includeFlags
|
||||||
<< "-F" << this->Convert(frameworkDir.c_str(),
|
<< "-F" << this->Convert(frameworkDir.c_str(),
|
||||||
cmLocalGenerator::START_OUTPUT,
|
START_OUTPUT, format, true)
|
||||||
cmLocalGenerator::SHELL, true)
|
|
||||||
<< " ";
|
<< " ";
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -1273,7 +1277,16 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
|
||||||
}
|
}
|
||||||
flagUsed = true;
|
flagUsed = true;
|
||||||
}
|
}
|
||||||
std::string includePath = this->ConvertToOutputForExisting(i->c_str());
|
std::string includePath;
|
||||||
|
if(forResponseFile)
|
||||||
|
{
|
||||||
|
includePath = this->Convert(i->c_str(), START_OUTPUT,
|
||||||
|
RESPONSE, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
includePath = this->ConvertToOutputForExisting(i->c_str());
|
||||||
|
}
|
||||||
if(quotePaths && includePath.size() && includePath[0] != '\"')
|
if(quotePaths && includePath.size() && includePath[0] != '\"')
|
||||||
{
|
{
|
||||||
includeFlags << "\"";
|
includeFlags << "\"";
|
||||||
|
@ -1291,13 +1304,11 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
|
||||||
{
|
{
|
||||||
flags[flags.size()-1] = ' ';
|
flags[flags.size()-1] = ' ';
|
||||||
}
|
}
|
||||||
std::string defineFlags = this->Makefile->GetDefineFlags();
|
this->LanguageToIncludeFlags[key] = flags;
|
||||||
flags += defineFlags;
|
|
||||||
this->LanguageToIncludeFlags[lang] = flags;
|
|
||||||
|
|
||||||
// Use this temorary variable for the return value to work-around a
|
// Use this temorary variable for the return value to work-around a
|
||||||
// bogus GCC 2.95 warning.
|
// bogus GCC 2.95 warning.
|
||||||
const char* ret = this->LanguageToIncludeFlags[lang].c_str();
|
const char* ret = this->LanguageToIncludeFlags[key].c_str();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,8 @@ public:
|
||||||
const char* config);
|
const char* config);
|
||||||
virtual void AppendFlags(std::string& flags, const char* newFlags);
|
virtual void AppendFlags(std::string& flags, const char* newFlags);
|
||||||
///! Get the include flags for the current makefile and language
|
///! Get the include flags for the current makefile and language
|
||||||
const char* GetIncludeFlags(const char* lang);
|
const char* GetIncludeFlags(const char* lang,
|
||||||
|
bool forResponseFile = false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode a list of preprocessor definitions for the compiler
|
* Encode a list of preprocessor definitions for the compiler
|
||||||
|
|
|
@ -880,6 +880,20 @@ cmLocalUnixMakefileGenerator3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmLocalUnixMakefileGenerator3
|
||||||
|
::AppendRuleDepends(std::vector<std::string>& depends,
|
||||||
|
std::vector<std::string> const& ruleFiles)
|
||||||
|
{
|
||||||
|
// Add a dependency on the rule file itself unless an option to skip
|
||||||
|
// it is specifically enabled by the user or project.
|
||||||
|
if(!this->Makefile->IsOn("CMAKE_SKIP_RULE_DEPENDENCY"))
|
||||||
|
{
|
||||||
|
depends.insert(depends.end(), ruleFiles.begin(), ruleFiles.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmLocalUnixMakefileGenerator3
|
cmLocalUnixMakefileGenerator3
|
||||||
|
|
|
@ -320,6 +320,8 @@ protected:
|
||||||
|
|
||||||
void AppendRuleDepend(std::vector<std::string>& depends,
|
void AppendRuleDepend(std::vector<std::string>& depends,
|
||||||
const char* ruleFileName);
|
const char* ruleFileName);
|
||||||
|
void AppendRuleDepends(std::vector<std::string>& depends,
|
||||||
|
std::vector<std::string> const& ruleFiles);
|
||||||
void AppendCustomDepends(std::vector<std::string>& depends,
|
void AppendCustomDepends(std::vector<std::string>& depends,
|
||||||
const std::vector<cmCustomCommand>& ccs);
|
const std::vector<cmCustomCommand>& ccs);
|
||||||
void AppendCustomDepend(std::vector<std::string>& depends,
|
void AppendCustomDepend(std::vector<std::string>& depends,
|
||||||
|
|
|
@ -47,12 +47,12 @@ void cmMakefileExecutableTargetGenerator::WriteRuleFiles()
|
||||||
// write rules used to help build object files
|
// write rules used to help build object files
|
||||||
this->WriteCommonCodeRules();
|
this->WriteCommonCodeRules();
|
||||||
|
|
||||||
// write in rules for object files and custom commands
|
|
||||||
this->WriteTargetBuildRules();
|
|
||||||
|
|
||||||
// write the per-target per-language flags
|
// write the per-target per-language flags
|
||||||
this->WriteTargetLanguageFlags();
|
this->WriteTargetLanguageFlags();
|
||||||
|
|
||||||
|
// write in rules for object files and custom commands
|
||||||
|
this->WriteTargetBuildRules();
|
||||||
|
|
||||||
// write the link rules
|
// write the link rules
|
||||||
this->WriteExecutableRule(false);
|
this->WriteExecutableRule(false);
|
||||||
if(this->Target->NeedRelinkBeforeInstall(this->ConfigName))
|
if(this->Target->NeedRelinkBeforeInstall(this->ConfigName))
|
||||||
|
|
|
@ -72,12 +72,12 @@ void cmMakefileLibraryTargetGenerator::WriteRuleFiles()
|
||||||
// write rules used to help build object files
|
// write rules used to help build object files
|
||||||
this->WriteCommonCodeRules();
|
this->WriteCommonCodeRules();
|
||||||
|
|
||||||
// write in rules for object files and custom commands
|
|
||||||
this->WriteTargetBuildRules();
|
|
||||||
|
|
||||||
// write the per-target per-language flags
|
// write the per-target per-language flags
|
||||||
this->WriteTargetLanguageFlags();
|
this->WriteTargetLanguageFlags();
|
||||||
|
|
||||||
|
// write in rules for object files and custom commands
|
||||||
|
this->WriteTargetBuildRules();
|
||||||
|
|
||||||
// write the link rules
|
// write the link rules
|
||||||
// Write the rule for this target type.
|
// Write the rule for this target type.
|
||||||
switch(this->Target->GetType())
|
switch(this->Target->GetType())
|
||||||
|
|
|
@ -310,8 +310,12 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
|
||||||
this->LocalGenerator->AddSharedFlags(flags, lang, shared);
|
this->LocalGenerator->AddSharedFlags(flags, lang, shared);
|
||||||
|
|
||||||
// Add include directory flags.
|
// Add include directory flags.
|
||||||
|
this->AddIncludeFlags(flags, lang);
|
||||||
|
|
||||||
|
// Append old-style preprocessor definition flags.
|
||||||
this->LocalGenerator->
|
this->LocalGenerator->
|
||||||
AppendFlags(flags, this->LocalGenerator->GetIncludeFlags(lang));
|
AppendFlags(flags, this->Makefile->GetDefineFlags());
|
||||||
|
|
||||||
// Add include directory flags.
|
// Add include directory flags.
|
||||||
this->LocalGenerator->
|
this->LocalGenerator->
|
||||||
AppendFlags(flags,this->GetFrameworkFlags().c_str());
|
AppendFlags(flags,this->GetFrameworkFlags().c_str());
|
||||||
|
@ -482,6 +486,8 @@ cmMakefileTargetGenerator
|
||||||
{
|
{
|
||||||
this->LocalGenerator->AppendRuleDepend(depends,
|
this->LocalGenerator->AppendRuleDepend(depends,
|
||||||
this->FlagFileNameFull.c_str());
|
this->FlagFileNameFull.c_str());
|
||||||
|
this->LocalGenerator->AppendRuleDepends(depends,
|
||||||
|
this->FlagFileDepends[lang]);
|
||||||
|
|
||||||
// generate the depend scanning rule
|
// generate the depend scanning rule
|
||||||
this->WriteObjectDependRules(source, depends);
|
this->WriteObjectDependRules(source, depends);
|
||||||
|
@ -1719,6 +1725,38 @@ cmMakefileTargetGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmMakefileTargetGenerator::AddIncludeFlags(std::string& flags,
|
||||||
|
const char* lang)
|
||||||
|
{
|
||||||
|
std::string responseVar = "CMAKE_";
|
||||||
|
responseVar += lang;
|
||||||
|
responseVar += "_USE_RESPONSE_FILE_FOR_INCLUDES";
|
||||||
|
bool useResponseFile = this->Makefile->IsOn(responseVar.c_str());
|
||||||
|
|
||||||
|
std::string includeFlags =
|
||||||
|
this->LocalGenerator->GetIncludeFlags(lang, useResponseFile);
|
||||||
|
if(includeFlags.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(useResponseFile)
|
||||||
|
{
|
||||||
|
std::string name = "includes_";
|
||||||
|
name += lang;
|
||||||
|
name += ".rsp";
|
||||||
|
std::string arg = "@" +
|
||||||
|
this->CreateResponseFile(name.c_str(), includeFlags,
|
||||||
|
this->FlagFileDepends[lang]);
|
||||||
|
this->LocalGenerator->AppendFlags(flags, arg.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->LocalGenerator->AppendFlags(flags, includeFlags.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
const char* cmMakefileTargetGenerator::GetFortranModuleDirectory()
|
const char* cmMakefileTargetGenerator::GetFortranModuleDirectory()
|
||||||
{
|
{
|
||||||
|
|
|
@ -146,6 +146,8 @@ protected:
|
||||||
bool useResponseFile, std::string& buildObjs,
|
bool useResponseFile, std::string& buildObjs,
|
||||||
std::vector<std::string>& makefile_depends);
|
std::vector<std::string>& makefile_depends);
|
||||||
|
|
||||||
|
void AddIncludeFlags(std::string& flags, const char* lang);
|
||||||
|
|
||||||
virtual void CloseFileStreams();
|
virtual void CloseFileStreams();
|
||||||
void RemoveForbiddenFlags(const char* flagVar, const char* linkLang,
|
void RemoveForbiddenFlags(const char* flagVar, const char* linkLang,
|
||||||
std::string& linkFlags);
|
std::string& linkFlags);
|
||||||
|
@ -177,6 +179,8 @@ protected:
|
||||||
// the stream for the flag file
|
// the stream for the flag file
|
||||||
std::string FlagFileNameFull;
|
std::string FlagFileNameFull;
|
||||||
cmGeneratedFileStream *FlagFileStream;
|
cmGeneratedFileStream *FlagFileStream;
|
||||||
|
class StringList: public std::vector<std::string> {};
|
||||||
|
std::map<cmStdString, StringList> FlagFileDepends;
|
||||||
|
|
||||||
// the stream for the info file
|
// the stream for the info file
|
||||||
std::string InfoFileNameFull;
|
std::string InfoFileNameFull;
|
||||||
|
|
Loading…
Reference in New Issue