There are a lot of different reasons it can fail. I usually end up debugging 
through the fixup_bundle() code and placing lots of "message(STATUS ....)" 
commands in order to try and follow what is going on. There are already some 
through out the cmake code you usually just have to set a cmake variable to "1" 
to get them to print. You can try posting the complete output from your "make 
install" run to try and see what is going on. 
--
Mike Jackson <www.bluequartz.net>

On Jan 20, 2011, at 2:35 PM, Yngve Levinsen wrote:

> Well I do have a folder structure, which looks like this:
> $ ls -R madx_dev.app/
> Contents
> 
> madx_dev.app//Contents:
> Info.plist MacOS      Resources
> 
> madx_dev.app//Contents/MacOS:
> madx_dev
> 
> madx_dev.app//Contents/Resources:
> MadX.icns
> 
> But it does not seem that the fixup-command does anything for me with
> the current configuration. Don't get why.
> 
> On 20 January 2011 15:40, Michael Jackson <[email protected]> wrote:
>> If you are creating a command line program then the included fixup_bundle 
>> will not work since it looks for a ".app" folder structure to fix. Instead 
>> you probably want to pass in the path to the executable located in 
>> ${CMAKE_INSTALL_PREFIX}/bin/MyExecutable to BundleUtilities.
>> 
>> Any library located in /usr/lib or System/Library/* will NOT be copied into 
>> your bundle/Folder structure as those are considered system libraries and 
>> available on every OS X system.
>> 
>> --
>> Mike Jackson <www.bluequartz.net>
>> 
>> On Jan 20, 2011, at 6:15 AM, Yngve Inntjore Levinsen wrote:
>> 
>>> Thank you for your kind reply Michael, it got me some bit further and I 
>>> think I understand a bit more. I could not see any examples of the usage of 
>>> the BundleUtilities in CMake, but the example given in the Wiki works as 
>>> expected on my machine.
>>> 
>>> I forgot to add some significant parts of my CMakeLists.txt file. I have 
>>> also made some fixes, so the current parts look like this:
>>> ...
>>> if (APPLE)
>>>  # So that we get the system X11 libraries if they exist:
>>>  set(CMAKE_LIBRARY_PATH /usr/lib/ /usr/X11/lib/ ${CMAKE_LIBRARY_PATH})
>>> endif (APPLE)
>>> ...
>>> if(APPLE)
>>>  SET(MACOSX_BUNDLE_STARTUP_COMMAND madx${BINARY_POSTFIX})
>>>  SET(MACOSX_BUNDLE_ICON_FILE 
>>> "${CMAKE_CURRENT_SOURCE_DIR}/cmakesrc/MadX.icns")
>>>  SET(MACOSX_BUNDLE_LONG_VERSION_STRING "MadX ${BINARY_POSTFIX} version 
>>> ${madX_MAJOR_VERSION}.${madX_MINOR_VERSION}.${madX_PATCH_LEVEL}")
>>>  SET(MACOSX_BUNDLE_BUNDLE_NAME "MadX${BINARY_POSTFIX}")
>>>  SET(MACOSX_BUNDLE_GUI_IDENTIFIER "MadX${BINARY_POSTFIX}")
>>>  # add icns to the .app/Resources with these TWO commands:
>>>  SET(srcfiles ${srcfiles} ${CMAKE_CURRENT_SOURCE_DIR}/cmakesrc/MadX.icns)
>>>  SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/cmakesrc/MadX.icns 
>>> PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
>>> endif(APPLE)
>>> 
>>> add_executable(madx${BINARY_POSTFIX} MACOSX_BUNDLE ${srcfiles})
>>> SET_TARGET_PROPERTIES(madx${BINARY_POSTFIX} PROPERTIES LINKER_LANGUAGE 
>>> Fortran)
>>> ...
>>> FIND_PACKAGE(X11)
>>> IF(X11_FOUND)
>>>   message("Found X11 libraries")
>>>   INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR})
>>>   TARGET_LINK_LIBRARIES(madx${BINARY_POSTFIX} ${X11_X11_LIB})
>>> ENDIF(X11_FOUND)
>>> ...
>>> target_link_libraries(madx${BINARY_POSTFIX} z)
>>> target_link_libraries(madx${BINARY_POSTFIX} pthread)
>>> target_link_libraries(madx${BINARY_POSTFIX} c)
>>> target_link_libraries(madx${BINARY_POSTFIX} gcc_eh)
>>> ...
>>> if(APPLE)
>>>  set(APPS "\${CMAKE_INSTALL_PREFIX}/madx${BINARY_POSTFIX}.app")  # paths to 
>>> executables
>>>  set(DIRS "")
>>>  message("aps: ${APPS}")
>>>  INSTALL(CODE "
>>>    include(BundleUtilities)
>>>    message(\"aps: ${APPS}\")
>>>    fixup_bundle(\"${APPS}\"   \"\"   \"${DIRS}\")
>>>    " COMPONENT Runtime)
>>>  INSTALL(TARGETS madx${BINARY_POSTFIX}
>>>   BUNDLE DESTINATION . COMPONENT Runtime
>>>   RUNTIME DESTINATION bin COMPONENT Runtime
>>>   )
>>> else(APPLE)
>>>  INSTALL(TARGETS madx${BINARY_POSTFIX}
>>>   RUNTIME DESTINATION bin
>>>   LIBRARY DESTINATION lib
>>>   ARCHIVE DESTINATION lib
>>>  )
>>> endif(APPLE)
>>> ...
>>> # so that we can build dragndrop on osx (actually needed?):
>>> set(CPACK_BINARY_DRAGNDROP ON)
>>> include (CPack)
>>> ...
>>> 
>>> 
>>> What I don't understand is why it does not work on my own project. From 
>>> what I can see you can actually replace the fixup_bundle() in the example 
>>> with simply fixup_bundle(\"${APPS}\" \"\" \"\"). This still gives the 
>>> following result when I check the binary with otools:
>>> otool -L 
>>> _CPack_Packages/Darwin/DragNDrop/QtTest-0.1.1-Darwin/QtTest.app/Contents/MacOS/QtTest
>>> _CPack_Packages/Darwin/DragNDrop/QtTest-0.1.1-Darwin/QtTest.app/Contents/MacOS/QtTest:
>>>    @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui 
>>> (compatibility version 4.7.0, current version 4.7.0)
>>>    @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore 
>>> (compatibility version 4.7.0, current version 4.7.0)
>>>    @executable_path/../MacOS/libstdc++.6.dylib (compatibility version 
>>> 7.0.0, current version 7.13.0)
>>>    @executable_path/../MacOS/libgcc_s.1.dylib (compatibility version 1.0.0, 
>>> current version 1.0.0)
>>>    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 
>>> 125.2.1)
>>> The original shows:
>>> otool -L QtTest.app/Contents/MacOS/QtTest
>>> QtTest.app/Contents/MacOS/QtTest:
>>>    /opt/local/libexec/qt4-mac-devel/lib/QtGui.framework/Versions/4/QtGui 
>>> (compatibility version 4.7.0, current version 4.7.0)
>>>    /opt/local/libexec/qt4-mac-devel/lib/QtCore.framework/Versions/4/QtCore 
>>> (compatibility version 4.7.0, current version 4.7.0)
>>>    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, 
>>> current version 7.13.0)
>>>    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, 
>>> current version 1.0.0)
>>>    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 
>>> 125.2.1)
>>> 
>>> So it seems that it by itself figured out that libraries in /opt/local 
>>> should be relinked and added to the bundle, whereas the /usr/lib library 
>>> can stay as it is. This is great stuff.
>>> 
>>> Doing the same with mine it fails with the "not a valid bundle" error. I 
>>> have the following original output from otools:
>>> otool -L madx_dev.app/Contents/MacOS/madx_dev
>>> madx_dev.app/Contents/MacOS/madx_dev:
>>>    /usr/X11/lib/libX11.6.dylib (compatibility version 9.0.0, current 
>>> version 9.0.0)
>>>    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 
>>> 1.2.3)
>>>    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 
>>> 125.2.1)
>>>    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, 
>>> current version 7.13.0)
>>>    /opt/local/lib/gcc44/libgfortran.3.dylib (compatibility version 4.0.0, 
>>> current version 4.0.0)
>>>    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, 
>>> current version 1.0.0)
>>> 
>>> In principle the only thing not available in /usr/ is the gfortran library 
>>> (right), but I guess I should expect that it would copy everything that is 
>>> linked to a library residing in /opt/local in the same manner as for 
>>> QtTest. However, the fixup_utilities does not relink any of those 
>>> libraries. What am I doing wrong? Are there anything you need to set prior 
>>> to the install(CODE "... command? I have been trying to read through the 
>>> QtTest example, and I don't see anything that should imply so.
>>> 
>>> I have too many questions at once I suppose, but there is still one more 
>>> important: My application is a "terminal app", so it does not come with a 
>>> GUI. Does this mean that the bundle-concept of osx is not fitted very well 
>>> to my application? Can I somehow run a script that will open my application 
>>> in a new Terminal.app window or something of that sort? I realized that 
>>> other applications work so that if you click on the Name.app you see the 
>>> GUI only, whereas if you click on the executable Contents/MacOS/Name you 
>>> first see a terminal that then opens the GUI...? Is e.g. Octave bundled, 
>>> and how is that done?
>>> 
>>> Cheers
>>> Yngve
>>> 
>>> 
>>> 
>>> 
>>> On 1/19/11 4:42 PM, Michael Jackson wrote:
>>>> You will need to look into the "BundleUtilities" functionality, 
>>>> specifically the "fixup_bundle()" function. This will copy and fixup 
>>>> dependent dylibs/frameworks needed by your project. There is a short 
>>>> example that uses Qt that you can download.
>>>> 
>>>>   You will also probably need to properly configure a plist that resides 
>>>> in your Application bundle. THere are CMake variables for this that you 
>>>> can set then CMake will create a default plist for you.
>>>> 
>>>>   There are a number of examples, CMake itself is one, that uses the 
>>>> "fixup_bundle()" in its own code.
>>>> 
>>>>   Separate from all of that is all the CPack variables that you probably 
>>>> need to set.
>>>> 
>>>> Here is a macro that I wrote for one of my own projects:
>>>> 
>>>> #-------------------------------------------------------------------------------
>>>> # This macro will set all the variables necessary to have a "good" OS X 
>>>> Application
>>>> # bundle. The variables are as follows:
>>>> #  PROJECT_NAME - which can be taken from the ${PROJECT_NAME} variable is 
>>>> needed
>>>> #  DEBUG_EXTENSION - The extension used to denote a debug built 
>>>> Application. Typically
>>>> #   this is '_debug'
>>>> #  ICON_FILE_PATH - The complete path to the bundle icon file
>>>> #  VERSION_STRING - The version string that you wish to use for the 
>>>> bundle. For OS X
>>>> #   this string is usually XXXX.YY.ZZ in type. Look at the Apple docs for 
>>>> more info
>>>> #-------------------------------------------------------------------------------
>>>> macro(ConfigureMacOSXBundlePlist PROJECT_NAME DEBUG_EXTENSION 
>>>> ICON_FILE_PATH VERSION_STRING)
>>>>   # message(STATUS "ConfigureMacOSXBundlePlist for ${PROJECT_NAME} ")
>>>>   IF(CMAKE_BUILD_TYPE MATCHES "Release")
>>>>     SET(DBG_EXTENSION "")
>>>>   else()
>>>>     set(DBG_EXTENSION ${DEBUG_EXTENSION})
>>>>   endif()
>>>>   get_filename_component(ICON_FILE_NAME "${ICON_FILE_PATH}" NAME)
>>>> 
>>>>  #CFBundleGetInfoString
>>>>  SET(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}${DBG_EXTENSION} Version 
>>>> ${VERSION_STRING}, Copyright 2009 BlueQuartz Software.")
>>>>  SET(MACOSX_BUNDLE_ICON_FILE ${ICON_FILE_NAME})
>>>>  SET(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME}${DBG_EXTENSION}")
>>>>  #CFBundleLongVersionString
>>>>  SET(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME}${DBG_EXTENSION} 
>>>> Version ${VERSION_STRING}")
>>>>  SET(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}${DBG_EXTENSION})
>>>>  SET(MACOSX_BUNDLE_SHORT_VERSION_STRING ${VERSION_STRING})
>>>>  SET(MACOSX_BUNDLE_BUNDLE_VERSION ${VERSION_STRING})
>>>>  SET(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010, BlueQuartz Software. All 
>>>> Rights Reserved.")
>>>> 
>>>>  SET(${PROJECT_NAME}_PROJECT_SRCS ${${PROJECT_NAME}_PROJECT_SRCS} 
>>>> ${ICON_FILE_PATH})
>>>>  SET_SOURCE_FILES_PROPERTIES(${ICON_FILE_PATH} PROPERTIES
>>>>                              MACOSX_PACKAGE_LOCATION Resources)
>>>> 
>>>> endmacro()
>>>> 
>>>> Hope that helps
>>>> ___________________________________________________________
>>>> Mike Jackson                      www.bluequartz.net
>>>> Principal Software Engineer       [email protected]
>>>> BlueQuartz Software               Dayton, Ohio
>>>> 
>>>> On Jan 19, 2011, at 7:08 AM, Yngve Inntjore Levinsen wrote:
>>>> 
>>>>> Dear fellow cmake users,
>>>>> 
>>>>> I am trying to create a bundle of my project that I build using CMake. I 
>>>>> have tried using the DragNDrop generator, which works to some extent. I 
>>>>> do manage to create a .app folder which contains the one binary that is 
>>>>> the outcome of the project in the Contents/MacOS folder. I do also create 
>>>>> a .dmg file. However:
>>>>> - When clicking the .dmg I am first presented with the license (great!) 
>>>>> before the dmg is mounted and I see an empty folder (??)
>>>>> - When clicking on the<package>.app nothing happens. However, clicking on 
>>>>> the binary in Contents/MacOS works as expected.
>>>>> - I would also like to know how to include the shared libraries (dylib) 
>>>>> that I need. I currently depend on stuff that is installed with MacPorts, 
>>>>> and I don't want to require that the user have to install all that stuff. 
>>>>> Isn't the bundle supposed to be "self-contained"? Ideally I would like 
>>>>> the bundle to automatically include the libraries that are listed with 
>>>>> the "otools -L<binary>" command...
>>>>> 
>>>>> Question: Where do I find the DragNDrop documentation/examples? On the 
>>>>> wiki ( 
>>>>> http://www.paraview.org/Wiki/CMake:CPackPackageGenerators#DragNDrop_.28OSX_only.29
>>>>>  ) there are only two small lines, and my googling skills are apparently 
>>>>> not good enough..
>>>>> 
>>>>> Here is an extraction of the relevant part of my CMakeLists.txt:
>>>>> ...
>>>>> if(APPLE)
>>>>>  add_executable(madx${BINARY_POSTFIX} MACOSX_BUNDLE ${srcfiles})
>>>>>  SET_TARGET_PROPERTIES(madx${BINARY_POSTFIX} PROPERTIES 
>>>>> CPACK_BUNDLE_STARTUP_COMMAND madx${BINARY_POSTFIX})
>>>>>  SET_TARGET_PROPERTIES(madx${BINARY_POSTFIX} PROPERTIES CPACK_BUNDLE_ICON 
>>>>> "${CMAKE_CURRENT_SOURCE_DIR}/cmakesrc/MadX.icns")
>>>>> else(APPLE)
>>>>>  add_executable(madx${BINARY_POSTFIX} ${srcfiles})
>>>>> endif(APPLE)
>>>>> ...
>>>>> 
>>>>> I also set some CPACK_BUNDLE properties because I earlier on tried to use 
>>>>> the BUNDLE generator, but from what I understand this should have nothing 
>>>>> to do with the DragNDrop generator?
>>>>> 
>>>>> Thank you all for reading and thanks in advance for all help you might 
>>>>> provide!
>>>>> 
>>>>> Cheers,
>>>>> Yngve
>>>>> 
>>>> 
>>> 
>>> _______________________________________________
>>> 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
>> 
>> _______________________________________________
>> 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
>> 
> _______________________________________________
> 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

_______________________________________________
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

Reply via email to