[cmake-developers] Create subdirectories in Resource directory for Frameworks and Application bundle.

Bartosz Kosiorek Bartosz.Kosiorek at tomtom.com
Fri Dec 11 22:08:29 EST 2015


Thanks Ruslan.


I would like to create instruction which is universal for all generators.

Currently we would like to support both Make/Ninja and Xcode generators, because Make is much faster than Xcode generator, and we are using it in our CI system. Make is also common for other architectures (Linux, QNX, Android etc.)


Unfortunately

   set(CMAKE_OSX_SYSROOT "iphoneos")

is not working for me.

It displays error:


  /Users/warsaw/Perforce/cmake-dev/cmake-build/bin/cmake .. && /Users/warsaw/Perforce/cmake-dev/cmake-build/bin/cmake --build .
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /Users/warsaw/Perforce/cmake_ios_framework_with_resource2/builddir
  [ 14%] Building C object shared_empty/heymath/CMakeFiles/heymath.dir/add.c.o
  clang: warning: no such sysroot directory: 'iphoneos'
...
Do you have some tip for that?


After removing "-isysroot ${CMAKE_OSX_SYSROOT}" everything works perfectly. Thanks

Unfortunately CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET is not working with Make.
Is it possible to introduce CMAKE_IOS_DEPLOYMENT_TARGET, as we already have CMAKE_OSX_DEPLOYMENT_TARGET?

I have attached my example script which I'm using.
​Could you please modify it to be better (and still support other generators)?

Best Regards
Bartosz






________________________________
From: Ruslan Baratov <ruslan_baratov at yahoo.com>
Sent: Saturday, December 12, 2015 1:58 AM
To: Bartosz Kosiorek
Cc: clinton at elemtech.com; Gregor Jasny; CMake Developers
Subject: Re: [cmake-developers] Create subdirectories in Resource directory for Frameworks and Application bundle.

On 12-Dec-15 03:46, Bartosz Kosiorek wrote:

Hi

To enable iOS build, I'm using following settings in CMakeLists.txt:


set(APPLE_PLATFORM "iphonesimulator")
I think this one not needed. Can't find any place where it parsed.

set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk")
Can be set to:
set(CMAKE_OSX_SYSROOT "iphoneos")
in this case will support both simulator and device

set(CMAKE_C_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT} -mios-version-min=7.0")
set(CMAKE_CXX_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT} -mios-version-min=7.0")
You can set minimum version by CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET variable.
In case of `CMAKE_OSX_SYSROOT` variable is set to `iphoneos` option `-isysroot` is redundant.


Do you think it should be documented?

Where is the good place to do so?
Maybe somewhere here:
https://cmake.org/cmake/help/v3.4/variable/CMAKE_OSX_SYSROOT.html



What do you think?

​


________________________________
From: clinton at elemtech.com<mailto:clinton at elemtech.com> <clinton at elemtech.com><mailto:clinton at elemtech.com>
Sent: Friday, December 11, 2015 8:21 PM
To: Bartosz Kosiorek
Cc: Bartosz Kosiorek; cmake-developers; Gregor Jasny
Subject: Re: [cmake-developers] Create subdirectories in Resource directory for Frameworks and Application bundle.



----- On Dec 11, 2015, at 11:44 AM, Bartosz Kosiorek <gang65 at poczta.onet.pl><mailto:gang65 at poczta.onet.pl> wrote:
Hi

Because there is difference between OS X and iOS Bundles directory structure (see: Apple specification
https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html),
in trunk (In CMake 3.5) RESOURCE property create corresponding directory structure.
I have already fix that with:
https://public.kitware.com/Bug/view.php?id=15848
Ok.  I hadn't been following all your work.
Also, I didn't see a toggle in the CMake code you sent to choose an iOS bundle instead of OS X bundles.  How is that toggled?

So RESOURCE gives you a level of abstraction:
For OSX:
it will create "Resource" directory

For iOS it will create "flat" directory structure.

In your example "Resource" directory will be created in both cases (for OSX and iOS).
Which is wrong:
For OSX: it should  create "Resource" directory
For iOS it will create "flat" directory structure.

I could provide patch to fix that issue, if you agree with that.
What do you think about that?
Do you think the same should be applied to "Headers"?

I think the abstraction seems reasonable, as well as what you are proposing.  However, I'm not an Apple guru.
I wonder if there are other Apple experts that can weigh in this if better feedback is needed.

Clint


Best Regards
Bartosz



2015-12-11 19:06 GMT+01:00 Clinton Stimpson <clinton at elemtech.com<mailto:clinton at elemtech.com>>:


