summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-05-17 16:53:56 (GMT)
committerBrad King <brad.king@kitware.com>2008-05-17 16:53:56 (GMT)
commitc1b8ad4e1db7df8dacbf8df2454270afb66d475b (patch)
treebf5e0410690e6a2bedcbd868386412cc0a667d62
parentb9ede3c86d046baa36c79111f0d7ab4b42bdc8dc (diff)
downloadCMake-c1b8ad4e1db7df8dacbf8df2454270afb66d475b.zip
CMake-c1b8ad4e1db7df8dacbf8df2454270afb66d475b.tar.gz
CMake-c1b8ad4e1db7df8dacbf8df2454270afb66d475b.tar.bz2
ENH: Allow users to specify a custom Info.plist template
- Create MACOSX_BUNDLE_INFO_PLIST target property to specify template. - Look for MacOSXBundleInfo.plist.in in CMAKE_MODULE_PATH by default. - See issue #6983.
-rw-r--r--Modules/MacOSXBundleInfo.plist.in36
-rw-r--r--Source/cmLocalGenerator.cxx108
-rw-r--r--Source/cmTarget.cxx24
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,