[cmake-developers] iOS: direction to official support and questions

Raffi Enficiaud raffi.enficiaud at mines-paris.org
Wed Sep 27 08:18:06 EDT 2017


Le 27.09.17 à 12:34, Brad King a écrit :
> On 09/26/2017 05:05 PM, Raffi Enficiaud wrote:
>> Is it possible to source the default setup and to override some parts
>> when a toolchain is given on the command line?
>
> The toolchain file is loaded very early, before any of the platform
> information files.  It is supposed to provide information, not consume it.
> It is loaded too early to even know CMAKE_SYSTEM_NAME, because it is
> supposed to provide this value.

Thanks for the answers!

 From what I understand, I missed the point of the cross compilation 
file a bit, and I should rather go for platform files.

For cross-compiling a project on iOS or iOS simulator, and since those 2 
platforms are still Darwin, I believe that:

* from a user perspective:
   * CMAKE_SYSTEM_NAME should be set to "Darwin"
   * CMAKE_SYSTEM_VERSION should be set to iOS or iOS-simulator, 
possibly with a version (like "Mac OSX 10.2" in Darwin.cmake)

* inside "Modules/Platform/Darwin.cmake"
    * CMAKE_SYSTEM_PROCESSOR should default to armXX for iOS and 
i386/x86_64 for the simulator
    * I do not think that any other compiler than AppleClang is 
supported, but we leave the detection as it is right now. This should 
default to AppleClang anyway.
    * the detection of the base SDKs should be performed inside 
"Platform/Darwin.cmake"
    * the file "Modules/Platform/Darwin-Clang.cmake" should check the 
"CMAKE_SYSTEM_VERSION" to add appropriate flags when 
CMAKE_SYSTEM_VERSION is iOS or simulator. This should include clang and 
apple clang.

If things work ok and if I understand more or less the scope of those 
files, the base SDKs will then be detected from the 
"Modules/Platform/Darwin.cmake".

However, I just notice the existence of 
"Modules/Platform/Darwin-Initialize.cmake" that is setting several 
variables. When is this file sourced? should be before 
"Modules/Platform/Darwin.cmake" but I failed to see from where.

I see several problems with this file if I were to make it iOS aware. 
For instance it contains variables that are checking for the version, 
but based only on the macOS scheme.

Should the CMAKE_SYSTEM_VERSION include the "iOS" or "iOSSimulator" 
part? (like for instance "iOS-10.1" ?) or we stick to a clean version 
name and:

1/ either we change the CMAKE_SYSTEM_NAME to DarwinIOS (we also need to 
distinguish between real device and simulator)
2/ or we carry another variable IOS=TRUE and be careful inside the 
Darwin specific platform files.

My preference goes for 2/ above because:
* having something like DarwinIOS would need to create a full new branch 
of platform support, while the overlap with Darwin is almost 95%.
* iOS is clearly a Darwin platform, just another version, but version 
carries more than a revision number (eg "10.5") that needs to be encoded 
in another variable (eg. IOS=TRUE)
* we will benefit from all the build logic (Darwin, policies, etc) that 
are currently working for OSX

>
>> Also, is it possible to check for policies directly from the toolchain
>> file, or is it too early?
>
> In a project that starts with `cmake_minimum_required(...)` as its first
> call (the recommended approach) then policies it sets will be available
> when the toolchain file is first loaded by a following `project()` or
> `enable_language()` command.  However, toolchain files are not meant to
> be general-purpose infrastructure shared by many projects.  They are
> meant to be specific to a project and host machine.  Common info about
> a platform belongs in CMake's modules, e.g. a Platform/iOS.cmake module
> for use with CMAKE_SYSTEM_NAME set to "iOS".  Lacking that, a toolchain
> file trying to work without it will undoubtedly need to be hacky.

I believe if I integrate well with the platform files, all things would 
be good again, and the policies will apply naturally (so no hack needed).

>
>> This is what I added in the toolchain file, but I feel like this is too
>> hacky:
>>
>> set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR TRUE)
>> set(CMAKE_INSTALL_NAME_DIR "@rpath/")
>> set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
>> set(CMAKE_INSTALL_RPATH "@rpath/")
>
> If that is universally needed when deploying to iOS then CMake should
> be taught this information in a corresponding platform file.

I do not think this is universally needed, I just wanted to mimic the 
default I got when compiling the same source tree but with the OSX 
target platform. Without great success ...


> Keeping
> it in the toolchain file may work but is an example of the hacky nature
> discussed above.  OTOH this looks project-specific to me.  One could
> use `@executable_path/` in INSTALL_NAME_DIR for everything and not need
> any rpath.

Yes, I was not convinced neither and totally fine with removing this.

>> and I need to also do this:
>> set_target_properties(mymainexecutable
>>    PROPERTIES
>>      BUILD_WITH_INSTALL_RPATH TRUE
>>      INSTALL_RPATH "@executable_path/"
>> )
>
> This encodes knowledge of the relative install destination of the
> libraries to the executable, which only the project code itself
> can know.

Here what I wanted to say is that the settings I am placing in the 
toolchain file were not propagating to this bundle project for some 
reason I failed to understand.

Your comments most welcome,
Raffi

PS: how should we proceed with the developments? Having a fork on Gitlab 
based on master and start integrating from there would be ok? Do you 
need a build machine first?




More information about the cmake-developers mailing list