فهرست منبع

Refactor SetupAutomocTarget() so it can be run after creating the target

This makes it easier to move it from InitialPass() to some other
location, e.g. FinalPass() or something else.

Alex
Alex Neundorf 14 سال پیش
والد
کامیت
c27607baf8
4فایلهای تغییر یافته به همراه28 افزوده شده و 64 حذف شده
  1. 3 12
      Source/cmAddExecutableCommand.cxx
  2. 3 11
      Source/cmAddLibraryCommand.cxx
  3. 21 36
      Source/cmQtAutomoc.cxx
  4. 1 5
      Source/cmQtAutomoc.h

+ 3 - 12
Source/cmAddExecutableCommand.cxx

@@ -126,14 +126,6 @@ bool cmAddExecutableCommand
     }
 
   std::vector<std::string> srclists(s, args.end());
-  cmQtAutomoc* automoc = 0;
-  if ( doAutomoc )
-    {
-    automoc = new cmQtAutomoc;
-    automoc->SetupAutomocTarget(this->Makefile, exename.c_str(), srclists);
-    }
-
-
   cmTarget* tgt = this->Makefile->AddExecutable(exename.c_str(), srclists,
                                                 excludeFromAll);
   if ( use_win32 )
@@ -145,11 +137,10 @@ bool cmAddExecutableCommand
     tgt->SetProperty("MACOSX_BUNDLE", "ON");
     }
 
-  if ( automoc )
+  if ( doAutomoc )
     {
-    automoc->AddTargetDependency(this->Makefile, tgt);
-    delete automoc;
-    automoc = 0;
+    cmQtAutomoc automoc;
+    automoc.SetupAutomocTarget(tgt);
     }
 
   return true;

+ 3 - 11
Source/cmAddLibraryCommand.cxx

@@ -178,21 +178,13 @@ bool cmAddLibraryCommand
     ++s;
     }
 
-  cmQtAutomoc* automoc = 0;
-  if ( doAutomoc )
-    {
-    automoc = new cmQtAutomoc;
-    automoc->SetupAutomocTarget(this->Makefile, libName.c_str(), srclists);
-    }
-
   cmTarget* tgt =this->Makefile->AddLibrary(libName.c_str(), type, srclists,
                                             excludeFromAll);
 
-  if ( automoc )
+  if ( doAutomoc )
     {
-    automoc->AddTargetDependency(this->Makefile, tgt);
-    delete automoc;
-    automoc = 0;
+    cmQtAutomoc automoc;
+    automoc.SetupAutomocTarget(tgt);
     }
 
   return true;

+ 21 - 36
Source/cmQtAutomoc.cxx

@@ -32,10 +32,10 @@ cmQtAutomoc::cmQtAutomoc()
 }
 
 
-void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile,
-                                     const char* targetName,
-                                     std::vector<std::string>& srcs)
+void cmQtAutomoc::SetupAutomocTarget(cmTarget* target)
 {
+  cmMakefile* makefile = target->GetMakefile();
+  const char* targetName = target->GetName();
   // don't do anything if there is no Qt4:
   std::string qtMajorVersion = makefile->GetSafeDefinition("QT_VERSION_MAJOR");
   if (qtMajorVersion != "4")
@@ -43,6 +43,7 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile,
     return;
     }
 
+  // create a custom target for running automoc at buildtime:
   std::string automocTargetName = targetName;
   automocTargetName += "_automoc";
 
@@ -66,34 +67,32 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile,
 
   std::vector<std::string> depends;
 
-  cmTarget* target = makefile->AddUtilityCommand(automocTargetName.c_str(),
-                                                 true,
+  cmTarget* mocTarget = makefile->AddUtilityCommand(automocTargetName.c_str(),
+                                                    true,
                                       workingDirectory.c_str(), depends,
                                       commandLines, false, "Automoc target");
+  target->AddUtility(automocTargetName.c_str());
 
+  // configure a file to get all information to automoc at buildtime:
   std::string _moc_files;
   std::string _moc_headers;
   const char* sepFiles = "";
   const char* sepHeaders = "";
-  for(std::vector<std::string>::const_iterator fileIt = srcs.begin();
-      fileIt != srcs.end();
+
+  const std::vector<cmSourceFile*>& srcFiles = target->GetSourceFiles();
+
+  for(std::vector<cmSourceFile*>::const_iterator fileIt = srcFiles.begin();
+      fileIt != srcFiles.end();
       ++fileIt)
     {
-    std::string absFile = cmSystemTools::CollapseFullPath(
-                             fileIt->c_str(), makefile->GetCurrentDirectory());
-
-    bool skip = false;
-    bool generated = false;
-    cmSourceFile* sf = makefile->GetSource(absFile.c_str());
-    if (sf)
-      {
-      skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC"));
-      generated = cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"));
-      }
+    cmSourceFile* sf = *fileIt;
+    std::string absFile = sf->GetFullPath();
+    bool skip = cmSystemTools::IsOn(sf->GetPropertyForUser("SKIP_AUTOMOC"));
+    bool generated = cmSystemTools::IsOn(sf->GetPropertyForUser("GENERATED"));
 
     if ((skip==false) && (generated == false))
       {
-      std::string ext = cmSystemTools::GetFilenameExtension(fileIt->c_str());
+      std::string ext = sf->GetExtension();
       cmSystemTools::FileFormat fileType = cmSystemTools::GetFileFormat(
                                                                   ext.c_str());
       if (fileType == cmSystemTools::CXX_FILE_FORMAT)
@@ -137,29 +136,15 @@ void cmQtAutomoc::SetupAutomocTarget(cmMakefile* makefile,
   mocCppFile += "/";
   mocCppFile += automocTargetName;
   mocCppFile += ".cpp";
-  makefile->GetOrCreateSource(mocCppFile.c_str(), true);
-  srcs.push_back(mocCppFile);
+  cmSourceFile* mocCppSource = makefile->GetOrCreateSource(mocCppFile.c_str(),
+                                                         true);
+  target->AddSourceFile(mocCppSource);
 
   makefile->AppendProperty("ADDITIONAL_MAKE_CLEAN_FILES",
                            mocCppFile.c_str(), false);
 }
 
 
-void cmQtAutomoc::AddTargetDependency(cmMakefile* makefile, cmTarget* target)
-{
-  // don't do anything if there is no Qt4:
-  std::string qtMajorVersion = makefile->GetSafeDefinition("QT_VERSION_MAJOR");
-  if (qtMajorVersion != "4")
-    {
-    return;
-    }
-
-  std::string automocTargetName = target->GetName();
-  automocTargetName += "_automoc";
-  target->AddUtility(automocTargetName.c_str());
-}
-
-
 bool cmQtAutomoc::Run(const char* targetDirectory)
 {
   cmake cm;

+ 1 - 5
Source/cmQtAutomoc.h

@@ -10,11 +10,7 @@ public:
   cmQtAutomoc();
   bool Run(const char* targetDirectory);
 
-  void SetupAutomocTarget(cmMakefile* makefile,
-                          const char* targetName,
-                          std::vector<std::string>& srcs);
-
-  void AddTargetDependency(cmMakefile* makefile, cmTarget* target);
+  void SetupAutomocTarget(cmTarget* target);
 
 private:
   cmGlobalGenerator* CreateGlobalGenerator(cmake* cm,