[CMake] Imported target location for OSX frameworks

Vladimír Vondruš mosra at centrum.cz
Thu Apr 7 04:54:44 EDT 2016


Hello,

sorry for flooding with e-mails today, it all kinda piled up. This one is about imported target location for frameworks on OSX (and thus also iOS). I saw the bugreport here https://cmake.org/Bug/view.php?id=14105 and that it was closed as "no change needed". The suggested solution was that the Find module needs to practically work around this with a code similar to the following (for example finding the SDL2 framework installed through Homebrew on OSX):

    find_library(SDL2_LIBRARY SDL2)
    if(APPLE AND ${SDL2_LIBRARY} MATCHES "\\.framework$")
        set_property(TARGET SDL2::SDL2 PROPERTY IMPORTED_LOCATION ${SDL2_LIBRARY}/SDL2)
    else()
        set_property(TARGET SDL2::SDL2 PROPERTY IMPORTED_LOCATION ${SDL2_LIBRARY})
    endif()

It's ugly to do and I have to do it for all my custom modules that were switched to imported targets, but seeing that even the builtin `FindQt4.cmake` is doing the same, I thought that there is no way to use the nice old "just works" behavior that worked before imported targets.

However, this requires that there actually *is* a file at `name.framework/name`, which is not always the case. One of those cases is the `OpenGLES` framework on iOS and for it I *have* to use the `-framework OpenGLES` way to make it work. In that case the workaround is like this:

    find_library(OpenGLES3 OpenGLES) # other platform-specific names omitted
    if(APPLE AND ${OPENGLES3_LIBRARY} MATCHES "\\.framework$")
        add_library(OpenGLES3::OpenGLES3 INTERFACE IMPORTED)
        set_property(TARGET OpenGLES3::OpenGLES3 APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${OPENGLES3_LIBRARY})
    else()
        add_library(OpenGLES3::OpenGLES3 UNKNOWN IMPORTED)
        set_property(TARGET OpenGLES3::OpenGLES3 PROPERTY IMPORTED_LOCATION ${OPENGLES3_LIBRARY})
    endif()

You see that I actually have to completely sidestep the imported target functionality. Only this way the ${OPENGLES3_LIBRARY} location (which in this case is `/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenGLES.framework`) gets properly replaced with `-framework OpenGLES` on linker command line and everything works as it should.

My question is: why CMake does not keep the old behavior also for imported targets? Is there any way to make it "just work" like it was with the old variable-based approach for finding libraries? I.e. not requiring the users to do elaborate platform-specific branching and introspection of each framework?

Thanks for your input.
mosra


More information about the CMake mailing list