diff options
Diffstat (limited to 'Source/CPack')
-rw-r--r-- | Source/CPack/cmCPackDragNDropGenerator.cxx | 163 |
1 files changed, 157 insertions, 6 deletions
diff --git a/Source/CPack/cmCPackDragNDropGenerator.cxx b/Source/CPack/cmCPackDragNDropGenerator.cxx index a7c58a9..8b98ac5 100644 --- a/Source/CPack/cmCPackDragNDropGenerator.cxx +++ b/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, |