On 4/25/15, David Hirvonen <dhirvo...@elucideye.com> wrote:
> I'm hitting a link error when linking an iOS application with an internally
> created framework/library using the the CMake Xcode generator and an iOS
> toolchain.  I've put together a minimal CMakeLists.txt example here:
>
> https://github.com/headupinclouds/cmake_framework_test/
>
> The problem is described in detail in the the README, and reproduced here
> in the email for completeness.
>
> The repository is intended as a simple unit test to illustrate an apparent
> link and build location mismatch when linking a framework to an iOS
> application using the "standard" iOS toolchain
> <https://code.google.com/p/ios-cmake/> (I realize this toolchain isn't
> provided with CMake). I've included the ios toolchain in this repository to
> make it easy to reproduce the issue. I've include both the iOS application
> that reproduces the link error, and an OS X application, which links to the
> library in correct framework location. I'm looking for a CMakeLists.txt fix
> or possible workaround. There are two top level convenience bash scripts
> for building the applications with cmake using an xcode generator.  The
> CMake version is 3.2.1.
>
> cmake --version
> cmake version 3.2.1
>
> <https://github.com/headupinclouds/cmake_framework_test/blob/master/README.md#ios-framework-and-application-error>iOS
> framework and application error:
>
> bash -fx ./test-ios.sh
> + NAME=_builds/ios
> + cmake -GXcode -H. -B_builds/ios -DCMAKE_TOOLCHAIN_FILE=iOS.cmake
>
> <snip>
> clang: error: no such file or directory:
> '/Users/dhirvonen/devel/cmake_framework_test/_builds/ios/Debug-iphoneos/TF.framework/Versions/A/TF'
> ** BUILD FAILED **
> The following build commands failed:
>     Ld _builds/ios/Debug-iphoneos/testa.app/testa normal armv7
> (1 failure)
> library path:  _builds/ios/Debug-iphoneos/TF.framework/TF
>
> This produces a flat framework layout (ignoring the FRAMEWORK_VERSION
> property (which is fine with me if I can get it to work)). It looks like
> this:
>
> tree _builds/ios/Debug-iphoneos/TF.framework
> _builds/ios/Debug-iphoneos/TF.framework
> ├── Info.plist
> ├── TF
> └── _CodeSignature
>     └── CodeResources
>
> But when it reaches the link command for the ios application:
>
> target_link_libraries(testa TF)
>
> it fails, since it seems to expect the library to be two directories down
> within a versioned framework layout:
>
> TF.framework/Versions/A/TF
>
> instead the directory is here:
>
> TF.framework/TF
>
> I'm looking for a solution to either:
>
>    - correct the TF link path to use the actual (non versioned) framework
>    layout that is currently generated, or
>    - correct the framework so that it uses the versioned layout to make
>    that consistent with the link path
>
> <https://github.com/headupinclouds/cmake_framework_test/blob/master/README.md#os-x-framework-and-application-success>OS
> X framework and application success:
>
> When I build this for OS X it seems to work fine.
>
> bash -fx ./test-osx.sh
> + NAME=_builds/osx
> + cmake -GXcode -H. -B_builds/osx
> <snip>
> ** BUILD SUCCEEDED **
> library path: _builds/osx/Debug/TF.framework/Versions/A/TF
>
> This produces a framework with the following layout:
>
> tree _builds/osx/Debug/
> _builds/osx/Debug/
> ├── TF.framework
> │   ├── Resources -> Versions/Current/Resources
> │   ├── TF -> Versions/Current/TF
> │   └── Versions
> │       ├── A
> │       │   ├── Resources
> │       │   │   └── Info.plist
> │       │   ├── TF
> │       │   └── _CodeSignature
> │       │       └── CodeResources
> │       └── Current -> A
> └── testb
>
> and the call to
>
> target_link_libraries(testb TF)
>
> picks up the TF library in the correct location.
>
> I'm curious if there is a variable or property that needs to be set for the
> iOS example to give the same framework layout.
>


I have not tried this (yet), but my guess is that CMake needs to be
patched to understand iOS frameworks. iOS frameworks are new as of iOS
8. 3rd parties were not allowed to make frameworks before that.
Additionally, CMake's framework support was implemented for Mac like a
decade ago. Because the iOS framework structure (and .app structure
for another matter) is different, CMake will likely need to be taught
how to make a proper structure for iOS.

If you do any work on this, I am interested in your results.
Eventually, I would like to support iOS frameworks, though I'm
probably at least 6 months from that since I need iOS 7 to drop off
the face of the earth, which means after iOS 9 is released.

(Note to non-iOS developers reading this: iOS does not allow flat
.dylib files for shared libraries. You must build a framework.)

-Eric
-- 
Beginning iPhone Games Development
http://playcontrol.net/iphonegamebook/
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake

Reply via email to