[CMake] cpack bundle on osx
Michael Jackson
mike.jackson at bluequartz.net
Wed Jan 19 10:42:37 EST 2011
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 mike.jackson at bluequartz.net
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
More information about the CMake
mailing list