[CMake] BundleUtilities (was RPATH on Mac)

tog guillaume.alleon at gmail.com
Wed Apr 20 06:54:59 EDT 2011


Some small progress after using INSTALL(CODE ...) but still an error.
(Small) code is still there https://github.com/galleon/CMakeOSX for
those interested.

Any idea what is going wrong ?

Best Regards
Guillaume

....

-- 4/8: copying '/Users/alleon/PROJECTS/CMakeOSX_build/foo/libfoo.1.dylib'
-- fixup_bundle: fixing...
-- 5/8: fixing up '/Users/alleon/PROJECTS/CMakeOSX_build/plugin/libplugin.so'
  exe_dotapp_dir/='/tmp/example/main.app/'
  item_substring='/Users/alleon/PROJECTS'
  resolved_embedded_item='/Users/alleon/PROJECTS/CMakeOSX_build/plugin/libplugin.so'

Install or copy the item into the bundle before calling fixup_bundle

CMake Error at /Applications/CMake
2.8-4.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:557
(message):
  cannot fixup an item that is not in the bundle...
Call Stack (most recent call first):
  /Applications/CMake
2.8-4.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:645
(fixup_bundle_item)
  example/cmake_install.cmake:44 (fixup_bundle)
  cmake_install.cmake:35 (INCLUDE)


make: *** [install] Error 1



