Просмотр исходного кода

ENH: Add license file presentation to the Drag-N-Drop dmg file CPack generator. Fixes issue #8442. Thanks to Clinton Stimpson for the patch.

David Cole 17 лет назад
Родитель
Сommit
c148714b82
1 измененных файлов с 157 добавлено и 6 удалено
  1. 157 6
      Source/CPack/cmCPackDragNDropGenerator.cxx

+ 157 - 6
Source/CPack/cmCPackDragNDropGenerator.cxx

@@ -18,9 +18,40 @@
 #include "cmCPackDragNDropGenerator.h"
 #include "cmCPackLog.h"
 #include "cmSystemTools.h"
+#include "cmGeneratedFileStream.h"
 
 #include <cmsys/RegularExpression.hxx>
 
+static const char* SLAHeader = 
+"data 'LPic' (5000) {\n"
+"    $\"0002 0011 0003 0001 0000 0000 0002 0000\"\n"
+"    $\"0008 0003 0000 0001 0004 0000 0004 0005\"\n"
+"    $\"0000 000E 0006 0001 0005 0007 0000 0007\"\n"
+"    $\"0008 0000 0047 0009 0000 0034 000A 0001\"\n"
+"    $\"0035 000B 0001 0020 000C 0000 0011 000D\"\n"
+"    $\"0000 005B 0004 0000 0033 000F 0001 000C\"\n"
+"    $\"0010 0000 000B 000E 0000\"\n"
+"};\n"
+"\n";
+
+static const char* SLASTREnglish = 
+"resource 'STR#' (5002, \"English\") {\n"
+"    {\n"
+"        \"English\",\n"
+"        \"Agree\",\n"
+"        \"Disagree\",\n"
+"        \"Print\",\n"
+"        \"Save...\",\n"
+"        \"You agree to the License Agreement terms when you click \"\n"
+"        \"the \\\"Agree\\\" button.\",\n"
+"        \"Software License Agreement\",\n"
+"        \"This text cannot be saved.  This disk may be full or locked, or the \"\n"
+"        \"file may be locked.\",\n"
+"        \"Unable to print.  Make sure you have selected a printer.\"\n"
+"    }\n"
+"};\n"
+"\n";
+
 //----------------------------------------------------------------------
 cmCPackDragNDropGenerator::cmCPackDragNDropGenerator()
 {
@@ -55,6 +86,17 @@ int cmCPackDragNDropGenerator::InitializeInternal()
     return 0;
     }
   this->SetOptionIfNotSet("CPACK_COMMAND_SETFILE", setfile_path.c_str());
+  
+  const std::string rez_path = cmSystemTools::FindProgram("Rez",
+    std::vector<std::string>(1, "/Developer/Tools"), false);
+  if(rez_path.empty())
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR,
+      "Cannot locate Rez command"
+      << std::endl);
+    return 0;
+    }
+  this->SetOptionIfNotSet("CPACK_COMMAND_REZ", rez_path.c_str());
 
   return this->Superclass::InitializeInternal();
 }
@@ -129,6 +171,17 @@ int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel,
   // Get optional arguments ...
   const std::string cpack_package_icon = this->GetOption("CPACK_PACKAGE_ICON") 
     ? this->GetOption("CPACK_PACKAGE_ICON") : "";
+  
+  // Get optional arguments ...
+  std::string cpack_license_file = 
+    this->GetOption("CPACK_RESOURCE_FILE_LICENSE") ? 
+    this->GetOption("CPACK_RESOURCE_FILE_LICENSE") : "";
+  // only put license on dmg if is user provided
+  if(!cpack_license_file.empty() &&
+      cpack_license_file.find("CPack.GenericLicense.txt") != std::string::npos)
+  {
+    cpack_license_file = "";
+  }
 
   // The staging directory contains everything that will end-up inside the
   // final disk image ...
@@ -163,8 +216,8 @@ int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel,
     }
 
   // Create a temporary read-write disk image ...
-  cmOStringStream temp_image;
-  temp_image << this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "/temp.dmg";
+  std::string temp_image = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+  temp_image += "/temp.dmg";
 
   cmOStringStream temp_image_command;
   temp_image_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
