summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2011-03-22 18:45:44 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2011-03-22 18:45:44 (GMT)
commit1c3233a850843bf8cf4863f1f0df9378708edffc (patch)
treee598918be33a3b76ce1ccf5caf9508712c376cad /Source
parent685d8935006ef8ea29f5ae6636dbb29b216fa9ef (diff)
parent86cb17b18de78e178b76e9be471789084994a162 (diff)
downloadCMake-1c3233a850843bf8cf4863f1f0df9378708edffc.zip
CMake-1c3233a850843bf8cf4863f1f0df9378708edffc.tar.gz
CMake-1c3233a850843bf8cf4863f1f0df9378708edffc.tar.bz2
Merge topic 'include-flags-response-file'
86cb17b Pass include directories with response files to GNU on Windows 9a0b9bc Optionally pass include directories with response files 6e8a67f Generate target-wide flags before individual build rules d099546 Factor old-style -D flags out from -I flag generation
Diffstat (limited to 'Source')
-rw-r--r--Source/cmDocumentVariables.cxx2
-rw-r--r--Source/cmLocalGenerator.cxx31
-rw-r--r--Source/cmLocalGenerator.h3
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.cxx14
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.h2
-rw-r--r--Source/cmMakefileExecutableTargetGenerator.cxx6
-rw-r--r--Source/cmMakefileLibraryTargetGenerator.cxx6
-rw-r--r--Source/cmMakefileTargetGenerator.cxx40
-rw-r--r--Source/cmMakefileTargetGenerator.h4
9 files changed, 90 insertions, 18 deletions
diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx
index bb6dc3f..f2431e6 100644
--- a/Source/cmDocumentVariables.cxx
+++ b/Source/cmDocumentVariables.cxx
@@ -1475,6 +1475,8 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
cmProperty::VARIABLE,0,0);
cm->DefineProperty("CMAKE_<LANG>_STANDARD_LIBRARIES_INIT",
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",
cmProperty::VARIABLE,0,0);
cm->DefineProperty("CMAKE_EXECUTABLE_SUFFIX_<LANG>",
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index cd265c1..7b3fc86 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -575,6 +575,7 @@ void cmLocalGenerator::AddCustomCommandToCreateObject(const char* ofname,
flags += this->Makefile->GetSafeDefinition(varString.c_str());
flags += " ";
flags += this->GetIncludeFlags(lang);
+ flags += this->Makefile->GetDefineFlags();
// Construct the command lines.
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)
{
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;
@@ -1250,10 +1254,10 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
frameworkDir = cmSystemTools::CollapseFullPath(frameworkDir.c_str());
if(emitted.insert(frameworkDir).second)
{
+ OutputFormat format = forResponseFile? RESPONSE : SHELL;
includeFlags
<< "-F" << this->Convert(frameworkDir.c_str(),
- cmLocalGenerator::START_OUTPUT,
- cmLocalGenerator::SHELL, true)
+ START_OUTPUT, format, true)
<< " ";
}
continue;
@@ -1273,7 +1277,16 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
}
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] != '\"')
{
includeFlags << "\"";
@@ -1291,13 +1304,11 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
{
flags[flags.size()-1] = ' ';
}
- std::string defineFlags = this->Makefile->GetDefineFlags();
- flags += defineFlags;
- this->LanguageToIncludeFlags[lang] = flags;
+ this->LanguageToIncludeFlags[key] = flags;
// Use this temorary variable for the return value to work-around a
// bogus GCC 2.95 warning.
- const char* ret = this->LanguageToIncludeFlags[lang].c_str();
+ const char* ret = this->LanguageToIncludeFlags[key].c_str();
return ret;
}
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index 35aab99..aebf9f3 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -143,7 +143,8 @@ public:
const char* config);
virtual void AppendFlags(std::string& flags, const char* newFlags);
///! 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
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx
index ff48009..d1214d2 100644
--- a/Source/cmLocalUnixMakefileGenerator3.cxx
+++ b/Source/cmLocalUnixMakefileGenerator3.cxx
@@ -883,6 +883,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
+cmLocalUnixMakefileGenerator3
::AppendCustomDepends(std::vector<std::string>& depends,
const std::vector<cmCustomCommand>& ccs)
{
diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h
index 790eff1..9ff6e5e 100644
--- a/Source/cmLocalUnixMakefileGenerator3.h
+++ b/Source/cmLocalUnixMakefileGenerator3.h
@@ -320,6 +320,8 @@ protected:
void AppendRuleDepend(std::vector<std::string>& depends,
const char* ruleFileName);
+ void AppendRuleDepends(std::vector<std::string>& depends,
+ std::vector<std::string> const& ruleFiles);
void AppendCustomDepends(std::vector<std::string>& depends,
const std::vector<cmCustomCommand>& ccs);
void AppendCustomDepend(std::vector<std::string>& depends,
diff --git a/Source/cmMakefileExecutableTargetGenerator.cxx b/Source/cmMakefileExecutableTargetGenerator.cxx
index 4426241..cd75d79 100644
--- a/Source/cmMakefileExecutableTargetGenerator.cxx
+++ b/Source/cmMakefileExecutableTargetGenerator.cxx
@@ -47,12 +47,12 @@ void cmMakefileExecutableTargetGenerator::WriteRuleFiles()
// write rules used to help build object files
this->WriteCommonCodeRules();
- // write in rules for object files and custom commands
- this->WriteTargetBuildRules();
-
// write the per-target per-language flags
this->WriteTargetLanguageFlags();
+ // write in rules for object files and custom commands
+ this->WriteTargetBuildRules();
+
// write the link rules
this->WriteExecutableRule(false);
if(this->Target->NeedRelinkBeforeInstall(this->ConfigName))
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx
index 1e9a670..31f7be5 100644
--- a/Source/cmMakefileLibraryTargetGenerator.cxx
+++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -72,12 +72,12 @@ void cmMakefileLibraryTargetGenerator::WriteRuleFiles()
// write rules used to help build object files
this->WriteCommonCodeRules();
- // write in rules for object files and custom commands
- this->WriteTargetBuildRules();
-
// write the per-target per-language flags
this->WriteTargetLanguageFlags();
+ // write in rules for object files and custom commands
+ this->WriteTargetBuildRules();
+
// write the link rules
// Write the rule for this target type.
switch(this->Target->GetType())
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index 9dcd8f1..69320da 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -310,8 +310,12 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
this->LocalGenerator->AddSharedFlags(flags, lang, shared);
// Add include directory flags.
+ this->AddIncludeFlags(flags, lang);
+
+ // Append old-style preprocessor definition flags.
this->LocalGenerator->
- AppendFlags(flags, this->LocalGenerator->GetIncludeFlags(lang));
+ AppendFlags(flags, this->Makefile->GetDefineFlags());
+
// Add include directory flags.
this->LocalGenerator->
AppendFlags(flags,this->GetFrameworkFlags().c_str());
@@ -482,6 +486,8 @@ cmMakefileTargetGenerator
{
this->LocalGenerator->AppendRuleDepend(depends,
this->FlagFileNameFull.c_str());
+ this->LocalGenerator->AppendRuleDepends(depends,
+ this->FlagFileDepends[lang]);
// generate the depend scanning rule
this->WriteObjectDependRules(source, depends);
@@ -1720,6 +1726,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()
{
// Compute the module directory.
diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h
index c9aede2..bd26795 100644
--- a/Source/cmMakefileTargetGenerator.h
+++ b/Source/cmMakefileTargetGenerator.h
@@ -146,6 +146,8 @@ protected:
bool useResponseFile, std::string& buildObjs,
std::vector<std::string>& makefile_depends);
+ void AddIncludeFlags(std::string& flags, const char* lang);
+
virtual void CloseFileStreams();
void RemoveForbiddenFlags(const char* flagVar, const char* linkLang,
std::string& linkFlags);
@@ -177,6 +179,8 @@ protected:
// the stream for the flag file
std::string FlagFileNameFull;
cmGeneratedFileStream *FlagFileStream;
+ class StringList: public std::vector<std::string> {};
+ std::map<cmStdString, StringList> FlagFileDepends;
// the stream for the info file
std::string InfoFileNameFull;