From 6053ce22f69f58c9dc4db66dbfe62cdd8fbe2774 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 2 Feb 2014 13:19:27 +0100 Subject: QtAutogen: Make uic work even when the source is in a subdir. Modify the includedUis to store the path to the file which includes the ui file. Reuse that path to generate the output file from the uic process. --- Source/cmQtAutoGenerators.cxx | 34 ++++++++++++++++++++-------------- Source/cmQtAutoGenerators.h | 12 ++++++------ Tests/QtAutogen/CMakeLists.txt | 4 ++-- Tests/QtAutogen/sub/uiconly.cpp | 13 +++++++++++++ Tests/QtAutogen/sub/uiconly.h | 20 ++++++++++++++++++++ Tests/QtAutogen/sub/uiconly.ui | 24 ++++++++++++++++++++++++ Tests/QtAutogen/uiconly.cpp | 13 ------------- Tests/QtAutogen/uiconly.h | 20 -------------------- Tests/QtAutogen/uiconly.ui | 24 ------------------------ 9 files changed, 85 insertions(+), 79 deletions(-) create mode 100644 Tests/QtAutogen/sub/uiconly.cpp create mode 100644 Tests/QtAutogen/sub/uiconly.h create mode 100644 Tests/QtAutogen/sub/uiconly.ui delete mode 100644 Tests/QtAutogen/uiconly.cpp delete mode 100644 Tests/QtAutogen/uiconly.h delete mode 100644 Tests/QtAutogen/uiconly.ui diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index cab59fe..7e44c26 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -1279,8 +1279,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) const std::vector& headerExtensions = makefile->GetHeaderExtensions(); - std::vector includedUis; - std::vector skippedUis; + std::map includedUis; + std::map skippedUis; std::vector uicSkipped; cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); @@ -1290,7 +1290,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), *it) != uicSkipped.end(); - std::vector& uiFiles = skipUic ? skippedUis : includedUis; + std::map& uiFiles + = skipUic ? skippedUis : includedUis; const std::string &absFilename = *it; if (this->Verbose) { @@ -1350,11 +1351,12 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { this->GenerateMoc(it->first, it->second); } - for(std::vector::const_iterator it = includedUis.begin(); + for(std::map::const_iterator + it = includedUis.begin(); it != includedUis.end(); ++it) { - this->GenerateUi(*it); + this->GenerateUi(it->first, it->second); } if(!this->RccExecutable.empty()) @@ -1431,7 +1433,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::map& includedMocs, - std::vector &includedUis) + std::map &includedUis) { cmsys::RegularExpression mocIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" @@ -1619,7 +1621,7 @@ void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::map& includedMocs, - std::vector& includedUis) + std::map& includedUis) { cmsys::RegularExpression mocIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" @@ -1737,7 +1739,7 @@ void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, - std::vector& includedUis) + std::map& includedUis) { if (this->UicExecutable.empty()) { @@ -1754,9 +1756,9 @@ void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, } -void cmQtAutoGenerators::ParseForUic(const std::string&, +void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, const std::string& contentsString, - std::vector& includedUis) + std::map& includedUis) { if (this->UicExecutable.empty()) { @@ -1768,6 +1770,9 @@ void cmQtAutoGenerators::ParseForUic(const std::string&, std::string::size_type matchOffset = 0; + const std::string absPath = cmsys::SystemTools::GetFilenamePath( + cmsys::SystemTools::GetRealPath(absFilename.c_str())) + '/'; + matchOffset = 0; if ((strstr(contentsString.c_str(), "ui_") != NULL) && (uiIncludeRegExp.find(contentsString))) @@ -1783,7 +1788,7 @@ void cmQtAutoGenerators::ParseForUic(const std::string&, // finding the correct header, so we need to remove the ui_ part basename = basename.substr(3); - includedUis.push_back(basename); + includedUis[absPath] = basename; matchOffset += uiIncludeRegExp.end(); } while(uiIncludeRegExp.find(contentsString.c_str() + matchOffset)); @@ -1831,7 +1836,7 @@ cmQtAutoGenerators::SearchHeadersForCppFile(const std::string& absFilename, void cmQtAutoGenerators::ParseHeaders(const std::set& absHeaders, const std::map& includedMocs, std::map& notIncludedMocs, - std::vector& includedUis) + std::map& includedUis) { for(std::set::const_iterator hIt=absHeaders.begin(); hIt!=absHeaders.end(); @@ -1939,7 +1944,8 @@ bool cmQtAutoGenerators::GenerateMoc(const std::string& sourceFile, return false; } -bool cmQtAutoGenerators::GenerateUi(const std::string& uiFileName) +bool cmQtAutoGenerators::GenerateUi(const std::string& path, + const std::string& uiFileName) { if (!cmsys::SystemTools::FileExists(this->Builddir.c_str(), false)) { @@ -1947,7 +1953,7 @@ bool cmQtAutoGenerators::GenerateUi(const std::string& uiFileName) } std::string ui_output_file = "ui_" + uiFileName + ".h"; - std::string ui_input_file = this->Srcdir + uiFileName + ".ui"; + std::string ui_input_file = path + uiFileName + ".ui"; int sourceNewerThanUi = 0; bool success = cmsys::SystemTools::FileTimeCompare(ui_input_file.c_str(), diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index f66d02b..2840fbf 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -48,16 +48,16 @@ private: bool RunAutogen(cmMakefile* makefile); bool GenerateMoc(const std::string& sourceFile, const std::string& mocFileName); - bool GenerateUi(const std::string& uiFileName); + bool GenerateUi(const std::string& path, const std::string& uiFileName); bool GenerateQrc(); void ParseCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::map& includedMocs, - std::vector& includedUis); + std::map& includedUis); void StrictParseCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::map& includedMocs, - std::vector& includedUis); + std::map& includedUis); void SearchHeadersForCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::set& absHeaders); @@ -65,14 +65,14 @@ private: void ParseHeaders(const std::set& absHeaders, const std::map& includedMocs, std::map& notIncludedMocs, - std::vector& includedUis); + std::map& includedUis); void ParseForUic(const std::string& fileName, const std::string& contentsString, - std::vector& includedUis); + std::map& includedUis); void ParseForUic(const std::string& fileName, - std::vector& includedUis); + std::map& includedUis); void Init(); diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index 515bf5b..546ed02 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -88,6 +88,6 @@ target_link_libraries(empty no_link_language) add_library(no_link_language STATIC empty.h) set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE) -qtx_wrap_cpp(uicOnlyMoc uiconly.h) -add_executable(uiconly uiconly.cpp ${uicOnlyMoc}) +qtx_wrap_cpp(uicOnlyMoc sub/uiconly.h) +add_executable(uiconly sub/uiconly.cpp ${uicOnlyMoc}) target_link_libraries(uiconly ${QT_LIBRARIES}) diff --git a/Tests/QtAutogen/sub/uiconly.cpp b/Tests/QtAutogen/sub/uiconly.cpp new file mode 100644 index 0000000..cdb3318 --- /dev/null +++ b/Tests/QtAutogen/sub/uiconly.cpp @@ -0,0 +1,13 @@ + +#include "uiconly.h" + +UicOnly::UicOnly(QWidget *parent) + : QWidget(parent), ui(new Ui::UicOnly) +{ + +} + +int main() +{ + return 0; +} diff --git a/Tests/QtAutogen/sub/uiconly.h b/Tests/QtAutogen/sub/uiconly.h new file mode 100644 index 0000000..9e21f82 --- /dev/null +++ b/Tests/QtAutogen/sub/uiconly.h @@ -0,0 +1,20 @@ + +#ifndef UIC_ONLY_H +#define UIC_ONLY_H + +#include +#include + +#include "ui_uiconly.h" + +class UicOnly : public QWidget +{ + Q_OBJECT +public: + explicit UicOnly(QWidget *parent = 0); + +private: + const std::auto_ptr ui; +}; + +#endif diff --git a/Tests/QtAutogen/sub/uiconly.ui b/Tests/QtAutogen/sub/uiconly.ui new file mode 100644 index 0000000..13fb832 --- /dev/null +++ b/Tests/QtAutogen/sub/uiconly.ui @@ -0,0 +1,24 @@ + + + UicOnly + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + + + + + diff --git a/Tests/QtAutogen/uiconly.cpp b/Tests/QtAutogen/uiconly.cpp deleted file mode 100644 index cdb3318..0000000 --- a/Tests/QtAutogen/uiconly.cpp +++ /dev/null @@ -1,13 +0,0 @@ - -#include "uiconly.h" - -UicOnly::UicOnly(QWidget *parent) - : QWidget(parent), ui(new Ui::UicOnly) -{ - -} - -int main() -{ - return 0; -} diff --git a/Tests/QtAutogen/uiconly.h b/Tests/QtAutogen/uiconly.h deleted file mode 100644 index 9e21f82..0000000 --- a/Tests/QtAutogen/uiconly.h +++ /dev/null @@ -1,20 +0,0 @@ - -#ifndef UIC_ONLY_H -#define UIC_ONLY_H - -#include -#include - -#include "ui_uiconly.h" - -class UicOnly : public QWidget -{ - Q_OBJECT -public: - explicit UicOnly(QWidget *parent = 0); - -private: - const std::auto_ptr ui; -}; - -#endif diff --git a/Tests/QtAutogen/uiconly.ui b/Tests/QtAutogen/uiconly.ui deleted file mode 100644 index 13fb832..0000000 --- a/Tests/QtAutogen/uiconly.ui +++ /dev/null @@ -1,24 +0,0 @@ - - - UicOnly - - - - 0 - 0 - 400 - 300 - - - - Form - - - - - - - - - - -- cgit v0.12