diff options
-rw-r--r-- | Modules/MacOSXBundleInfo.plist.in | 36 | ||||
-rw-r--r-- | Source/cmLocalGenerator.cxx | 108 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 24 |
3 files changed, 94 insertions, 74 deletions
diff --git a/Modules/MacOSXBundleInfo.plist.in b/Modules/MacOSXBundleInfo.plist.in new file mode 100644 index 0000000..a466dc7 --- /dev/null +++ b/Modules/MacOSXBundleInfo.plist.in @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> + <key>CFBundleGetInfoString</key> + <string>${MACOSX_BUNDLE_INFO_STRING}</string> + <key>CFBundleIconFile</key> + <string>${MACOSX_BUNDLE_ICON_FILE}</string> + <key>CFBundleIdentifier</key> + <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleLongVersionString</key> + <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string> + <key>CFBundleName</key> + <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> + <key>CSResourcesFileMapped</key> + <true/> + <key>LSRequiresCarbon</key> + <true/> + <key>NSHumanReadableCopyright</key> + <string>${MACOSX_BUNDLE_COPYRIGHT}</string> +</dict> +</plist> diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index b934126..5a2a6c6 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2776,16 +2776,11 @@ bool cmLocalGenerator::CheckDefinition(std::string const& define) const } //---------------------------------------------------------------------------- -static std::string cmLGInfoProp(cmTarget* target, const char* prop) +static void cmLGInfoProp(cmMakefile* mf, cmTarget* target, const char* prop) { if(const char* val = target->GetProperty(prop)) { - return val; - } - else - { - // For compatibility check for a variable. - return target->GetMakefile()->GetSafeDefinition(prop); + mf->AddDefinition(prop, val); } } @@ -2794,66 +2789,41 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmTarget* target, const char* targetName, const char* fname) { - std::string info_EXECUTABLE_NAME = targetName; - - // Lookup the properties. - std::string info_INFO_STRING = - cmLGInfoProp(target, "MACOSX_BUNDLE_INFO_STRING"); - std::string info_ICON_FILE = - cmLGInfoProp(target, "MACOSX_BUNDLE_ICON_FILE"); - std::string info_GUI_IDENTIFIER = - cmLGInfoProp(target, "MACOSX_BUNDLE_GUI_IDENTIFIER"); - std::string info_LONG_VERSION_STRING = - cmLGInfoProp(target, "MACOSX_BUNDLE_LONG_VERSION_STRING"); - std::string info_BUNDLE_NAME = - cmLGInfoProp(target, "MACOSX_BUNDLE_BUNDLE_NAME"); - std::string info_SHORT_VERSION_STRING = - cmLGInfoProp(target, "MACOSX_BUNDLE_SHORT_VERSION_STRING"); - std::string info_BUNDLE_VERSION = - cmLGInfoProp(target, "MACOSX_BUNDLE_BUNDLE_VERSION"); - std::string info_COPYRIGHT = - cmLGInfoProp(target, "MACOSX_BUNDLE_COPYRIGHT"); - - // Generate the file. - cmGeneratedFileStream fout(fname); - fout.SetCopyIfDifferent(true); - fout << - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"\n" - " \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" - "<plist version=\"1.0\">\n" - "<dict>\n" - "\t<key>CFBundleDevelopmentRegion</key>\n" - "\t<string>English</string>\n" - "\t<key>CFBundleExecutable</key>\n" - "\t<string>" << info_EXECUTABLE_NAME << "</string>\n" - "\t<key>CFBundleGetInfoString</key>\n" - "\t<string>" << info_INFO_STRING << "</string>\n" - "\t<key>CFBundleIconFile</key>\n" - "\t<string>" << info_ICON_FILE << "</string>\n" - "\t<key>CFBundleIdentifier</key>\n" - "\t<string>" << info_GUI_IDENTIFIER << "</string>\n" - "\t<key>CFBundleInfoDictionaryVersion</key>\n" - "\t<string>6.0</string>\n" - "\t<key>CFBundleLongVersionString</key>\n" - "\t<string>" << info_LONG_VERSION_STRING << "</string>\n" - "\t<key>CFBundleName</key>\n" - "\t<string>" << info_BUNDLE_NAME << "</string>\n" - "\t<key>CFBundlePackageType</key>\n" - "\t<string>APPL</string>\n" - "\t<key>CFBundleShortVersionString</key>\n" - "\t<string>" << info_SHORT_VERSION_STRING << "</string>\n" - "\t<key>CFBundleSignature</key>\n" - "\t<string>????" /* break string to avoid trigraph */ "</string>\n" - "\t<key>CFBundleVersion</key>\n" - "\t<string>" << info_BUNDLE_VERSION << "</string>\n" - "\t<key>CSResourcesFileMapped</key>\n" - "\t<true/>\n" - "\t<key>LSRequiresCarbon</key>\n" - "\t<true/>\n" - "\t<key>NSHumanReadableCopyright</key>\n" - "\t<string>" << info_COPYRIGHT << "</string>\n" - "</dict>\n" - "</plist>\n" - ; + // Find the Info.plist template. + const char* in = target->GetProperty("MACOSX_BUNDLE_INFO_PLIST"); + std::string inFile = (in && *in)? in : "MacOSXBundleInfo.plist.in"; + if(!cmSystemTools::FileIsFullPath(inFile.c_str())) + { + std::string inMod = this->Makefile->GetModulesFile(inFile.c_str()); + if(!inMod.empty()) + { + inFile = inMod; + } + } + if(!cmSystemTools::FileExists(inFile.c_str(), true)) + { + cmOStringStream e; + e << "Target " << target->GetName() << " Info.plist template \"" + << inFile << "\" could not be found."; + cmSystemTools::Error(e.str().c_str()); + return; + } + + // Convert target properties to variables in an isolated makefile + // scope to configure the file. If properties are set they will + // override user make variables. If not the configuration will fall + // back to the directory-level values set by the user. + cmMakefile* mf = this->Makefile; + mf->PushScope(); + mf->AddDefinition("MACOSX_BUNDLE_EXECUTABLE_NAME", targetName); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_INFO_STRING"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_ICON_FILE"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_GUI_IDENTIFIER"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_LONG_VERSION_STRING"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_BUNDLE_NAME"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_SHORT_VERSION_STRING"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_BUNDLE_VERSION"); + cmLGInfoProp(mf, target, "MACOSX_BUNDLE_COPYRIGHT"); + mf->ConfigureFile(inFile.c_str(), fname, false, false, false); + mf->PopScope(); } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index f9c9426..c4cc793 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -547,10 +547,21 @@ void cmTarget::DefineProperties(cmake *cm) "When this property is set to true the executable when built " "on Mac OS X will be created as an application bundle. " "This makes it a GUI executable that can be launched from " - "the Finder.\n" - "The bundle Info.plist file is generated automatically. " - "The following target properties may be set to specify " - "its content:" + "the Finder. " + "See the MACOSX_BUNDLE_INFO_PLIST target property for information " + "about creation of the Info.plist file for the application bundle."); + + cm->DefineProperty + ("MACOSX_BUNDLE_INFO_PLIST", cmProperty::TARGET, + "Specify a custom Info.plist template for a Mac OS X App Bundle.", + "An executable target with MACOSX_BUNDLE enabled will be built as an " + "application bundle on Mac OS X. " + "By default its Info.plist file is created by configuring a template " + "called MacOSXBundleInfo.plist.in located in the CMAKE_MODULE_PATH. " + "This property specifies an alternative template file name which " + "may be a full path.\n" + "The following target properties may be set to specify content to " + "be configured into the file:\n" " MACOSX_BUNDLE_INFO_STRING\n" " MACOSX_BUNDLE_ICON_FILE\n" " MACOSX_BUNDLE_GUI_IDENTIFIER\n" @@ -559,7 +570,10 @@ void cmTarget::DefineProperties(cmake *cm) " MACOSX_BUNDLE_SHORT_VERSION_STRING\n" " MACOSX_BUNDLE_BUNDLE_VERSION\n" " MACOSX_BUNDLE_COPYRIGHT\n" - ); + "CMake variables of the same name may be set to affect all targets " + "in a directory that do not have each specific property set. " + "If a custom Info.plist is specified by this property it may of course " + "hard-code all the settings instead of using the target properties."); cm->DefineProperty ("ENABLE_EXPORTS", cmProperty::TARGET, |