From 20359572ed1e68b65c689ae84bc46321dc54a04e Mon Sep 17 00:00:00 2001 From: Kornel Benko Date: Sat, 13 Oct 2012 09:53:20 +0200 Subject: [PATCH] Patch from Benjamin Piwowarski Just some comments on the patch: - The executable name has to match the information in Info.plist (development/MacOSX/Info.plist.in and CMakeLists.txt). The autoconf config/lyxinclude.m4 file has been modified to make it work with autotools. - The process to build OS X bundle is to first add all the files to be included to the bundle when calling add_executable (src/CMakeLists.txt) and then by calling setting the source file property of each of these files (development/cmake/Install.cmake, l.14) so that the files are properly located into the bundle. This is also why Install.cmake has to be included two times in src/CMakeLists.txt (once to build the list of files, once to set the location of the list of files). - in CMakeLists.txt there is a line install(CODE "set(BU_CHMOD_BUNDLE_ITEMS 1)") What it does is to fix the owner permissions within the bundle - this is necessary because some libraries are copied within the bundle and might be owned by root - An empty qt.conf is included in the bundle so that QT does not try to link to other QT libraries (which will not be included in the bundle) - In development/cmake/Install.cmake, some OS X specific files (*.sdef, qt.conf, *.icns) have to be included in the bundle Benjamin --- CMakeLists.txt | 13 +++++++++++- config/lyxinclude.m4 | 2 ++ development/MacOSX/Info.plist.in | 2 +- development/cmake/Install.cmake | 35 +++++++++++++++++++++++++++++--- src/CMakeLists.txt | 9 +++++++- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 63baa9d4e6..f72032714f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,6 +278,11 @@ else() endif() +if(APPLE) + set(osx_bundle_program_name ${PACKAGE_BASE}${PROGRAM_SUFFIX}) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/development/MacOSX/Info.plist.in" "${CMAKE_CURRENT_BINARY_DIR}/Info.plist") +endif() + if(LYX_BUNDLE) set(LYX_CPACK ON) message(STATUS) @@ -287,12 +292,16 @@ if(LYX_BUNDLE) message(STATUS " make package") if(APPLE) set(LYX_BUILD_BUNDLE MACOSX_BUNDLE) + set(CPACK_BUNDLE_NAME ${PACKAGE_BASE}${PROGRAM_SUFFIX}) + set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist") set(LYX_DATA_SUBDIR ${PACKAGE_BASE}${PROGRAM_SUFFIX}.app/Contents/Resources/ CACHE STRING "Bundle Contents dir" FORCE) set(MACOSX_BUNDLE_STARTUP_COMMAND ${PACKAGE_BASE}${PROGRAM_SUFFIX}.app) if(NOT LYX_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/LyX CACHE PATH "Mac bundle dir" FORCE) set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) endif() + # Change the owner so that the install can work + install(CODE "set(BU_CHMOD_BUNDLE_ITEMS 1)") elseif(UNIX) message(STATUS "To embed Qt in this bundle don't build with your system Qt:") message(STATUS " - fix PATH so a other qmake is found by cmake") @@ -677,7 +686,9 @@ if(LYX_INSTALL) add_subdirectory(${LYX_CMAKE_DIR}/man "${TOP_BINARY_DIR}/man") add_subdirectory(${LYX_CMAKE_DIR}/doc "${TOP_BINARY_DIR}/doc") endif() - include(../Install) + if(NOT(LYX_BUNDLE AND APPLE)) + include(../Install) + endif() endif() add_subdirectory(sourcedoc "${TOP_BINARY_DIR}/sourcedoc") diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 299efbc6fb..e532c54d87 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -56,6 +56,7 @@ AC_ARG_WITH(version-suffix, AC_SUBST(version_suffix,$withval) RPM_VERSION_SUFFIX="--with-version-suffix=$withval"]) AC_SUBST(RPM_VERSION_SUFFIX) +AC_SUBST(program_base_name,"lyx") AC_MSG_RESULT([$withval]) ]) @@ -498,6 +499,7 @@ case $lyx_use_packaging in macosx) AC_DEFINE(USE_MACOSX_PACKAGING, 1, [Define to 1 if LyX should use a MacOS X application bundle file layout]) PACKAGE=LyX${version_suffix} default_prefix="/Applications/${PACKAGE}.app" + AC_SUBST(osx_bundle_program_name,"${program_base_name}") bindir='${prefix}/Contents/MacOS' libdir='${prefix}/Contents/Resources' datarootdir='${prefix}/Contents/Resources' diff --git a/development/MacOSX/Info.plist.in b/development/MacOSX/Info.plist.in index 7bbd2fc864..ab20084986 100644 --- a/development/MacOSX/Info.plist.in +++ b/development/MacOSX/Info.plist.in @@ -3,7 +3,7 @@ CFBundleExecutable - lyx + @osx_bundle_program_name@ CFBundleDocumentTypes diff --git a/development/cmake/Install.cmake b/development/cmake/Install.cmake index 2154bdc8e6..d2ff5eb77c 100755 --- a/development/cmake/Install.cmake +++ b/development/cmake/Install.cmake @@ -2,7 +2,21 @@ # TODO: set correct path in call to cmake # e.g. cmake /usr/src/lyx/lyx-devel/development/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/share/lyx2.0 -Dnls=1 -message(STATUS "Installing to ${CMAKE_INSTALL_PREFIX}, defined by CMAKE_INSTALL_PREFIX") +if(NOT(LYX_BUNDLE) AND APPLE) + message(STATUS "Installing to ${CMAKE_INSTALL_PREFIX}, defined by CMAKE_INSTALL_PREFIX") +endif() +set(OSX_BUNDLE_FILES "") + +# Install files into OS X bundle +macro(lyx_install_osx basedir files) + if(LYX_BUNDLE_PROPERTY_MODE STREQUAL "ON") + foreach(file ${files}) + set_source_files_properties("${file}" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/${basedir}") + endforeach() + else() + list(APPEND OSX_BUNDLE_FILES "${files}") + endif() +endmacro(lyx_install_osx) # the macro scans the directories "_parent_src_dir/_dir/_current_dir" for *._file_type files # and installs the files in CMAKE_INSTALL_PREFIX/_current_dir @@ -59,13 +73,21 @@ macro(lyx_install _parent_src_dir _gl_dir _file_type) endif() #message(STATUS "install ${LYX_DATA_SUBDIR}${_dir}/${_base_dir}: ${files_list} ") #message(STATUS "install at ${CMAKE_INSTALL_PREFIX}/${LYX_DATA_SUBDIR}${_dir}/${_base_dir}") - install(FILES ${files_list} DESTINATION ${LYX_DATA_SUBDIR}${_dir}/${_base_dir}) + if(APPLE) + lyx_install_osx("${_dir}/${_based_dir}" "${files_list}") + else() + install(FILES ${files_list} DESTINATION ${LYX_DATA_SUBDIR}${_dir}/${_base_dir}) + endif(APPLE) endif() if(program_list) if(_glob_dir STREQUAL ".") set(_base_dir .) endif() - install(PROGRAMS ${program_list} DESTINATION ${LYX_DATA_SUBDIR}${_dir}/${_base_dir}) + if(APPLE) + lyx_install_osx("${_dir}/${_based_dir}" "${program_list}") + else() + install(PROGRAMS ${program_list} DESTINATION ${LYX_DATA_SUBDIR}${_dir}/${_base_dir}) + endif(APPLE) endif() endforeach(_current_dir) endforeach(_glob_dir) @@ -99,6 +121,13 @@ lyx_install(${TOP_SRC_DIR}/lib tex * .) lyx_install(${TOP_SRC_DIR}/lib ui * .) lyx_install(${TOP_SRC_DIR}/lib . * .) +# Install +if(APPLE) + lyx_install(${TOP_SRC_DIR}/development/MacOSX . *.sdef .) + lyx_install(${TOP_SRC_DIR}/development/MacOSX . *.icns .) + lyx_install(${TOP_SRC_DIR}/development/MacOSX . qt.conf .) +endif() + install(PROGRAMS ${TOP_SRC_DIR}/lib/scripts/listerrors DESTINATION scripts) if(UNIX) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index efa8d01d50..5862136f01 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,7 @@ # Copyright (c) 2006-2011 Peter Kümmel, # -set(_lyx ${PACKAGE_BASE}${PROGRAM_SUFFIX}) +set(_lyx "${PACKAGE_BASE}${PROGRAM_SUFFIX}") project(${_lyx}) include_directories(${TOP_SRC_DIR}/src) @@ -100,6 +100,9 @@ lyx_find_info_files(LyXCMakeFiles ${TOP_SRC_DIR}/development/cmake/*.msvc) lyx_find_info_files(LyXCMakeFiles ${TOP_SRC_DIR}/development/cmake/modules/*) lyx_find_info_files(LyXUiFiles ${TOP_SRC_DIR}/lib/ui/*) +if (APPLE AND LYX_BUNDLE) + include(../Install) +endif() add_executable(${_lyx} ${WIN32_CONSOLE} @@ -110,6 +113,7 @@ add_executable(${_lyx} ${FILE_RC} ${lyx_info_files} ${lyx_cmake_files} + ${OSX_BUNDLE_FILES} ) @@ -165,7 +169,10 @@ if(LYX_BUNDLE) if(NOT APPLE) set(installed_lyx ${CMAKE_INSTALL_PREFIX}/bin/${_lyx}${CMAKE_EXECUTABLE_SUFFIX}) else() + set_target_properties(${_lyx} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_BINARY_DIR}/../Info.plist") set(installed_lyx ${CMAKE_INSTALL_PREFIX}/${_lyx}.app) + set(LYX_BUNDLE_PROPERTY_MODE "ON") + include("../Install") endif() install(CODE "include(BundleUtilities) fixup_bundle(\"${installed_lyx}\" \"\" \"\") " COMPONENT RUNTIME)