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

Ruslan Baratov ruslan_baratov at yahoo.com
Fri Dec 11 20:15:58 EST 2015


On 12-Dec-15 07:26, Bartosz Kosiorek wrote:
> Hi
> I have updated current documentation with examples, to reflect current status of CMake in OSX/iOS support.
>
> Such information is very useful for novice CMake developers,
> and it saves an hours of digging through mailing list and websites.
This is true, totally agree.

+If user would like to build for iPhone device, it could specify::
+
+  set(CMAKE_OSX_ARCHITECTURES "armv7;armv7s;arm64")


Note that:
* you can mix simulator and device architectures here
* if more than one architecture set then `ONLY_ACTIVE_ARCH` will be set 
to `NO`. it is useful for install/archive stage but will slow down your 
development process. at least it worth to mention 
CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH variable usage
* I think newly created IOS_INSTALL_COMBINED should be mentioned too
* also architectures can be set using next Xcode attributes:

   set_target_properties(
       foo
       PROPERTIES
       XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] armv7
       XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] armv7
       XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] x86_64
       XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] x86_64
   )

note that to specify several architectures you need to use space as a 
separator (unlike CMake list):

   set_target_properties(
       foo
       PROPERTIES
       XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "armv7 arm64"
       XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "armv7 arm64"
   )

Ruslan
>
> Best Regards
> Bartosz
>
>
> ________________________________________
> From: Clinton Stimpson <clinton at elemtech.com>
> Sent: Friday, December 11, 2015 10:16 PM
> To: Bartosz Kosiorek
> Cc: cmake-developers; Gregor Jasny
> Subject: Re: Create subdirectories in Resource directory for Frameworks and Application bundle.
>
> On Friday, December 11, 2015 08:46:56 PM Bartosz Kosiorek wrote:
>> Hi
>>
>> To enable iOS build, I'm using following settings in CMakeLists.txt:
>>
>>
>> set(APPLE_PLATFORM "iphonesimulator")
>> set(CMAKE_OSX_SYSROOT
>> "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platf
>> orm/Developer/SDKs/iPhoneSimulator.sdk")
>   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")
>> 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?
>>
> I'm thinking it'll be better to integrate that at the Modules/Platform/ level.
> For example, there is code in Darwin-Clang.cmake for the -mmacosx-version-min
> flag.
>
> Perhaps iOS can be toggled with CMAKE_GENERATOR_PLATFORM.
> Brad, what do you think?
>
> Or maybe toggled with CMAKE_OSX_SYSROOT, and if the SDK is pointing to another
> platform than OS X, we can switch between
> -mios-version-min= and -mmacosx-version-min=
>
> Clint
>
>
>>>>
>>
>> ________________________________
>> From: clinton at elemtech.com <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>
>> 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/Concep
>> tual/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
>>
>> 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-developers
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20151212/07456705/attachment.html>


More information about the cmake-developers mailing list