OS X: Add handling for XCTest bundles

An XCTest bundle is a CFBundle with a special product-type and bundle
extension.  For more information about XCTest visit the Mac Developer
library at:

  http://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/

Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
This commit is contained in:
Gregor Jasny 2015-02-25 21:07:43 +01:00 committed by Brad King
parent 54a5cdbb4c
commit 3714955b9c
5 changed files with 42 additions and 3 deletions

View File

@ -243,6 +243,7 @@ Properties on Targets
/prop_tgt/VS_WINRT_REFERENCES
/prop_tgt/WIN32_EXECUTABLE
/prop_tgt/XCODE_ATTRIBUTE_an-attribute
/prop_tgt/XCTEST
Properties on Tests
===================

13
Help/prop_tgt/XCTEST.rst Normal file
View File

@ -0,0 +1,13 @@
XCTEST
------
This target is a XCTest CFBundle on the Mac.
This property will usually get set via the :command:`xctest_add_bundle`
macro in :module:`FindXCTest` module.
If a module library target has this property set to true it will be
built as a CFBundle when built on the Mac. It will have the directory
structure required for a CFBundle.
This property depends on :prop_tgt:`BUNDLE` to be effective.

View File

@ -804,6 +804,10 @@ GetSourcecodeValueFromFileExtension(const std::string& _ext,
{
sourcecode = "compiled.mach-o.objfile";
}
else if(ext == "xctest")
{
sourcecode = "wrapper.cfbundle";
}
else if(ext == "xib")
{
keepLastKnownFileType = true;
@ -2598,7 +2602,9 @@ const char* cmGlobalXCodeGenerator::GetTargetFileType(cmTarget& cmtarget)
case cmTarget::STATIC_LIBRARY:
return "archive.ar";
case cmTarget::MODULE_LIBRARY:
if (cmtarget.IsCFBundleOnApple())
if (cmtarget.IsXCTestOnApple())
return "wrapper.cfbundle";
else if (cmtarget.IsCFBundleOnApple())
return "wrapper.plug-in";
else
return ((this->XcodeVersion >= 22)?
@ -2622,7 +2628,9 @@ const char* cmGlobalXCodeGenerator::GetTargetProductType(cmTarget& cmtarget)
case cmTarget::STATIC_LIBRARY:
return "com.apple.product-type.library.static";
case cmTarget::MODULE_LIBRARY:
if (cmtarget.IsCFBundleOnApple())
if (cmtarget.IsXCTestOnApple())
return "com.apple.product-type.bundle.unit-test";
else if (cmtarget.IsCFBundleOnApple())
return "com.apple.product-type.bundle";
else
return ((this->XcodeVersion >= 22)?

View File

@ -615,6 +615,13 @@ bool cmTarget::IsCFBundleOnApple() const
this->GetPropertyAsBool("BUNDLE"));
}
//----------------------------------------------------------------------------
bool cmTarget::IsXCTestOnApple() const
{
return (this->IsCFBundleOnApple() &&
this->GetPropertyAsBool("XCTEST"));
}
//----------------------------------------------------------------------------
bool cmTarget::IsBundleOnApple() const
{
@ -6791,7 +6798,14 @@ std::string cmTarget::GetCFBundleDirectory(const std::string& config,
const char *ext = this->GetProperty("BUNDLE_EXTENSION");
if (!ext)
{
ext = "bundle";
if (this->IsXCTestOnApple())
{
ext = "xctest";
}
else
{
ext = "bundle";
}
}
fpath += ext;
fpath += "/Contents";

View File

@ -527,6 +527,9 @@ public:
/** Return whether this target is a CFBundle (plugin) on Apple. */
bool IsCFBundleOnApple() const;
/** Return whether this target is a XCTest on Apple. */
bool IsXCTestOnApple() const;
/** Return whether this target is an executable Bundle on Apple. */
bool IsAppBundleOnApple() const;