ソースを参照

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.
Stephen Kelly 11 年 前
コミット
6053ce22f6

+ 20 - 14
Source/cmQtAutoGenerators.cxx

@@ -1279,8 +1279,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile)
   const std::vector<std::string>& headerExtensions =
                                                makefile->GetHeaderExtensions();
 
-  std::vector<std::string> includedUis;
-  std::vector<std::string> skippedUis;
+  std::map<std::string, std::string> includedUis;
+  std::map<std::string, std::string> skippedUis;
   std::vector<std::string> 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<std::string>& uiFiles = skipUic ? skippedUis : includedUis;
+    std::map<std::string, std::string>& 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<std::string>::const_iterator it = includedUis.begin();
+  for(std::map<std::string, std::string>::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<std::string>& headerExtensions,
                               std::map<std::string, std::string>& includedMocs,
-                              std::vector<std::string> &includedUis)
+                              std::map<std::string, std::string> &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<std::string>& headerExtensions,
                               std::map<std::string, std::string>& includedMocs,
-                              std::vector<std::string>& includedUis)
+                              std::map<std::string, std::string>& 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<std::string>& includedUis)
+                              std::map<std::string, std::string>& 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<std::string>& includedUis)
+                              std::map<std::string, std::string>& 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<std::string>& absHeaders,
                         const std::map<std::string, std::string>& includedMocs,
                         std::map<std::string, std::string>& notIncludedMocs,
-                        std::vector<std::string>& includedUis)
+                        std::map<std::string, std::string>& includedUis)
 {
   for(std::set<std::string>::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(),

+ 6 - 6
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<std::string>& headerExtensions,
                     std::map<std::string, std::string>& includedMocs,
-                          std::vector<std::string>& includedUis);
+                          std::map<std::string, std::string>& includedUis);
   void StrictParseCppFile(const std::string& absFilename,
                           const std::vector<std::string>& headerExtensions,
                           std::map<std::string, std::string>& includedMocs,
-                          std::vector<std::string>& includedUis);
+                          std::map<std::string, std::string>& includedUis);
   void SearchHeadersForCppFile(const std::string& absFilename,
                               const std::vector<std::string>& headerExtensions,
                               std::set<std::string>& absHeaders);
@@ -65,14 +65,14 @@ private:
   void ParseHeaders(const std::set<std::string>& absHeaders,
                     const std::map<std::string, std::string>& includedMocs,
                     std::map<std::string, std::string>& notIncludedMocs,
-                          std::vector<std::string>& includedUis);
+                          std::map<std::string, std::string>& includedUis);
 
   void ParseForUic(const std::string& fileName,
                    const std::string& contentsString,
-                   std::vector<std::string>& includedUis);
+                   std::map<std::string, std::string>& includedUis);
 
   void ParseForUic(const std::string& fileName,
-                   std::vector<std::string>& includedUis);
+                   std::map<std::string, std::string>& includedUis);
 
   void Init();
 

+ 2 - 2
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})

+ 0 - 0
Tests/QtAutogen/uiconly.cpp → Tests/QtAutogen/sub/uiconly.cpp


+ 0 - 0
Tests/QtAutogen/uiconly.h → Tests/QtAutogen/sub/uiconly.h


+ 0 - 0
Tests/QtAutogen/uiconly.ui → Tests/QtAutogen/sub/uiconly.ui