[CMake] BundleUtilities (was RPATH on Mac)

Michael Jackson mike.jackson at bluequartz.net
Sat Apr 23 09:07:30 EDT 2011


To Copy in a framework into a .app bundle or to fixup a framework? In the first case things should "just work" as I copy in Qt Frameworks all the time.

--
Mike Jackson <www.bluequartz.net>

On Apr 22, 2011, at 10:31 PM, tog wrote:

> Hi
> 
> Do we have something similar to BundleUtilities for Frameworks ?
> 
> Best Regards
> Guillaume
> 
> On Wed, Apr 20, 2011 at 9:48 PM, David Cole <david.cole at kitware.com> wrote:
>> On Wed, Apr 20, 2011 at 11:38 AM, Michael Jackson
>> <mike.jackson at bluequartz.net> wrote:
>>> 
>>> ___________________________________________________________
>>> Mike Jackson                      www.bluequartz.net
>>> Principal Software Engineer       mike.jackson at bluequartz.net
>>> BlueQuartz Software               Dayton, Ohio
>>> 
>>> On Apr 20, 2011, at 11:25 AM, David Cole wrote:
>>> 
>>>> On Wed, Apr 20, 2011 at 11:17 AM, Michael Jackson
>>>> <mike.jackson at bluequartz.net> wrote:
>>>> On Apr 20, 2011, at 10:55 AM, David Cole wrote:
>>>> 
>>>>> 
>>>>> What is wrong with that one ?
>>>>> 
>>>>> Nothing is wrong with it, but there is no link from the app to the
>>>>> plugin, so fixup_bundle cannot determine that it's necessary and
>>>>> automatically pull it in. The plugin, from the app's point of view, is
>>>>> something that may or may not exist, and if it does, it's dynamically
>>>>> loaded. So you need to install it into the bundle first, and then you need
>>>>> to tell fixup_bundle about it so that it gets included in the set of fixed
>>>>> up libraries.
>>>>> 
>>>>> Hope this helps,
>>>>> David
>>>> 
>>>> Is that the part that changed from CMake 2.8.3 to 2.8.4? I am using
>>>> CMake 2.8.3 and all my code works fine but I don't think I explicitly
>>>> "install" the plugin but rather list it (the absolute path to the built
>>>> plugin) as an argument to the "fixup_bundle" function. Will that scheme
>>>> still work under CMake 2.8.4?
>>>> 
>>>>  There are some other issues with CMake 2.8.4 with BundleUtilities and
>>>> my code which is why I have not updated from 2.8.3
>>>> 
>>>> Mike Jackson
>>>> www.bluequartz.net
>>>> 
>>>> 
>>>> 
>>>> In CMake 2.8.3 and earlier, libs listed in the 2nd arg to fixup_bundle
>>>> were copied into the bundle. Half the people using it considered that
>>>> behavior a bug, half liked it just fine.
>>>> 
>>>> In 2.8.4, we "fixed" the bug (really, transferred it to the other half
>>>> of the people)...
>>>> 
>>>> In retrospect, I never should have allowed that change to go into CMake,
>>>> but there you have it: 2.8.3 and earlier copy the plugins, 2.8.4 and later
>>>> do not.
>>>> 
>>>> So: if you want a plugin inside your bundle, with CMake 2.8.4 and later,
>>>> you have to copy/install the plugin into the bundle yourself before calling
>>>> fixup_bundle.
>>>> 
>>>> 
>>>> Sorry for the persisting confusion,
>>>> David
>>>> 
>>> 
>>> So I should probably put the copy step into my configured cmake file that
>>> runs the 'fixup_bundle'? I guess an install rule with the proper path inside
>>> the app bundle should work. Isn't there an easier way? BUNDLE DESTINATION
>>> argument to the INSTALL(target.. ) should do it also correct?
>>> 
>>> Thanks
>>> Mike Jackson
>>> 
>> 
>> I would recommend something like this (top of my head, not actually building
>> from this):
>> 
>>   install( TARGETS myapp BUNDLE DESTINATION . )
>> 
>> That should produce a directory structure in CMAKE_INSTALL_PREFIX like so:
>> 
>>   ./myapp.app/Contents/MacOS/myapp
>> 
>> Then for the plugin, something like:
>> 
>>   install( TARGETS plugin DESTINATION myapp.app/Contents/plugins )
>> 
>> Which should yield:
>> 
>>   ./myapp.app/Contents/MacOS/myapp
>>   ./myapp.app/Contents/plugins/libplugin.dylib
>> 
>> Something along those lines. And then pass the full path to libplugin.dylib
>> to fixup_bundle.
>> 
> PGP KeyID: 2048R/EA31CFC9  subkeys.pgp.net
> 



More information about the CMake mailing list