diff options
Diffstat (limited to 'Source/cmNinjaNormalTargetGenerator.cxx')
-rw-r--r-- | Source/cmNinjaNormalTargetGenerator.cxx | 157 |
1 files changed, 10 insertions, 147 deletions
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 6a5fd6b..fecce14 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -16,6 +16,7 @@ #include "cmSourceFile.h" #include "cmGeneratedFileStream.h" #include "cmMakefile.h" +#include "cmOSXBundleGenerator.h" #include <assert.h> #include <algorithm> @@ -34,8 +35,8 @@ cmNinjaNormalTargetGenerator(cmTarget* target) , TargetNameImport() , TargetNamePDB() , TargetLinkLanguage(0) - , MacContentDirectory() - , FrameworkVersion() + , OSXBundleGenerator(0) + , MacContentFolders() { this->TargetLinkLanguage = target->GetLinkerLanguage(this->GetConfigName()); if (target->GetType() == cmTarget::EXECUTABLE) @@ -59,43 +60,15 @@ cmNinjaNormalTargetGenerator(cmTarget* target) EnsureDirectoryExists(target->GetDirectory(this->GetConfigName())); } - // TODO: Factor with the cmMakefileExecutableTargetGenerator constructor. - if(target->IsAppBundleOnApple()) - { - this->MacContentDirectory = target->GetDirectory(this->GetConfigName()); - this->MacContentDirectory += "/"; - this->MacContentDirectory += this->TargetNameOut; - this->MacContentDirectory += ".app/Contents/"; - } - // TODO: Factor with the cmMakefileLibraryTargetGenerator constructor. - else if(target->IsFrameworkOnApple()) - { - this->FrameworkVersion = target->GetFrameworkVersion(); - this->MacContentDirectory = target->GetDirectory(this->GetConfigName()); - this->MacContentDirectory += "/"; - this->MacContentDirectory += this->TargetNameOut; - this->MacContentDirectory += ".framework/Versions/"; - this->MacContentDirectory += this->FrameworkVersion; - this->MacContentDirectory += "/"; - } - else if(target->IsCFBundleOnApple()) - { - this->MacContentDirectory = target->GetDirectory(this->GetConfigName()); - this->MacContentDirectory += "/"; - this->MacContentDirectory += this->TargetNameOut; - this->MacContentDirectory += "."; - const char *ext = target->GetProperty("BUNDLE_EXTENSION"); - if (!ext) - { - ext = "bundle"; - } - this->MacContentDirectory += ext; - this->MacContentDirectory += "/Contents/"; - } + this->OSXBundleGenerator = new cmOSXBundleGenerator(target, + this->TargetNameOut, + this->GetConfigName()); + this->OSXBundleGenerator->SetMacContentFolders(&this->MacContentFolders); } cmNinjaNormalTargetGenerator::~cmNinjaNormalTargetGenerator() { + delete this->OSXBundleGenerator; } void cmNinjaNormalTargetGenerator::Generate() @@ -392,7 +365,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() { // Create the app bundle std::string outpath; - this->CreateAppBundle(this->TargetNameOut, outpath); + this->OSXBundleGenerator->CreateAppBundle(this->TargetNameOut, outpath); // Calculate the output path targetOutput = outpath + this->TargetNameOut; @@ -403,7 +376,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() else if (this->GetTarget()->IsFrameworkOnApple()) { // Create the library framework. - this->CreateFramework(this->TargetNameOut); + this->OSXBundleGenerator->CreateFramework(this->TargetNameOut); } // Write comments. @@ -631,113 +604,3 @@ void cmNinjaNormalTargetGenerator::WriteObjectLibStatement() this->GetGlobalGenerator()->AddTargetAlias(this->GetTargetName(), this->GetTarget()); } - -// TODO: Factor with cmMakefileExecutableTargetGenerator::CreateAppBundle(). -void -cmNinjaNormalTargetGenerator::CreateAppBundle(const std::string& targetName, - std::string& outpath) -{ - // Compute bundle directory names. - outpath = this->MacContentDirectory; - 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->MacContentDirectory + "Info.plist"; - this->GetLocalGenerator()->GenerateAppleInfoPList(this->GetTarget(), - targetName.c_str(), - plist.c_str()); - this->GetMakefile()->AddCMakeOutputFile(plist.c_str()); -} - -// TODO: Factor with cmMakefileLibraryTargetGenerator::CreateFramework(). -void -cmNinjaNormalTargetGenerator::CreateFramework(std::string const& targetName) -{ - // Create the Resources directory. - std::string resources = this->MacContentDirectory + "Resources/"; - cmSystemTools::MakeDirectory(resources.c_str()); - - // Configure the Info.plist file into the Resources directory. - std::set<cmStdString> macContentFolders; - macContentFolders.insert("Resources"); - std::string plist = resources + "Info.plist"; - this->GetLocalGenerator()->GenerateFrameworkInfoPList(this->GetTarget(), - targetName.c_str(), - plist.c_str()); - - // TODO: Use the cmMakefileTargetGenerator::ExtraFiles vector to - // drive rules to create these files at build time. - std::string oldName; - std::string newName; - - // Compute the location of the top-level foo.framework directory. - std::string top = this->GetTarget()->GetDirectory(this->GetConfigName()); - top += "/"; - top += this->TargetNameOut; - top += ".framework/"; - - // Make foo.framework/Versions - std::string versions = top; - versions += "Versions"; - cmSystemTools::MakeDirectory(versions.c_str()); - - // Make foo.framework/Versions/version - std::string version = versions; - version += "/"; - version += this->FrameworkVersion; - cmSystemTools::MakeDirectory(version.c_str()); - - // Current -> version - oldName = this->FrameworkVersion; - newName = versions; - newName += "/Current"; - cmSystemTools::RemoveFile(newName.c_str()); - cmSystemTools::CreateSymlink(oldName.c_str(), newName.c_str()); - this->GetMakefile()->AddCMakeOutputFile(newName.c_str()); - - // foo -> Versions/Current/foo - oldName = "Versions/Current/"; - oldName += this->TargetNameOut; - newName = top; - newName += this->TargetNameOut; - cmSystemTools::RemoveFile(newName.c_str()); - cmSystemTools::CreateSymlink(oldName.c_str(), newName.c_str()); - this->GetMakefile()->AddCMakeOutputFile(newName.c_str()); - - // Resources -> Versions/Current/Resources - if(macContentFolders.find("Resources") != macContentFolders.end()) - { - oldName = "Versions/Current/Resources"; - newName = top; - newName += "Resources"; - cmSystemTools::RemoveFile(newName.c_str()); - cmSystemTools::CreateSymlink(oldName.c_str(), newName.c_str()); - this->GetMakefile()->AddCMakeOutputFile(newName.c_str()); - } - - // Headers -> Versions/Current/Headers - if(macContentFolders.find("Headers") != macContentFolders.end()) - { - oldName = "Versions/Current/Headers"; - newName = top; - newName += "Headers"; - cmSystemTools::RemoveFile(newName.c_str()); - cmSystemTools::CreateSymlink(oldName.c_str(), newName.c_str()); - this->GetMakefile()->AddCMakeOutputFile(newName.c_str()); - } - - // PrivateHeaders -> Versions/Current/PrivateHeaders - if(macContentFolders.find("PrivateHeaders") != macContentFolders.end()) - { - oldName = "Versions/Current/PrivateHeaders"; - newName = top; - newName += "PrivateHeaders"; - cmSystemTools::RemoveFile(newName.c_str()); - cmSystemTools::CreateSymlink(oldName.c_str(), newName.c_str()); - this->GetMakefile()->AddCMakeOutputFile(newName.c_str()); - } -} |