@@ -174,7 +227,7 @@ int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel,
   temp_image_command << " -volname \""
     << this->GetOption("CPACK_PACKAGE_FILE_NAME") << "\"";
   temp_image_command << " -format UDRW";
-  temp_image_command << " \"" << temp_image.str() << "\"";
+  temp_image_command << " \"" << temp_image << "\"";
 
   if(!this->RunCommand(temp_image_command))
     {
@@ -193,7 +246,7 @@ int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel,
     cmOStringStream attach_command;
     attach_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
     attach_command << " attach";
-    attach_command << " \"" << temp_image.str() << "\"";
+    attach_command << " \"" << temp_image << "\"";
 
     std::string attach_output;
     if(!this->RunCommand(attach_command, &attach_output))
@@ -237,16 +290,114 @@ int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel,
       return 0;
       }
     }
+  
+  if(!cpack_license_file.empty())
+  {
+    std::string sla_r = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+    sla_r += "/sla.r";
+
+    std::ifstream ifs;
+    ifs.open(cpack_license_file.c_str());
+    if(ifs.is_open())
+    {
+      cmGeneratedFileStream osf(sla_r.c_str());
+      osf << SLAHeader;
+      osf << "\n";
+      osf << "data 'TEXT' (5002, \"English\") {\n";
+      while(ifs.good())
+      {
+        std::string line;
+        std::getline(ifs, line);
+        osf << "        \"" << line << "\\n\"\n";
+      }
+      osf << "};\n";
+      osf << "\n";
+      osf << SLASTREnglish;
+      ifs.close();
+      osf.close();
+    }
+
+    // convert to UDCO
+    std::string temp_udco = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+    temp_udco += "/temp-udco.dmg";
+
+    cmOStringStream udco_image_command;
+    udco_image_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
+    udco_image_command << " convert \"" << temp_image << "\"";
+    udco_image_command << " -format UDCO";
+    udco_image_command << " -o \"" << temp_udco << "\"";
+    
+    std::string error;
+    if(!this->RunCommand(udco_image_command, &error))
+      {
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+        "Error converting to UDCO dmg for adding SLA." << std::endl
+        << error
+        << std::endl);
+      return 0;
+      }
+
+    // unflatten dmg
+    cmOStringStream unflatten_command;
+    unflatten_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
+    unflatten_command << " unflatten ";
+    unflatten_command << "\"" << temp_udco << "\"";
+    
+    if(!this->RunCommand(unflatten_command, &error))
+      {
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+        "Error unflattening dmg for adding SLA." << std::endl
+        << error 
+        << std::endl);
+      return 0;
+      }
+ 
+    // Rez the SLA 
+    cmOStringStream embed_sla_command;
+    embed_sla_command << "/bin/bash -c \"";   // need expansion of "*.r"
+    embed_sla_command << this->GetOption("CPACK_COMMAND_REZ");
+    embed_sla_command << " /Developer/Headers/FlatCarbon/*.r ";
+    embed_sla_command << "'" << sla_r << "'";
+    embed_sla_command << " -a -o ";
+    embed_sla_command << "'" << temp_udco << "'\"";
+    
+    if(!this->RunCommand(embed_sla_command, &error))
+      {
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+        "Error adding SLA." << std::endl 
+        << error 
+        << std::endl);
+      return 0;
+      }
+
+    // flatten dmg
+    cmOStringStream flatten_command;
+    flatten_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
+    flatten_command << " flatten ";
+    flatten_command << "\"" << temp_udco << "\"";
+    
+    if(!this->RunCommand(flatten_command, &error))
+      {
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+        "Error flattening dmg for adding SLA." << std::endl
+        << error
+        << std::endl);
+      return 0;
+      }
+
+    temp_image = temp_udco;
+  }
+
 
   // Create the final compressed read-only disk image ...
   cmOStringStream final_image_command;
   final_image_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
-  final_image_command << " convert \"" << temp_image.str() << "\"";
+  final_image_command << " convert \"" << temp_image << "\"";
   final_image_command << " -format UDZO";
   final_image_command << " -imagekey";
   final_image_command << " zlib-level=9";
   final_image_command << " -o \"" << outFileName << "\"";
-
+  
   if(!this->RunCommand(final_image_command))
     {
     cmCPackLogger(cmCPackLog::LOG_ERROR,