Browse Source

ENH: Add copy stages for bundle files

Andy Cedilnik 19 years ago
parent
commit
32ec28ad00
3 changed files with 45 additions and 0 deletions
  1. 43 0
      Source/cmGlobalXCodeGenerator.cxx
  2. 1 0
      Source/cmXCodeObject.cxx
  3. 1 0
      Source/cmXCodeObject.h

+ 43 - 0
Source/cmGlobalXCodeGenerator.cxx

@@ -616,6 +616,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
     // add all the sources
     std::vector<cmXCodeObject*> externalObjFiles;
     std::vector<cmXCodeObject*> headerFiles;
+    std::vector<cmXCodeObject*> specialBundleFiles;
     for(std::vector<cmSourceFile*>::iterator i = classes.begin(); 
         i != classes.end(); ++i)
       {
@@ -674,6 +675,48 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
                                headerBuildPhase, frameworkBuildPhase,
                                cmtarget);
     targets.push_back(this->CreateXCodeTarget(l->second, buildPhases));
+
+    // copy files build phase
+    typedef std::map<cmStdString, std::vector<cmSourceFile*> >
+      mapOfVectorOfSourceFiles;
+    mapOfVectorOfSourceFiles bundleFiles;
+    for(std::vector<cmSourceFile*>::iterator i = classes.begin(); 
+        i != classes.end(); ++i)
+      {
+      const char* resLoc = (*i)->GetProperty("MACOSX_PACKAGE_LOCATION");
+      if ( !resLoc )
+        {
+        continue;
+        }
+      bundleFiles[resLoc].push_back(*i);
+      }
+    mapOfVectorOfSourceFiles::iterator mit;
+    for ( mit = bundleFiles.begin(); mit != bundleFiles.end(); ++ mit )
+      {
+      cmXCodeObject* copyFilesBuildPhase
+        = this->CreateObject(cmXCodeObject::PBXCopyFilesBuildPhase);
+      buildPhases->AddObject(copyFilesBuildPhase);
+      copyFilesBuildPhase->SetComment("Copy files");
+      copyFilesBuildPhase->AddAttribute("buildActionMask",
+        this->CreateString("2147483647"));
+      copyFilesBuildPhase->AddAttribute("dstSubfolderSpec",
+        this->CreateString("6"));
+      copyFilesBuildPhase->AddAttribute("runOnlyForDeploymentPostprocessing",
+        this->CreateString("0"));
+      cmOStringStream ostr;
+      ostr << "../" << mit->first.c_str();
+      copyFilesBuildPhase->AddAttribute("dstPath",
+        this->CreateString(ostr.str().c_str()));
+      buildFiles = this->CreateObject(cmXCodeObject::OBJECT_LIST);
+      copyFilesBuildPhase->AddAttribute("files", buildFiles);
+      std::vector<cmSourceFile*>::iterator sfIt;
+      for ( sfIt = mit->second.begin(); sfIt != mit->second.end(); ++ sfIt )
+        {
+        cmXCodeObject* xsf =
+          this->CreateXCodeSourceFile(this->CurrentLocalGenerator, *sfIt, cmtarget);
+        buildFiles->AddObject(xsf);
+        }
+      }
     }
 }
 

+ 1 - 0
Source/cmXCodeObject.cxx

@@ -10,6 +10,7 @@ const char* cmXCodeObject::PBXTypeNames[] = {
     "PBXExecutableFileReference", "PBXLibraryReference", "PBXToolTarget",
     "PBXLibraryTarget", "PBXAggregateTarget", "XCBuildConfiguration", 
     "XCConfigurationList",
+    "PBXCopyFilesBuildPhase",
     "None"
   };
 

+ 1 - 0
Source/cmXCodeObject.h

@@ -16,6 +16,7 @@ public:
                  PBXApplicationReference, PBXExecutableFileReference, 
                  PBXLibraryReference, PBXToolTarget, PBXLibraryTarget, 
                  PBXAggregateTarget,XCBuildConfiguration,XCConfigurationList,
+                 PBXCopyFilesBuildPhase,
                  None
   };
   class StringVec: public std::vector<cmStdString> {};