Merge topic 'TheRealAutomocIncludeDirFix'

acc2240 Automoc: get include dirs without stripping implicit include dirs off
This commit is contained in:
David Cole 2012-12-11 13:44:17 -05:00 committed by CMake Topic Stage
commit 7b20f893c2
3 changed files with 21 additions and 71 deletions

View File

@ -1329,7 +1329,9 @@ std::string cmLocalGenerator::GetIncludeFlags(
void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs, void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
cmGeneratorTarget* target, cmGeneratorTarget* target,
const char* lang, const char* lang,
const char *config) const char *config,
bool stripImplicitInclDirs
)
{ {
// Need to decide whether to automatically include the source and // Need to decide whether to automatically include the source and
// binary directories at the beginning of the include path. // binary directories at the beginning of the include path.
@ -1404,18 +1406,21 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector<std::string>& dirs,
return; return;
} }
// Load implicit include directories for this language. if (stripImplicitInclDirs)
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; // Load implicit include directories for this language.
cmSystemTools::ExpandListArgument(value, impDirVec); std::string impDirVar = "CMAKE_";
for(std::vector<std::string>::const_iterator i = impDirVec.begin(); impDirVar += lang;
i != impDirVec.end(); ++i) impDirVar += "_IMPLICIT_INCLUDE_DIRECTORIES";
if(const char* value = this->Makefile->GetDefinition(impDirVar.c_str()))
{ {
emitted.insert(*i); 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);
}
} }
} }

View File

@ -212,7 +212,8 @@ public:
/** Get the include flags for the current makefile and language. */ /** Get the include flags for the current makefile and language. */
void GetIncludeDirectories(std::vector<std::string>& dirs, void GetIncludeDirectories(std::vector<std::string>& dirs,
cmGeneratorTarget* target, cmGeneratorTarget* target,
const char* lang = "C", const char *config = 0); const char* lang = "C", const char *config = 0,
bool stripImplicitInclDirs = true);
/** Compute the language used to compile the given source file. */ /** Compute the language used to compile the given source file. */
const char* GetSourceFileLanguage(const cmSourceFile& source); const char* GetSourceFileLanguage(const cmSourceFile& source);

View File

@ -212,36 +212,11 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target)
} }
const char* qtIncDir = 0;
const char* qtCoreIncDir = 0;
// check whether ${QT_INCLUDE_DIR} is part of the implicit include dirs,
// see http://public.kitware.com/Bug/view.php?id=13667
bool qtIncludeDirMayHaveBeenRemoved = false;
if (makefile->IsSet("QT_INCLUDE_DIR"))
{
qtIncDir = makefile->GetDefinition("QT_INCLUDE_DIR");
std::string s =
makefile->GetSafeDefinition("CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES");
std::vector<std::string> implIncDirs;
cmSystemTools::ExpandListArgument(s, implIncDirs);
if (std::find(implIncDirs.begin(), implIncDirs.end(),std::string(qtIncDir))
!= implIncDirs.end())
{
qtIncludeDirMayHaveBeenRemoved = true;
if (makefile->IsSet("QT_QTCORE_INCLUDE_DIR"))
{
qtCoreIncDir = makefile->GetDefinition("QT_QTCORE_INCLUDE_DIR");
}
}
}
bool haveQtCoreIncDir = false;
bool haveQtIncDir = false;
std::vector<std::string> includeDirs; std::vector<std::string> includeDirs;
cmGeneratorTarget gtgt(target); cmGeneratorTarget gtgt(target);
localGen->GetIncludeDirectories(includeDirs, &gtgt, "CXX"); // Get the include dirs for this target, without stripping the implicit
// include dirs off, see http://public.kitware.com/Bug/view.php?id=13667
localGen->GetIncludeDirectories(includeDirs, &gtgt, "CXX", 0, false);
std::string _moc_incs = ""; std::string _moc_incs = "";
const char* sep = ""; const char* sep = "";
for(std::vector<std::string>::const_iterator incDirIt = includeDirs.begin(); for(std::vector<std::string>::const_iterator incDirIt = includeDirs.begin();
@ -251,37 +226,6 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target)
_moc_incs += sep; _moc_incs += sep;
sep = ";"; sep = ";";
_moc_incs += *incDirIt; _moc_incs += *incDirIt;
if (qtIncludeDirMayHaveBeenRemoved && qtCoreIncDir && qtIncDir) // #13667
{
if (*incDirIt == qtIncDir)
{
haveQtIncDir = true;
qtIncludeDirMayHaveBeenRemoved = false; // it's here, i.e. not removed
}
if (*incDirIt == qtCoreIncDir)
{
haveQtCoreIncDir = true;
}
}
}
// Some projects (kdelibs, phonon) query the compiler for its default
// include search dirs, and add those to
// CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES.
// These may include e.g./usr/lib/qt/include . This is typically also part
// of ${QT_INCLUDES}. If this directory is then contained in the implicit
// include dirs, it is removed from the include dirs returned from the
// target above. So we add ${QT_INCLUDE_DIR} manually for moc if we detected
// that ${QT_QTCORE_INCLUDE_DIR} is among the include dirs (there shouldn't
// be a way to use Qt4 without using ${QT_QTCORE_INCLUDE_DIR} I think.
// See #13646 and #13667.
if (qtIncludeDirMayHaveBeenRemoved && qtCoreIncDir && qtIncDir
&& (haveQtCoreIncDir == true) && (haveQtIncDir == false))
{
_moc_incs += sep;
sep = ";";
_moc_incs += qtIncDir;
} }
const char* tmp = target->GetProperty("COMPILE_DEFINITIONS"); const char* tmp = target->GetProperty("COMPILE_DEFINITIONS");