From a1e49bb155132606ed9f590c0b62e68f2e288d0b Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 24 Dec 2016 17:36:56 +0100 Subject: AUTOGEN: Generators: rename makeParentDirectory to MakeParentDirectory --- Source/cmQtAutoGenerators.cxx | 10 +++++----- Source/cmQtAutoGenerators.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index a9a9c49..98b3de3 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -1113,7 +1113,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( this->LogBold(msg); } // Make sure the parent directory exists - bool success = this->makeParentDirectory(this->OutMocCppFilenameAbs); + bool success = this->MakeParentDirectory(this->OutMocCppFilenameAbs); if (success) { cmsys::ofstream outfile; outfile.open(this->OutMocCppFilenameAbs.c_str(), std::ios::trunc); @@ -1154,7 +1154,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, this->LogBold("Generating MOC source " + mocFileRel); // Make sure the parent directory exists - if (!this->makeParentDirectory(mocFileAbs)) { + if (!this->MakeParentDirectory(mocFileAbs)) { this->RunMocFailed = true; return false; } @@ -1276,7 +1276,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& realName, this->LogBold("Generating UIC header " + uicFileRel); // Make sure the parent directory exists - if (!this->makeParentDirectory(uicFileAbs)) { + if (!this->MakeParentDirectory(uicFileAbs)) { this->RunUicFailed = true; return false; } @@ -1415,7 +1415,7 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } // Make sure the parent directory exists - if (!this->makeParentDirectory(qrcOutputFile)) { + if (!this->MakeParentDirectory(qrcOutputFile)) { this->RunRccFailed = true; return false; } @@ -1551,7 +1551,7 @@ void cmQtAutoGenerators::LogCommand(const std::vector& command) * @brief Generates the parent directory of the given file on demand * @return True on success */ -bool cmQtAutoGenerators::makeParentDirectory(const std::string& filename) +bool cmQtAutoGenerators::MakeParentDirectory(const std::string& filename) { bool success = true; const std::string dirName = cmSystemTools::GetFilenamePath(filename); diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index c241579..24960a5 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -91,7 +91,7 @@ private: void LogError(const std::string& message); void LogCommand(const std::vector& command); - bool makeParentDirectory(const std::string& filename); + bool MakeParentDirectory(const std::string& filename); std::string JoinExts(const std::vector& lst); -- cgit v0.12 From 794fdf40a1bc85dded519d7c737f73690e3a6e42 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 24 Dec 2016 16:00:09 +0100 Subject: AUTOGEN: Generators: Cleanup variable initialization --- Source/cmQtAutoGenerators.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 98b3de3..01cc1b3 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -926,15 +926,12 @@ void cmQtAutoGenerators::ParseForUic( if (this->UicExecutable.empty()) { return; } + const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); cmsys::RegularExpression uiIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); std::string::size_type matchOffset = 0; - - const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - - matchOffset = 0; if ((strstr(contentsString.c_str(), "ui_") != CM_NULLPTR) && (uiIncludeRegExp.find(contentsString))) { do { -- cgit v0.12 From 2f67aef23d4192fadb222dc79311fb5ffbbc36ce Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 24 Dec 2016 16:28:01 +0100 Subject: AUTOGEN: Generators: Cleanup and optimize ParseForUic method --- Source/cmQtAutoGenerators.cxx | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 01cc1b3..1ada434 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -931,23 +931,17 @@ void cmQtAutoGenerators::ParseForUic( "[\n][ \t]*#[ \t]*include[ \t]+" "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); - std::string::size_type matchOffset = 0; - if ((strstr(contentsString.c_str(), "ui_") != CM_NULLPTR) && - (uiIncludeRegExp.find(contentsString))) { - do { + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "ui_") != CM_NULLPTR) { + while (uiIncludeRegExp.find(contentChars)) { const std::string currentUi = uiIncludeRegExp.match(1); - - std::string basename = + const std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); - // basename should be the part of the ui filename used for // finding the correct header, so we need to remove the ui_ part - basename = basename.substr(3); - - includedUis[realName].push_back(basename); - - matchOffset += uiIncludeRegExp.end(); - } while (uiIncludeRegExp.find(contentsString.c_str() + matchOffset)); + includedUis[realName].push_back(basename.substr(3)); + contentChars += uiIncludeRegExp.end(); + } } } -- cgit v0.12 From 2cfcdf757d032cdea8b980792007a6f9d749e6fb Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 10:51:14 +0100 Subject: AUTOGEN: Generators: Variable rename --- Source/cmQtAutoGenerators.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 1ada434..6543ac6 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -646,7 +646,7 @@ bool cmQtAutoGenerators::ParseCppFile( std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool moc_style = cmHasLiteralPrefix(basename, "moc_"); + const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); // If the moc include is of the moc_foo.cpp style we expect // the Q_OBJECT class declaration in a header file. @@ -654,7 +654,7 @@ bool cmQtAutoGenerators::ParseCppFile( // a Q_OBJECT macro in the current source file, if it contains the // macro we generate the moc file from the source file. // Q_OBJECT - if (moc_style) { + if (mocUnderscoreStyle) { // basename should be the part of the moc filename used for // finding the correct header, so we need to remove the moc_ part basename = basename.substr(4); -- cgit v0.12 From 2b9d795e63acf723a6abd79f3195ec70476442a5 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 10:54:54 +0100 Subject: AUTOGEN: Generators: Comments --- Source/cmQtAutoGenerators.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 6543ac6..a0949d4 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -62,6 +62,7 @@ static std::string findMatchingHeader( header = sourceFilePath; break; } + // Try subdirectory instead if (!mocSubDir.empty()) { sourceFilePath = mocSubDir + basename + "." + (*ext); if (cmsys::SystemTools::FileExists(sourceFilePath.c_str())) { @@ -653,7 +654,6 @@ bool cmQtAutoGenerators::ParseCppFile( // If the moc include is of the foo.moc style we need to look for // a Q_OBJECT macro in the current source file, if it contains the // macro we generate the moc file from the source file. - // Q_OBJECT if (mocUnderscoreStyle) { // basename should be the part of the moc filename used for // finding the correct header, so we need to remove the moc_ part -- cgit v0.12 From 0b1527ff3d1781380756ee72a9641b7c5c7c87cc Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 14:16:10 +0100 Subject: AUTOGEN: Generators: Introduce unified ParseSourceFile The new cmQtAutoGenerators::ParseSourceFile method combines the functionality of ParseCppFile and StrictParseCppFile in a single method to avoid code duplication. Relaxed or strict mode is selected by an additional bool argument. --- Source/cmQtAutoGenerators.cxx | 208 ++++++++++++++++++++++++++++++++++++++++++ Source/cmQtAutoGenerators.h | 6 ++ 2 files changed, 214 insertions(+) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index a0949d4..41bb6f9 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -901,6 +901,214 @@ bool cmQtAutoGenerators::StrictParseCppFile( return true; } +/** + * @return True on success + */ +bool cmQtAutoGenerators::ParseSourceFile( + const std::string& absFilename, + const std::vector& headerExtensions, + std::map& includedMocs, + std::map >& includedUis, bool relaxed) +{ + cmsys::RegularExpression mocIncludeRegExp( + "[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); + + const std::string contentsString = ReadAll(absFilename); + if (contentsString.empty()) { + std::ostringstream err; + err << "AUTOGEN: warning: " << absFilename << "\n" + << "The file is empty\n"; + this->LogWarning(err.str()); + return true; + } + + // Parse source contents for UIC + this->ParseForUic(absFilename, contentsString, includedUis); + + // Continue with moc parsing on demand + if (this->MocExecutable.empty()) { + return true; + } + + const std::string scannedFileAbsPath = + cmsys::SystemTools::GetFilenamePath( + cmsys::SystemTools::GetRealPath(absFilename)) + + '/'; + const std::string scannedFileBasename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); + + std::string macroName; + const bool requiresMoc = requiresMocing(contentsString, macroName); + bool ownDotMocIncluded = false; + bool ownMocUnderscoreIncluded = false; + std::string ownMocUnderscoreFile; + std::string ownMocHeaderFile; + + std::string::size_type matchOffset = 0; + // first a simple string check for "moc" is *much* faster than the regexp, + // and if the string search already fails, we don't have to try the + // expensive regexp + if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { + // Iterate over all included moc files + const char* contentChars = contentsString.c_str(); + while (mocIncludeRegExp.find(contentChars)) { + const std::string currentMoc = mocIncludeRegExp.match(1); + // Basename of the current moc include + std::string basename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); + + // If the moc include is of the moc_foo.cpp style we expect + // the Q_OBJECT class declaration in a header file. + // If the moc include is of the foo.moc style we need to look for + // a Q_OBJECT macro in the current source file, if it contains the + // macro we generate the moc file from the source file. + if (cmHasLiteralPrefix(basename, "moc_")) { + // Include: moc_FOO.cxx + // basename should be the part of the moc filename used for + // finding the correct header, so we need to remove the moc_ part + basename = basename.substr(4); + const std::string mocSubDir = + extractSubDir(scannedFileAbsPath, currentMoc); + const std::string headerToMoc = findMatchingHeader( + scannedFileAbsPath, mocSubDir, basename, headerExtensions); + + if (!headerToMoc.empty()) { + includedMocs[headerToMoc] = currentMoc; + if (relaxed && (basename == scannedFileBasename)) { + ownMocUnderscoreIncluded = true; + ownMocUnderscoreFile = currentMoc; + ownMocHeaderFile = headerToMoc; + } + } else { + std::ostringstream err; + err << "AUTOGEN: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", but could not find header \"" << basename << '{' + << this->JoinExts(headerExtensions) << "}\" "; + if (mocSubDir.empty()) { + err << "in " << scannedFileAbsPath << "\n"; + } else { + err << "neither in " << scannedFileAbsPath << " nor in " + << mocSubDir << "\n"; + } + this->LogError(err.str()); + return false; + } + } else { + // Include: FOO.moc + std::string fileToMoc; + if (relaxed) { + // Mode: Relaxed + if (!requiresMoc || basename != scannedFileBasename) { + const std::string mocSubDir = + extractSubDir(scannedFileAbsPath, currentMoc); + const std::string headerToMoc = findMatchingHeader( + scannedFileAbsPath, mocSubDir, basename, headerExtensions); + if (!headerToMoc.empty()) { + // This is for KDE4 compatibility: + fileToMoc = headerToMoc; + if (!requiresMoc && basename == scannedFileBasename) { + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", but does not contain a " << macroName + << " macro. Running moc on " + << "\"" << headerToMoc << "\" ! Include \"moc_" << basename + << ".cpp\" for a compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + } else { + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\" instead of \"moc_" << basename + << ".cpp\". Running moc on " + << "\"" << headerToMoc << "\" ! Include \"moc_" << basename + << ".cpp\" for compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + } + } else { + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", which seems to be the moc file from a different " + "source file. CMake also could not find a matching " + "header.\n"; + this->LogError(err.str()); + return false; + } + } else { + // Include self + fileToMoc = absFilename; + ownDotMocIncluded = true; + } + } else { + // Mode: Strict + if (basename != scannedFileBasename) { + // Don't allow FOO.moc include other than self in strict mode + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file includes the moc file \"" << currentMoc + << "\", which seems to be the moc file from a different " + "source file. This is not supported. Include \"" + << scannedFileBasename + << ".moc\" to run moc on this source file.\n"; + this->LogError(err.str()); + return false; + } else { + // Include self + fileToMoc = absFilename; + ownDotMocIncluded = true; + } + } + if (!fileToMoc.empty()) { + includedMocs[fileToMoc] = currentMoc; + } + } + // Forward content pointer + contentChars += mocIncludeRegExp.end(); + } + } + + // In this case, check whether the scanned file itself contains a Q_OBJECT. + // 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. + // But warn, since this is not how it is supposed to be used. + if (requiresMoc && !ownDotMocIncluded) { + if (relaxed && ownMocUnderscoreIncluded) { + // This is for KDE4 compatibility: + std::ostringstream err; + err << "AUTOMOC: warning: " << absFilename << "\n" + << "The file contains a " << macroName + << " macro, but does not include " + << "\"" << scannedFileBasename << ".moc\", but instead includes " + << "\"" << ownMocUnderscoreFile << "\". Running moc on " + << "\"" << absFilename << "\" ! Better include \"" + << scannedFileBasename + << ".moc\" for compatibility with " + "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n"; + this->LogWarning(err.str()); + + // Use scanned source file instead of scanned header file as moc source + includedMocs[absFilename] = ownMocUnderscoreFile; + includedMocs.erase(ownMocHeaderFile); + } else { + // Otherwise always error out since it will not compile: + std::ostringstream err; + err << "AUTOMOC: error: " << absFilename << "\n" + << "The file contains a " << macroName + << " macro, but does not include " + << "\"" << scannedFileBasename << ".moc\" !\n"; + this->LogError(err.str()); + return false; + } + } + + return true; +} + void cmQtAutoGenerators::ParseForUic( const std::string& absFilename, std::map >& includedUis) diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 24960a5..f6fbed3 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -58,6 +58,12 @@ private: const std::vector& headerExtensions, std::map& includedMocs, std::map >& includedUis); + bool ParseSourceFile( + const std::string& absFilename, + const std::vector& headerExtensions, + std::map& includedMocs, + std::map >& includedUis, + bool relaxed); void SearchHeadersForCppFile( const std::string& absFilename, const std::vector& headerExtensions, -- cgit v0.12 From cbd650c2642e40369eaa53d20dafee6cdccae4af Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 14:26:56 +0100 Subject: AUTOGEN: Generators: Use unified ParseSourceFile and drop old methods --- Source/cmQtAutoGenerators.cxx | 320 +----------------------------------------- Source/cmQtAutoGenerators.h | 10 -- 2 files changed, 5 insertions(+), 325 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 41bb6f9..8439f2a 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -537,17 +537,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) err << "AUTOGEN: Checking " << absFilename << std::endl; this->LogInfo(err.str()); } - if (this->MocRelaxedMode) { - if (!this->ParseCppFile(absFilename, headerExtensions, includedMocs, - uiFiles)) { - return false; - } - } else { - if (!this->StrictParseCppFile(absFilename, headerExtensions, - includedMocs, uiFiles)) { - return false; - } + // Parse source file for MOC/UIC + if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, + uiFiles, this->MocRelaxedMode)) { + return false; } + // Find additional headers this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); } @@ -599,311 +594,6 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) /** * @return True on success */ -bool cmQtAutoGenerators::ParseCppFile( - const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map >& includedUis) -{ - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return true; - } - this->ParseForUic(absFilename, contentsString, includedUis); - if (this->MocExecutable.empty()) { - return true; - } - - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; - const std::string scannedFileBasename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - std::string macroName; - const bool requiresMoc = requiresMocing(contentsString, macroName); - bool dotMocIncluded = false; - bool mocUnderscoreIncluded = false; - std::string ownMocUnderscoreFile; - std::string ownDotMocFile; - std::string ownMocHeaderFile; - - std::string::size_type matchOffset = 0; - // first a simple string check for "moc" is *much* faster than the regexp, - // and if the string search already fails, we don't have to try the - // expensive regexp - if ((strstr(contentsString.c_str(), "moc") != CM_NULLPTR) && - (mocIncludeRegExp.find(contentsString))) { - // for every moc include in the file - do { - const std::string currentMoc = mocIncludeRegExp.match(1); - - std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); - - // If the moc include is of the moc_foo.cpp style we expect - // the Q_OBJECT class declaration in a header file. - // If the moc include is of the foo.moc style we need to look for - // a Q_OBJECT macro in the current source file, if it contains the - // macro we generate the moc file from the source file. - if (mocUnderscoreStyle) { - // basename should be the part of the moc filename used for - // finding the correct header, so we need to remove the moc_ part - basename = basename.substr(4); - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - - if (!headerToMoc.empty()) { - includedMocs[headerToMoc] = currentMoc; - if (basename == scannedFileBasename) { - mocUnderscoreIncluded = true; - ownMocUnderscoreFile = currentMoc; - ownMocHeaderFile = headerToMoc; - } - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "includes the moc file \"" << currentMoc << "\", " - << "but could not find header \"" << basename << '{' - << this->JoinExts(headerExtensions) << "}\" "; - if (mocSubDir.empty()) { - err << "in " << absPath << "\n" << std::endl; - } else { - err << "neither in " << absPath << " nor in " << mocSubDir << "\n" - << std::endl; - } - this->LogError(err.str()); - return false; - } - } else { - std::string fileToMoc = absFilename; - if (!requiresMoc || basename != scannedFileBasename) { - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - if (!headerToMoc.empty()) { - // this is for KDE4 compatibility: - fileToMoc = headerToMoc; - if (!requiresMoc && basename == scannedFileBasename) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc << "\", but does not contain a " << macroName - << " macro. Running moc on " - << "\"" << headerToMoc << "\" ! Include \"moc_" << basename - << ".cpp\" for a compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - } else { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc << "\" instead of \"moc_" << basename - << ".cpp\". " - "Running moc on " - << "\"" << headerToMoc << "\" ! Include \"moc_" << basename - << ".cpp\" for compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - } - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc - << "\", which seems to be the moc file from a different " - "source file. CMake also could not find a matching " - "header.\n" - << std::endl; - this->LogError(err.str()); - return false; - } - } else { - dotMocIncluded = true; - ownDotMocFile = currentMoc; - } - includedMocs[fileToMoc] = currentMoc; - } - matchOffset += mocIncludeRegExp.end(); - } while (mocIncludeRegExp.find(contentsString.c_str() + matchOffset)); - } - - // In this case, check whether the scanned file itself contains a Q_OBJECT. - // 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. - // But warn, since this is not how it is supposed to be used. - if (!dotMocIncluded && requiresMoc) { - if (mocUnderscoreIncluded) { - // this is for KDE4 compatibility: - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not " - "include " - << "\"" << scannedFileBasename << ".moc\", but instead " - "includes " - << "\"" << ownMocUnderscoreFile << "\". Running moc on " - << "\"" << absFilename << "\" ! Better include \"" - << scannedFileBasename - << ".moc\" for compatibility with " - "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n" - << std::endl; - this->LogWarning(err.str()); - - includedMocs[absFilename] = ownMocUnderscoreFile; - includedMocs.erase(ownMocHeaderFile); - } else { - // otherwise always error out since it will not compile: - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not " - "include " - << "\"" << scannedFileBasename << ".moc\" !\n" - << std::endl; - this->LogError(err.str()); - return false; - } - } - - return true; -} - -/** - * @return True on success - */ -bool cmQtAutoGenerators::StrictParseCppFile( - const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map >& includedUis) -{ - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return true; - } - this->ParseForUic(absFilename, contentsString, includedUis); - if (this->MocExecutable.empty()) { - return true; - } - - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; - const std::string scannedFileBasename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - - bool dotMocIncluded = false; - - std::string::size_type matchOffset = 0; - // first a simple string check for "moc" is *much* faster than the regexp, - // and if the string search already fails, we don't have to try the - // expensive regexp - if ((strstr(contentsString.c_str(), "moc") != CM_NULLPTR) && - (mocIncludeRegExp.find(contentsString))) { - // for every moc include in the file - do { - const std::string currentMoc = mocIncludeRegExp.match(1); - - std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); - const bool mocUnderscoreStyle = cmHasLiteralPrefix(basename, "moc_"); - - // If the moc include is of the moc_foo.cpp style we expect - // the Q_OBJECT class declaration in a header file. - // If the moc include is of the foo.moc style we need to look for - // a Q_OBJECT macro in the current source file, if it contains the - // macro we generate the moc file from the source file. - if (mocUnderscoreStyle) { - // basename should be the part of the moc filename used for - // finding the correct header, so we need to remove the moc_ part - basename = basename.substr(4); - std::string mocSubDir = extractSubDir(absPath, currentMoc); - std::string headerToMoc = - findMatchingHeader(absPath, mocSubDir, basename, headerExtensions); - - if (!headerToMoc.empty()) { - includedMocs[headerToMoc] = currentMoc; - } else { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << " The file " - << "includes the moc file \"" << currentMoc << "\", " - << "but could not find header \"" << basename << '{' - << this->JoinExts(headerExtensions) << "}\" "; - if (mocSubDir.empty()) { - err << "in " << absPath << "\n" << std::endl; - } else { - err << "neither in " << absPath << " nor in " << mocSubDir << "\n" - << std::endl; - } - this->LogError(err.str()); - return false; - } - } else { - if (basename != scannedFileBasename) { - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename - << ": The file " - "includes the moc file \"" - << currentMoc - << "\", which seems to be the moc file from a different " - "source file. This is not supported. " - "Include \"" - << scannedFileBasename << ".moc\" to run " - "moc on this source file.\n" - << std::endl; - this->LogError(err.str()); - return false; - } - dotMocIncluded = true; - includedMocs[absFilename] = currentMoc; - } - matchOffset += mocIncludeRegExp.end(); - } while (mocIncludeRegExp.find(contentsString.c_str() + matchOffset)); - } - - // In this case, check whether the scanned file itself contains a Q_OBJECT. - // 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. - // But warn, since this is not how it is supposed to be used. - std::string macroName; - if (!dotMocIncluded && requiresMocing(contentsString, macroName)) { - // otherwise always error out since it will not compile: - std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << ": The file " - << "contains a " << macroName << " macro, but does not include " - << "\"" << scannedFileBasename << ".moc\" !\n" - << std::endl; - this->LogError(err.str()); - return false; - } - - return true; -} - -/** - * @return True on success - */ bool cmQtAutoGenerators::ParseSourceFile( const std::string& absFilename, const std::vector& headerExtensions, diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index f6fbed3..08f98b5 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -48,16 +48,6 @@ private: bool GenerateQrc(const std::string& qrcInputFile, const std::string& qrcOutputFile, bool unique_n); - bool ParseCppFile( - const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map >& includedUis); - bool StrictParseCppFile( - const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map >& includedUis); bool ParseSourceFile( const std::string& absFilename, const std::vector& headerExtensions, -- cgit v0.12 From c736c41ad192c89e1c74751a8f401c75955f5f3b Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 14:52:49 +0100 Subject: AUTOGEN: Generators: Use precompiled regular expressions --- Source/cmQtAutoGenerators.cxx | 74 +++++++++++++++++++++---------------------- Source/cmQtAutoGenerators.h | 7 ++++ 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 8439f2a..6a7f828 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -28,27 +27,6 @@ #include #endif -static bool requiresMocing(const std::string& text, std::string& macroName) -{ - // this simple check is much much faster than the regexp - if (strstr(text.c_str(), "Q_OBJECT") == CM_NULLPTR && - strstr(text.c_str(), "Q_GADGET") == CM_NULLPTR) { - return false; - } - - cmsys::RegularExpression qObjectRegExp("[\n][ \t]*Q_OBJECT[^a-zA-Z0-9_]"); - if (qObjectRegExp.find(text)) { - macroName = "Q_OBJECT"; - return true; - } - cmsys::RegularExpression qGadgetRegExp("[\n][ \t]*Q_GADGET[^a-zA-Z0-9_]"); - if (qGadgetRegExp.find(text)) { - macroName = "Q_GADGET"; - return true; - } - return false; -} - static std::string findMatchingHeader( const std::string& absPath, const std::string& mocSubDir, const std::string& basename, @@ -120,6 +98,15 @@ cmQtAutoGenerators::cmQtAutoGenerators() this->ColorOutput = false; } } + + // Precompile regular expressions + this->RegExpQObject.compile("[\n][ \t]*Q_OBJECT[^a-zA-Z0-9_]"); + this->RegExpQGadget.compile("[\n][ \t]*Q_GADGET[^a-zA-Z0-9_]"); + this->RegExpMocInclude.compile( + "[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); + this->RegExpUicInclude.compile("[\n][ \t]*#[ \t]*include[ \t]+" + "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); } void cmQtAutoGenerators::MergeUicOptions( @@ -600,10 +587,6 @@ bool cmQtAutoGenerators::ParseSourceFile( std::map& includedMocs, std::map >& includedUis, bool relaxed) { - cmsys::RegularExpression mocIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?moc_[^ \">/]+\\.cpp|[^ \">]+\\.moc)[\">]"); - const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; @@ -629,7 +612,7 @@ bool cmQtAutoGenerators::ParseSourceFile( cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); std::string macroName; - const bool requiresMoc = requiresMocing(contentsString, macroName); + const bool requiresMoc = this->requiresMocing(contentsString, macroName); bool ownDotMocIncluded = false; bool ownMocUnderscoreIncluded = false; std::string ownMocUnderscoreFile; @@ -642,8 +625,8 @@ bool cmQtAutoGenerators::ParseSourceFile( if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { // Iterate over all included moc files const char* contentChars = contentsString.c_str(); - while (mocIncludeRegExp.find(contentChars)) { - const std::string currentMoc = mocIncludeRegExp.match(1); + while (this->RegExpMocInclude.find(contentChars)) { + const std::string currentMoc = this->RegExpMocInclude.match(1); // Basename of the current moc include std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentMoc); @@ -758,7 +741,7 @@ bool cmQtAutoGenerators::ParseSourceFile( } } // Forward content pointer - contentChars += mocIncludeRegExp.end(); + contentChars += this->RegExpMocInclude.end(); } } @@ -799,6 +782,25 @@ bool cmQtAutoGenerators::ParseSourceFile( return true; } +bool cmQtAutoGenerators::requiresMocing(const std::string& text, + std::string& macroName) +{ + // Run a simple check before an expensive regular expression check + if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { + if (this->RegExpQObject.find(text)) { + macroName = "Q_OBJECT"; + return true; + } + } + if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { + if (this->RegExpQGadget.find(text)) { + macroName = "Q_GADGET"; + return true; + } + } + return false; +} + void cmQtAutoGenerators::ParseForUic( const std::string& absFilename, std::map >& includedUis) @@ -825,20 +827,16 @@ void cmQtAutoGenerators::ParseForUic( return; } const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - cmsys::RegularExpression uiIncludeRegExp( - "[\n][ \t]*#[ \t]*include[ \t]+" - "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]"); - const char* contentChars = contentsString.c_str(); if (strstr(contentChars, "ui_") != CM_NULLPTR) { - while (uiIncludeRegExp.find(contentChars)) { - const std::string currentUi = uiIncludeRegExp.match(1); + while (this->RegExpUicInclude.find(contentChars)) { + const std::string currentUi = this->RegExpUicInclude.match(1); const std::string basename = cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); // basename should be the part of the ui filename used for // finding the correct header, so we need to remove the ui_ part includedUis[realName].push_back(basename.substr(3)); - contentChars += uiIncludeRegExp.end(); + contentChars += this->RegExpUicInclude.end(); } } } @@ -893,7 +891,7 @@ void cmQtAutoGenerators::ParseHeaders( } std::string macroName; - if (requiresMocing(contents, macroName)) { + if (this->requiresMocing(contents, macroName)) { notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + "/moc_" + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 08f98b5..b6bca8a 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -5,6 +5,7 @@ #include // IWYU pragma: keep #include +#include #include #include @@ -65,6 +66,8 @@ private: std::map& notIncludedMocs, std::map >& includedUis); + bool requiresMocing(const std::string& text, std::string& macroName); + void ParseForUic( const std::string& fileName, const std::string& contentsString, std::map >& includedUis); @@ -138,6 +141,10 @@ private: std::string OldCompileSettingsStr; // - Utility cmFilePathChecksum fpathCheckSum; + cmsys::RegularExpression RegExpQObject; + cmsys::RegularExpression RegExpQGadget; + cmsys::RegularExpression RegExpMocInclude; + cmsys::RegularExpression RegExpUicInclude; // - Flags bool IncludeProjectDirsBefore; bool Verbose; -- cgit v0.12 From f962275987e17cf94da663a919f52b6d0c8f44f4 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 18:37:30 +0100 Subject: AUTOGEN: Generators: Group static function definitions --- Source/cmQtAutoGenerators.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 6a7f828..561e566 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -80,6 +80,15 @@ static bool FileNameIsUnique(const std::string& filePath, return true; } +static std::string ReadAll(const std::string& filename) +{ + cmsys::ifstream file(filename.c_str()); + std::ostringstream stream; + stream << file.rdbuf(); + file.close(); + return stream.str(); +} + cmQtAutoGenerators::cmQtAutoGenerators() : Verbose(cmsys::SystemTools::HasEnv("VERBOSE")) , ColorOutput(true) @@ -472,15 +481,6 @@ void cmQtAutoGenerators::Init() } } -static std::string ReadAll(const std::string& filename) -{ - cmsys::ifstream file(filename.c_str()); - std::ostringstream stream; - stream << file.rdbuf(); - file.close(); - return stream.str(); -} - bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { // If settings changed everything needs to be re-generated. -- cgit v0.12 From cf1d5a9cdba49a2e9f08879d756ae118b22bfc6a Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 18:55:51 +0100 Subject: AUTOGEN: Generators: Rename ParseForUic method --- Source/cmQtAutoGenerators.cxx | 8 ++++---- Source/cmQtAutoGenerators.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 561e566..f2f1505 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -597,7 +597,7 @@ bool cmQtAutoGenerators::ParseSourceFile( } // Parse source contents for UIC - this->ParseForUic(absFilename, contentsString, includedUis); + this->ParseContentForUic(absFilename, contentsString, includedUis); // Continue with moc parsing on demand if (this->MocExecutable.empty()) { @@ -816,10 +816,10 @@ void cmQtAutoGenerators::ParseForUic( this->LogWarning(err.str()); return; } - this->ParseForUic(absFilename, contentsString, includedUis); + this->ParseContentForUic(absFilename, contentsString, includedUis); } -void cmQtAutoGenerators::ParseForUic( +void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { @@ -898,7 +898,7 @@ void cmQtAutoGenerators::ParseHeaders( ".cpp"; } } - this->ParseForUic(headerName, contents, includedUis); + this->ParseContentForUic(headerName, contents, includedUis); } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index b6bca8a..c6fe3b6 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -68,7 +68,7 @@ private: bool requiresMocing(const std::string& text, std::string& macroName); - void ParseForUic( + void ParseContentForUic( const std::string& fileName, const std::string& contentsString, std::map >& includedUis); -- cgit v0.12 From d51cc88e844c78c01c1616e6a2fb102c0682dd00 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 19:03:14 +0100 Subject: AUTOGEN: Generators: Split config headers/sources into vector --- Source/cmQtAutoGenerators.cxx | 23 ++++++++++------------- Source/cmQtAutoGenerators.h | 4 ++-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index f2f1505..5a370fe 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -221,8 +221,10 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->RccExecutable = makefile->GetSafeDefinition("AM_QT_RCC_EXECUTABLE"); // - File Lists - this->Sources = makefile->GetSafeDefinition("AM_SOURCES"); - this->Headers = makefile->GetSafeDefinition("AM_HEADERS"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SOURCES"), + this->Sources); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_HEADERS"), + this->Headers); // - Moc this->SkipMoc = makefile->GetSafeDefinition("AM_SKIP_MOC"); @@ -501,9 +503,6 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) // collect all headers which may need to be mocced std::set headerFiles; - std::vector sourceFiles; - cmSystemTools::ExpandListArgument(this->Sources, sourceFiles); - const std::vector& headerExtensions = makefile->GetCMakeInstance()->GetHeaderExtensions(); @@ -512,13 +511,13 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::vector uicSkipped; cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); - for (std::vector::const_iterator it = sourceFiles.begin(); - it != sourceFiles.end(); ++it) { - const bool skipUic = - std::find(uicSkipped.begin(), uicSkipped.end(), *it) != uicSkipped.end(); + for (std::vector::const_iterator it = this->Sources.begin(); + it != this->Sources.end(); ++it) { + const std::string& absFilename = *it; + const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), + absFilename) != uicSkipped.end(); std::map >& uiFiles = skipUic ? skippedUis : includedUis; - const std::string& absFilename = *it; if (this->Verbose) { std::ostringstream err; err << "AUTOGEN: Checking " << absFilename << std::endl; @@ -551,9 +550,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) } } - std::vector headerFilesVec; - cmSystemTools::ExpandListArgument(this->Headers, headerFilesVec); - headerFiles.insert(headerFilesVec.begin(), headerFilesVec.end()); + headerFiles.insert(this->Headers.begin(), this->Headers.end()); // key = moc source filepath, value = moc output filename std::map notIncludedMocs; diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index c6fe3b6..bffdee2 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -116,8 +116,8 @@ private: std::string UicExecutable; std::string RccExecutable; // - File lists - std::string Sources; - std::string Headers; + std::vector Sources; + std::vector Headers; // - Moc std::string SkipMoc; std::string MocCompileDefinitionsStr; -- cgit v0.12 From 9986da4f0f2f49c0d7d260f9d21deaa906708376 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Tue, 27 Dec 2016 19:08:23 +0100 Subject: AUTOGEN: Generators: Split config SKIP_MOC and SKIP_UIC into vectors --- Source/cmQtAutoGenerators.cxx | 36 ++++++++++++++++-------------------- Source/cmQtAutoGenerators.h | 4 ++-- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 5a370fe..33550b0 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -227,7 +227,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->Headers); // - Moc - this->SkipMoc = makefile->GetSafeDefinition("AM_SKIP_MOC"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SKIP_MOC"), + this->SkipMoc); { std::string compileDefsPropOrig = "AM_MOC_COMPILE_DEFINITIONS"; std::string compileDefsProp = compileDefsPropOrig; @@ -254,7 +255,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( this->MocOptionsStr = makefile->GetSafeDefinition("AM_MOC_OPTIONS"); // - Uic - this->SkipUic = makefile->GetSafeDefinition("AM_SKIP_UIC"); + cmSystemTools::ExpandListArgument(makefile->GetSafeDefinition("AM_SKIP_UIC"), + this->SkipUic); { const char* uicOptionsFiles = makefile->GetSafeDefinition("AM_UIC_OPTIONS_FILES"); @@ -508,14 +510,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::map > includedUis; std::map > skippedUis; - std::vector uicSkipped; - cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); for (std::vector::const_iterator it = this->Sources.begin(); it != this->Sources.end(); ++it) { const std::string& absFilename = *it; - const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), - absFilename) != uicSkipped.end(); + const bool skipUic = std::find(this->SkipUic.begin(), this->SkipUic.end(), + absFilename) != this->SkipUic.end(); std::map >& uiFiles = skipUic ? skippedUis : includedUis; if (this->Verbose) { @@ -532,21 +532,17 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); } - { - std::vector mocSkipped; - cmSystemTools::ExpandListArgument(this->SkipMoc, mocSkipped); - for (std::vector::const_iterator it = mocSkipped.begin(); - it != mocSkipped.end(); ++it) { - if (std::find(uicSkipped.begin(), uicSkipped.end(), *it) != - uicSkipped.end()) { - const std::string& absFilename = *it; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); - } - this->ParseForUic(absFilename, includedUis); + for (std::vector::const_iterator it = this->SkipMoc.begin(); + it != this->SkipMoc.end(); ++it) { + if (std::find(this->SkipUic.begin(), this->SkipUic.end(), *it) != + this->SkipUic.end()) { + const std::string& absFilename = *it; + if (this->Verbose) { + std::ostringstream err; + err << "AUTOGEN: Checking " << absFilename << std::endl; + this->LogInfo(err.str()); } + this->ParseForUic(absFilename, includedUis); } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index bffdee2..f86e7c3 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -119,7 +119,7 @@ private: std::vector Sources; std::vector Headers; // - Moc - std::string SkipMoc; + std::vector SkipMoc; std::string MocCompileDefinitionsStr; std::string MocIncludesStr; std::string MocOptionsStr; @@ -129,7 +129,7 @@ private: std::list MocDefinitions; std::vector MocOptions; // - Uic - std::string SkipUic; + std::vector SkipUic; std::vector UicTargetOptions; std::map UicOptions; // - Rcc -- cgit v0.12 From 6ae19bf32e232beb59a0c427d82c0761e8248ab8 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 28 Dec 2016 10:25:16 +0100 Subject: AUTOGEN: Generators: Add dedicated method for moc content parsing --- Source/cmQtAutoGenerators.cxx | 136 +++++++++++++++++++++++------------------- Source/cmQtAutoGenerators.h | 6 ++ 2 files changed, 80 insertions(+), 62 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 33550b0..5877619 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -580,19 +580,90 @@ bool cmQtAutoGenerators::ParseSourceFile( std::map& includedMocs, std::map >& includedUis, bool relaxed) { + bool success = true; const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; err << "AUTOGEN: warning: " << absFilename << "\n" << "The file is empty\n"; this->LogWarning(err.str()); - return true; + } else { + // Parse source contents for UIC + this->ParseContentForUic(absFilename, contentsString, includedUis); + // Parse source contents for MOC + success = this->ParseContentForMoc( + absFilename, contentsString, headerExtensions, includedMocs, relaxed); + } + return success; +} + +bool cmQtAutoGenerators::requiresMocing(const std::string& text, + std::string& macroName) +{ + // Run a simple check before an expensive regular expression check + if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { + if (this->RegExpQObject.find(text)) { + macroName = "Q_OBJECT"; + return true; + } + } + if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { + if (this->RegExpQGadget.find(text)) { + macroName = "Q_GADGET"; + return true; + } } + return false; +} - // Parse source contents for UIC +void cmQtAutoGenerators::ParseForUic( + const std::string& absFilename, + std::map >& includedUis) +{ + if (this->UicExecutable.empty()) { + return; + } + const std::string contentsString = ReadAll(absFilename); + if (contentsString.empty()) { + std::ostringstream err; + err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" + << std::endl; + this->LogWarning(err.str()); + return; + } this->ParseContentForUic(absFilename, contentsString, includedUis); +} - // Continue with moc parsing on demand +void cmQtAutoGenerators::ParseContentForUic( + const std::string& absFilename, const std::string& contentsString, + std::map >& includedUis) +{ + if (this->UicExecutable.empty()) { + return; + } + const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "ui_") != CM_NULLPTR) { + while (this->RegExpUicInclude.find(contentChars)) { + const std::string currentUi = this->RegExpUicInclude.match(1); + const std::string basename = + cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); + // basename should be the part of the ui filename used for + // finding the correct header, so we need to remove the ui_ part + includedUis[realName].push_back(basename.substr(3)); + contentChars += this->RegExpUicInclude.end(); + } + } +} + +/** + * @return True on success + */ +bool cmQtAutoGenerators::ParseContentForMoc( + const std::string& absFilename, const std::string& contentsString, + const std::vector& headerExtensions, + std::map& includedMocs, bool relaxed) +{ if (this->MocExecutable.empty()) { return true; } @@ -775,65 +846,6 @@ bool cmQtAutoGenerators::ParseSourceFile( return true; } -bool cmQtAutoGenerators::requiresMocing(const std::string& text, - std::string& macroName) -{ - // Run a simple check before an expensive regular expression check - if (strstr(text.c_str(), "Q_OBJECT") != CM_NULLPTR) { - if (this->RegExpQObject.find(text)) { - macroName = "Q_OBJECT"; - return true; - } - } - if (strstr(text.c_str(), "Q_GADGET") != CM_NULLPTR) { - if (this->RegExpQGadget.find(text)) { - macroName = "Q_GADGET"; - return true; - } - } - return false; -} - -void cmQtAutoGenerators::ParseForUic( - const std::string& absFilename, - std::map >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { - std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return; - } - this->ParseContentForUic(absFilename, contentsString, includedUis); -} - -void cmQtAutoGenerators::ParseContentForUic( - const std::string& absFilename, const std::string& contentsString, - std::map >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } - const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); - const char* contentChars = contentsString.c_str(); - if (strstr(contentChars, "ui_") != CM_NULLPTR) { - while (this->RegExpUicInclude.find(contentChars)) { - const std::string currentUi = this->RegExpUicInclude.match(1); - const std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(currentUi); - // basename should be the part of the ui filename used for - // finding the correct header, so we need to remove the ui_ part - includedUis[realName].push_back(basename.substr(3)); - contentChars += this->RegExpUicInclude.end(); - } - } -} - void cmQtAutoGenerators::SearchHeadersForCppFile( const std::string& absFilename, const std::vector& headerExtensions, diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index f86e7c3..dac23d9 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -72,6 +72,12 @@ private: const std::string& fileName, const std::string& contentsString, std::map >& includedUis); + bool ParseContentForMoc(const std::string& absFilename, + const std::string& contentsString, + const std::vector& headerExtensions, + std::map& includedMocs, + bool relaxed); + void ParseForUic( const std::string& fileName, std::map >& includedUis); -- cgit v0.12 From 63d3ca4c1cab0c7b9c71d6c051c3b4c053eb7627 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 28 Dec 2016 11:43:25 +0100 Subject: AUTOGEN: Make skipMoc and skipUic blacklists behave the same way Before skipMoc was a list of files that were not included in the sources. Now the skipMoc files are added to the sources as well in case they are needed for uic processing. skipMoc becomes a blacklist just like skipUic. --- Source/cmQtAutoGeneratorInitializer.cxx | 49 +++++++++----- Source/cmQtAutoGenerators.cxx | 113 ++++++++++++++------------------ 2 files changed, 82 insertions(+), 80 deletions(-) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index f0847b1..0ed43b1 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -100,8 +100,8 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) static void SetupSourceFiles(cmGeneratorTarget const* target, std::vector& skipMoc, - std::vector& mocSources, - std::vector& mocHeaders, + std::vector& sources, + std::vector& headers, std::vector& skipUic) { cmMakefile* makefile = target->Target->GetMakefile(); @@ -113,26 +113,39 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, for (std::vector::const_iterator fileIt = srcFiles.begin(); fileIt != srcFiles.end(); ++fileIt) { cmSourceFile* sf = *fileIt; + const cmSystemTools::FileFormat fileType = + cmSystemTools::GetFileFormat(sf->GetExtension().c_str()); + + if (!(fileType == cmSystemTools::CXX_FILE_FORMAT) && + !(fileType == cmSystemTools::HEADER_FILE_FORMAT)) { + continue; + } + if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { + continue; + } + const bool fileSkipUic = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); + const bool fileSkipMoc = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); + if (fileSkipUic && fileSkipMoc) { + continue; + } + + // Use file const std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - const std::string ext = sf->GetExtension(); - - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC"))) { + // Add file name to sources or headers list + if (fileType == cmSystemTools::CXX_FILE_FORMAT) { + sources.push_back(absFile); + } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { + headers.push_back(absFile); + } + // Add file name to skip lists on demand + if (fileSkipUic) { skipUic.push_back(absFile); } - - if (!cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC"))) { - skipMoc.push_back(absFile); - } else { - cmSystemTools::FileFormat fileType = - cmSystemTools::GetFileFormat(ext.c_str()); - if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - mocSources.push_back(absFile); - } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - mocHeaders.push_back(absFile); - } - } + if (fileSkipMoc) { + skipMoc.push_back(absFile); } } } diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 5877619..4b5e113 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -89,6 +89,12 @@ static std::string ReadAll(const std::string& filename) return stream.str(); } +static bool ListContains(const std::vector& list, + const std::string& entry) +{ + return (std::find(list.begin(), list.end(), entry) != list.end()); +} + cmQtAutoGenerators::cmQtAutoGenerators() : Verbose(cmsys::SystemTools::HasEnv("VERBOSE")) , ColorOutput(true) @@ -502,56 +508,35 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) // key = moc source filepath, value = moc output filepath std::map includedMocs; - // collect all headers which may need to be mocced + std::map notIncludedMocs; + std::map > includedUis; + // collects all headers which may need to be mocced std::set headerFiles; - const std::vector& headerExtensions = - makefile->GetCMakeInstance()->GetHeaderExtensions(); - - std::map > includedUis; - std::map > skippedUis; - - for (std::vector::const_iterator it = this->Sources.begin(); - it != this->Sources.end(); ++it) { - const std::string& absFilename = *it; - const bool skipUic = std::find(this->SkipUic.begin(), this->SkipUic.end(), - absFilename) != this->SkipUic.end(); - std::map >& uiFiles = - skipUic ? skippedUis : includedUis; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); - } - // Parse source file for MOC/UIC - if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, - uiFiles, this->MocRelaxedMode)) { - return false; - } - // Find additional headers - this->SearchHeadersForCppFile(absFilename, headerExtensions, headerFiles); - } + // Parse sources + { + const std::vector& headerExtensions = + makefile->GetCMakeInstance()->GetHeaderExtensions(); - for (std::vector::const_iterator it = this->SkipMoc.begin(); - it != this->SkipMoc.end(); ++it) { - if (std::find(this->SkipUic.begin(), this->SkipUic.end(), *it) != - this->SkipUic.end()) { + for (std::vector::const_iterator it = this->Sources.begin(); + it != this->Sources.end(); ++it) { const std::string& absFilename = *it; - if (this->Verbose) { - std::ostringstream err; - err << "AUTOGEN: Checking " << absFilename << std::endl; - this->LogInfo(err.str()); + // Parse source file for MOC/UIC + if (!this->ParseSourceFile(absFilename, headerExtensions, includedMocs, + includedUis, this->MocRelaxedMode)) { + return false; } - this->ParseForUic(absFilename, includedUis); + // Find additional headers + this->SearchHeadersForCppFile(absFilename, headerExtensions, + headerFiles); } } + // Parse headers headerFiles.insert(this->Headers.begin(), this->Headers.end()); - - // key = moc source filepath, value = moc output filename - std::map notIncludedMocs; this->ParseHeaders(headerFiles, includedMocs, notIncludedMocs, includedUis); + // Generate files if (!this->MocExecutable.empty()) { if (!this->GenerateMocFiles(includedMocs, notIncludedMocs)) { return false; @@ -588,11 +573,13 @@ bool cmQtAutoGenerators::ParseSourceFile( << "The file is empty\n"; this->LogWarning(err.str()); } else { - // Parse source contents for UIC - this->ParseContentForUic(absFilename, contentsString, includedUis); // Parse source contents for MOC success = this->ParseContentForMoc( absFilename, contentsString, headerExtensions, includedMocs, relaxed); + // Parse source contents for UIC + if (success) { + this->ParseContentForUic(absFilename, contentsString, includedUis); + } } return success; } @@ -616,31 +603,21 @@ bool cmQtAutoGenerators::requiresMocing(const std::string& text, return false; } -void cmQtAutoGenerators::ParseForUic( - const std::string& absFilename, +void cmQtAutoGenerators::ParseContentForUic( + const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { - if (this->UicExecutable.empty()) { + if (this->UicExecutable.empty() || + ListContains(this->SkipUic, absFilename)) { return; } - const std::string contentsString = ReadAll(absFilename); - if (contentsString.empty()) { + + if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << ": file is empty\n" - << std::endl; - this->LogWarning(err.str()); - return; + err << "AUTOUIC: Checking " << absFilename << "\n"; + this->LogInfo(err.str()); } - this->ParseContentForUic(absFilename, contentsString, includedUis); -} -void cmQtAutoGenerators::ParseContentForUic( - const std::string& absFilename, const std::string& contentsString, - std::map >& includedUis) -{ - if (this->UicExecutable.empty()) { - return; - } const std::string realName = cmsys::SystemTools::GetRealPath(absFilename); const char* contentChars = contentsString.c_str(); if (strstr(contentChars, "ui_") != CM_NULLPTR) { @@ -664,10 +641,17 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector& headerExtensions, std::map& includedMocs, bool relaxed) { - if (this->MocExecutable.empty()) { + if (this->MocExecutable.empty() || + ListContains(this->SkipMoc, absFilename)) { return true; } + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << absFilename << "\n"; + this->LogInfo(err.str()); + } + const std::string scannedFileAbsPath = cmsys::SystemTools::GetFilenamePath( cmsys::SystemTools::GetRealPath(absFilename)) + @@ -887,11 +871,14 @@ void cmQtAutoGenerators::ParseHeaders( const std::string& headerName = *hIt; const std::string contents = ReadAll(headerName); + // Parse header content for MOC if (!this->MocExecutable.empty() && - includedMocs.find(headerName) == includedMocs.end()) { + !ListContains(this->SkipMoc, headerName) && + (includedMocs.find(headerName) == includedMocs.end())) { + if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: Checking " << headerName << std::endl; + err << "AUTOMOC: Checking " << headerName << "\n"; this->LogInfo(err.str()); } @@ -903,6 +890,8 @@ void cmQtAutoGenerators::ParseHeaders( ".cpp"; } } + + // Parse header content for UIC this->ParseContentForUic(headerName, contents, includedUis); } } -- cgit v0.12 From e7280a7f1743d73cdab41ed709a9e1d0f99b6342 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 28 Dec 2016 11:56:20 +0100 Subject: AUTOGEN: Rename config variables The new names describe the variables use cases better. --- Modules/AutogenInfo.cmake.in | 8 ++++---- Source/cmQtAutoGeneratorInitializer.cxx | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Modules/AutogenInfo.cmake.in b/Modules/AutogenInfo.cmake.in index 84b0f4d..3fafaff 100644 --- a/Modules/AutogenInfo.cmake.in +++ b/Modules/AutogenInfo.cmake.in @@ -1,7 +1,7 @@ -set(AM_SOURCES @_cpp_files@ ) -set(AM_SKIP_MOC @_skip_moc@ ) -set(AM_SKIP_UIC @_skip_uic@ ) -set(AM_HEADERS @_moc_headers@ ) +set(AM_SOURCES @_moc_uic_sources@) +set(AM_HEADERS @_moc_uic_headers@) +set(AM_SKIP_MOC @_skip_moc@) +set(AM_SKIP_UIC @_skip_uic@) set(AM_MOC_COMPILE_DEFINITIONS @_moc_compile_defs@) set(AM_MOC_INCLUDES @_moc_incs@) set(AM_MOC_OPTIONS @_moc_options@) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index 0ed43b1..5304aec 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -99,9 +99,9 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) } static void SetupSourceFiles(cmGeneratorTarget const* target, + std::vector& mocUicSources, + std::vector& mocUicHeaders, std::vector& skipMoc, - std::vector& sources, - std::vector& headers, std::vector& skipUic) { cmMakefile* makefile = target->Target->GetMakefile(); @@ -136,9 +136,9 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, cmsys::SystemTools::GetRealPath(sf->GetFullPath()); // Add file name to sources or headers list if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - sources.push_back(absFile); + mocUicSources.push_back(absFile); } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - headers.push_back(absFile); + mocUicHeaders.push_back(absFile); } // Add file name to skip lists on demand if (fileSkipUic) { @@ -171,7 +171,6 @@ static void GetCompileDefinitionsAndDirectories( static void MocSetupAutoTarget( cmGeneratorTarget const* target, const std::string& autogenTargetName, std::vector const& skipMoc, - std::vector const& mocHeaders, std::map& configIncludes, std::map& configDefines) { @@ -185,9 +184,6 @@ static void MocSetupAutoTarget( makefile->AddDefinition( "_skip_moc", cmOutputConverter::EscapeForCMake(cmJoin(skipMoc, ";")).c_str()); - makefile->AddDefinition( - "_moc_headers", - cmOutputConverter::EscapeForCMake(cmJoin(mocHeaders, ";")).c_str()); bool relaxedMode = makefile->IsOn("CMAKE_AUTOMOC_RELAXED_MODE"); makefile->AddDefinition("_moc_relaxed_mode", relaxedMode ? "TRUE" : "FALSE"); @@ -863,10 +859,10 @@ void cmQtAutoGeneratorInitializer::SetupAutoGenerateTarget( cmOutputConverter::EscapeForCMake(target->GetName()).c_str()); makefile->AddDefinition("_target_qt_version", qtMajorVersion.c_str()); - std::vector skipUic; + std::vector mocUicSources; + std::vector mocUicHeaders; std::vector skipMoc; - std::vector mocSources; - std::vector mocHeaders; + std::vector skipUic; std::map configMocIncludes; std::map configMocDefines; std::map configUicOptions; @@ -874,14 +870,18 @@ void cmQtAutoGeneratorInitializer::SetupAutoGenerateTarget( if (target->GetPropertyAsBool("AUTOMOC") || target->GetPropertyAsBool("AUTOUIC") || target->GetPropertyAsBool("AUTORCC")) { - SetupSourceFiles(target, skipMoc, mocSources, mocHeaders, skipUic); + SetupSourceFiles(target, mocUicSources, mocUicHeaders, skipMoc, skipUic); } makefile->AddDefinition( - "_cpp_files", - cmOutputConverter::EscapeForCMake(cmJoin(mocSources, ";")).c_str()); + "_moc_uic_sources", + cmOutputConverter::EscapeForCMake(cmJoin(mocUicSources, ";")).c_str()); + makefile->AddDefinition( + "_moc_uic_headers", + cmOutputConverter::EscapeForCMake(cmJoin(mocUicHeaders, ";")).c_str()); + if (target->GetPropertyAsBool("AUTOMOC")) { - MocSetupAutoTarget(target, autogenTargetName, skipMoc, mocHeaders, - configMocIncludes, configMocDefines); + MocSetupAutoTarget(target, autogenTargetName, skipMoc, configMocIncludes, + configMocDefines); } if (target->GetPropertyAsBool("AUTOUIC")) { UicSetupAutoTarget(target, skipUic, configUicOptions); -- cgit v0.12 From 32d3540e090c4a24d55b99c49c094a9cb574c9b3 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 28 Dec 2016 12:01:31 +0100 Subject: AUTOGEN: Initializer: Introduce SKIP_AUTOGEN checks --- Source/cmQtAutoGeneratorInitializer.cxx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index 5304aec..de0c212 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -123,6 +123,9 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { continue; } + if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN"))) { + continue; + } const bool fileSkipUic = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); const bool fileSkipMoc = @@ -578,7 +581,9 @@ static void RccSetupAutoTarget(cmGeneratorTarget const* target, std::string ext = sf->GetExtension(); if (ext == "qrc") { std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - bool skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")); + const bool skip = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")) || + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC")); if (!skip) { _rcc_files += sepRccFiles; @@ -756,6 +761,7 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget( fileIt != srcFiles.end(); ++fileIt) { cmSourceFile* sf = *fileIt; if (sf->GetExtension() == "qrc" && + !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")) && !cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTORCC"))) { { const std::string absFile = -- cgit v0.12 From d9313a82906ced0ff3c76828e86d9d7a248a5e49 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 28 Dec 2016 12:15:11 +0100 Subject: AUTOGEN: Initializer: Enable SKIP_AUTOGEN on all AUTOGEN generated sources --- Source/cmQtAutoGeneratorInitializer.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index de0c212..b74fbf3 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -646,7 +646,8 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenSources( cmMakefile* makefile = target->Target->GetMakefile(); const std::string mocCppFile = GetAutogenTargetBuildDir(target) + "moc_compilation.cpp"; - makefile->GetOrCreateSource(mocCppFile, true); + cmSourceFile* gf = makefile->GetOrCreateSource(mocCppFile, true); + gf->SetProperty("SKIP_AUTOGEN", "On"); target->AddSource(mocCppFile); } } @@ -778,7 +779,8 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget( rccOutputFile += ".cpp"; // Add rcc output file to origin target sources - makefile->GetOrCreateSource(rccOutputFile, true); + cmSourceFile* gf = makefile->GetOrCreateSource(rccOutputFile, true); + gf->SetProperty("SKIP_AUTOGEN", "On"); target->AddSource(rccOutputFile); // Register rcc output file as generated autogenOutputFiles.push_back(rccOutputFile); -- cgit v0.12 From d8e45536fb3637454cf17a638dcd9fc236e94660 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 31 Dec 2016 11:17:07 +0100 Subject: AUTOGEN: Initializer: Always remember skipped files --- Source/cmQtAutoGeneratorInitializer.cxx | 61 +++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index b74fbf3..6d4c302 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -101,14 +101,17 @@ static std::string GetQtMajorVersion(cmGeneratorTarget const* target) static void SetupSourceFiles(cmGeneratorTarget const* target, std::vector& mocUicSources, std::vector& mocUicHeaders, - std::vector& skipMoc, - std::vector& skipUic) + std::vector& skipMocList, + std::vector& skipUicList) { cmMakefile* makefile = target->Target->GetMakefile(); std::vector srcFiles; target->GetConfigCommonSourceFiles(srcFiles); + const bool targetMoc = target->GetPropertyAsBool("AUTOMOC"); + const bool targetUic = target->GetPropertyAsBool("AUTOUIC"); + cmFilePathChecksum fpathCheckSum(makefile); for (std::vector::const_iterator fileIt = srcFiles.begin(); fileIt != srcFiles.end(); ++fileIt) { @@ -123,32 +126,38 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, if (cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"))) { continue; } - if (cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN"))) { - continue; - } - const bool fileSkipUic = - cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); - const bool fileSkipMoc = - cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); - if (fileSkipUic && fileSkipMoc) { - continue; - } - - // Use file const std::string absFile = cmsys::SystemTools::GetRealPath(sf->GetFullPath()); - // Add file name to sources or headers list - if (fileType == cmSystemTools::CXX_FILE_FORMAT) { - mocUicSources.push_back(absFile); - } else if (fileType == cmSystemTools::HEADER_FILE_FORMAT) { - mocUicHeaders.push_back(absFile); - } - // Add file name to skip lists on demand - if (fileSkipUic) { - skipUic.push_back(absFile); - } - if (fileSkipMoc) { - skipMoc.push_back(absFile); + // Skip flags + const bool skipAll = + cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOGEN")); + const bool skipMoc = + skipAll || cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC")); + const bool skipUic = + skipAll || cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOUIC")); + // Add file name to skip lists. + // Do this even when the file is not added to the sources/headers lists + // because the file name may be extracted from an other file when + // processing + if (skipMoc) { + skipMocList.push_back(absFile); + } + if (skipUic) { + skipUicList.push_back(absFile); + } + + if ((targetMoc && !skipMoc) || (targetUic && !skipUic)) { + // Add file name to sources or headers list + switch (fileType) { + case cmSystemTools::CXX_FILE_FORMAT: + mocUicSources.push_back(absFile); + break; + case cmSystemTools::HEADER_FILE_FORMAT: + mocUicHeaders.push_back(absFile); + break; + default: + break; + } } } } -- cgit v0.12 From de531432887487943dbe4ae5a1bde762d5582e06 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Thu, 29 Dec 2016 17:16:12 +0100 Subject: AUTOGEN: Generators: Remove unused variable --- Source/cmQtAutoGenerators.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 4b5e113..c162c87 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -666,13 +666,12 @@ bool cmQtAutoGenerators::ParseContentForMoc( std::string ownMocUnderscoreFile; std::string ownMocHeaderFile; - std::string::size_type matchOffset = 0; // first a simple string check for "moc" is *much* faster than the regexp, // and if the string search already fails, we don't have to try the // expensive regexp - if (strstr(contentsString.c_str(), "moc") != CM_NULLPTR) { + const char* contentChars = contentsString.c_str(); + if (strstr(contentChars, "moc") != CM_NULLPTR) { // Iterate over all included moc files - const char* contentChars = contentsString.c_str(); while (this->RegExpMocInclude.find(contentChars)) { const std::string currentMoc = this->RegExpMocInclude.match(1); // Basename of the current moc include -- cgit v0.12 From 966be439e07131c3ff84175c1a9e3b6336908d8e Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 31 Dec 2016 11:51:39 +0100 Subject: AUTOGEN: Generators: Be verbose about skipping files --- Source/cmQtAutoGenerators.cxx | 61 ++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index c162c87..b323609 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -607,11 +607,20 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { - if (this->UicExecutable.empty() || - ListContains(this->SkipUic, absFilename)) { + if (this->UicExecutable.empty()) { + return; + } + // Check skip list + if (ListContains(this->SkipUic, absFilename)) { + if (this->Verbose) { + std::ostringstream err; + err << "AUTOUIC: Skipping " << absFilename << "\n"; + this->LogInfo(err.str()); + } return; } + // Process if (this->Verbose) { std::ostringstream err; err << "AUTOUIC: Checking " << absFilename << "\n"; @@ -641,11 +650,20 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector& headerExtensions, std::map& includedMocs, bool relaxed) { - if (this->MocExecutable.empty() || - ListContains(this->SkipMoc, absFilename)) { + if (this->MocExecutable.empty()) { + return true; + } + // Check skip list + if (ListContains(this->SkipMoc, absFilename)) { + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Skipping " << absFilename << "\n"; + this->LogInfo(err.str()); + } return true; } + // Process if (this->Verbose) { std::ostringstream err; err << "AUTOMOC: Checking " << absFilename << "\n"; @@ -872,21 +890,28 @@ void cmQtAutoGenerators::ParseHeaders( // Parse header content for MOC if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, headerName) && (includedMocs.find(headerName) == includedMocs.end())) { - - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; - this->LogInfo(err.str()); - } - - std::string macroName; - if (this->requiresMocing(contents, macroName)) { - notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + - "/moc_" + - cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + - ".cpp"; + if (ListContains(this->SkipMoc, headerName)) { + // Skip + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Skipping " << headerName << "\n"; + this->LogInfo(err.str()); + } + } else { + // Process + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << headerName << "\n"; + this->LogInfo(err.str()); + } + std::string macroName; + if (this->requiresMocing(contents, macroName)) { + notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + + "/moc_" + + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + + ".cpp"; + } } } -- cgit v0.12 From 94c319f93309ff4cddd0280cdcbd48b50492db36 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 31 Dec 2016 13:04:38 +0100 Subject: AUTOGEN: Generators: Use separate header lists for MOC and UIC This is necessary for the skipMoc and skipUic lists to work properly. --- Source/cmQtAutoGenerators.cxx | 58 +++++++++++++++++++++++++++++++++---------- Source/cmQtAutoGenerators.h | 8 +++--- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index b323609..fac9d54 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -511,7 +511,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) std::map notIncludedMocs; std::map > includedUis; // collects all headers which may need to be mocced - std::set headerFiles; + std::set headerFilesMoc; + std::set headerFilesUic; // Parse sources { @@ -527,14 +528,16 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) return false; } // Find additional headers - this->SearchHeadersForCppFile(absFilename, headerExtensions, - headerFiles); + this->SearchHeadersForSourceFile(absFilename, headerExtensions, + headerFilesMoc, headerFilesUic); } } // Parse headers - headerFiles.insert(this->Headers.begin(), this->Headers.end()); - this->ParseHeaders(headerFiles, includedMocs, notIncludedMocs, includedUis); + headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); + headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + this->ParseHeaders(headerFilesMoc, headerFilesUic, includedMocs, + notIncludedMocs, includedUis); // Generate files if (!this->MocExecutable.empty()) { @@ -847,10 +850,10 @@ bool cmQtAutoGenerators::ParseContentForMoc( return true; } -void cmQtAutoGenerators::SearchHeadersForCppFile( +void cmQtAutoGenerators::SearchHeadersForSourceFile( const std::string& absFilename, const std::vector& headerExtensions, - std::set& absHeaders) + std::set& absHeadersMoc, std::set& absHeadersUic) { // search for header files and private header files we may need to moc: const std::string basename = @@ -859,37 +862,64 @@ void cmQtAutoGenerators::SearchHeadersForCppFile( cmsys::SystemTools::GetRealPath(absFilename)) + '/'; + // Search for regular header for (std::vector::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { const std::string headerName = absPath + basename + "." + (*ext); if (cmsys::SystemTools::FileExists(headerName.c_str())) { - absHeaders.insert(headerName); + // Moc headers + if (!this->MocExecutable.empty() && + !ListContains(this->SkipMoc, absFilename)) { + absHeadersMoc.insert(headerName); + } + // Uic headers + if (!this->UicExecutable.empty() && + !ListContains(this->SkipUic, absFilename)) { + absHeadersUic.insert(headerName); + } break; } } + // Search for private header for (std::vector::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { const std::string privateHeaderName = absPath + basename + "_p." + (*ext); if (cmsys::SystemTools::FileExists(privateHeaderName.c_str())) { - absHeaders.insert(privateHeaderName); + // Moc headers + if (!this->MocExecutable.empty() && + !ListContains(this->SkipMoc, absFilename)) { + absHeadersMoc.insert(privateHeaderName); + } + // Uic headers + if (!this->UicExecutable.empty() && + !ListContains(this->SkipUic, absFilename)) { + absHeadersUic.insert(privateHeaderName); + } break; } } } void cmQtAutoGenerators::ParseHeaders( - const std::set& absHeaders, + const std::set& absHeadersMoc, + const std::set& absHeadersUic, const std::map& includedMocs, std::map& notIncludedMocs, std::map >& includedUis) { - for (std::set::const_iterator hIt = absHeaders.begin(); - hIt != absHeaders.end(); ++hIt) { + // Merged header files list to read files only once + std::set headerFiles; + headerFiles.insert(absHeadersMoc.begin(), absHeadersMoc.end()); + headerFiles.insert(absHeadersUic.begin(), absHeadersUic.end()); + + for (std::set::const_iterator hIt = headerFiles.begin(); + hIt != headerFiles.end(); ++hIt) { const std::string& headerName = *hIt; const std::string contents = ReadAll(headerName); // Parse header content for MOC if (!this->MocExecutable.empty() && + (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { if (ListContains(this->SkipMoc, headerName)) { // Skip @@ -916,7 +946,9 @@ void cmQtAutoGenerators::ParseHeaders( } // Parse header content for UIC - this->ParseContentForUic(headerName, contents, includedUis); + if (absHeadersUic.find(headerName) != absHeadersUic.end()) { + this->ParseContentForUic(headerName, contents, includedUis); + } } } diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index dac23d9..1036cb7 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -55,13 +55,15 @@ private: std::map& includedMocs, std::map >& includedUis, bool relaxed); - void SearchHeadersForCppFile( + void SearchHeadersForSourceFile( const std::string& absFilename, const std::vector& headerExtensions, - std::set& absHeaders); + std::set& absHeadersMoc, + std::set& absHeadersUic); void ParseHeaders( - const std::set& absHeaders, + const std::set& absHeadersMoc, + const std::set& absHeadersUic, const std::map& includedMocs, std::map& notIncludedMocs, std::map >& includedUis); -- cgit v0.12 From d58b6bf31c18cfedd4a2f15e009b8e5cbdc21b6e Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sun, 1 Jan 2017 15:58:34 +0100 Subject: AUTOGEN: Generators: Moc/UicSkipTest methods --- Source/cmQtAutoGenerators.cxx | 63 ++++++++++++++++++++++++------------------- Source/cmQtAutoGenerators.h | 3 +++ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index fac9d54..9c8594b 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -610,16 +610,7 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { - if (this->UicExecutable.empty()) { - return; - } - // Check skip list - if (ListContains(this->SkipUic, absFilename)) { - if (this->Verbose) { - std::ostringstream err; - err << "AUTOUIC: Skipping " << absFilename << "\n"; - this->LogInfo(err.str()); - } + if (this->UicExecutable.empty() || this->UicSkipTest(absFilename)) { return; } @@ -653,16 +644,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector& headerExtensions, std::map& includedMocs, bool relaxed) { - if (this->MocExecutable.empty()) { - return true; - } - // Check skip list - if (ListContains(this->SkipMoc, absFilename)) { - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Skipping " << absFilename << "\n"; - this->LogInfo(err.str()); - } + if (this->MocExecutable.empty() || this->MocSkipTest(absFilename)) { return true; } @@ -921,14 +903,7 @@ void cmQtAutoGenerators::ParseHeaders( if (!this->MocExecutable.empty() && (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { - if (ListContains(this->SkipMoc, headerName)) { - // Skip - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Skipping " << headerName << "\n"; - this->LogInfo(err.str()); - } - } else { + if (!this->MocSkipTest(headerName)) { // Process if (this->Verbose) { std::ostringstream err; @@ -1397,6 +1372,38 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } /** + * @brief Tests if the file name is in the skip list + */ +bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) +{ + if (ListContains(this->SkipMoc, absFilename)) { + if (this->Verbose) { + std::ostringstream msg; + msg << "AUTOMOC: Skipping " << absFilename << "\n"; + this->LogInfo(msg.str()); + } + return true; + } + return false; +} + +/** + * @brief Tests if the file name is in the skip list + */ +bool cmQtAutoGenerators::UicSkipTest(const std::string& absFilename) +{ + if (ListContains(this->SkipUic, absFilename)) { + if (this->Verbose) { + std::ostringstream msg; + msg << "AUTOUIC: Skipping " << absFilename << "\n"; + this->LogInfo(msg.str()); + } + return true; + } + return false; +} + +/** * @brief Collects name collisions as output/input pairs * @return True if there were collisions */ diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 1036cb7..d0c7066 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -86,6 +86,9 @@ private: void Init(); + bool MocSkipTest(const std::string& absFilename); + bool UicSkipTest(const std::string& absFilename); + bool NameCollisionTest(const std::map& genFiles, std::multimap& collisions); -- cgit v0.12 From 2964b8cca4155fa318722f6ef17f0d4d56ee2f29 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sun, 1 Jan 2017 16:10:49 +0100 Subject: AUTOGEN: Generators: Use AUTOMOC/UIC/RCC instead of AUTOGEN in messages --- Source/cmQtAutoGenerators.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 9c8594b..24d2dd7 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -705,7 +705,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOGEN: error: " << absFilename << "\n" + err << "AUTOMOC: error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but could not find header \"" << basename << '{' << this->JoinExts(headerExtensions) << "}\" "; @@ -939,7 +939,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( mergedMocs.insert(notIncludedMocs.begin(), notIncludedMocs.end()); if (this->NameCollisionTest(mergedMocs, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: " + err << "AUTOMOC: error: " "The same moc file will be generated " "from different sources." << std::endl @@ -1010,7 +1010,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( // nothing changed: don't touch the moc_compilation.cpp file if (this->Verbose) { std::ostringstream err; - err << "AUTOGEN: " << this->OutMocCppFilenameRel << " still up to date" + err << "AUTOMOC: " << this->OutMocCppFilenameRel << " still up to date" << std::endl; this->LogInfo(err.str()); } @@ -1032,7 +1032,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile) { success = false; std::ostringstream err; - err << "AUTOGEN: error opening " << this->OutMocCppFilenameAbs << "\n"; + err << "AUTOMOC: error opening " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } else { outfile << automocSource; @@ -1040,7 +1040,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile.good()) { success = false; std::ostringstream err; - err << "AUTOGEN: error writing " << this->OutMocCppFilenameAbs << "\n"; + err << "AUTOMOC: error writing " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } } @@ -1097,7 +1097,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTOGEN: error: moc process for " << mocFileRel << " failed:\n" + err << "AUTOMOC: error: moc process for " << mocFileRel << " failed:\n" << output << std::endl; this->LogError(err.str()); } @@ -1140,7 +1140,7 @@ bool cmQtAutoGenerators::GenerateUiFiles( std::multimap collisions; if (this->NameCollisionTest(testMap, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: The same ui_NAME.h file will be generated " + err << "AUTOUIC: error: The same ui_NAME.h file will be generated " "from different sources." << std::endl << "To avoid this error rename the source files." << std::endl; @@ -1270,7 +1270,7 @@ bool cmQtAutoGenerators::GenerateQrcFiles() std::multimap collisions; if (this->NameCollisionTest(qrcGenMap, collisions)) { std::ostringstream err; - err << "AUTOGEN: error: The same qrc_NAME.cpp file" + err << "AUTORCC: error: The same qrc_NAME.cpp file" " will be generated from different sources." << std::endl << "To avoid this error rename the source .qrc files." << std::endl; -- cgit v0.12 From 7b766b83952ec4c431a55d2f6e589a5f806834c9 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 4 Jan 2017 13:08:25 +0100 Subject: AUTOGEN: Generators: Use single moc/uic skip test method only --- Source/cmQtAutoGenerators.cxx | 92 ++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 24d2dd7..8fea817 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -610,7 +610,7 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { - if (this->UicExecutable.empty() || this->UicSkipTest(absFilename)) { + if (this->UicSkipTest(absFilename)) { return; } @@ -644,7 +644,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector& headerExtensions, std::map& includedMocs, bool relaxed) { - if (this->MocExecutable.empty() || this->MocSkipTest(absFilename)) { + if (this->MocSkipTest(absFilename)) { return true; } @@ -838,25 +838,22 @@ void cmQtAutoGenerators::SearchHeadersForSourceFile( std::set& absHeadersMoc, std::set& absHeadersUic) { // search for header files and private header files we may need to moc: - const std::string basename = - cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); - const std::string absPath = cmsys::SystemTools::GetFilenamePath( - cmsys::SystemTools::GetRealPath(absFilename)) + - '/'; + std::string basepath = cmsys::SystemTools::GetFilenamePath( + cmsys::SystemTools::GetRealPath(absFilename)); + basepath += '/'; + basepath += cmsys::SystemTools::GetFilenameWithoutLastExtension(absFilename); // Search for regular header for (std::vector::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { - const std::string headerName = absPath + basename + "." + (*ext); + const std::string headerName = basepath + "." + (*ext); if (cmsys::SystemTools::FileExists(headerName.c_str())) { // Moc headers - if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, absFilename)) { + if (!this->MocSkipTest(absFilename) && !this->MocSkipTest(headerName)) { absHeadersMoc.insert(headerName); } // Uic headers - if (!this->UicExecutable.empty() && - !ListContains(this->SkipUic, absFilename)) { + if (!this->UicSkipTest(absFilename) && !this->UicSkipTest(headerName)) { absHeadersUic.insert(headerName); } break; @@ -865,17 +862,15 @@ void cmQtAutoGenerators::SearchHeadersForSourceFile( // Search for private header for (std::vector::const_iterator ext = headerExtensions.begin(); ext != headerExtensions.end(); ++ext) { - const std::string privateHeaderName = absPath + basename + "_p." + (*ext); - if (cmsys::SystemTools::FileExists(privateHeaderName.c_str())) { + const std::string headerName = basepath + "_p." + (*ext); + if (cmsys::SystemTools::FileExists(headerName.c_str())) { // Moc headers - if (!this->MocExecutable.empty() && - !ListContains(this->SkipMoc, absFilename)) { - absHeadersMoc.insert(privateHeaderName); + if (!this->MocSkipTest(absFilename) && !this->MocSkipTest(headerName)) { + absHeadersMoc.insert(headerName); } // Uic headers - if (!this->UicExecutable.empty() && - !ListContains(this->SkipUic, absFilename)) { - absHeadersUic.insert(privateHeaderName); + if (!this->UicSkipTest(absFilename) && !this->UicSkipTest(headerName)) { + absHeadersUic.insert(headerName); } break; } @@ -900,23 +895,21 @@ void cmQtAutoGenerators::ParseHeaders( const std::string contents = ReadAll(headerName); // Parse header content for MOC - if (!this->MocExecutable.empty() && + if (!this->MocSkipTest(headerName) && (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { - if (!this->MocSkipTest(headerName)) { - // Process - if (this->Verbose) { - std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; - this->LogInfo(err.str()); - } - std::string macroName; - if (this->requiresMocing(contents, macroName)) { - notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + - "/moc_" + - cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + - ".cpp"; - } + // Process + if (this->Verbose) { + std::ostringstream err; + err << "AUTOMOC: Checking " << headerName << "\n"; + this->LogInfo(err.str()); + } + std::string macroName; + if (this->requiresMocing(contents, macroName)) { + notIncludedMocs[headerName] = fpathCheckSum.getPart(headerName) + + "/moc_" + + cmsys::SystemTools::GetFilenameWithoutLastExtension(headerName) + + ".cpp"; } } @@ -1372,19 +1365,19 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, } /** - * @brief Tests if the file name is in the skip list + * @brief Tests if the file should be ignored for moc scanning + * @return True if the file should be ignored */ bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) { - if (ListContains(this->SkipMoc, absFilename)) { - if (this->Verbose) { - std::ostringstream msg; - msg << "AUTOMOC: Skipping " << absFilename << "\n"; - this->LogInfo(msg.str()); + // Test if moc scanning is enabled + if (!this->MocExecutable.empty()) { + // Test if the file name is on the skip list + if (!ListContains(this->SkipMoc, absFilename)) { + return false; } - return true; } - return false; + return true; } /** @@ -1392,15 +1385,14 @@ bool cmQtAutoGenerators::MocSkipTest(const std::string& absFilename) */ bool cmQtAutoGenerators::UicSkipTest(const std::string& absFilename) { - if (ListContains(this->SkipUic, absFilename)) { - if (this->Verbose) { - std::ostringstream msg; - msg << "AUTOUIC: Skipping " << absFilename << "\n"; - this->LogInfo(msg.str()); + // Test if uic scanning is enabled + if (!this->UicExecutable.empty()) { + // Test if the file name is on the skip list + if (!ListContains(this->SkipUic, absFilename)) { + return false; } - return true; } - return false; + return true; } /** -- cgit v0.12 From a84f0bb726ebcc8e9bf3db0b99e5b6fd8a720045 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 4 Jan 2017 13:18:23 +0100 Subject: AUTOGEN: Generators: Message upper/lower case unification --- Source/cmQtAutoGenerators.cxx | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 8fea817..0a8c459 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -198,7 +198,7 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( if (!makefile->ReadListFile(filename.c_str())) { std::ostringstream err; - err << "AUTOGEN: error processing file: " << filename << std::endl; + err << "AutoGen: error processing file: " << filename << std::endl; this->LogError(err.str()); return false; } @@ -328,7 +328,7 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile( } if (this->RccSources.size() != rccInputLists.size()) { std::ostringstream err; - err << "AUTOGEN: RCC sources lists size missmatch in: " << filename; + err << "AutoGen: RCC sources lists size missmatch in: " << filename; err << std::endl; this->LogError(err.str()); return false; @@ -572,7 +572,7 @@ bool cmQtAutoGenerators::ParseSourceFile( const std::string contentsString = ReadAll(absFilename); if (contentsString.empty()) { std::ostringstream err; - err << "AUTOGEN: warning: " << absFilename << "\n" + err << "AutoGen: Warning: " << absFilename << "\n" << "The file is empty\n"; this->LogWarning(err.str()); } else { @@ -617,7 +617,7 @@ void cmQtAutoGenerators::ParseContentForUic( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOUIC: Checking " << absFilename << "\n"; + err << "AutoUic: Checking " << absFilename << "\n"; this->LogInfo(err.str()); } @@ -651,7 +651,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: Checking " << absFilename << "\n"; + err << "AutoMoc: Checking " << absFilename << "\n"; this->LogInfo(err.str()); } @@ -705,7 +705,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but could not find header \"" << basename << '{' << this->JoinExts(headerExtensions) << "}\" "; @@ -733,7 +733,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( fileToMoc = headerToMoc; if (!requiresMoc && basename == scannedFileBasename) { std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", but does not contain a " << macroName << " macro. Running moc on " @@ -743,7 +743,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( this->LogWarning(err.str()); } else { std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\" instead of \"moc_" << basename << ".cpp\". Running moc on " @@ -754,7 +754,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } } else { std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", which seems to be the moc file from a different " "source file. CMake also could not find a matching " @@ -772,7 +772,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( if (basename != scannedFileBasename) { // Don't allow FOO.moc include other than self in strict mode std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file includes the moc file \"" << currentMoc << "\", which seems to be the moc file from a different " "source file. This is not supported. Include \"" @@ -803,7 +803,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( if (relaxed && ownMocUnderscoreIncluded) { // This is for KDE4 compatibility: std::ostringstream err; - err << "AUTOMOC: warning: " << absFilename << "\n" + err << "AutoMoc: Warning: " << absFilename << "\n" << "The file contains a " << macroName << " macro, but does not include " << "\"" << scannedFileBasename << ".moc\", but instead includes " @@ -820,7 +820,7 @@ bool cmQtAutoGenerators::ParseContentForMoc( } else { // Otherwise always error out since it will not compile: std::ostringstream err; - err << "AUTOMOC: error: " << absFilename << "\n" + err << "AutoMoc: Error: " << absFilename << "\n" << "The file contains a " << macroName << " macro, but does not include " << "\"" << scannedFileBasename << ".moc\" !\n"; @@ -901,7 +901,7 @@ void cmQtAutoGenerators::ParseHeaders( // Process if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: Checking " << headerName << "\n"; + err << "AutoMoc: Checking " << headerName << "\n"; this->LogInfo(err.str()); } std::string macroName; @@ -932,7 +932,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( mergedMocs.insert(notIncludedMocs.begin(), notIncludedMocs.end()); if (this->NameCollisionTest(mergedMocs, collisions)) { std::ostringstream err; - err << "AUTOMOC: error: " + err << "AutoMoc: Error: " "The same moc file will be generated " "from different sources." << std::endl @@ -1003,7 +1003,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( // nothing changed: don't touch the moc_compilation.cpp file if (this->Verbose) { std::ostringstream err; - err << "AUTOMOC: " << this->OutMocCppFilenameRel << " still up to date" + err << "AutoMoc: " << this->OutMocCppFilenameRel << " still up to date" << std::endl; this->LogInfo(err.str()); } @@ -1025,7 +1025,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile) { success = false; std::ostringstream err; - err << "AUTOMOC: error opening " << this->OutMocCppFilenameAbs << "\n"; + err << "AutoMoc: error opening " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } else { outfile << automocSource; @@ -1033,7 +1033,7 @@ bool cmQtAutoGenerators::GenerateMocFiles( if (!outfile.good()) { success = false; std::ostringstream err; - err << "AUTOMOC: error writing " << this->OutMocCppFilenameAbs << "\n"; + err << "AutoMoc: error writing " << this->OutMocCppFilenameAbs << "\n"; this->LogError(err.str()); } } @@ -1090,7 +1090,7 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTOMOC: error: moc process for " << mocFileRel << " failed:\n" + err << "AutoMoc: Error: moc process for " << mocFileRel << " failed:\n" << output << std::endl; this->LogError(err.str()); } @@ -1133,7 +1133,7 @@ bool cmQtAutoGenerators::GenerateUiFiles( std::multimap collisions; if (this->NameCollisionTest(testMap, collisions)) { std::ostringstream err; - err << "AUTOUIC: error: The same ui_NAME.h file will be generated " + err << "AutoUic: Error: The same ui_NAME.h file will be generated " "from different sources." << std::endl << "To avoid this error rename the source files." << std::endl; @@ -1214,7 +1214,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& realName, if (!result || retVal) { { std::ostringstream err; - err << "AUTOUIC: error: uic process for " << uicFileRel + err << "AutoUic: Error: uic process for " << uicFileRel << " needed by\n \"" << realName << "\"\nfailed:\n" << output << std::endl; this->LogError(err.str()); @@ -1263,7 +1263,7 @@ bool cmQtAutoGenerators::GenerateQrcFiles() std::multimap collisions; if (this->NameCollisionTest(qrcGenMap, collisions)) { std::ostringstream err; - err << "AUTORCC: error: The same qrc_NAME.cpp file" + err << "AutoRcc: Error: The same qrc_NAME.cpp file" " will be generated from different sources." << std::endl << "To avoid this error rename the source .qrc files." << std::endl; @@ -1350,7 +1350,7 @@ bool cmQtAutoGenerators::GenerateQrc(const std::string& qrcInputFile, if (!result || retVal) { { std::ostringstream err; - err << "AUTORCC: error: rcc process for " << qrcOutputFile + err << "AutoRcc: Error: rcc process for " << qrcOutputFile << " failed:\n" << output << std::endl; this->LogError(err.str()); @@ -1495,7 +1495,7 @@ bool cmQtAutoGenerators::MakeParentDirectory(const std::string& filename) success = cmsys::SystemTools::MakeDirectory(dirName); if (!success) { std::ostringstream err; - err << "AUTOGEN: Directory creation failed: " << dirName << std::endl; + err << "AutoGen: Directory creation failed: " << dirName << std::endl; this->LogError(err.str()); } } -- cgit v0.12 From 0699760d5c8b644242ddd4ac6d07d8c4c68f2b94 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Wed, 4 Jan 2017 13:32:11 +0100 Subject: AUTOGEN: Generators: Do moc/uic skip test during file list generation --- Source/cmQtAutoGenerators.cxx | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 0a8c459..f5c33fe 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -534,8 +534,16 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) } // Parse headers - headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); - headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + for (std::vector::const_iterator it = this->Headers.begin(); + it != this->Headers.end(); ++it) { + const std::string& headerName = *it; + if (!this->MocSkipTest(headerName)) { + headerFilesMoc.insert(this->Headers.begin(), this->Headers.end()); + } + if (!this->UicSkipTest(headerName)) { + headerFilesUic.insert(this->Headers.begin(), this->Headers.end()); + } + } this->ParseHeaders(headerFilesMoc, headerFilesUic, includedMocs, notIncludedMocs, includedUis); @@ -577,10 +585,12 @@ bool cmQtAutoGenerators::ParseSourceFile( this->LogWarning(err.str()); } else { // Parse source contents for MOC - success = this->ParseContentForMoc( - absFilename, contentsString, headerExtensions, includedMocs, relaxed); + if (success && !this->MocSkipTest(absFilename)) { + success = this->ParseContentForMoc( + absFilename, contentsString, headerExtensions, includedMocs, relaxed); + } // Parse source contents for UIC - if (success) { + if (success && !this->UicSkipTest(absFilename)) { this->ParseContentForUic(absFilename, contentsString, includedUis); } } @@ -610,10 +620,6 @@ void cmQtAutoGenerators::ParseContentForUic( const std::string& absFilename, const std::string& contentsString, std::map >& includedUis) { - if (this->UicSkipTest(absFilename)) { - return; - } - // Process if (this->Verbose) { std::ostringstream err; @@ -644,10 +650,6 @@ bool cmQtAutoGenerators::ParseContentForMoc( const std::vector& headerExtensions, std::map& includedMocs, bool relaxed) { - if (this->MocSkipTest(absFilename)) { - return true; - } - // Process if (this->Verbose) { std::ostringstream err; @@ -895,8 +897,7 @@ void cmQtAutoGenerators::ParseHeaders( const std::string contents = ReadAll(headerName); // Parse header content for MOC - if (!this->MocSkipTest(headerName) && - (absHeadersMoc.find(headerName) != absHeadersMoc.end()) && + if ((absHeadersMoc.find(headerName) != absHeadersMoc.end()) && (includedMocs.find(headerName) == includedMocs.end())) { // Process if (this->Verbose) { -- cgit v0.12 From 8dbdd3e726ead25c179e6eb4ffab212a1db3aba8 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sat, 31 Dec 2016 10:25:38 +0100 Subject: AUTOGEN: Tests: AUTOMOC SKIP_AUTOMOC and SKIP_AUTOGEN test --- Tests/QtAutogen/CMakeLists.txt | 22 ++++++++++++++++++++++ Tests/QtAutogen/skipMoc.cpp | 14 ++++++++++++++ Tests/QtAutogen/skipSource/qItemA.cpp | 5 +++++ Tests/QtAutogen/skipSource/qItemA.hpp | 13 +++++++++++++ Tests/QtAutogen/skipSource/qItemB.cpp | 5 +++++ Tests/QtAutogen/skipSource/qItemB.hpp | 13 +++++++++++++ Tests/QtAutogen/skipSource/qItemC.cpp | 5 +++++ Tests/QtAutogen/skipSource/qItemC.hpp | 13 +++++++++++++ 8 files changed, 90 insertions(+) create mode 100644 Tests/QtAutogen/skipMoc.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemA.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemA.hpp create mode 100644 Tests/QtAutogen/skipSource/qItemB.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemB.hpp create mode 100644 Tests/QtAutogen/skipSource/qItemC.cpp create mode 100644 Tests/QtAutogen/skipSource/qItemC.hpp diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 6d4e2c4..068b037 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -139,6 +139,28 @@ if (automoc_rerun_result) message(SEND_ERROR "Second build of automoc_rerun failed.") endif() +# -- Test: AUTOMOC, SKIP_AUTOMOC +# Test for SKIP_AUTOMOC and SKIP_AUTOGEN on an AUTOMOC enabled target +qtx_wrap_cpp(skipMocWrapMoc + skipSource/qItemA.hpp + skipSource/qItemB.hpp) +set(skipMocSources + skipMoc.cpp + skipSource/qItemA.cpp + skipSource/qItemB.cpp + skipSource/qItemC.cpp) +set_property(SOURCE skipSource/qItemA.cpp PROPERTY SKIP_AUTOMOC ON) +set_property(SOURCE skipSource/qItemB.cpp PROPERTY SKIP_AUTOGEN ON) +# AUTOMOC enabled only +add_executable(skipMocA ${skipMocSources} ${skipMocWrapMoc}) +set_property(TARGET skipMocA PROPERTY AUTOMOC ON) +target_link_libraries(skipMocA ${QT_LIBRARIES}) +# AUTOMOC and AUTOUIC enabled +add_executable(skipMocB ${skipMocSources} ${skipMocWrapMoc}) +set_property(TARGET skipMocB PROPERTY AUTOMOC ON) +set_property(TARGET skipMocB PROPERTY AUTOUIC ON) +target_link_libraries(skipMocB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipMoc.cpp b/Tests/QtAutogen/skipMoc.cpp new file mode 100644 index 0000000..85305f5 --- /dev/null +++ b/Tests/QtAutogen/skipMoc.cpp @@ -0,0 +1,14 @@ + +#include "skipSource/qItemA.hpp" +#include "skipSource/qItemB.hpp" +#include "skipSource/qItemC.hpp" + +int main(int, char**) +{ + QItemA itemA; + QItemA itemB; + QItemA itemC; + + // Fails to link if the symbol is not present. + return 0; +} diff --git a/Tests/QtAutogen/skipSource/qItemA.cpp b/Tests/QtAutogen/skipSource/qItemA.cpp new file mode 100644 index 0000000..522c2c7 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemA.cpp @@ -0,0 +1,5 @@ +#include "qItemA.hpp" + +void QItemA::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemA.hpp b/Tests/QtAutogen/skipSource/qItemA.hpp new file mode 100644 index 0000000..d295faf --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemA.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMA_HPP +#define QITEMA_HPP + +#include + +class QItemA : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif diff --git a/Tests/QtAutogen/skipSource/qItemB.cpp b/Tests/QtAutogen/skipSource/qItemB.cpp new file mode 100644 index 0000000..636e15d --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemB.cpp @@ -0,0 +1,5 @@ +#include "qItemB.hpp" + +void QItemB::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemB.hpp b/Tests/QtAutogen/skipSource/qItemB.hpp new file mode 100644 index 0000000..1775915 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemB.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMB_HPP +#define QITEMB_HPP + +#include + +class QItemB : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif diff --git a/Tests/QtAutogen/skipSource/qItemC.cpp b/Tests/QtAutogen/skipSource/qItemC.cpp new file mode 100644 index 0000000..700abd6 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemC.cpp @@ -0,0 +1,5 @@ +#include "qItemC.hpp" + +void QItemC::go() +{ +} diff --git a/Tests/QtAutogen/skipSource/qItemC.hpp b/Tests/QtAutogen/skipSource/qItemC.hpp new file mode 100644 index 0000000..f06bda2 --- /dev/null +++ b/Tests/QtAutogen/skipSource/qItemC.hpp @@ -0,0 +1,13 @@ +#ifndef QITEMC_HPP +#define QITEMC_HPP + +#include + +class QItemC : public QObject +{ + Q_OBJECT + Q_SLOT + void go(); +}; + +#endif -- cgit v0.12 From 53787bf8de2d3981f650e9036bb89cb6ed884a75 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sun, 1 Jan 2017 15:42:32 +0100 Subject: AUTOGEN: Tests: AUTOUIC SKIP_AUTOUIC and SKIP_AUTOGEN test --- Tests/QtAutogen/CMakeLists.txt | 20 ++++++++++++++++++++ Tests/QtAutogen/skipSource/skipUicGen.cpp | 7 +++++++ Tests/QtAutogen/skipSource/skipUicGen.hpp | 8 ++++++++ Tests/QtAutogen/skipSource/skipUicNoGen1.cpp | 7 +++++++ Tests/QtAutogen/skipSource/skipUicNoGen1.hpp | 8 ++++++++ Tests/QtAutogen/skipSource/skipUicNoGen2.cpp | 7 +++++++ Tests/QtAutogen/skipSource/skipUicNoGen2.hpp | 8 ++++++++ Tests/QtAutogen/skipSource/ui_nogen1.h | 6 ++++++ Tests/QtAutogen/skipSource/ui_nogen2.h | 6 ++++++ Tests/QtAutogen/skipSource/uigen1.ui | 24 ++++++++++++++++++++++++ Tests/QtAutogen/skipSource/uigen2.ui | 24 ++++++++++++++++++++++++ Tests/QtAutogen/skipUic.cpp | 22 ++++++++++++++++++++++ 12 files changed, 147 insertions(+) create mode 100644 Tests/QtAutogen/skipSource/skipUicGen.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicGen.hpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen1.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen1.hpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen2.cpp create mode 100644 Tests/QtAutogen/skipSource/skipUicNoGen2.hpp create mode 100644 Tests/QtAutogen/skipSource/ui_nogen1.h create mode 100644 Tests/QtAutogen/skipSource/ui_nogen2.h create mode 100644 Tests/QtAutogen/skipSource/uigen1.ui create mode 100644 Tests/QtAutogen/skipSource/uigen2.ui create mode 100644 Tests/QtAutogen/skipUic.cpp diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 068b037..045f5b9 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -161,6 +161,26 @@ set_property(TARGET skipMocB PROPERTY AUTOMOC ON) set_property(TARGET skipMocB PROPERTY AUTOUIC ON) target_link_libraries(skipMocB ${QT_LIBRARIES}) +# -- Test: AUTOUIC, SKIP_AUTOUIC +# Test for SKIP_AUTOUIC and SKIP_AUTOGEN on an AUTOUIC enabled target +set(skipUicSources + skipUic.cpp + skipSource/skipUicGen.cpp + skipSource/skipUicNoGen1.cpp + skipSource/skipUicNoGen2.cpp +) +set_property(SOURCE skipSource/skipUicNoGen1.cpp PROPERTY SKIP_AUTOUIC ON) +set_property(SOURCE skipSource/skipUicNoGen2.cpp PROPERTY SKIP_AUTOGEN ON) +# AUTOUIC enabled +add_executable(skipUicA ${skipUicSources}) +set_property(TARGET skipUicA PROPERTY AUTOUIC ON) +target_link_libraries(skipUicA ${QT_LIBRARIES}) +# AUTOUIC and AUTOMOC enabled +add_executable(skipUicB ${skipUicSources}) +set_property(TARGET skipUicB PROPERTY AUTOUIC ON) +set_property(TARGET skipUicB PROPERTY AUTOMOC ON) +target_link_libraries(skipUicB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipSource/skipUicGen.cpp b/Tests/QtAutogen/skipSource/skipUicGen.cpp new file mode 100644 index 0000000..d2a55a6 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicGen.cpp @@ -0,0 +1,7 @@ + +#include "skipUicGen.hpp" +#include "ui_uigen2.h" + +void skipGen() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicGen.hpp b/Tests/QtAutogen/skipSource/skipUicGen.hpp new file mode 100644 index 0000000..3669f0e --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicGen.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICGEN_HPP +#define SKIPUICGEN_HPP + +#include "ui_uigen1.h" + +void skipGen(); + +#endif diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp b/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp new file mode 100644 index 0000000..f591a42 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen1.cpp @@ -0,0 +1,7 @@ + +#include "skipUicNoGen1.hpp" +#include "ui_nogen2.h" + +void skipNoGen1() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp b/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp new file mode 100644 index 0000000..2864695 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen1.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICNOGEN1_H +#define SKIPUICNOGEN1_H + +#include "ui_nogen1.h" + +void skipNoGen1(); + +#endif diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp b/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp new file mode 100644 index 0000000..8c1c324 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen2.cpp @@ -0,0 +1,7 @@ + +#include "skipUicNoGen2.hpp" +#include "ui_nogen2.h" + +void skipNoGen2() +{ +} diff --git a/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp b/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp new file mode 100644 index 0000000..7c38193 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipUicNoGen2.hpp @@ -0,0 +1,8 @@ +#ifndef SKIPUICNOGEN2_H +#define SKIPUICNOGEN2_H + +#include "ui_nogen1.h" + +void skipNoGen2(); + +#endif diff --git a/Tests/QtAutogen/skipSource/ui_nogen1.h b/Tests/QtAutogen/skipSource/ui_nogen1.h new file mode 100644 index 0000000..a7be52b --- /dev/null +++ b/Tests/QtAutogen/skipSource/ui_nogen1.h @@ -0,0 +1,6 @@ +#ifndef UI_NOGEN1_H +#define UI_NOGEN1_H + +void ui_nogen1(); + +#endif diff --git a/Tests/QtAutogen/skipSource/ui_nogen2.h b/Tests/QtAutogen/skipSource/ui_nogen2.h new file mode 100644 index 0000000..5d547d4 --- /dev/null +++ b/Tests/QtAutogen/skipSource/ui_nogen2.h @@ -0,0 +1,6 @@ +#ifndef UI_NOGEN2_H +#define UI_NOGEN2_H + +void ui_nogen2(); + +#endif \ No newline at end of file diff --git a/Tests/QtAutogen/skipSource/uigen1.ui b/Tests/QtAutogen/skipSource/uigen1.ui new file mode 100644 index 0000000..fc7cb82 --- /dev/null +++ b/Tests/QtAutogen/skipSource/uigen1.ui @@ -0,0 +1,24 @@ + + + UiGen1 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + + + + + diff --git a/Tests/QtAutogen/skipSource/uigen2.ui b/Tests/QtAutogen/skipSource/uigen2.ui new file mode 100644 index 0000000..01f08d2 --- /dev/null +++ b/Tests/QtAutogen/skipSource/uigen2.ui @@ -0,0 +1,24 @@ + + + UiGen2 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + + + + + diff --git a/Tests/QtAutogen/skipUic.cpp b/Tests/QtAutogen/skipUic.cpp new file mode 100644 index 0000000..0adf011 --- /dev/null +++ b/Tests/QtAutogen/skipUic.cpp @@ -0,0 +1,22 @@ + +#include "skipSource/skipUicGen.hpp" +#include "skipSource/skipUicNoGen1.hpp" +#include "skipSource/skipUicNoGen2.hpp" + +int main(int, char**) +{ + skipGen(); + skipNoGen1(); + skipNoGen2(); + + return 0; +} + +// -- Function definitions +void ui_nogen1() +{ +} + +void ui_nogen2() +{ +} -- cgit v0.12 From c17e0a3ad58f06fcb0827910af520405670b3d51 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Sun, 1 Jan 2017 16:45:40 +0100 Subject: AUTOGEN: Tests: AUTORCC SKIP_AUTORCC and SKIP_AUTOGEN test --- Tests/QtAutogen/CMakeLists.txt | 21 +++++++++++++++++++++ Tests/QtAutogen/skipRcc.cpp | 9 +++++++++ Tests/QtAutogen/skipSource/skipRccBad1.qrc | 5 +++++ Tests/QtAutogen/skipSource/skipRccBad2.qrc | 5 +++++ Tests/QtAutogen/skipSource/skipRccGood.qrc | 6 ++++++ 5 files changed, 46 insertions(+) create mode 100644 Tests/QtAutogen/skipRcc.cpp create mode 100644 Tests/QtAutogen/skipSource/skipRccBad1.qrc create mode 100644 Tests/QtAutogen/skipSource/skipRccBad2.qrc create mode 100644 Tests/QtAutogen/skipSource/skipRccGood.qrc diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 045f5b9..4b90ad8 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -181,6 +181,27 @@ set_property(TARGET skipUicB PROPERTY AUTOUIC ON) set_property(TARGET skipUicB PROPERTY AUTOMOC ON) target_link_libraries(skipUicB ${QT_LIBRARIES}) +# -- Test: AUTORCC, SKIP_AUTORCC +# Test for SKIP_AUTORCC and SKIP_AUTOGEN on an AUTORCC enabled target +set(skipRccSources + skipRcc.cpp + skipSource/skipRccBad1.qrc + skipSource/skipRccBad2.qrc + skipSource/skipRccGood.qrc +) +set_property(SOURCE skipSource/skipRccBad1.qrc PROPERTY SKIP_AUTORCC ON) +set_property(SOURCE skipSource/skipRccBad2.qrc PROPERTY SKIP_AUTOGEN ON) +# AUTORCC enabled +add_executable(skipRccA ${skipRccSources}) +set_property(TARGET skipRccA PROPERTY AUTORCC ON) +target_link_libraries(skipRccA ${QT_LIBRARIES}) +# AUTORCC, AUTOUIC and AUTOMOC enabled +add_executable(skipRccB ${skipRccSources}) +set_property(TARGET skipRccB PROPERTY AUTORCC ON) +set_property(TARGET skipRccB PROPERTY AUTOUIC ON) +set_property(TARGET skipRccB PROPERTY AUTOMOC ON) +target_link_libraries(skipRccB ${QT_LIBRARIES}) + # -- Test: AUTOMOC AUTORCC # Source files with the same basename in different subdirectories add_subdirectory(sameName) diff --git a/Tests/QtAutogen/skipRcc.cpp b/Tests/QtAutogen/skipRcc.cpp new file mode 100644 index 0000000..ec57110 --- /dev/null +++ b/Tests/QtAutogen/skipRcc.cpp @@ -0,0 +1,9 @@ + +extern int qInitResources_skipRccGood(); + +int main(int, char**) +{ + // Fails to link if the symbol is not present. + qInitResources_skipRccGood(); + return 0; +} diff --git a/Tests/QtAutogen/skipSource/skipRccBad1.qrc b/Tests/QtAutogen/skipSource/skipRccBad1.qrc new file mode 100644 index 0000000..6cbd9ed --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccBad1.qrc @@ -0,0 +1,5 @@ + + + skipRccGood.cpp>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + diff --git a/Tests/QtAutogen/skipSource/skipRccBad2.qrc b/Tests/QtAutogen/skipSource/skipRccBad2.qrc new file mode 100644 index 0000000..b32c589 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccBad2.qrc @@ -0,0 +1,5 @@ +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< + + skipRccGood.cpp + + diff --git a/Tests/QtAutogen/skipSource/skipRccGood.qrc b/Tests/QtAutogen/skipSource/skipRccGood.qrc new file mode 100644 index 0000000..21a94b0 --- /dev/null +++ b/Tests/QtAutogen/skipSource/skipRccGood.qrc @@ -0,0 +1,6 @@ + + + skipRccBad1.qrc + skipRccBad2.qrc + + -- cgit v0.12 From cbc07d331d1d5429dc1e0b7c6c7949ff8d9efdf1 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Mon, 2 Jan 2017 17:28:36 +0100 Subject: AUTOGEN: Documentation for SKIP_AUTOX source file properties --- Help/manual/cmake-properties.7.rst | 4 ++++ Help/prop_sf/SKIP_AUTOGEN.rst | 8 ++++++++ Help/prop_sf/SKIP_AUTOMOC.rst | 6 ++++++ Help/prop_sf/SKIP_AUTORCC.rst | 6 ++++++ Help/prop_sf/SKIP_AUTOUIC.rst | 6 ++++++ 5 files changed, 30 insertions(+) create mode 100644 Help/prop_sf/SKIP_AUTOGEN.rst create mode 100644 Help/prop_sf/SKIP_AUTOMOC.rst create mode 100644 Help/prop_sf/SKIP_AUTORCC.rst create mode 100644 Help/prop_sf/SKIP_AUTOUIC.rst diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index 971834e..c93ace1 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -357,6 +357,10 @@ Properties on Source Files /prop_sf/MACOSX_PACKAGE_LOCATION /prop_sf/OBJECT_DEPENDS /prop_sf/OBJECT_OUTPUTS + /prop_sf/SKIP_AUTOGEN + /prop_sf/SKIP_AUTOMOC + /prop_sf/SKIP_AUTORCC + /prop_sf/SKIP_AUTOUIC /prop_sf/SYMBOLIC /prop_sf/VS_DEPLOYMENT_CONTENT /prop_sf/VS_DEPLOYMENT_LOCATION diff --git a/Help/prop_sf/SKIP_AUTOGEN.rst b/Help/prop_sf/SKIP_AUTOGEN.rst new file mode 100644 index 0000000..6bf2409 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOGEN.rst @@ -0,0 +1,8 @@ +SKIP_AUTOGEN +------------ + +Exclude the source file from :prop_tgt:`AUTOMOC`, :prop_tgt:`AUTOUIC` and +:prop_tgt:`AUTORCC` processing (for Qt projects). + +For finer control see :prop_sf:`SKIP_AUTOMOC`, :prop_sf:`SKIP_AUTOUIC` and +:prop_sf:`SKIP_AUTORCC`. diff --git a/Help/prop_sf/SKIP_AUTOMOC.rst b/Help/prop_sf/SKIP_AUTOMOC.rst new file mode 100644 index 0000000..2245ca6 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOMOC.rst @@ -0,0 +1,6 @@ +SKIP_AUTOMOC +------------ + +Exclude the source file from :prop_tgt:`AUTOMOC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` diff --git a/Help/prop_sf/SKIP_AUTORCC.rst b/Help/prop_sf/SKIP_AUTORCC.rst new file mode 100644 index 0000000..394d8f8 --- /dev/null +++ b/Help/prop_sf/SKIP_AUTORCC.rst @@ -0,0 +1,6 @@ +SKIP_AUTORCC +------------ + +Exclude the source file from :prop_tgt:`AUTORCC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` diff --git a/Help/prop_sf/SKIP_AUTOUIC.rst b/Help/prop_sf/SKIP_AUTOUIC.rst new file mode 100644 index 0000000..50f78ef --- /dev/null +++ b/Help/prop_sf/SKIP_AUTOUIC.rst @@ -0,0 +1,6 @@ +SKIP_AUTOUIC +------------ + +Exclude the source file from :prop_tgt:`AUTOUIC` processing (for Qt projects). + +For broader control see :prop_sf:`SKIP_AUTOGEN` -- cgit v0.12 From 6eabac26f5c8167481be9c872210a8142ead4b99 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Mon, 2 Jan 2017 17:45:17 +0100 Subject: AUTOGEN: Documentation update: cmake-qt, AUTOMOC, AUTOUIC, AUTORCC --- Help/manual/cmake-qt.7.rst | 9 +++++++++ Help/prop_tgt/AUTOMOC.rst | 3 +++ Help/prop_tgt/AUTORCC.rst | 3 +++ Help/prop_tgt/AUTOUIC.rst | 3 +++ 4 files changed, 18 insertions(+) diff --git a/Help/manual/cmake-qt.7.rst b/Help/manual/cmake-qt.7.rst index 80b0f49..56d4ca7 100644 --- a/Help/manual/cmake-qt.7.rst +++ b/Help/manual/cmake-qt.7.rst @@ -83,6 +83,9 @@ following targets by setting the :variable:`CMAKE_AUTOMOC` variable. The options to pass to ``moc``. The :variable:`CMAKE_AUTOMOC_MOC_OPTIONS` variable may be populated to pre-set the options for all following targets. +Source C++ files can be excluded from :prop_tgt:`AUTOMOC` processing by +enabling :prop_sf:`SKIP_AUTOMOC` or the broader :prop_sf:`SKIP_AUTOGEN`. + .. _`Qt AUTOUIC`: AUTOUIC @@ -149,6 +152,9 @@ result of linking with the :prop_tgt:`IMPORTED` target: Qt5::Widgets ) +Source files can be excluded from :prop_tgt:`AUTOUIC` processing by +enabling :prop_sf:`SKIP_AUTOUIC` or the broader :prop_sf:`SKIP_AUTOGEN`. + .. _`Qt AUTORCC`: AUTORCC @@ -171,6 +177,9 @@ populated to pre-set the options for all following targets. The ``.qrc`` file to set particular options for the file. This overrides options from the :prop_tgt:`AUTORCC_OPTIONS` target property. +Source files can be excluded from :prop_tgt:`AUTORCC` processing by +enabling :prop_sf:`SKIP_AUTORCC` or the broader :prop_sf:`SKIP_AUTOGEN`. + qtmain.lib on Windows ===================== diff --git a/Help/prop_tgt/AUTOMOC.rst b/Help/prop_tgt/AUTOMOC.rst index 30a39b1..b42643f 100644 --- a/Help/prop_tgt/AUTOMOC.rst +++ b/Help/prop_tgt/AUTOMOC.rst @@ -47,5 +47,8 @@ See the documentation for this variable for more details. The global property :prop_gbl:`AUTOGEN_TARGETS_FOLDER` can be used to group the automoc targets together in an IDE, e.g. in MSVS. +Source C++ files can be excluded from :prop_tgt:`AUTOMOC` processing by +enabling :prop_sf:`SKIP_AUTOMOC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. diff --git a/Help/prop_tgt/AUTORCC.rst b/Help/prop_tgt/AUTORCC.rst index 158fdf8..1ad0895 100644 --- a/Help/prop_tgt/AUTORCC.rst +++ b/Help/prop_tgt/AUTORCC.rst @@ -24,5 +24,8 @@ generate unspecified unique names for ``rcc``. Therefore if ``Q_INIT_RESOURCE()`` or ``Q_CLEANUP_RESOURCE()`` need to be used the ``.qrc`` file name must be unique. +Source files can be excluded from :prop_tgt:`AUTORCC` processing by +enabling :prop_sf:`SKIP_AUTORCC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. diff --git a/Help/prop_tgt/AUTOUIC.rst b/Help/prop_tgt/AUTOUIC.rst index 4e60ec3..fbf24c3 100644 --- a/Help/prop_tgt/AUTOUIC.rst +++ b/Help/prop_tgt/AUTOUIC.rst @@ -20,5 +20,8 @@ Additional command line options for ``uic`` can be set via the The global property :prop_gbl:`AUTOGEN_TARGETS_FOLDER` can be used to group the autouic targets together in an IDE, e.g. in MSVS. +Source files can be excluded from :prop_tgt:`AUTOUIC` processing by +enabling :prop_sf:`SKIP_AUTOUIC` or the broader :prop_sf:`SKIP_AUTOGEN`. + See the :manual:`cmake-qt(7)` manual for more information on using CMake with Qt. -- cgit v0.12 From 7db05f426e2c3a5b4d1a29ae97f5a75692bc03ac Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Mon, 2 Jan 2017 18:02:53 +0100 Subject: AUTOGEN: Release notes for SKIP_AUTOX --- Help/release/dev/QtAutogen_Skip.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Help/release/dev/QtAutogen_Skip.rst diff --git a/Help/release/dev/QtAutogen_Skip.rst b/Help/release/dev/QtAutogen_Skip.rst new file mode 100644 index 0000000..37f795c --- /dev/null +++ b/Help/release/dev/QtAutogen_Skip.rst @@ -0,0 +1,12 @@ +QtAutogen_Skip +-------------- + +* The source file properties + :prop_sf:`SKIP_AUTOMOC`, + :prop_sf:`SKIP_AUTOUIC`, + :prop_sf:`SKIP_AUTORCC` and + :prop_sf:`SKIP_AUTOGEN` + allow to exclude files from + :prop_tgt:`AUTOMOC`, + :prop_tgt:`AUTOUIC` and + :prop_tgt:`AUTORCC` processing. -- cgit v0.12