Fix iOS Bundle layouts (#15669)

In contrast to Mac OS X App bundle layout the iOS one lacks the
Contents/MacOSX structure.  See also the Bundle Structures documentation
in Mac Developer Library:

  https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html

For now detect iOS targets by checking the SDK name/path.
This commit is contained in:
Gregor Jasny 2015-08-18 21:30:54 +02:00 committed by Brad King
parent a712575da1
commit 744e6c497c
6 changed files with 116 additions and 10 deletions

View File

@ -951,9 +951,13 @@ cmGeneratorTarget::GetAppBundleDirectory(const std::string& config,
bool contentOnly) const
{
std::string fpath = this->GetFullName(config, false);
fpath += ".app/Contents";
fpath += ".app";
if(!this->Makefile->PlatformIsAppleIos())
{
fpath += "/Contents";
if(!contentOnly)
fpath += "/MacOS";
}
return fpath;
}
@ -985,9 +989,12 @@ std::string cmGeneratorTarget::GetCFBundleDirectory(const std::string& config,
}
}
fpath += ext;
if(!this->Makefile->PlatformIsAppleIos())
{
fpath += "/Contents";
if(!contentOnly)
fpath += "/MacOS";
}
return fpath;
}
@ -999,7 +1006,7 @@ cmGeneratorTarget::GetFrameworkDirectory(const std::string& config,
std::string fpath;
fpath += this->GetOutputName(config, false);
fpath += ".framework";
if(!rootDir)
if(!rootDir && !this->Makefile->PlatformIsAppleIos())
{
fpath += "/Versions/";
fpath += this->Target->GetFrameworkVersion();
@ -2146,9 +2153,12 @@ void cmGeneratorTarget::GetLibraryNames(std::string& name,
if(this->Target->IsFrameworkOnApple())
{
realName = prefix;
if(!this->Makefile->PlatformIsAppleIos())
{
realName += "Versions/";
realName += this->Target->GetFrameworkVersion();
realName += "/";
}
realName += base;
soName = realName;
}

View File

@ -2529,6 +2529,18 @@ bool cmMakefile::PlatformIs64Bit() const
return false;
}
bool cmMakefile::PlatformIsAppleIos() const
{
std::string sdkRoot;
sdkRoot = this->GetSafeDefinition("CMAKE_OSX_SYSROOT");
sdkRoot = cmSystemTools::LowerCase(sdkRoot);
return sdkRoot.find("iphoneos") == 0 ||
sdkRoot.find("/iphoneos") != std::string::npos ||
sdkRoot.find("iphonesimulator") == 0 ||
sdkRoot.find("/iphonesimulator") != std::string::npos;
}
const char* cmMakefile::GetSONameFlag(const std::string& language) const
{
std::string name = "CMAKE_SHARED_LIBRARY_SONAME";

View File

@ -490,6 +490,9 @@ public:
/** Return whether the target platform is 64-bit. */
bool PlatformIs64Bit() const;
/** Return whether the target platform is Apple iOS. */
bool PlatformIsAppleIos() const;
/** Retrieve soname flag for the specified language if supported */
const char* GetSONameFlag(const std::string& language) const;

View File

@ -7,3 +7,35 @@ run_cmake(XcodeObjectNeedsQuote)
if (NOT XCODE_VERSION VERSION_LESS 6)
run_cmake(XcodePlatformFrameworks)
endif()
# Use a single build tree for a few tests without cleaning.
if(NOT XCODE_VERSION VERSION_LESS 5)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesOSX-build)
set(RunCMake_TEST_NO_CLEAN 1)
set(RunCMake_TEST_OPTIONS "-DTEST_IOS=OFF")
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
run_cmake(XcodeBundles)
run_cmake_command(XcodeBundles-build ${CMAKE_COMMAND} --build .)
unset(RunCMake_TEST_BINARY_DIR)
unset(RunCMake_TEST_NO_CLEAN)
unset(RunCMake_TEST_OPTIONS)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesIOS-build)
set(RunCMake_TEST_NO_CLEAN 1)
set(RunCMake_TEST_OPTIONS "-DTEST_IOS=ON")
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
run_cmake(XcodeBundles)
run_cmake_command(XcodeBundles-build ${CMAKE_COMMAND} --build .)
unset(RunCMake_TEST_BINARY_DIR)
unset(RunCMake_TEST_NO_CLEAN)
unset(RunCMake_TEST_OPTIONS)
endif()

View File

@ -0,0 +1,46 @@
# check if Xcode and CMake have the same understanding of Bundle layout
cmake_minimum_required(VERSION 3.3)
enable_language(C)
if(TEST_IOS)
set(CMAKE_OSX_SYSROOT iphoneos)
set(CMAKE_OSX_ARCHITECTURES "armv7")
set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos;-iphonesimulator")
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
endif(TEST_IOS)
# App Bundle
add_executable(AppBundle MACOSX_BUNDLE main.m)
add_custom_target(AppBundleTest ALL
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:AppBundle>" "$<TARGET_FILE:AppBundle>.old")
add_dependencies(AppBundleTest AppBundle)
# Framework (not supported for iOS on Xcode < 6)
if(NOT TEST_IOS OR NOT XCODE_VERSION VERSION_LESS 6)
add_library(Framework SHARED main.c)
set_target_properties(Framework PROPERTIES FRAMEWORK TRUE)
add_custom_target(FrameworkTest ALL
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:Framework>" "$<TARGET_FILE:Framework>.old")
add_dependencies(FrameworkTest Framework)
endif()
# Bundle
add_library(Bundle MODULE main.c)
set_target_properties(Bundle PROPERTIES BUNDLE TRUE)
add_custom_target(BundleTest ALL
COMMAND ${CMAKE_COMMAND} -E copy
"$<TARGET_FILE:Bundle>" "$<TARGET_FILE:Bundle>.old")
add_dependencies(BundleTest Bundle)

View File

@ -0,0 +1,3 @@
int main(int argc, const char * argv[]) {
return 1;
}