On Wed, Apr 20, 2011 at 12:03 PM, tog <guillaume.alleon at gmail.com> wrote:
> Hi,
>
> Yes I have used the references you send me i.e. the link to the QtTest project.
> This project is nevertheless simpler than mine since only an
> executable is generated - no libraries (excepted those taken from Qt).
>
> If my understanding is correct - FIXUP_BUNDLE shall be used after the
> bundle is created. Shall it be called for each artifacts i.e each
> library and executable or only for the main executable.
>
> My problem is that I got an  "fixup_bundle: not a valid bundle" error
> message when using FIXUP_BUNDLE.
>
> I have created a very simplified project here if one wants to have a
> look to my problem: https://github.com/galleon/CMakeOSX
>
> Best Regards
> Guillaume
>
>
>
> On Tue, Apr 19, 2011 at 9:10 PM, Michael Jackson
> <mike.jackson at bluequartz.net> wrote:
>> Use the "SHARED" library type for your shared library and "MODULE" for your plugin.
>>
>> Have you downloaded the Qt example from the Wiki? It shows what you need to do. The terse summary of how some of us do it is this:
>>
>> Write a configurable *.cmake.in file that gets configured at cmake time. An install rule is also added that executes the .cmake file at install time. inside this file is cmake code to over ride some CMake functions for your use and then include the BundleUtilities. And then call "fixup_bundle". The tail end of my own file looks like this:
>>
>> # -- Run the BundleUtilities cmake code
>> include(BundleUtilities)
>> fixup_bundle("${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app"
>>             # Plugins to Install
>>             "${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app/Contents/plugins/imageformats/libqgif.dylib;${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app/Contents/plugins/imageformats/libqjpeg.dylib;${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app/Contents/plugins/imageformats/libqtiff.dylib;${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app/Contents/plugins/libEMMPMPlugin_debug.plugin;${CMAKE_INSTALL_PREFIX}/IPHelperApp_debug.app/Contents/plugins/libCrossCorrelationPlugin_debug.plugin"
>>             # Directories to Search for Libraries
>>             "/Users/mjackson/Workspace/IPHelper/Build/Bin;/Users/mjackson/Workspace/IPHelper/Build/Bin"
>> )
>>
>> This is for a Qt based project where I need some of the Qt plugins for image loading and I have produced my own plugins that need to get copied into the application bundle. Note that this will get called at INSTALL time NOT at build time. You should have code in your main executable that looks for the plugins in a few locations so your executable will work from both the build directory and the installed location. Again, if you happen to be working with Qt I can share some code that I use.
>>
>> If you take a look at http://scm.bluequartz.net/support-libraries/cmp/trees/master there are some  Macros (cmpCMakeMacros.cmake) that I use in my project. There is also the example configured file in the OSX_Tools directory (CompleteBundle.cmake.in).
>>
>> The "cmp" project is just a collection of CMake code that I use over and over in all my projects so I just made a Git module out of it and I use it as a git submodule in all my projects.
>> ___________________________________________________________
>> Mike Jackson                      www.bluequartz.net
>> Principal Software Engineer       mike.jackson at bluequartz.net
>> BlueQuartz Software               Dayton, Ohio
>>
>> On Apr 19, 2011, at 11:21 AM, tog wrote:
>>
>>> Hi Mike
>>>
>>> Thanks for this very helpful answer.
>>> I am nevertheless still facing few problems. My project contains:
>>>  - a shared library
>>>  - an executable using the shared lib
>>>  - a plugin lib (loaded using dylib)
>>>
>>> I have modified my exec target to be
>>> ADD_EXECUTABLE(main MACOSX_BUNDLE  main.cpp sub.cpp)
>>> then I have something like
>>> INSTALL(TARGETS main  BUNDLE    DESTINATION Applications  RUNTIME)
>>>
>>> the make install does create Application.app and add the main exec.
>>>
>>> Fir the lib I am facing 2 problems:
>>>  1- I don't understand how to add them to the bundle. They are both
>>> created using:
>>>
>>>      ADD_LIBRARY(foo ${EXAMPLE_LIBRARY_TYPE} foo.cpp)
>>> EXAMPLE_LIBRARY_TYPE=SHARED
>>>
>>>      INSTALL(TARGETS foo
>>>              RUNTIME DESTINATION ${EXAMPLE_INSTALL_LIB_DIR} COMPONENT
>>> RuntimeLibraries
>>>              LIBRARY DESTINATION ${EXAMPLE_INSTALL_LIB_DIR} COMPONENT
>>> RuntimeLibraries
>>>              ARCHIVE DESTINATION ${EXAMPLE_INSTALL_LIB_DIR} COMPONENT
>>> Development
>>>
>>>      nothing is added to the app.
>>>
>>>  2- According to the doc. For a library loaded at runtime the doc
>>> suggests to use MODULE but I end up having this error. Is that
>>> supported on Mac
>>>
>>> Linking CXX shared module libplugin.so
>>> cd /Users/alleon/PROJECTS/example_build/plugin && "/Applications/CMake
>>> 2.8-4.app/Contents/bin/cmake" -E cmake_link_script
>>> CMakeFiles/plugin.dir/link.txt --verbose=1
>>> /usr/bin/c++   -bundle -Wl,-headerpad_max_install_names
>>> -compatibility_version 1.0.0 -current_version 1.2.3 -o
>>> libplugin.1.2.3.so CMakeFiles/plugin.dir/plugin.cpp.o
>>> i686-apple-darwin10-g++-4.2.1: -compatibility_version only allowed
>>> with -dynamiclib
>>> make[2]: *** [plugin/libplugin.1.2.3.so] Error 1
>>>
>>>
>>> Thanks
>>> Guillaume
>>>
>>>
>>> On Sat, Apr 16, 2011 at 6:51 PM, Michael Jackson
>>> <mike.jackson at bluequartz.net> wrote:
>>>> You need to process your executable with "install_name_tool" either manually or using the "BundleUtilities" functionality built into CMake. Note that there is a bug in the current CMake 2.8.4 that will NOT allow bundleUtilities to work on a command line type app. Your app MUST be in a .app bundle. If you search for BUndleUtilities on the Wiki there is a small Qt based project that shows a simple use of BundleUtilities.
>>>>
>>>> Hope that helps.
>>>> ___________________________________________________________
>>>> Mike Jackson                      www.bluequartz.net
>>>> Principal Software Engineer       mike.jackson at bluequartz.net
>>>> BlueQuartz Software               Dayton, Ohio
>>>>
>>>>
>>>>
>>>> On Apr 15, 2011, at 7:17 AM, tog wrote:
>>>>
>>>>> Dear all
>>>>>
>>>>> I have a project in which I would like to use rpath on Mac OS.
>>>>> Everything is going fine if I am building everything manually (i.e.
>>>>> without CMake)
>>>>>
>>>>> With CMake all is fine for the libs between the build and the
>>>>> installation, all libs are processed with install_name_tool.
>>>>> But nothing is done for the executable (checked from cmake_install.cmake)
>>>>>
>>>>> In the build phase, I don't see any -Wl,-rpath,... added on the command line.
>>>>>
>>>>> What do I miss there ?
>>>>>
>>>>> I have been using:
>>>>>
>>>>> SET(CMAKE_SKIP_BUILD_RPATH FALSE)
>>>>> SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
>>>>> SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
>>>>> SET(CMAKE_INSTALL_RPATH "${EXAMPLE_INSTALL_LIB_DIR}")
>>>>>
>>>>> as indicated in the Wiki.
>>>>>
>>>>> Is there  tool on the Mac to get rpath from the executable ?
>>>>>
>>>>>
>>>>> Thanks for your help
>>>>> Guillaume
>>>>>
>>>>> --
>>>>> PGP KeyID: 2048R/EA31CFC9  subkeys.pgp.net
>>>>> _______________________________________________
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://www.cmake.org/mailman/listinfo/cmake
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> PGP KeyID: 2048R/EA31CFC9  subkeys.pgp.net
>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>>
>
>
>
> --
> PGP KeyID: 2048R/EA31CFC9  subkeys.pgp.net
>



-- 
PGP KeyID: 2048R/EA31CFC9  subkeys.pgp.net


More information about the CMake mailing list