소스 검색

Automoc: append implicit includes after user-specified dirs

The commit d2536579 (Automoc: fix regression #13667, broken build in
phonon, 2012-11-19) changed Automoc to try to re-add the Qt header dir
if it was stripped out as an implicit include from the moc command
line. When invoking a compiler, those directories are stripped out
because they are built-in, but for moc, there are no built-in directories.

The follow-up commit acc22400 (Automoc: get include dirs without
stripping implicit include dirs off, 2012-12-07) went further by not
removing the implicit include dirs, if they were specified specifically
by the user.

This had the remaining problem that the implicit include dirs appeared
in a different order of precedence for moc compared to the compiler.
Resolve that by stripping out the include dirs, where specified for
the moc command line to, and then appending them at the end. Note that
the order of the appended implicit include directories is the order
they are specified in the CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES, not
the order specified by the user.
Stephen Kelly 12 년 전
부모
커밋
753b905ec8
1개의 변경된 파일24개의 추가작업 그리고 13개의 파일을 삭제
  1. 24 13
      Source/cmLocalGenerator.cxx

+ 24 - 13
Source/cmLocalGenerator.cxx

@@ -1407,20 +1407,22 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
     return;
     }
 
-  if (stripImplicitInclDirs)
-    {
-    // Load implicit include directories for this language.
-    std::string impDirVar = "CMAKE_";
-    impDirVar += lang;
-    impDirVar += "_IMPLICIT_INCLUDE_DIRECTORIES";
-    if(const char* value = this->Makefile->GetDefinition(impDirVar.c_str()))
-      {
-      std::vector<std::string> impDirVec;
-      cmSystemTools::ExpandListArgument(value, impDirVec);
-      for(std::vector<std::string>::const_iterator i = impDirVec.begin();
-          i != impDirVec.end(); ++i)
+  std::vector<std::string> implicitDirs;
+  // Load implicit include directories for this language.
+  std::string impDirVar = "CMAKE_";
+  impDirVar += lang;
+  impDirVar += "_IMPLICIT_INCLUDE_DIRECTORIES";
+  if(const char* value = this->Makefile->GetDefinition(impDirVar.c_str()))
+    {
+    std::vector<std::string> impDirVec;
+    cmSystemTools::ExpandListArgument(value, impDirVec);
+    for(std::vector<std::string>::const_iterator i = impDirVec.begin();
+        i != impDirVec.end(); ++i)
+      {
+      emitted.insert(*i);
+      if (!stripImplicitInclDirs)
         {
-        emitted.insert(*i);
+        implicitDirs.push_back(*i);
         }
       }
     }
@@ -1463,6 +1465,15 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
       dirs.push_back(*i);
       }
     }
+
+  for(std::vector<std::string>::const_iterator i = implicitDirs.begin();
+      i != implicitDirs.end(); ++i)
+    {
+    if(std::find(includes.begin(), includes.end(), *i) != includes.end())
+      {
+      dirs.push_back(*i);
+      }
+    }
 }
 
 void cmLocalGenerator::GetTargetFlags(std::string& linkLibs,