[CMake] Mac and Win32 bundling

David Cole david.cole at kitware.com
Wed Nov 25 06:52:49 EST 2009


Please do post your info here as well.


On Wed, Nov 25, 2009 at 5:01 AM, Filip Wänström <filip.wanstrom at tii.se>wrote:

> Just wanted to add an update: I have managed to create a stand alone
> MacOSX OpenSceneGraph app that works. Basically it boils down to
> scripting the install_name_tool to create loader_paths that points
> correctly. I will create an example of this and will be posting that
> to the osg-users mailing list. I will post it here too if that's ok?
>
> Best regards
> /Filip
>
>
> On Tue, Nov 24, 2009 at 3:23 PM, Filip Wänström <filip.wanstrom at tii.se>
> wrote:
> > Hi my name is Filip Wänström and I'm new to this list.
> >
> > I have recently(a few months) started to use CMake for all my
> > building. I find that it works well in most cases and probably is the
> > best alternative on the "market". Anyway, I like to stay cross
> > platform for my projects so I personally develop on a Mac but mostly
> > deliver on win32.
> >
> > Building works fine for me (using Makefile gen for mac and VS for win)
> > but I have huge problems with the bundling process. On the Mac I want
> > to deliver an app using regular drag and drop as a self contained
> > bundle and on windows I want to deliver an installer.
> > I have managed to get a win32 installer working using the NSIS
> > facilities but it took a lot of extra scripting. On the Mac I have
> > been able to create the dragndrop bundle "installer" but it doesn't
> > really work. I assume there are some issues with
> > rpath/loader_path/executable_path.
> >
> > For reference the app is an Openscenegraph app that is dependant on
> > quite a few libraries that need to be bundled as dll:s on win and
> > dylibs/.so on mac.
> >
> > The question is: what is the current "best practices approaches" on
> > these platforms? I have found no complete examples.
> >
> >
> > Finally: parts of my cmake test case for win32: THis works fine and
> > creates a usable app that bundles the osg libs as well as a plugin and
> > data. It just doesn't feel very neat for being user code.
> >
> >
> > #Basic app test (packaging exercise)
> > SET(TARGET_BASIC_APP_SRC BasicApp.cpp BasicAppMain.cpp)
> > ADD_EXECUTABLE(BasicApp  ${TARGET_BASIC_APP_SRC} )
> > TARGET_LINK_LIBRARIES(BasicApp ${MY_COMMON_LIBS})
> >
> > IF(WIN32 AND NOT UNIX)
> >        SET(CPACK_GENERATOR "NSIS")
> >        INSTALL(
> >                        TARGETS BasicApp
> >                        DESTINATION bin
> >                         )
> >
> >        SET(OSG_DLL_DIR $ENV{OSG_ROOT}\\bin)
> >        FILE(TO_CMAKE_PATH ${OSG_DLL_DIR} OSG_DLL_DIR_CPATH)
> >        SET(CMAKE_INSTALL_DEBUG_LIBRARIES)
> >        INCLUDE(InstallRequiredSystemLibraries)
> >        SET(CPACK_PACKAGE_EXECUTABLES "BasicApp" "Basic App")
> >
> >        CONFIGURE_FILE(
> >                "${CMAKE_MODULE_PATH}/dependencies.cmake.in"
> >                "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake"
> >                @ONLY
> >        )
> >        INSTALL(CODE "set(input_file
> > \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/BasicApp.exe \")")
> >        INSTALL(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake")
> >
> >        SET(OSG_PLUGINS_DIR
> > "${OSG_DLL_DIR_CPATH}/osgPlugins-${OPENSCENEGRAPH_VERSION}")
> >        MESSAGE("Installing plugins from: ${OSG_PLUGINS_DIR}")
> >        # Extra plugin installs that the dependency checker can't find
> >        INSTALL(
> >                FILES "${OSG_PLUGINS_DIR}/osgdb_obj.dll"
> >                DESTINATION bin)
> >        # Install data that uses (at runtime) the plugin above
> >        INSTALL(FILES
> >              "${Dope_SOURCE_DIR}/data/models/clogo.obj"
> > "${Dope_SOURCE_DIR}/data/models/clogo.mtl"
> >      DESTINATION data/models)
> >
> >        # Create shortcuts usin NSIS commands
> >        SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS " CreateShortCut
> > '$INSTDIR\\\\shortcut.lnk' '$INSTDIR\\\\bin\\\\BasicApp.exe'  ")
> >
> >        # Install vc90 sp1 redist
> >        # windows update broke a lot of things so lets add an vcdist
> > dependant installer
> >        INSTALL(FILES
> >
>  "${Dope_SOURCE_DIR}/external/win32_vc9/win_extras/vcredist_x86.exe"
> >      DESTINATION win32_extras/)
> >
> >        SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait
> > '$INSTDIR\\\\win32_extras\\\\vcredist_x86.exe'")
> > ENDIF(WIN32 AND NOT UNIX)
> >
> >
> > # dependcies.cmake.in is:
> >
> > if(NOT DEFINED input_file)
> >  message(FATAL_ERROR "input file is not defined")
> > endif(NOT DEFINED input_file)
> > message("Using ${input_file}")
> > INCLUDE(GetPrerequisites)
> > GET_PREREQUISITES(${input_file} DEPENDENCIES 1 1 "" "")
> >
> > FOREACH(DEPENDENCY ${DEPENDENCIES})
> >        MESSAGE("DEPENDENCY: ${DEPENDENCY}")
> >        GET_FILENAME_COMPONENT(DEPENDENCY_NAME "${DEPENDENCY}" NAME)
> >        GET_FILENAME_COMPONENT(DEPENDENCY_ACTUAL "${DEPENDENCY}" REALPATH)
> >        MESSAGE("DEPENDENCY_NAME: ${DEPENDENCY_NAME}")
> >        MESSAGE("DEPENDENCY_ACTUAL: ${DEPENDENCY_ACTUAL}")
> >        FIND_FILE(${DEPENDENCY_NAME}_REAL_PATH ${DEPENDENCY_NAME} )
> >        MESSAGE("DEPENDENCY_REAL_PATH: ${${DEPENDENCY_NAME}_REAL_PATH}")
> >
> >        MESSAGE("installing into: ${CMAKE_INSTALL_PREFIX}/bin")
> >        FILE(COPY ${${DEPENDENCY_NAME}_REAL_PATH} DESTINATION
> > "${CMAKE_INSTALL_PREFIX}/bin")
> >        #INSTALL(FILES "${DEPENDENCY_REAL_PATH}" DESTINATION bin)
> > ENDFOREACH()
> >
> > On the mac, I don't have any working code yet. I feel that I am close,
> > but as it is, the code cannot load the right plugin
> >
> > IF (APPLE)
> >          SET(MACOSX_BUNDLE_INFO_STRING "MACOSX_BUNDLE_INFO_STRING")
> >          SET(MACOSX_BUNDLE_ICON_FILE "")
> >          SET(MACOSX_BUNDLE_GUI_IDENTIFIER "BasicAppGuiId")
> >          SET(MACOSX_BUNDLE_LONG_VERSION_STRING "long ver string")
> >          SET(MACOSX_BUNDLE_BUNDLE_NAME "BasicAPpBundleName")
> >          SET(MACOSX_BUNDLE_SHORT_VERSION_STRING "short ver")
> >
> >          # setup the bundle
> >          SET(BasicApp_BUNDLE_NAME "BasicApp")
> >          SET_TARGET_PROPERTIES(BasicApp PROPERTIES OUTPUT_NAME
> > ${BasicApp_BUNDLE_NAME})
> >          SET(BasicApp_BUNDLE_LOCATION "${CMAKE_INSTALL_PREFIX}")
> >          MESSAGE("ORIGINAL CMAKE_INSTALL_PREFIX:
> ${CMAKE_INSTALL_PREFIX}")
> >          # make sure CMAKE_INSTALL_PREFIX ends in /
> >          STRING(LENGTH "${CMAKE_INSTALL_PREFIX}" LEN)
> >          MATH(EXPR LEN "${LEN} -1" )
> >          STRING(SUBSTRING "${CMAKE_INSTALL_PREFIX}" ${LEN} 1 ENDCH)
> >          IF(NOT "${ENDCH}" STREQUAL "/")
> >                  SET(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/")
> >          ENDIF(NOT "${ENDCH}" STREQUAL "/")
> >          SET(CMAKE_INSTALL_PREFIX
> > "${CMAKE_INSTALL_PREFIX}${BasicApp_BUNDLE_NAME}.app/Contents")
> >
> >          MESSAGE("CHANGED CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
> >
> >          INSTALL(
> >                                TARGETS BasicApp
> >                                RUNTIME DESTINATION bin
> >                                BUNDLE DESTINATION "." )
> >
> >          INSTALL(FILES ${Dope_SOURCE_DIR}/ReadMe.txt DESTINATION "." )
> >
> >          SET(BasicAppFullPath
> "${CMAKE_INSTALL_PREFIX}/MacOS/${BasicApp_BUNDLE_NAME}")
> >          MESSAGE("BasicAppFullPath: ${BasicAppFullPath}")
> >
> >         # INSTALL(CODE "set(input_file
> \"/MacOS/${BasicApp_BUNDLE_NAME}\")")
> >         MESSAGE("INSTALL CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
> >         INSTALL(CODE "set(lib_path \"/usr/local/lib\")")
> >          INSTALL(CODE "set(input_file
> >
> \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BasicApp_BUNDLE_NAME}.app/Contents/MacOS/${BasicApp_BUNDLE_NAME}\")")
> >          INSTALL(SCRIPT
> > "${Dope_SOURCE_DIR}/CMakeModules/CMakeIngestOSXBundleLibraries.cmake")
> >
> >          INSTALL(FILES
> >              "${Dope_SOURCE_DIR}/data/models/clogo.obj"
> > "${Dope_SOURCE_DIR}/data/models/clogo.mtl"
> >          DESTINATION
> > "./${BasicApp_BUNDLE_NAME}.app/Contents/Resources/data/models/")
> >
> >        MESSAGE("OSG VERSION: ${OPENSCENEGRAPH_VERSION}")
> >
> >        SET(OSG_PLUGINS_DIR
> > "/usr/local/lib/osgPlugins-${OPENSCENEGRAPH_VERSION}")
> >      INSTALL(FILES
> >                     "${OSG_PLUGINS_DIR}/osgdb_obj.so"
> >          DESTINATION
> >
> "./${BasicApp_BUNDLE_NAME}.app/Contents/PlugIns/osgPlugins-${OPENSCENEGRAPH_VERSION}/")
> >
> >          SET(CPACK_GENERATOR "DragNDrop")
> >
> > ENDIF(APPLE)
> >
> > I tried to use code from the cmake 2.8 qt dialog working example
> > (among other things, the CMakeIngestOSXBundleLibraries.cmake comes
> > from there)
> >
> > Ok, first post over :)
> > /Filip
> >
> _______________________________________________
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20091125/b47fa2f6/attachment-0001.htm>


More information about the CMake mailing list