On Friday, December 11, 2015 05:01:41 PM Bartosz Kosiorek wrote:
> Thanks Clint
>
> Unfortunately MACOSX_PACKAGE_LOCATION is not working correctly with RESOURCE
> property. For every resource which is marked as RESOURCE, will be placed in
> root "Resources" directory.
>
> The CMake code below create following directory structure for OS X:
>
> ── mul.framework
>     ├── Headers -> Versions/Current/Headers
>     ├── Resources -> Versions/Current/Resources
>     ├── Versions
>     │   ├── A
>     │   │   ├── Headers
>     │   │   │   └── mul.h
>     │   │   ├── Modules
>     │   │   │   └── module.modulemap
>     │   │   ├── Resources
>     │   │   │   ├── Info.plist
>     │   │   │   ├── mulres.txt
>     │   │   │   ├── pl.txt
>     │   │   │   └── resourcefile.txt
>     │   │   ├── lang
>     │   │   │   └── en.txt
>     │   │   └── mul
>     │   └── Current -> A
>     └── mul -> Versions/Current/mul
>
>
> As you can see eveything which is marked as "RESOURCE" will be placed in
> Versions/A/ directory My expectation will be that lang/pl.txt and
> lang/en.txt should be in Resources/lang/ directory. Here is complete
> directory structure:
>
> ── mul.framework
>     ├── Headers -> Versions/Current/Headers
>     ├── Resources -> Versions/Current/Resources
>     ├── Versions
>     │   ├── A
>     │   │   ├── Headers
>     │   │   │   └── mul.h
>     │   │   ├── Modules
>     │   │   │   └── module.modulemap
>     │   │   ├── Resources
>     │   │   │   ├── Info.plist
>     │   │   │   ├── mulres.txt
>     │   │   │   ├── lang
>     │   │   │   │   └── pl.txt
>     │   │   │   │   └── en.txt
>     │   │   │   └── resourcefile.txt
>     │   │   ├── lang
>     │   │   │   └── en.txt
>     │   │   └── mul
>     │   └── Current -> A
>     └── mul -> Versions/Current/mul
>
>
> What do you think about that?
>
> Here is the source code:
>
> set_property(SOURCE module.modulemap
>   PROPERTY MACOSX_PACKAGE_LOCATION "Modules")
>
> set_property(
>   SOURCE lang/en.txt lang/pl.txt
>   PROPERTY MACOSX_PACKAGE_LOCATION "lang")
>
> set(RESLIST
>     mulres.txt
>     lang/pl.txt
>     resourcefile.txt
>     )
>
> add_library(mul SHARED
>             mul.c
>             mul.h
>             module.modulemap
>             lang/pl.txt
>             lang/en.txt
>             resourcefile.txt
>             mulres.txt)
>
> # Create an iOS Framework bundle
> set_target_properties(mul PROPERTIES
>   FRAMEWORK TRUE
>   MACOSX_FRAMEWORK_IDENTIFIER org.cmake.mul
>   MACOSX_FRAMEWORK_SHORT_VERSION_STRING 42
>   MACOSX_FRAMEWORK_BUNDLE_VERSION 3.2.10
>   XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
>   PUBLIC_HEADER mul.h
>   RESOURCE "${RESLIST}"
> )


Here is a CMakeLists.txt that will give you the desired layout.
I also see that MACOSX_PACKAGE_LOCATION doesn't work with RESOURCE.


set_property(SOURCE module.modulemap
  PROPERTY MACOSX_PACKAGE_LOCATION "Modules")

set_property(
  SOURCE lang/pl.txt lang/en.txt
  PROPERTY MACOSX_PACKAGE_LOCATION "Resources/lang")

set(RESLIST
    mulres.txt
    resourcefile.txt
    )

add_library(mul SHARED
            mul.c
            mul.h
            module.modulemap
            lang/pl.txt
            lang/en.txt
            resourcefile.txt
            mulres.txt)

# Create an iOS Framework bundle
set_target_properties(mul PROPERTIES
  FRAMEWORK TRUE
  MACOSX_FRAMEWORK_IDENTIFIER org.cmake.mul
  MACOSX_FRAMEWORK_SHORT_VERSION_STRING 42
  MACOSX_FRAMEWORK_BUNDLE_VERSION 3.2.10
  XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
  PUBLIC_HEADER mul.h
  RESOURCE "${RESLIST}"
)


Now I'm wondering what does the RESOURCE target property do that
MACOSX_PACKAGE_LOCATION doesn't already support?

Clint
--

Powered by www.kitware.com<http://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> http://cmake.org/cmake/help/training.html

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

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




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20151212/06fd2f8f/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cmake_ios_framework_with_resource2.zip
Type: application/zip
Size: 81233 bytes
Desc: cmake_ios_framework_with_resource2.zip
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20151212/06fd2f8f/attachment-0001.zip>


More information about the cmake-developers mailing list