Browse Source

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.
Brad King 17 years ago
parent
commit
c1b8ad4e1d
3 changed files with 94 additions and 74 deletions
  1. 36 0
      Modules/MacOSXBundleInfo.plist.in
  2. 39 69
      Source/cmLocalGenerator.cxx
  3. 19 5
      Source/cmTarget.cxx

+ 36 - 0
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>

+ 39 - 69
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();
 }

+ 19 - 5
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,