IS your application a GUI application or an terminal application? If it is really a terminal application then you really should NOT be creating an .app bundle but instead just a plain executable. ___________________________________________________________ Mike Jackson www.bluequartz.net Principal Software Engineer [email protected] BlueQuartz Software Dayton, Ohio
On Jan 21, 2011, at 5:10 AM, Yngve Inntjore Levinsen wrote: > Thank you so much for your tips and help Michael! My stupid mistake as you > can see it below is that I ran the install target command AFTER the > fixup_bundle. Hence the app did not exist in its location when the > fixup_bundle ran, but when I checked afterwards it all looked as one would > expect. > > Last question, anyone have some tip on how to set up a terminal application > in an app bundle? Currently I have to suggest to the user to open the bundle > and go to the MacOS folder and click on the binary file there. This is of > course a minor issue, but would be nicer if a click on the app bundle itself > would have the same behaviour... Something I can set in the plist file > perhaps? > > Cheers > Yngve > > On 1/20/11 9:02 PM, Michael Jackson wrote: >> 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 > > _______________________________________________ > 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
