From 1bf669207b2f3dcc21bd3f3f0b88535a34f4a8aa Mon Sep 17 00:00:00 2001 From: David Cole Date: Thu, 19 Feb 2009 10:39:08 -0500 Subject: [PATCH] BUG: A little bit more refactoring from BundleGenerator to DragNDropGenerator. See issue #8556. Thanks for Clinton Stimpson for the patch. --- Source/CPack/cmCPackBundleGenerator.cxx | 126 +-------------------- Source/CPack/cmCPackDragNDropGenerator.cxx | 100 ++++++++-------- Source/CPack/cmCPackDragNDropGenerator.h | 2 + 3 files changed, 56 insertions(+), 172 deletions(-) diff --git a/Source/CPack/cmCPackBundleGenerator.cxx b/Source/CPack/cmCPackBundleGenerator.cxx index 62183e62d..a098c551f 100644 --- a/Source/CPack/cmCPackBundleGenerator.cxx +++ b/Source/CPack/cmCPackBundleGenerator.cxx @@ -98,9 +98,6 @@ int cmCPackBundleGenerator::CompressFiles(const char* outFileName, } // Get optional arguments ... - const std::string cpack_package_icon = this->GetOption("CPACK_PACKAGE_ICON") - ? this->GetOption("CPACK_PACKAGE_ICON") : ""; - const std::string cpack_bundle_startup_command = this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND") ? this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND") : ""; @@ -175,126 +172,5 @@ int cmCPackBundleGenerator::CompressFiles(const char* outFileName, cmSystemTools::SetPermissions(command_target.str().c_str(), 0777); } - // Add a symlink to /Applications so users can drag-and-drop the bundle - // into it - cmOStringStream application_link; - application_link << staging.str() << "/Applications"; - cmSystemTools::CreateSymlink("/Applications", - application_link.str().c_str()); - - // Optionally add a custom volume icon ... - if(!cpack_package_icon.empty()) - { - cmOStringStream package_icon_source; - package_icon_source << cpack_package_icon; - - cmOStringStream package_icon_destination; - package_icon_destination << staging.str() << "/.VolumeIcon.icns"; - - if(!this->CopyFile(package_icon_source, package_icon_destination)) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error copying disk volume icon. " - "Check the value of CPACK_PACKAGE_ICON." - << std::endl); - - return 0; - } - } - - // Create a temporary read-write disk image ... - cmOStringStream temp_image; - temp_image << this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "/temp.dmg"; - - cmOStringStream temp_image_command; - temp_image_command << this->GetOption("CPACK_COMMAND_HDIUTIL"); - temp_image_command << " create"; - temp_image_command << " -ov"; - temp_image_command << " -srcfolder \"" << staging.str() << "\""; - temp_image_command << " -volname \"" - << this->GetOption("CPACK_PACKAGE_FILE_NAME") << "\""; - temp_image_command << " -format UDRW"; - temp_image_command << " \"" << temp_image.str() << "\""; - - if(!this->RunCommand(temp_image_command)) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error generating temporary disk image." - << std::endl); - - return 0; - } - - // Optionally set the custom icon flag for the image ... - if(!cpack_package_icon.empty()) - { - cmOStringStream temp_mount; - - cmOStringStream attach_command; - attach_command << this->GetOption("CPACK_COMMAND_HDIUTIL"); - attach_command << " attach"; - attach_command << " \"" << temp_image.str() << "\""; - - std::string attach_output; - if(!this->RunCommand(attach_command, &attach_output)) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error attaching temporary disk image." - << std::endl); - - return 0; - } - - cmsys::RegularExpression mountpoint_regex(".*(/Volumes/[^\n]+)\n.*"); - mountpoint_regex.find(attach_output.c_str()); - temp_mount << mountpoint_regex.match(1); - - cmOStringStream setfile_command; - setfile_command << this->GetOption("CPACK_COMMAND_SETFILE"); - setfile_command << " -a C"; - setfile_command << " \"" << temp_mount.str() << "\""; - - if(!this->RunCommand(setfile_command)) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error assigning custom icon to temporary disk image." - << std::endl); - - return 0; - } - - cmOStringStream detach_command; - detach_command << this->GetOption("CPACK_COMMAND_HDIUTIL"); - detach_command << " detach"; - detach_command << " \"" << temp_mount.str() << "\""; - - if(!this->RunCommand(detach_command)) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error detaching temporary disk image." - << std::endl); - - return 0; - } - } - - // 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 << " -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, - "Error compressing disk image." - << std::endl); - - return 0; - } - - return 1; + return this->CreateDMG(toplevel, outFileName); } diff --git a/Source/CPack/cmCPackDragNDropGenerator.cxx b/Source/CPack/cmCPackDragNDropGenerator.cxx index 40ade06cb..228066205 100644 --- a/Source/CPack/cmCPackDragNDropGenerator.cxx +++ b/Source/CPack/cmCPackDragNDropGenerator.cxx @@ -71,6 +71,59 @@ int cmCPackDragNDropGenerator::CompressFiles(const char* outFileName, { (void) files; + return this->CreateDMG(toplevel, outFileName); +} + +//---------------------------------------------------------------------- +bool cmCPackDragNDropGenerator::CopyFile(cmOStringStream& source, + cmOStringStream& target) +{ + if(!cmSystemTools::CopyFileIfDifferent( + source.str().c_str(), + target.str().c_str())) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Error copying " + << source.str() + << " to " + << target.str() + << std::endl); + + return false; + } + + return true; +} + +//---------------------------------------------------------------------- +bool cmCPackDragNDropGenerator::RunCommand(cmOStringStream& command, + std::string* output) +{ + int exit_code = 1; + + bool result = cmSystemTools::RunSingleCommand( + command.str().c_str(), + output, + &exit_code, + 0, + this->GeneratorVerbose, + 0); + + if(!result || exit_code) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Error executing: " + << command.str() + << std::endl); + + return false; + } + + return true; +} + +int cmCPackDragNDropGenerator::CreateDMG(const std::string& toplevel, const std::string& outFileName) +{ // Get optional arguments ... const std::string cpack_package_icon = this->GetOption("CPACK_PACKAGE_ICON") ? this->GetOption("CPACK_PACKAGE_ICON") : ""; @@ -204,50 +257,3 @@ int cmCPackDragNDropGenerator::CompressFiles(const char* outFileName, return 1; } -//---------------------------------------------------------------------- -bool cmCPackDragNDropGenerator::CopyFile(cmOStringStream& source, - cmOStringStream& target) -{ - if(!cmSystemTools::CopyFileIfDifferent( - source.str().c_str(), - target.str().c_str())) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error copying " - << source.str() - << " to " - << target.str() - << std::endl); - - return false; - } - - return true; -} - -//---------------------------------------------------------------------- -bool cmCPackDragNDropGenerator::RunCommand(cmOStringStream& command, - std::string* output) -{ - int exit_code = 1; - - bool result = cmSystemTools::RunSingleCommand( - command.str().c_str(), - output, - &exit_code, - 0, - this->GeneratorVerbose, - 0); - - if(!result || exit_code) - { - cmCPackLogger(cmCPackLog::LOG_ERROR, - "Error executing: " - << command.str() - << std::endl); - - return false; - } - - return true; -} diff --git a/Source/CPack/cmCPackDragNDropGenerator.h b/Source/CPack/cmCPackDragNDropGenerator.h index 0dd4e5a69..ed0307d37 100644 --- a/Source/CPack/cmCPackDragNDropGenerator.h +++ b/Source/CPack/cmCPackDragNDropGenerator.h @@ -39,6 +39,8 @@ protected: bool CopyFile(cmOStringStream& source, cmOStringStream& target); bool RunCommand(cmOStringStream& command, std::string* output = 0); + + virtual int CreateDMG(const std::string& installdir, const std::string& outdmg); std::string InstallPrefix; };