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
