[CMake] EFFECTIVE_PLATFORM_NAME not expanded in TARGET_* generator expressions on iOS

Vladimír Vondruš mosra at centrum.cz
Tue Mar 29 05:14:15 EDT 2016


I saw that commit, yes. Since there is no additional round of variable expansion, wouldn't it be better to expand the ${EFFECTIVE_PLATFORM_NAME} to at least something fixed (based on the value of CMAKE_OSX_SYSROOT), instead of making the generator expression unusable in all cases? It seems reasonable to me that if I set CMAKE_OSX_SYSROOT to "iPhoneSimulator", the output of $<TARGET_LOCATION:something> would be something like

    /path/to/my/build/dir/Debug-iphonesimulator/something.framework

instead of:

    /path/to/my/build/dir/Debug${EFFECTIVE_PLATFORM_NAME}/something.framework

Because the latter is unusable, with the former I have at least the ability to use it with a single fixed SDK.

Thanks
mosra

______________________________________________________________
> Od: Ruslan Baratov <ruslan_baratov at yahoo.com>
> Komu: "Vladimír Vondruš" <mosra at centrum.cz>
> Datum: 21.03.2016 14:56
> Předmět: Re: [CMake] EFFECTIVE_PLATFORM_NAME not expanded in TARGET_* generator expressions on iOS
>
> CC: cmake at cmake.org
>On 21-Mar-16 19:42, Vladimír Vondruš wrote:
>> Hello,
>>
>> I came across this problem when trying to use XCTest macros ( https://cmake.org/cmake/help/latest/module/FindXCTest.html ) on iOS. When compiling for OSX, ctest properly executes all test cases, but when targeting iOS or iOS simulator, all the test cases fail similarly to the following:
>>
>>      25: Test command: /Applications/Xcode.app/Contents/Developer/usr/bin/xctest "/Users/mosra/Code/corrade/build-ioss/src/Corrade/Utility/Test/Debug${EFFECTIVE_PLATFORM_NAME}/UtilityTypeTraitsTestRunner.xctest/../.."
>>      25: Environment variables:
>>      25:  DYLD_FRAMEWORK_PATH=/Users/mosra/Code/corrade/build-ioss/src/Corrade/Utility/Test/Debug${EFFECTIVE_PLATFORM_NAME}/UtilityTypeTraitsTest.framework/..
>>      25: Test timeout computed to be: 9.99988e+06
>>      25: 2016-03-21 12:41:38.799 xctest[31113:31078264] The bundle “Test” couldn’t be loaded because its executable couldn’t be located. Try reinstalling the bundle.
>>      25/28 Test #25: UtilityTypeTraitsTest ...............***Failed    0.04 sec
>>
>> As you can see, the `${EFFECTIVE_PLATFORM_NAME}` is not being expanded to `-iphonesimulator` and thus the file is not found. The problem is that the `$<TARGET_LINKER_FILE_DIR:target>` generator expression does not expand the variable. On the other hand, installation works without an issue, because the `cmake_install.cmake` scripts do additional round of variable expansion that (accidentally?) fixes this. The relevant part of the CMake source is here: https://github.com/Kitware/CMake/blob/cd569b962dbeaa7ea718021c16582cddd158df3a/Source/cmGeneratorTarget.cxx#L5063
>>
>>  From the source it looks like the generator is just putting the "${EFFECTIVE_PLATFORM_NAME}" output and hopes that someone later expands it. That's the case with install scripts (so they work), but not with generator expressions. The `TARGET_LINKER_FILE_DIR` is not the only affected, the problem is the same for all `TARGET_*` generator expressions.
>>
>> Currently I'm working around this by partially hardcoding the path, but that's far from ideal and I would like to avoid that:
>>
>>      if(CMAKE_OSX_SYSROOT MATCHES "iPhoneOS")
>>          set(platform_name "-iphoneos")
>>      elseif(CMAKE_OSX_SYSROOT MATCHES "iPhoneSimulator")
>>          set(platform_name "-iphonesimulator")
>>      endif()
>>      set(target_linker_file_dir ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>${platform_name}/${target}.xctest)
>>
>> Is there any way to fix this directly in CMake? Also the above workaround works only when targeting single SDK and not when having single generated project for both the device and the simulator.
>>
>> Thank you a lot for your help.
>>
>> mosra
>I doubt I can help with the problem but just for your information:
>* it wasn't fixed "accidentally", it was a fix for #12506: 
>https://github.com/Kitware/CMake/commit/48fe617e667d2e6b1e471cfb56346de51f984ba5
>* there is no "additional round" of variable expansion, 
>EFFECTIVE_PLATFORM_NAME initialized from Xcode's environment variable 
>EFFECTIVE_PLATFORM_NAME on installation
>
>As far as I understand the main general problem with iOS 
>device/simulator support is that CMake doesn't have multi-toolchain 
>feature from the box. So for now all this stuff worked by generating 
>some "universal" code that do work for both SDKs. The real SDK can be 
>triggered by additional explicit option, i.e.:
>* cmake --build _builds -- -sdk iphoneos # trigger iphoneos SDK
>* cmake --build _builds -- -sdk iphonesimulator # trigger 
>iphonesimulator SDK
>
>Ruslo
>


More information about the CMake mailing list