automoc: accept even more .moc files in non-strict mode

Alex
This commit is contained in:
Alex Neundorf 2011-12-02 21:54:11 +01:00
parent c207f5d361
commit 40c516783e
1 changed files with 25 additions and 56 deletions

View File

@ -37,20 +37,6 @@ static bool containsQ_OBJECT(const std::string& text)
} }
static bool containsQ_PRIVATE_SLOT(const std::string& text)
{
// this simple check is much much faster than the regexp
if (strstr(text.c_str(), "Q_PRIVATE_SLOT") == NULL)
{
return false;
}
cmsys::RegularExpression qPrivateSlotRegExp(
"[\n][ \t]*Q_PRIVATE_SLOT[^a-zA-Z0-9_]");
return qPrivateSlotRegExp.find(text);
}
static std::string findMatchingHeader(const std::string& absPath, static std::string findMatchingHeader(const std::string& absPath,
const std::string& mocSubDir, const std::string& mocSubDir,
const std::string& basename, const std::string& basename,
@ -602,7 +588,7 @@ void cmQtAutomoc::ParseCppFile(const std::string& absFilename,
cmsys::SystemTools::GetRealPath(absFilename.c_str())) + '/'; cmsys::SystemTools::GetRealPath(absFilename.c_str())) + '/';
const std::string scannedFileBasename = cmsys::SystemTools:: const std::string scannedFileBasename = cmsys::SystemTools::
GetFilenameWithoutLastExtension(absFilename); GetFilenameWithoutLastExtension(absFilename);
const bool cppContainsQ_OBJECT = containsQ_OBJECT(contentsString);
bool dotMocIncluded = false; bool dotMocIncluded = false;
bool mocUnderscoreIncluded = false; bool mocUnderscoreIncluded = false;
std::string ownMocUnderscoreFile; std::string ownMocUnderscoreFile;
@ -673,7 +659,7 @@ void cmQtAutomoc::ParseCppFile(const std::string& absFilename,
else else
{ {
std::string fileToMoc = absFilename; std::string fileToMoc = absFilename;
if (basename != scannedFileBasename) if ((basename != scannedFileBasename) || (cppContainsQ_OBJECT==false))
{ {
std::string mocSubDir = extractSubDir(absPath, currentMoc); std::string mocSubDir = extractSubDir(absPath, currentMoc);
std::string headerToMoc = findMatchingHeader( std::string headerToMoc = findMatchingHeader(
@ -682,22 +668,34 @@ void cmQtAutomoc::ParseCppFile(const std::string& absFilename,
{ {
// this is for KDE4 compatibility: // this is for KDE4 compatibility:
fileToMoc = headerToMoc; fileToMoc = headerToMoc;
std::cerr << "AUTOMOC: warning: " << absFilename << ": The file " if ((cppContainsQ_OBJECT==false) && (basename == scannedFileBasename))
"includes the moc file \"" << currentMoc << {
"\" instead of \"moc_" << basename << ".cpp\". " std::cerr << "AUTOMOC: warning: " << absFilename << ": The file "
"Running moc on " "includes the moc file \"" << currentMoc <<
<< "\"" << headerToMoc << "\" ! Better include \"moc_" "\", but does not contain a Q_OBJECT macro. "
<< basename << ".cpp\" for a robust build.\n" "Running moc on "
<< std::endl; << "\"" << headerToMoc << "\" ! Better include \"moc_"
<< basename << ".cpp\" for a robust build.\n"
<< std::endl;
}
else
{
std::cerr << "AUTOMOC: warning: " << absFilename << ": The file "
"includes the moc file \"" << currentMoc <<
"\" instead of \"moc_" << basename << ".cpp\". "
"Running moc on "
<< "\"" << headerToMoc << "\" ! Better include \"moc_"
<< basename << ".cpp\" for a robust build.\n"
<< std::endl;
}
} }
else else
{ {
std::cerr <<"AUTOMOC: error: " << absFilename << ": The file " std::cerr <<"AUTOMOC: error: " << absFilename << ": The file "
"includes the moc file \"" << currentMoc << "includes the moc file \"" << currentMoc <<
"\", which seems to be the moc file from a different " "\", which seems to be the moc file from a different "
"source file. This is not supported. " "source file. CMake also could not find a matching "
"Include \"" << scannedFileBasename << ".moc\" to run " "header.\n" << std::endl;
"moc on this source file.\n" << std::endl;
::exit(EXIT_FAILURE); ::exit(EXIT_FAILURE);
} }
} }
@ -716,7 +714,7 @@ void cmQtAutomoc::ParseCppFile(const std::string& absFilename,
// If this is the case, the moc_foo.cpp should probably be generated from // If this is the case, the moc_foo.cpp should probably be generated from
// foo.cpp instead of foo.h, because otherwise it won't build. // foo.cpp instead of foo.h, because otherwise it won't build.
// But warn, since this is not how it is supposed to be used. // But warn, since this is not how it is supposed to be used.
if ((dotMocIncluded == false) && (containsQ_OBJECT(contentsString))) if ((dotMocIncluded == false) && (cppContainsQ_OBJECT == true))
{ {
if (mocUnderscoreIncluded == true) if (mocUnderscoreIncluded == true)
{ {
@ -743,35 +741,6 @@ void cmQtAutomoc::ParseCppFile(const std::string& absFilename,
} }
} }
// if only the .moc file is included and we are in compatibility mode,
// check whether maybe the header must actually be mocced, e.g. because it
// might use the Q_PRIVATE_SLOT macro:
if ((dotMocIncluded == true) && (mocUnderscoreIncluded == false))
{
std::string ownHeader=findMatchingHeader(absPath, "", scannedFileBasename,
headerExtensions);
if (ownHeader.size() > 0)
{
const std::string ownHeaderContents = this->ReadAll(ownHeader);
if (containsQ_PRIVATE_SLOT(ownHeaderContents))
{
// this is for KDE4 compatibility:
std::cerr << "AUTOMOC: warning: " << absFilename << ": The file "
<< "includes \"" << ownDotMocFile << "\", but the "
<< "header \"" << ownHeader << "\" contains a "
<< "Q_PRIVATE_SLOT macro. "
<< "Running moc on " << "\"" << absFilename << "\" ! "
<< "Better include \"moc_" << scannedFileBasename << ".cpp\""
<< " for a robust build.\n"
<< std::endl;
includedMocs[ownHeader] = ownDotMocFile;
includedMocs.erase(absFilename);
}
}
}
} }