瀏覽代碼

ENH: Add proper support for installing bundles

Andy Cedilnik 19 年之前
父節點
當前提交
ed5f95cf23
共有 4 個文件被更改,包括 25 次插入20 次删除
  1. 21 1
      Source/cmFileCommand.cxx
  2. 1 0
      Source/cmInstallGenerator.cxx
  3. 2 18
      Source/cmInstallTargetGenerator.cxx
  4. 1 1
      Source/cmTarget.h

+ 21 - 1
Source/cmFileCommand.cxx

@@ -571,6 +571,10 @@ bool cmFileCommand::HandleInstallCommand(
     {
     itype = cmTarget::MODULE_LIBRARY;
     }
+  else if ( stype == "DIRECTORY" )
+    {
+    itype = cmTarget::INSTALL_DIRECTORY;
+    }
 
   if ( !cmSystemTools::FileExists(destination.c_str()) )
     {
@@ -775,7 +779,23 @@ bool cmFileCommand::HandleInstallCommand(
     std::string message;
     if(!cmSystemTools::SameFile(fromFile.c_str(), toFile.c_str()))
       {
-      if(cmSystemTools::FileExists(fromFile.c_str()))
+      if(itype == cmTarget::INSTALL_DIRECTORY &&
+        cmSystemTools::FileIsDirectory(fromFile.c_str()))
+        {
+        // We will install this file.  Display the information.
+        message = "Installing ";
+        message += toFile.c_str();
+        this->Makefile->DisplayStatus(message.c_str(), -1);
+        if(!cmSystemTools::CopyADirectory(fromFile.c_str(), toFile.c_str()))
+          {
+          cmOStringStream e;
+          e << "INSTALL cannot copy directory \"" << fromFile
+            << "\" to \"" << toFile + "\".";
+          this->SetError(e.str().c_str());
+          return false;
+          }
+        }
+      else if(cmSystemTools::FileExists(fromFile.c_str()))
         {
         // We will install this file.  Display the information.
         message = "Installing ";

+ 1 - 0
Source/cmInstallGenerator.cxx

@@ -60,6 +60,7 @@ void cmInstallGenerator::AddInstallRule(std::ostream& os,
   std::string stype;
   switch(type)
     {
+    case cmTarget::INSTALL_DIRECTORY:stype = "DIRECTORY"; break;
     case cmTarget::INSTALL_PROGRAMS: stype = "PROGRAM"; break;
     case cmTarget::EXECUTABLE:       stype = "EXECUTABLE"; break;
     case cmTarget::STATIC_LIBRARY:   stype = "STATIC_LIBRARY"; break;

+ 2 - 18
Source/cmInstallTargetGenerator.cxx

@@ -123,24 +123,8 @@ void cmInstallTargetGenerator::GenerateScript(std::ostream& os)
         // Info.plist file.
         this->PrepareScriptReference(os, this->Target, "INSTALL",
                                      false, false);
-        std::string plist = fromFile;
-        plist += ".app/Contents/Info.plist";
-        fromFile += ".app/Contents/MacOS/";
-        fromFile += this->GetScriptReference(this->Target, "INSTALL",
-                                             false);
-
-        // Compute the destination locations of the bundle Info.plist file.
-        destination += "/";
-        destination += this->GetScriptReference(this->Target, "INSTALL",
-                                                false);
-        destination += ".app/Contents";
-
-        // Install the Info.plist file.
-        this->AddInstallRule(os, destination.c_str(), cmTarget::INSTALL_FILES,
-                             plist.c_str());
-
-        // Compute the destination locations of the bundle executable file.
-        destination += "/MacOS";
+        fromFile += ".app";
+        type = cmTarget::INSTALL_DIRECTORY;
         }
       }
       break;

+ 1 - 1
Source/cmTarget.h

@@ -35,7 +35,7 @@ public:
   cmTarget();
   enum TargetType { EXECUTABLE, STATIC_LIBRARY,
                     SHARED_LIBRARY, MODULE_LIBRARY, UTILITY, GLOBAL_TARGET,
-                    INSTALL_FILES, INSTALL_PROGRAMS};
+                    INSTALL_FILES, INSTALL_PROGRAMS, INSTALL_DIRECTORY};
 
   enum CustomCommandType { PRE_BUILD, PRE_LINK, POST_BUILD };