CPack: Add support for code signing of bundles on MacOS
This commit is contained in:
parent
fddb3ca443
commit
bd3fbf36b4
|
@ -33,6 +33,31 @@
|
||||||
# Path to a startup script. This is a path to an executable or script that
|
# Path to a startup script. This is a path to an executable or script that
|
||||||
# will be run whenever an end-user double-clicks the generated bundle in the
|
# will be run whenever an end-user double-clicks the generated bundle in the
|
||||||
# OSX Finder. Optional.
|
# OSX Finder. Optional.
|
||||||
|
#
|
||||||
|
# .. variable:: CPACK_BUNDLE_APPLE_CERT_APP
|
||||||
|
#
|
||||||
|
# The name of your Apple supplied code signing certificate for the application.
|
||||||
|
# The name usually takes the form "Developer ID Application: [Name]" or
|
||||||
|
# "3rd Party Mac Developer Application: [Name]". If this variable is not set
|
||||||
|
# the application will not be signed.
|
||||||
|
#
|
||||||
|
# .. variable:: CPACK_BUNDLE_APPLE_ENTITLEMENTS
|
||||||
|
#
|
||||||
|
# The name of the plist file that contains your apple entitlements for sandboxing
|
||||||
|
# your application. This file is required for submission to the Mac App Store.
|
||||||
|
#
|
||||||
|
# .. variable:: CPACK_BUNDLE_APPLE_CODESIGN_FILES
|
||||||
|
#
|
||||||
|
# A list of additional files that you wish to be signed. You do not need to
|
||||||
|
# list the main application folder, or the main executable. You should
|
||||||
|
# list any frameworks and plugins that are included in your app bundle.
|
||||||
|
#
|
||||||
|
# .. variable:: CPACK_COMMAND_CODESIGN
|
||||||
|
#
|
||||||
|
# Path to the codesign(1) command used to sign applications with an
|
||||||
|
# Apple cert. This variable can be used to override the automatically
|
||||||
|
# detected command (or specify its location if the auto-detection fails
|
||||||
|
# to find it.)
|
||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
# Copyright 2006-2009 Kitware, Inc.
|
# Copyright 2006-2009 Kitware, Inc.
|
||||||
|
|
|
@ -39,6 +39,21 @@ int cmCPackBundleGenerator::InitializeInternal()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP"))
|
||||||
|
{
|
||||||
|
const std::string codesign_path = cmSystemTools::FindProgram("codesign",
|
||||||
|
std::vector<std::string>(), false);
|
||||||
|
|
||||||
|
if(codesign_path.empty())
|
||||||
|
{
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||||
|
"Cannot locate codesign command"
|
||||||
|
<< std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
this->SetOptionIfNotSet("CPACK_COMMAND_CODESIGN", codesign_path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return this->Superclass::InitializeInternal();
|
return this->Superclass::InitializeInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +68,7 @@ const char* cmCPackBundleGenerator::GetPackagingInstallPrefix()
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
int cmCPackBundleGenerator::PackageFiles()
|
int cmCPackBundleGenerator::ConstructBundle()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get required arguments ...
|
// Get required arguments ...
|
||||||
|
@ -165,6 +180,22 @@ int cmCPackBundleGenerator::PackageFiles()
|
||||||
cmSystemTools::SetPermissions(command_target.str().c_str(), 0777);
|
cmSystemTools::SetPermissions(command_target.str().c_str(), 0777);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
int cmCPackBundleGenerator::PackageFiles()
|
||||||
|
{
|
||||||
|
if(!this->ConstructBundle())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!this->SignBundle(toplevel))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return this->CreateDMG(toplevel, packageFileNames[0]);
|
return this->CreateDMG(toplevel, packageFileNames[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,3 +203,96 @@ bool cmCPackBundleGenerator::SupportsComponentInstallation() const
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
|
||||||
|
{
|
||||||
|
const std::string cpack_apple_cert_app =
|
||||||
|
this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP")
|
||||||
|
? this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP") : "";
|
||||||
|
|
||||||
|
// codesign the application.
|
||||||
|
if(!cpack_apple_cert_app.empty())
|
||||||
|
{
|
||||||
|
std::string bundle_path;
|
||||||
|
bundle_path = src_dir + "/";
|
||||||
|
bundle_path += this->GetOption("CPACK_BUNDLE_NAME");
|
||||||
|
bundle_path += ".app";
|
||||||
|
|
||||||
|
// A list of additional files to sign, ie. frameworks and plugins.
|
||||||
|
const std::string sign_files =
|
||||||
|
this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES")
|
||||||
|
? this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES") : "";
|
||||||
|
|
||||||
|
std::vector<std::string> relFiles;
|
||||||
|
cmSystemTools::ExpandListArgument(sign_files, relFiles);
|
||||||
|
|
||||||
|
// sign the files supplied by the user, ie. frameworks.
|
||||||
|
for(std::vector<std::string>::iterator it = relFiles.begin();
|
||||||
|
it != relFiles.end(); ++it)
|
||||||
|
{
|
||||||
|
cmOStringStream temp_sign_file_cmd;
|
||||||
|
temp_sign_file_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
|
||||||
|
temp_sign_file_cmd << " --deep -f -s \"" << cpack_apple_cert_app;
|
||||||
|
temp_sign_file_cmd << "\" -i ";
|
||||||
|
temp_sign_file_cmd << this->GetOption("CPACK_APPLE_BUNDLE_ID");
|
||||||
|
temp_sign_file_cmd << " \"";
|
||||||
|
temp_sign_file_cmd << bundle_path;
|
||||||
|
temp_sign_file_cmd << it->c_str() << "\"";
|
||||||
|
|
||||||
|
if(!this->RunCommand(temp_sign_file_cmd))
|
||||||
|
{
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||||
|
"Error signing file:"
|
||||||
|
<< bundle_path << it->c_str() << std::endl);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sign main binary
|
||||||
|
cmOStringStream temp_sign_binary_cmd;
|
||||||
|
temp_sign_binary_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
|
||||||
|
temp_sign_binary_cmd << " --deep -f -s \"" << cpack_apple_cert_app;
|
||||||
|
temp_sign_binary_cmd << "\" \"" << bundle_path << "\"";
|
||||||
|
|
||||||
|
if(!this->RunCommand(temp_sign_binary_cmd))
|
||||||
|
{
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||||
|
"Error signing the application binary."
|
||||||
|
<< std::endl);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sign app bundle
|
||||||
|
cmOStringStream temp_codesign_cmd;
|
||||||
|
temp_codesign_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
|
||||||
|
temp_codesign_cmd << " --deep -f -s \"" << cpack_apple_cert_app << "\"";
|
||||||
|
if(this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS"))
|
||||||
|
{
|
||||||
|
temp_codesign_cmd << " --entitlements ";
|
||||||
|
temp_codesign_cmd << this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS");
|
||||||
|
}
|
||||||
|
temp_codesign_cmd << " \"" << bundle_path << "\"";
|
||||||
|
|
||||||
|
if(!this->RunCommand(temp_codesign_cmd))
|
||||||
|
{
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||||
|
"Error signing the application package."
|
||||||
|
<< std::endl);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_OUTPUT,
|
||||||
|
"- Application has been codesigned"
|
||||||
|
<< std::endl);
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_VERBOSE,
|
||||||
|
(this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS")
|
||||||
|
? "with entitlement sandboxing" : "without entitlement sandboxing")
|
||||||
|
<< std::endl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual int InitializeInternal();
|
virtual int InitializeInternal();
|
||||||
virtual const char* GetPackagingInstallPrefix();
|
virtual const char* GetPackagingInstallPrefix();
|
||||||
|
int ConstructBundle();
|
||||||
|
int SignBundle(const std::string& src_dir);
|
||||||
int PackageFiles();
|
int PackageFiles();
|
||||||
bool SupportsComponentInstallation() const;
|
bool SupportsComponentInstallation() const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue