浏览代码

OS X: Fix getting of CFBundle LOCATION property.

This fixes bug #13797.
The kinds of changes applied in 373faae5 for frameworks are now
applied to CFBundle.  The prefix and suffix for CFBundles are
now handled in cmTarget::GetFullNameInternal.
Clinton Stimpson 12 年之前
父节点
当前提交
483e208482

+ 1 - 15
Source/cmExportInstallFileGenerator.cxx

@@ -351,21 +351,7 @@ cmExportInstallFileGenerator
     prop += suffix;
 
     // Append the installed file name.
-    if(target->IsCFBundleOnApple())
-      {
-      const char *ext = target->GetProperty("BUNDLE_EXTENSION");
-      if (!ext)
-        {
-        ext = "bundle";
-        }
-
-      value += itgen->GetInstallFilename(target, config);
-      value += ".";
-      value += ext;
-      value += "/";
-      value += itgen->GetInstallFilename(target, config);
-      }
-    else if(target->IsAppBundleOnApple())
+    if(target->IsAppBundleOnApple())
       {
       value += itgen->GetInstallFilename(target, config);
       value += ".app/Contents/MacOS/";

+ 1 - 7
Source/cmGlobalXCodeGenerator.cxx

@@ -746,12 +746,6 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
       }
     }
 
-  if(cmtarget.IsCFBundleOnApple())
-    {
-    cmtarget.SetProperty("PREFIX", "");
-    cmtarget.SetProperty("SUFFIX", "");
-    }
-
   // Add the fileRef to the top level Resources group/folder if it is not
   // already there.
   //
@@ -1823,7 +1817,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
       pndir = target.GetDirectory(configName);
       }
 
-    if(target.IsFrameworkOnApple())
+    if(target.IsFrameworkOnApple() || target.IsCFBundleOnApple())
       {
       pnprefix = "";
       }

+ 0 - 2
Source/cmMakefileLibraryTargetGenerator.cxx

