From 483e208482ff46532e7ae48659e569580a88af9c Mon Sep 17 00:00:00 2001 From: Clinton Stimpson Date: Sat, 1 Jun 2013 22:47:18 -0600 Subject: 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. --- Source/cmExportInstallFileGenerator.cxx | 16 +--------------- Source/cmGlobalXCodeGenerator.cxx | 8 +------- Source/cmMakefileLibraryTargetGenerator.cxx | 2 -- Source/cmNinjaNormalTargetGenerator.cxx | 2 -- Source/cmOSXBundleGenerator.cxx | 23 +++++------------------ Source/cmOSXBundleGenerator.h | 8 +++----- Source/cmTarget.cxx | 19 +++++++++++++++++-- Tests/CFBundleTest/CMakeLists.txt | 2 ++ 8 files changed, 29 insertions(+), 51 deletions(-) diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx index fff807c074..f3fda71a31 100644 --- a/Source/cmExportInstallFileGenerator.cxx +++ b/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/"; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 240d60c48f..00a06bceb8 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/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 = ""; } diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 3edaa44f10..347f26d263 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/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, diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index e5a6eabee4..4a7d2f4132 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/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, diff --git a/Source/cmOSXBundleGenerator.cxx b/Source/cmOSXBundleGenerator.cxx index 621a49fecc..d3cdf854b5 100644 --- a/Source/cmOSXBundleGenerator.cxx +++ b/Source/cmOSXBundleGenerator.cxx @@ -16,15 +16,6 @@ #include -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; } //---------------------------------------------------------------------------- diff --git a/Source/cmOSXBundleGenerator.h b/Source/cmOSXBundleGenerator.h index 6cf81d25d5..ec82b9a159 100644 --- a/Source/cmOSXBundleGenerator.h +++ b/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 { diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 093b30e214..fb6d0a8c89 100644 --- a/Source/cmTarget.cxx +++ b/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:""; diff --git a/Tests/CFBundleTest/CMakeLists.txt b/Tests/CFBundleTest/CMakeLists.txt index 8fd9efdc65..bf9771c8b1 100644 --- a/Tests/CFBundleTest/CMakeLists.txt +++ b/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) -- cgit v1.2.1