From 54d9713adb016423d20c610163726f80da435588 Mon Sep 17 00:00:00 2001 From: Nicolas Despres Date: Wed, 11 Jul 2012 11:19:25 +0200 Subject: [PATCH] Ninja: Add support for CFBundle. This patch fixes test CFBundleTest on Darwin. --- Source/cmNinjaNormalTargetGenerator.cxx | 37 +++++++++++++++++++++++++ Source/cmNinjaNormalTargetGenerator.h | 1 + Source/cmTarget.cxx | 13 +++++++++ 3 files changed, 51 insertions(+) diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 45a4f683f..d4fc02b54 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -36,6 +36,13 @@ cmNinjaNormalTargetGenerator(cmTarget* target) , TargetNamePDB() , TargetLinkLanguage(0) { + // TODO: Re-factor with cmMakefileLibraryTargetGenerator's constructor. + if(target->IsCFBundleOnApple()) + { + target->SetProperty("PREFIX", ""); + target->SetProperty("SUFFIX", ""); + } + this->TargetLinkLanguage = target->GetLinkerLanguage(this->GetConfigName()); if (target->GetType() == cmTarget::EXECUTABLE) target->GetExecutableNames(this->TargetNameOut, @@ -376,6 +383,14 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() // Create the library framework. this->OSXBundleGenerator->CreateFramework(this->TargetNameOut); } + // TODO: Re-factor with cmMakefileLibraryTargetGenerator::WriteLibraryRules. + else if(this->GetTarget()->IsCFBundleOnApple()) + { + std::string outpath; + outpath = this->GetTarget()->GetDirectory(this->GetConfigName()); + outpath += "/"; + this->CreateCFBundle(this->TargetNameOut, outpath); + } // Write comments. cmGlobalNinjaGenerator::WriteDivider(this->GetBuildFileStream()); @@ -602,3 +617,25 @@ void cmNinjaNormalTargetGenerator::WriteObjectLibStatement() this->GetGlobalGenerator()->AddTargetAlias(this->GetTargetName(), this->GetTarget()); } + +//---------------------------------------------------------------------------- +// TODO: Re-factor with cmMakefileLibraryTargetGenerator::CreateCFBundle. +void cmNinjaNormalTargetGenerator::CreateCFBundle(std::string& targetName, + std::string& outpath) +{ + // Compute bundle directory names. + outpath = this->OSXBundleGenerator->GetMacContentDirectory(); + outpath += "MacOS"; + cmSystemTools::MakeDirectory(outpath.c_str()); + this->GetMakefile()->AddCMakeOutputFile(outpath.c_str()); + outpath += "/"; + + // Configure the Info.plist file. Note that it needs the executable name + // to be set. + std::string plist = this->OSXBundleGenerator->GetMacContentDirectory(); + plist += "Info.plist"; + this->GetLocalGenerator()->GenerateAppleInfoPList(this->GetTarget(), + targetName.c_str(), + plist.c_str()); + this->GetMakefile()->AddCMakeOutputFile(plist.c_str()); +} diff --git a/Source/cmNinjaNormalTargetGenerator.h b/Source/cmNinjaNormalTargetGenerator.h index 284804b08..74e10cfd4 100644 --- a/Source/cmNinjaNormalTargetGenerator.h +++ b/Source/cmNinjaNormalTargetGenerator.h @@ -38,6 +38,7 @@ private: void WriteLinkStatement(); void WriteObjectLibStatement(); std::vector ComputeLinkCmd(); + void CreateCFBundle(std::string& targetName, std::string& outpath); private: // Target name info. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 4f3f2c572..aaa622f3e 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3169,6 +3169,7 @@ std::string cmTarget::GetFullPath(const char* config, bool implib, std::string cmTarget::NormalGetFullPath(const char* config, bool implib, bool realname) { + // TODO: Re-factor with cmOSXBundleGenerator's constructor. // Start with the output directory for the target. std::string fpath = this->GetDirectory(config, implib); fpath += "/"; @@ -3185,6 +3186,18 @@ std::string cmTarget::NormalGetFullPath(const char* config, bool implib, fpath += this->GetFrameworkVersion(); fpath += "/"; } + if(this->IsCFBundleOnApple()) + { + fpath += this->GetFullName(config, false); + fpath += "."; + const char *ext = this->GetProperty("BUNDLE_EXTENSION"); + if (!ext) + { + ext = "bundle"; + } + fpath += ext; + fpath += "/Contents/MacOS/"; + } // Add the full name of the target. if(implib)