@@ -24,8 +24,6 @@ cmMakefileLibraryTargetGenerator
 ::cmMakefileLibraryTargetGenerator(cmTarget* target):
   cmMakefileTargetGenerator(target)
 {
-  cmOSXBundleGenerator::PrepareTargetProperties(this->Target);
-
   this->CustomCommandDriver = OnDepends;
   this->Target->GetLibraryNames(
     this->TargetNameOut, this->TargetNameSO, this->TargetNameReal,

+ 0 - 2
Source/cmNinjaNormalTargetGenerator.cxx

@@ -36,8 +36,6 @@ cmNinjaNormalTargetGenerator(cmTarget* target)
   , TargetNamePDB()
   , TargetLinkLanguage(0)
 {
-  cmOSXBundleGenerator::PrepareTargetProperties(target);
-
   this->TargetLinkLanguage = target->GetLinkerLanguage(this->GetConfigName());
   if (target->GetType() == cmTarget::EXECUTABLE)
     target->GetExecutableNames(this->TargetNameOut,

+ 5 - 18
Source/cmOSXBundleGenerator.cxx

@@ -16,15 +16,6 @@
 
 #include <cassert>
 
-void cmOSXBundleGenerator::PrepareTargetProperties(cmTarget* target)
-{
-  if(target->IsCFBundleOnApple())
-    {
-    target->SetProperty("PREFIX", "");
-    target->SetProperty("SUFFIX", "");
-    }
-}
-
 //----------------------------------------------------------------------------
 cmOSXBundleGenerator::
 cmOSXBundleGenerator(cmTarget* target,
@@ -173,31 +164,27 @@ void cmOSXBundleGenerator::CreateFramework(
 
 //----------------------------------------------------------------------------
 void cmOSXBundleGenerator::CreateCFBundle(const std::string& targetName,
-                                          std::string& outpath)
+                                          const std::string& root)
 {
   if (this->MustSkip())
     return;
 
   // Compute bundle directory names.
-  std::string out = outpath;
+  std::string out = root;
   out += "/";
-  out += this->Target->GetCFBundleDirectory(this->ConfigName, true);
-  std::string top = out;
-  out += "/MacOS";
+  out += this->Target->GetCFBundleDirectory(this->ConfigName, false);
   cmSystemTools::MakeDirectory(out.c_str());
   this->Makefile->AddCMakeOutputFile(out.c_str());
 
-  std::string newoutpath = out;
-
   // Configure the Info.plist file.  Note that it needs the executable name
   // to be set.
-  std::string plist = top;
+  std::string plist =
+    this->Target->GetCFBundleDirectory(this->ConfigName, true);
   plist += "/Info.plist";
   this->LocalGenerator->GenerateAppleInfoPList(this->Target,
                                                targetName.c_str(),
                                                plist.c_str());
   this->Makefile->AddCMakeOutputFile(plist.c_str());
-  outpath = newoutpath;
 }
 
 //----------------------------------------------------------------------------

+ 3 - 5
Source/cmOSXBundleGenerator.h

@@ -25,8 +25,6 @@ class cmLocalGenerator;
 class cmOSXBundleGenerator
 {
 public:
-  static void PrepareTargetProperties(cmTarget* target);
-
   cmOSXBundleGenerator(cmTarget* target,
                        const char* configName);
 
@@ -38,9 +36,9 @@ public:
   void CreateFramework(const std::string& targetName,
                        const std::string& root);
 
-  // create a cf bundle at a given root and return the
-  // directory within the bundle that contains the library
-  void CreateCFBundle(const std::string& targetName, std::string& outpath);
+  // create a cf bundle at a given root
+  void CreateCFBundle(const std::string& targetName,
+                      const std::string& root);
 
   struct MacOSXContentGeneratorType
   {

+ 17 - 2
Source/cmTarget.cxx

@@ -3278,7 +3278,7 @@ const char* cmTarget::NormalGetLocation(const char* config)
     this->Location += cfgid;
     }
 
-  if(this->IsCFBundleOnApple() || this->IsAppBundleOnApple())
+  if(this->IsAppBundleOnApple())
     {
     std::string macdir = this->BuildMacContentDirectory("", config, false);
     if(!macdir.empty())
@@ -3891,7 +3891,7 @@ std::string cmTarget::NormalGetFullPath(const char* config, bool implib,
 {
   std::string fpath = this->GetDirectory(config, implib);
   fpath += "/";
-  if(this->IsCFBundleOnApple() || this->IsAppBundleOnApple())
+  if(this->IsAppBundleOnApple())
     {
     fpath = this->BuildMacContentDirectory(fpath, config, false);
     fpath += "/";
@@ -4037,6 +4037,21 @@ void cmTarget::GetFullNameInternal(const char* config,
     targetSuffix = 0;
     }
 
+  if(this->IsCFBundleOnApple())
+    {
+    fw_prefix = this->GetOutputName(config, false);
+    fw_prefix += ".";
+    const char *ext = this->GetProperty("BUNDLE_EXTENSION");
+    if (!ext)
+      {
+      ext = "bundle";
+      }
+    fw_prefix += ext;
+    fw_prefix += "/Contents/MacOS/";
+    targetPrefix = fw_prefix.c_str();
+    targetSuffix = 0;
+    }
+
   // Begin the final name with the prefix.
   outPrefix = targetPrefix?targetPrefix:"";
 

+ 2 - 0
Tests/CFBundleTest/CMakeLists.txt

@@ -54,3 +54,5 @@ set_source_files_properties(
     ${CMAKE_CURRENT_BINARY_DIR}/InfoPlist.strings
     ${CMAKE_CURRENT_BINARY_DIR}/Localized.rsrc
     PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/English.lproj")
+
+export(TARGETS CFBundleTest FILE ${CMAKE_CURRENT_BINARY_DIR}/exp.cmake)