Re-factor Mac OS X content directory computation.
This commit is contained in:
parent
5d885db416
commit
f36c7b0bbe
@ -39,49 +39,36 @@ cmOSXBundleGenerator(cmTarget* target,
|
|||||||
, FrameworkVersion()
|
, FrameworkVersion()
|
||||||
, MacContentFolders(0)
|
, MacContentFolders(0)
|
||||||
{
|
{
|
||||||
if(this->Target->IsAppBundleOnApple())
|
if (this->MustSkip())
|
||||||
{
|
return;
|
||||||
this->MacContentDirectory = this->Target->GetDirectory(this->ConfigName);
|
|
||||||
this->MacContentDirectory += "/";
|
this->MacContentDirectory =
|
||||||
this->MacContentDirectory += this->TargetNameOut;
|
this->Target->GetMacContentDirectory(this->ConfigName,
|
||||||
this->MacContentDirectory += ".app/Contents/";
|
/*implib*/ false,
|
||||||
}
|
/*includeMacOS*/ false);
|
||||||
else if(this->Target->IsFrameworkOnApple())
|
if(this->Target->IsFrameworkOnApple())
|
||||||
{
|
|
||||||
this->FrameworkVersion = this->Target->GetFrameworkVersion();
|
this->FrameworkVersion = this->Target->GetFrameworkVersion();
|
||||||
this->MacContentDirectory = this->Target->GetDirectory(this->ConfigName);
|
}
|
||||||
this->MacContentDirectory += "/";
|
|
||||||
this->MacContentDirectory += this->TargetNameOut;
|
//----------------------------------------------------------------------------
|
||||||
this->MacContentDirectory += ".framework/Versions/";
|
bool cmOSXBundleGenerator::MustSkip()
|
||||||
this->MacContentDirectory += this->FrameworkVersion;
|
{
|
||||||
this->MacContentDirectory += "/";
|
return !this->Target->HaveWellDefinedOutputFiles();
|
||||||
}
|
|
||||||
else if(this->Target->IsCFBundleOnApple())
|
|
||||||
{
|
|
||||||
this->MacContentDirectory = this->Target->GetDirectory(this->ConfigName);
|
|
||||||
this->MacContentDirectory += "/";
|
|
||||||
this->MacContentDirectory += this->TargetNameOut;
|
|
||||||
this->MacContentDirectory += ".";
|
|
||||||
const char *ext = this->Target->GetProperty("BUNDLE_EXTENSION");
|
|
||||||
if (!ext)
|
|
||||||
{
|
|
||||||
ext = "bundle";
|
|
||||||
}
|
|
||||||
this->MacContentDirectory += ext;
|
|
||||||
this->MacContentDirectory += "/Contents/";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmOSXBundleGenerator::CreateAppBundle(std::string& targetName,
|
void cmOSXBundleGenerator::CreateAppBundle(std::string& targetName,
|
||||||
std::string& outpath)
|
std::string& outpath)
|
||||||
{
|
{
|
||||||
|
if (this->MustSkip())
|
||||||
|
return;
|
||||||
|
|
||||||
// Compute bundle directory names.
|
// Compute bundle directory names.
|
||||||
outpath = this->MacContentDirectory;
|
outpath = this->MacContentDirectory;
|
||||||
outpath += "MacOS";
|
outpath += "MacOS";
|
||||||
cmSystemTools::MakeDirectory(outpath.c_str());
|
cmSystemTools::MakeDirectory(outpath.c_str());
|
||||||
this->Makefile->AddCMakeOutputFile(outpath.c_str());
|
|
||||||
outpath += "/";
|
outpath += "/";
|
||||||
|
this->Makefile->AddCMakeOutputFile(outpath.c_str());
|
||||||
|
|
||||||
// Configure the Info.plist file. Note that it needs the executable name
|
// Configure the Info.plist file. Note that it needs the executable name
|
||||||
// to be set.
|
// to be set.
|
||||||
@ -95,6 +82,9 @@ void cmOSXBundleGenerator::CreateAppBundle(std::string& targetName,
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmOSXBundleGenerator::CreateFramework(std::string const& targetName)
|
void cmOSXBundleGenerator::CreateFramework(std::string const& targetName)
|
||||||
{
|
{
|
||||||
|
if (this->MustSkip())
|
||||||
|
return;
|
||||||
|
|
||||||
assert(this->MacContentFolders);
|
assert(this->MacContentFolders);
|
||||||
|
|
||||||
// Configure the Info.plist file into the Resources directory.
|
// Configure the Info.plist file into the Resources directory.
|
||||||
@ -184,12 +174,15 @@ void cmOSXBundleGenerator::CreateFramework(std::string const& targetName)
|
|||||||
void cmOSXBundleGenerator::CreateCFBundle(std::string& targetName,
|
void cmOSXBundleGenerator::CreateCFBundle(std::string& targetName,
|
||||||
std::string& outpath)
|
std::string& outpath)
|
||||||
{
|
{
|
||||||
|
if (this->MustSkip())
|
||||||
|
return;
|
||||||
|
|
||||||
// Compute bundle directory names.
|
// Compute bundle directory names.
|
||||||
outpath = this->MacContentDirectory;
|
outpath = this->MacContentDirectory;
|
||||||
outpath += "MacOS";
|
outpath += "MacOS";
|
||||||
cmSystemTools::MakeDirectory(outpath.c_str());
|
cmSystemTools::MakeDirectory(outpath.c_str());
|
||||||
this->Makefile->AddCMakeOutputFile(outpath.c_str());
|
|
||||||
outpath += "/";
|
outpath += "/";
|
||||||
|
this->Makefile->AddCMakeOutputFile(outpath.c_str());
|
||||||
|
|
||||||
// Configure the Info.plist file. Note that it needs the executable name
|
// Configure the Info.plist file. Note that it needs the executable name
|
||||||
// to be set.
|
// to be set.
|
||||||
@ -207,6 +200,9 @@ cmOSXBundleGenerator::
|
|||||||
GenerateMacOSXContentStatements(std::vector<cmSourceFile*> const& sources,
|
GenerateMacOSXContentStatements(std::vector<cmSourceFile*> const& sources,
|
||||||
MacOSXContentGeneratorType* generator)
|
MacOSXContentGeneratorType* generator)
|
||||||
{
|
{
|
||||||
|
if (this->MustSkip())
|
||||||
|
return;
|
||||||
|
|
||||||
for(std::vector<cmSourceFile*>::const_iterator
|
for(std::vector<cmSourceFile*>::const_iterator
|
||||||
si = sources.begin(); si != sources.end(); ++si)
|
si = sources.begin(); si != sources.end(); ++si)
|
||||||
{
|
{
|
||||||
|
@ -52,6 +52,9 @@ public:
|
|||||||
void SetMacContentFolders(std::set<cmStdString>* macContentFolders)
|
void SetMacContentFolders(std::set<cmStdString>* macContentFolders)
|
||||||
{ this->MacContentFolders = macContentFolders; }
|
{ this->MacContentFolders = macContentFolders; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool MustSkip();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cmTarget* Target;
|
cmTarget* Target;
|
||||||
cmMakefile* Makefile;
|
cmMakefile* Makefile;
|
||||||
|
@ -2482,6 +2482,16 @@ void cmTarget::MarkAsImported()
|
|||||||
this->IsImportedTarget = true;
|
this->IsImportedTarget = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool cmTarget::HaveWellDefinedOutputFiles()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
this->GetType() == cmTarget::STATIC_LIBRARY ||
|
||||||
|
this->GetType() == cmTarget::SHARED_LIBRARY ||
|
||||||
|
this->GetType() == cmTarget::MODULE_LIBRARY ||
|
||||||
|
this->GetType() == cmTarget::EXECUTABLE;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmTarget::OutputInfo const* cmTarget::GetOutputInfo(const char* config)
|
cmTarget::OutputInfo const* cmTarget::GetOutputInfo(const char* config)
|
||||||
{
|
{
|
||||||
@ -2492,10 +2502,7 @@ cmTarget::OutputInfo const* cmTarget::GetOutputInfo(const char* config)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only libraries and executables have well-defined output files.
|
// Only libraries and executables have well-defined output files.
|
||||||
if(this->GetType() != cmTarget::STATIC_LIBRARY &&
|
if(!this->HaveWellDefinedOutputFiles())
|
||||||
this->GetType() != cmTarget::SHARED_LIBRARY &&
|
|
||||||
this->GetType() != cmTarget::MODULE_LIBRARY &&
|
|
||||||
this->GetType() != cmTarget::EXECUTABLE)
|
|
||||||
{
|
{
|
||||||
std::string msg = "cmTarget::GetOutputInfo called for ";
|
std::string msg = "cmTarget::GetOutputInfo called for ";
|
||||||
msg += this->GetName();
|
msg += this->GetName();
|
||||||
@ -2586,18 +2593,7 @@ const char* cmTarget::NormalGetLocation(const char* config)
|
|||||||
this->Location += cfgid;
|
this->Location += cfgid;
|
||||||
this->Location += "/";
|
this->Location += "/";
|
||||||
}
|
}
|
||||||
if(this->IsAppBundleOnApple())
|
this->Location = this->BuildMacContentDirectory(this->Location, config);
|
||||||
{
|
|
||||||
this->Location += this->GetFullName(config, false);
|
|
||||||
this->Location += ".app/Contents/MacOS/";
|
|
||||||
}
|
|
||||||
if(this->IsFrameworkOnApple())
|
|
||||||
{
|
|
||||||
this->Location += this->GetFullName(config, false);
|
|
||||||
this->Location += ".framework/Versions/";
|
|
||||||
this->Location += this->GetFrameworkVersion();
|
|
||||||
this->Location += "/";
|
|
||||||
}
|
|
||||||
this->Location += this->GetFullName(config, false);
|
this->Location += this->GetFullName(config, false);
|
||||||
return this->Location.c_str();
|
return this->Location.c_str();
|
||||||
}
|
}
|
||||||
@ -3169,35 +3165,7 @@ std::string cmTarget::GetFullPath(const char* config, bool implib,
|
|||||||
std::string cmTarget::NormalGetFullPath(const char* config, bool implib,
|
std::string cmTarget::NormalGetFullPath(const char* config, bool implib,
|
||||||
bool realname)
|
bool realname)
|
||||||
{
|
{
|
||||||
// TODO: Re-factor with cmOSXBundleGenerator's constructor.
|
std::string fpath = this->GetMacContentDirectory(config, implib);
|
||||||
// Start with the output directory for the target.
|
|
||||||
std::string fpath = this->GetDirectory(config, implib);
|
|
||||||
fpath += "/";
|
|
||||||
|
|
||||||
if(this->IsAppBundleOnApple())
|
|
||||||
{
|
|
||||||
fpath += this->GetFullName(config, false);
|
|
||||||
fpath += ".app/Contents/MacOS/";
|
|
||||||
}
|
|
||||||
if(this->IsFrameworkOnApple())
|
|
||||||
{
|
|
||||||
fpath += this->GetFullName(config, false);
|
|
||||||
fpath += ".framework/Versions/";
|
|
||||||
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.
|
// Add the full name of the target.
|
||||||
if(implib)
|
if(implib)
|
||||||
@ -4746,6 +4714,55 @@ std::vector<std::string> cmTarget::GetIncludeDirectories()
|
|||||||
return orderedAndUniqueIncludes;
|
return orderedAndUniqueIncludes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string cmTarget::BuildMacContentDirectory(const std::string& base,
|
||||||
|
const char* config,
|
||||||
|
bool includeMacOS)
|
||||||
|
{
|
||||||
|
std::string fpath = base;
|
||||||
|
if(this->IsAppBundleOnApple())
|
||||||
|
{
|
||||||
|
fpath += this->GetFullName(config, false);
|
||||||
|
fpath += ".app/Contents/";
|
||||||
|
if(includeMacOS)
|
||||||
|
fpath += "MacOS/";
|
||||||
|
}
|
||||||
|
if(this->IsFrameworkOnApple())
|
||||||
|
{
|
||||||
|
fpath += this->GetFullName(config, false);
|
||||||
|
fpath += ".framework/Versions/";
|
||||||
|
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/";
|
||||||
|
if(includeMacOS)
|
||||||
|
fpath += "MacOS/";
|
||||||
|
}
|
||||||
|
return fpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string cmTarget::GetMacContentDirectory(const char* config,
|
||||||
|
bool implib,
|
||||||
|
bool includeMacOS)
|
||||||
|
{
|
||||||
|
// Start with the output directory for the target.
|
||||||
|
std::string fpath = this->GetDirectory(config, implib);
|
||||||
|
fpath += "/";
|
||||||
|
fpath = this->BuildMacContentDirectory(fpath, config, includeMacOS);
|
||||||
|
return fpath;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmTargetLinkInformationMap
|
cmTargetLinkInformationMap
|
||||||
::cmTargetLinkInformationMap(cmTargetLinkInformationMap const& r): derived()
|
::cmTargetLinkInformationMap(cmTargetLinkInformationMap const& r): derived()
|
||||||
|
@ -465,6 +465,19 @@ public:
|
|||||||
/** Get the include directories for this target. */
|
/** Get the include directories for this target. */
|
||||||
std::vector<std::string> GetIncludeDirectories();
|
std::vector<std::string> GetIncludeDirectories();
|
||||||
|
|
||||||
|
/** Append to @a base the mac content directory and return it. */
|
||||||
|
std::string BuildMacContentDirectory(const std::string& base,
|
||||||
|
const char* config = 0,
|
||||||
|
bool includeMacOS = true);
|
||||||
|
|
||||||
|
/** @return the mac content directory for this target. */
|
||||||
|
std::string GetMacContentDirectory(const char* config = 0,
|
||||||
|
bool implib = false,
|
||||||
|
bool includeMacOS = true);
|
||||||
|
|
||||||
|
/** @return whether this target have a well defined output file name. */
|
||||||
|
bool HaveWellDefinedOutputFiles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* A list of direct dependencies. Use in conjunction with DependencyMap.
|
* A list of direct dependencies. Use in conjunction with DependencyMap.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user