From d1294a43d26f63a4e5f6a249bbb5cec4dbe1d130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 24 Mar 2020 17:57:13 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@975 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- cmake/DeployMacros.cmake | 488 +++++++++++++++++++++++++++++++++++ cmake/PIMacOSBundle.plist.in | 42 +++ cmake/TargetArch.cmake | 136 ++++++++++ 3 files changed, 666 insertions(+) create mode 100644 cmake/DeployMacros.cmake create mode 100644 cmake/PIMacOSBundle.plist.in create mode 100644 cmake/TargetArch.cmake diff --git a/cmake/DeployMacros.cmake b/cmake/DeployMacros.cmake new file mode 100644 index 00000000..9c5dbfd6 --- /dev/null +++ b/cmake/DeployMacros.cmake @@ -0,0 +1,488 @@ +# set_version( [MAJOR ] [MINOR ] [REVISION ] [SUFFIX ] [BUILD ] [OUTPUT ]) +# +# Set target version, optionally creates file +# +# Create variable _VERSION with full version name +# +# If OUTPUT then generate header with +# version macros - _VERSION_ +# Also create macro _VERSION_NAME with full string version +# Attention: macro _VERSION is byte-packed integer version! +# +# +# +# +# import_version( ) +# +# Copy all version components from +# +# +# +# +# set_deploy_property( [SHARED | STATIC] NAME [NAME [...]]) +# +# Set target deploy property, where NAME one of: +# * LABEL - application icon name +# * FULLNAME - package name in format "*.*.*" +# * COMPANY - company name +# * ICON - icon file +# * INFO - additional info +# +# Specify SHARED or STATIC if your target is library +# You can setup several properties in one command +# +# +# +# +# deploy_target( [DEPLOY_DIR ] [DESTINATION ] [RESOURCE_DIRS [ ...]]) +# +# DEPLOY_DIR - dir where you install +# * executable on Windows, Linux +# * .app directory with executable on MacOS +# +# DESTINATION - dir where macro place package +# +# Example: +# deploy_target(my_app DESTINATION packages) +# +# Create make target "deploy" +# +# This macro use "deploy_tool" from sdk, +# make sure it can be executed from shell +# You should set deploy properties before +# call this macro, see "set_deploy_property()" +# +# use "CMAKE_OTOOL" or "CMAKE_OBJDUMP" variable, +# depends on target platform +# can use "DEPLOY_ADD_LIBPATH" variable as additional +# library search path +# +# +# +# +# make_rc( ) +# +# Generate Windows *.rc file from deploy properties +# and return file path to +# +# You should set deploy properties before +# call this macro, see "set_deploy_property()" +# +# + + +if (POLICY CMP0057) + cmake_policy(SET CMP0057 NEW) # Support if() IN_LIST +endif() +set(__prop_names "LABEL;FULLNAME;COMPANY;ICON;INFO") +set(__version_names "MAJOR;MINOR;REVISION;BUILD;SUFFIX") +include(TargetArch) +if (NOT MY_ARCH) + target_architecture(MY_ARCH) +endif() + + +macro(set_version _T) + set(_name) + set(_is_name 1) + set(_is_out 0) + set(_out) + foreach(_i ${ARGN}) + if (_is_out) + set(_is_out 0) + set(_out "${_i}") + elseif ("x${_i}" STREQUAL "xOUTPUT") + set(_is_out 1) + elseif(_is_name) + set(_is_name 0) + if (_i IN_LIST __version_names) + else() + message(FATAL_ERROR "Invalid version component \"${_i}\"!") + endif() + set(_name ${_i}) + else() + set(_is_name 1) + set(${_T}_VERSION_${_name} ${_i}) + endif() + endforeach() + set(${_T}_VERSION_FULLSUFFIX "${${_T}_VERSION_SUFFIX}") + if (NOT ("x${${_T}_VERSION_FULLSUFFIX}" STREQUAL "x")) + if(NOT ("${${_T}_VERSION_FULLSUFFIX}" MATCHES "_.*")) + set(${_T}_VERSION_FULLSUFFIX "_${${_T}_VERSION_FULLSUFFIX}") + endif() + endif() + if ("x${${_T}_VERSION_MAJOR}" STREQUAL "x") + set(${_T}_VERSION_MAJOR "0") + endif() + if ("x${${_T}_VERSION_MINOR}" STREQUAL "x") + set(${_T}_VERSION_MINOR "0") + endif() + if ("x${${_T}_VERSION_REVISION}" STREQUAL "x") + set(${_T}_VERSION_REVISION "0") + endif() + if ("x${${_T}_VERSION_BUILD}" STREQUAL "x") + set(${_T}_VERSION_BUILD "0") + endif() + set(${_T}_VERSION "${${_T}_VERSION_MAJOR}.${${_T}_VERSION_MINOR}.${${_T}_VERSION_REVISION}${${_T}_VERSION_FULLSUFFIX}") + set(_${_T}_VERSION_WB "${${_T}_VERSION}-${${_T}_VERSION_BUILD}") + if (_out) + set(_${_T}_VERSION_CHANGED 0) + if ((NOT _${_T}_CACHED_VERSION) OR (NOT ("x${_${_T}_CACHED_VERSION}" STREQUAL "x${_${_T}_VERSION_WB}"))) + set(_${_T}_CACHED_VERSION "${_${_T}_VERSION_WB}" CACHE STRING "" FORCE) + set(_${_T}_VERSION_CHANGED 1) + endif() + if ((NOT EXISTS "${_out}") OR _${_T}_VERSION_CHANGED) + get_filename_component(_def "${_out}" NAME) + string(MAKE_C_IDENTIFIER "${_T}_${_def}" _def) + string(TOUPPER "${_def}" _def) + string(TOUPPER "${_T}" _TN) + file(WRITE "${_out}" +"// This file generated by CMake set_version() + +#ifndef ${_def} +#define ${_def} + +#define ${_TN}_VERSION_MAJOR ${${_T}_VERSION_MAJOR} +#define ${_TN}_VERSION_MINOR ${${_T}_VERSION_MINOR} +#define ${_TN}_VERSION_REVISION ${${_T}_VERSION_REVISION} +#define ${_TN}_VERSION_BUILD ${${_T}_VERSION_BUILD} +#define ${_TN}_VERSION_SUFFIX \"${${_T}_VERSION_SUFFIX}\" +#define ${_TN}_VERSION_NAME \"${${_T}_VERSION}\" +#define ${_TN}_VERSION ((${_TN}_VERSION_MAJOR << 16) | (${_TN}_VERSION_MINOR < 8) | ${_TN}_VERSION_REVISION) + +#endif // ${_def} +") + endif() + endif() +endmacro() + + +macro(import_version _T _F) + set(_names "${__version_names};FULLSUFFIX") + foreach(_i ${_names}) + set(${_T}_VERSION_${_i} "${${_F}_VERSION_${_i}}") + endforeach() + set(${_T}_VERSION "${${_F}_VERSION}") +endmacro() + + +macro(set_deploy_property _T) + set(_name) + set(_is_name 1) + foreach(_i ${ARGN}) + if (("x${_i}" STREQUAL "xSHARED") OR ("x${_i}" STREQUAL "xSTATIC")) + set(${_T}_TYPE "${_i}") + elseif(_is_name) + set(_is_name 0) + if (_i IN_LIST __prop_names) + else() + message(FATAL_ERROR "Invalid property name \"${_i}\"!") + endif() + set(_name ${_i}) + else() + set(_is_name 1) + set(${_T}_${_name} ${_i}) + endif() + endforeach() +endmacro() + + +macro(make_rc _T _out) + if (WIN32) + if ("x${${_T}_VERSION_MAJOR}" STREQUAL "x") + message(FATAL_ERROR "Version for \"${_T}\" not set, use set_version()!") + endif() + set(WINDOWS_RC_FULLNAME "${${_T}_FULLNAME}") + set(WINDOWS_RC_VERSION "${${_T}_VERSION}") + set(WINDOWS_RC_LABEL "${${_T}_LABEL}") + set(WINDOWS_RC_COMPANY "${${_T}_COMPANY}") + set(WINDOWS_RC_INFO "${${_T}_INFO}") + if (("x${${_T}_TYPE}" STREQUAL "x") OR ("x${${_T}_TYPE}" STREQUAL "xEXECUTABLE")) + set(WINDOWS_RC_FILETYPE "0x1L") + set(_rc_prefix "") + set(_rc_ext "exe") + elseif ("x${${_T}_TYPE}" STREQUAL "xSHARED") + set(WINDOWS_RC_FILETYPE "0x2L") + set(_rc_prefix "lib") + set(_rc_ext "dll") + elseif ("x${${_T}_TYPE}" STREQUAL "xSTATIC") + set(WINDOWS_RC_FILETYPE "0x7L") + set(_rc_prefix "lib") + set(_rc_ext "a") + endif() + set(_rc_version "${${_T}_VERSION_MAJOR},${${_T}_VERSION_MINOR},${${_T}_VERSION_REVISION},${${_T}_VERSION_BUILD}") + set(_icon) + if (NOT ("x${${_T}_ICON}" STREQUAL "x")) + get_filename_component(WINDOWS_RC_ICON "${${_T}_ICON}" REALPATH BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + set(_icon "1 ICON \"${WINDOWS_RC_ICON}\"") + endif() + set(_rc_file "${CMAKE_CURRENT_BINARY_DIR}/${_T}_winres.rc") + file(WRITE "${_rc_file}" +"# if defined(UNDER_CE) +# include +# else +# include +# endif +#pragma code_page(65001) +${_icon} +VS_VERSION_INFO VERSIONINFO +FILEVERSION ${_rc_version} +PRODUCTVERSION ${_rc_version} +FILEFLAGSMASK 0x3fL +FILEFLAGS 0x0L +FILEOS 0x40004L +FILETYPE ${WINDOWS_RC_FILETYPE} +FILESUBTYPE 0x0L +BEGIN +BLOCK \"StringFileInfo\" +BEGIN +BLOCK \"041904B0\" +BEGIN +VALUE \"Comments\", \"\\0\" +VALUE \"CompanyName\", \"${WINDOWS_RC_COMPANY}\\0\" +VALUE \"FileDescription\", \"${WINDOWS_RC_INFO}\\0\" +VALUE \"FileVersion\", \"${WINDOWS_RC_VERSION}\\0\" +VALUE \"InternalName\", \"${WINDOWS_RC_FULLNAME}\\0\" +VALUE \"LegalTrademarks\", \"\\0\" +VALUE \"LegalCopyright\", \"${WINDOWS_RC_COMPANY}\\0\" +VALUE \"OriginalFilename\", \"${_rc_prefix}${_T}.${_rc_ext}\\0\" +VALUE \"ProductName\", \"${WINDOWS_RC_LABEL}\\0\" +VALUE \"ProductVersion\", \"${WINDOWS_RC_VERSION}\\0\" +END +END +BLOCK \"VarFileInfo\" +BEGIN +VALUE \"Translation\", 0x0419, 0x04B0, 0x0409, 0x04B0 +END +END +") + set(${_out} ${_rc_file}) + else() + set(${_out}) + endif() +endmacro() + + +macro(deploy_target _T) + set(_DESTINATION "${CMAKE_INSTALL_PREFIX}") + set(_DEPLOY_DIR "${CMAKE_INSTALL_PREFIX}") + set(_RES_DIRS) + set(_is_dest 0) + set(_is_deploy_dir 0) + set(_is_res_dirs 0) + foreach(_i ${ARGN}) + if (_is_dest) + set(_is_dest 0) + set(_DESTINATION "${_i}/") + elseif (_is_deploy_dir) + set(_is_deploy_dir 0) + set(_DEPLOY_DIR "${_i}/") + elseif (_is_res_dirs) + if (IS_ABSOLUTE "${_i}") + list(APPEND _RES_DIRS "${_i}") + else() + list(APPEND _RES_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/${_i}") + endif() + else() + if ("x${_i}" STREQUAL "xDESTINATION") + set(_is_dest 1) + elseif ("x${_i}" STREQUAL "xDEPLOY_DIR") + set(_is_deploy_dir 1) + elseif ("x${_i}" STREQUAL "xRESOURCE_DIRS") + set(_is_res_dirs 1) + endif() + endif() + #message("-i = ${_i}") + endforeach() + get_filename_component(_ICON_NAME "${${_T}_ICON}" NAME) + get_filename_component(_ICON_FN "${${_T}_ICON}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(_TV "${_T}_${${_T}_VERSION}") + set(_DEP_LIBPATH) + set(_DEP_LIBS_CS) + set(_DEP_LIBS) + get_target_property(_LL ${_T} LINK_LIBRARIES) + foreach (_L ${_LL}) + if (TARGET ${_L}) + get_target_property(_II ${_L} IMPORTED) + if (NOT _II) + #message("depend on ${_L}") + get_target_property(_LT ${_L} TYPE) + if ("x${_LT}" STREQUAL "xSHARED_LIBRARY") + set(_DEP_LIBPATH "${_DEP_LIBPATH};$") + set(_DEP_LIBS_CS "${_DEP_LIBS_CS};$/$") + set(_DEP_LIBS "${_DEP_LIBS}" "$/$") + endif() + endif() + endif() + endforeach() + #message("app depend libpath ${_DEP_LIBPATH}") + set(_CMD_RES) + if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux") + if (NOT CMAKE_LDD) + find_program(CMAKE_LDD ldd) + endif() + string(REPLACE "_" "-" _DEBNAME "${_T}") + set(_DEB_ARCH) + if("_${MY_ARCH}" STREQUAL "_arm64") + set(_DEB_ARCH "arm64") + elseif("_${MY_ARCH}" STREQUAL "_armv7") + set(_DEB_ARCH "armhf") + elseif("_${MY_ARCH}" STREQUAL "_i386") + set(_DEB_ARCH "i386") + elseif("_${MY_ARCH}" STREQUAL "_x86_64") + set(_DEB_ARCH "amd64") + elseif("_${MY_ARCH}" STREQUAL "_ppc") + set(_DEB_ARCH "PowerPC") + elseif("_${MY_ARCH}" STREQUAL "_ppc64") + set(_DEB_ARCH "PPC64") + elseif("_${MY_ARCH}" STREQUAL "_ia64") + set(_DEB_ARCH "ia64") + endif() + set(_DEB "${_TV}_deb_${_DEB_ARCH}") + set(_AGD "${_DEPLOY_DIR}/${_DEB}") + set(_C_echof ">" "${_AGD}/DEBIAN/control") + set(_C_echo ">>" "${_AGD}/DEBIAN/control") + set(_D_echof ">" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop") + set(_D_echo ">>" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop") + foreach(_r ${_RES_DIRS}) + set(_CMD_RES ${_CMD_RES} COMMAND cp -r "${_r}" "${_AGD}/usr/share/${${_T}_COMPANY}") + endforeach() + set(_CMD_COPY) + if (_DEP_LIBS) + set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_DEP_LIBS} ${_AGD}/usr/lib) + endif() + if (_ICON_NAME) + set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_ICON_FN} ${_AGD}/usr/share/pixmaps) + endif() + add_custom_target(deploy + # gather deb dir + COMMAND mkdir -p ${_AGD}/DEBIAN + COMMAND mkdir -p ${_AGD}/usr/bin + COMMAND mkdir -p ${_AGD}/usr/lib + COMMAND mkdir -p ${_AGD}/usr/share/${${_T}_COMPANY} + COMMAND mkdir -p ${_AGD}/usr/share/pixmaps + COMMAND mkdir -p ${_AGD}/usr/share/applications + COMMAND cp -f ${_DEPLOY_DIR}/${_T} ${_AGD}/usr/bin + ${_CMD_COPY} + ${_CMD_RES} + + COMMAND echo "Package: ${_DEBNAME}" ${_C_echof} + COMMAND echo "Version: ${${_T}_VERSION}" ${_C_echo} + COMMAND echo "Architecture: ${_DEB_ARCH}" ${_C_echo} + COMMAND echo "Maintainer: ${${_T}_COMPANY} <>" ${_C_echo} + COMMAND deploy_tool --prefix "Depends: " --dependencies -l ${CMAKE_LDD} ${_DEPLOY_DIR}/${_T} -a "${_DEP_LIBS_CS}" -o "${_AGD}/usr/lib" ${_C_echo} + COMMAND echo "Conflicts:" ${_C_echo} + COMMAND echo "Replaces:" ${_C_echo} + COMMAND echo "Section: misc" ${_C_echo} + COMMAND echo "Priority: optional" ${_C_echo} + COMMAND echo "Description: ${${_T}_INFO}" ${_C_echo} + + COMMAND echo "[Desktop Entry]" ${_D_echof} + COMMAND echo "Encoding=UTF-8" ${_D_echo} + COMMAND echo "Type=Application" ${_D_echo} + COMMAND echo "Name=${${_T}_LABEL}" ${_D_echo} + COMMAND echo "GenericName=${${_T}_LABEL}" ${_D_echo} + COMMAND echo "Comment=${${_T}_INFO}" ${_D_echo} + COMMAND echo "Exec=/usr/bin/${_T}" ${_D_echo} + COMMAND echo "Icon=/usr/share/pixmaps/${_ICON_NAME}" ${_D_echo} + COMMAND echo "Terminal=false" ${_D_echo} + COMMAND echo "StartupNotify=true" ${_D_echo} + #COMMAND echo "X-KDE-StartupNotify=true" ${_D_echo} + COMMAND echo "Categories=Utility;" ${_D_echo} + + #COMMAND -l "${CMAKE_LDD}" -P xcb -q ${Qt5_ROOT} -s "\"${CMAKE_PREFIX_PATH}/lib;${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD}/usr/lib -p ${_AGD}/usr/ ${_AGD}/Contents/MacOS/${_T} + # generate deb + COMMAND cd ${_AGD} "&&" md5deep -rl usr ">" DEBIAN/md5sums + COMMAND mkdir -p ${_DESTINATION} + COMMAND dpkg-deb -b ${_AGD} ${_DESTINATION}/${_TV}_${_DEB_ARCH}.deb + VERBATIM + COMMENT "Generating ${_TV}_${_DEB_ARCH}.deb" + ) + elseif(WIN32) + if (NOT CMAKE_OBJDUMP) + find_program(CMAKE_OBJDUMP objdump) + endif() + set(_AGD "${_DEPLOY_DIR}/${_TV}_win_${MY_ARCH}/") + set(_SEP "/") + set(_COPY "cp" "-rf") + set(_COPY_SUFFIX) + set(_MKDIR mkdir -p "${_AGD}") + set(_MKDIR_P mkdir -p "${_DESTINATION}") + if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows") + set(_SEP "\\") + set(_COPY xcopy "/y" "/r") + set(_COPY_SUFFIX "1>" "NUL") + file(TO_NATIVE_PATH "${_AGD}" _AGD) + file(TO_NATIVE_PATH "${_DEPLOY_DIR}/" _DEPLOY_DIR) + string(REPLACE "/" "\\" _AGD "${_AGD}") + string(REPLACE "/" "\\" _DEPLOY_DIR "${_DEPLOY_DIR}") + string(REPLACE "/" "\\" CMAKE_OBJDUMP "${CMAKE_OBJDUMP}") + set(_MKDIR if not exist "\"${_AGD}\"" mkdir "\"${_AGD}\"") + set(_MKDIR_P if not exist "\"${_DESTINATION}\"" mkdir "\"${_DESTINATION}\"") + endif() + foreach(_r ${_RES_DIRS}) + get_filename_component(_dirname "${_r}" NAME) + file(TO_NATIVE_PATH "${_r}/" _wr) + if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows") + set(_CMD_RES ${_CMD_RES} COMMAND if not exist "\"${_AGD}${_dirname}\"" mkdir "\"${_AGD}${_dirname}\"") + string(REPLACE "/" "\\" _wr "${_wr}") + else() + set(_CMD_RES ${_CMD_RES} COMMAND mkdir -p "${_AGD}${_dirname}") + endif() + set(_CMD_RES ${_CMD_RES} COMMAND ${_COPY} "${_wr}*" "\"${_AGD}${_dirname}${_SEP}\"" ${_COPY_SUFFIX}) + endforeach() + add_custom_target(deploy + # gather dir + COMMAND ${_MKDIR} + COMMAND ${_MKDIR_P} + COMMAND ${_COPY} "\"${_DEPLOY_DIR}${_T}.exe\"" "\"${_AGD}\"" ${_COPY_SUFFIX} + #COMMAND ${_COPY} "${_DEPLOY_DIR}lang${_SEP}*" "\"${_AGD}lang${_SEP}\"" ${_COPY_SUFFIX} + ${_CMD_RES} + + COMMAND deploy_tool -W "\"${CMAKE_OBJDUMP}\"" -P windows -S windows -q "\"${Qt5_ROOT}\"" -s "\"${CMAKE_PREFIX_PATH}/bin;${MINGW_BIN};${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD} -p ${_AGD} "\"${_AGD}${_T}.exe\"" + # zip + COMMAND cd "\"${_DEPLOY_DIR}\"" "&&" zip -r "\"${_DESTINATION}/${_TV}.zip\"" "\"${_TV}_win_${MY_ARCH}\"" + COMMENT "Generating ${_TV}.zip" + ) + elseif (APPLE) + set(MACOSX_BUNDLE_GUI_IDENTIFIER "${${_T}_FULLNAME}") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${${_T}_VERSION}") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "${${_T}_VERSION}") + set(MACOSX_BUNDLE_ICON_FILE "${_ICON_NAME}") + set(MACOSX_BUNDLE_BUNDLE_NAME "${${_T}_LABEL}") + set(MACOSX_BUNDLE_COPYRIGHT "${${_T}_COMPANY}") + set(MACOSX_BUNDLE_INFO_STRING "${${_T}_INFO}") + set(MACOSX_BUNDLE_BUNDLE_VERSION "6.0") + set(MACOSX_BUNDLE_SIGNATURE "????") + set_target_properties(${_T} PROPERTIES MACOSX_BUNDLE TRUE) + set_target_properties(${_T} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_ROOT}/Modules/PIMacOSBundle.plist.in") + set(_AGD "${_DEPLOY_DIR}/${_T}.app") + set(_DMG "${CMAKE_CURRENT_BINARY_DIR}/dmg") + set(_CMD_COPY) + if (_ICON_NAME) + set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_ICON_FN} ${_AGD}/Contents/Resources) + endif() + foreach(_r ${_RES_DIRS}) + set(_CMD_RES ${_CMD_RES} COMMAND cp -r "${_r}" "${_AGD}/Contents/Resources") + endforeach() + add_custom_target(deploy + # gather .app dir + COMMAND mkdir -p ${_AGD}/Contents/Resources + COMMAND mkdir -p ${_AGD}/Contents/Frameworks + COMMAND mkdir -p ${_DESTINATION} + ${_CMD_COPY} + ${_CMD_RES} + #COMMAND cp ${_ICON_FN} ${_AGD}/Contents/Resources + #COMMAND cp -r ${_DEPLOY_DIR}/lang ${_AGD}/Contents/Resources + COMMAND deploy_tool -M "${CMAKE_OTOOL}" -P cocoa -S mac -q ${Qt5_ROOT} -s "\"${CMAKE_PREFIX_PATH}/lib;${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD}/Contents/Frameworks -p ${_AGD}/Contents/PlugIns ${_AGD}/Contents/MacOS/${_T} + # prepare dmg dir + COMMAND rm -rf ${_DMG} + COMMAND mkdir -p ${_DMG} + COMMAND cp -r ${_AGD} ${_DMG} + COMMAND ln --symbolic /Applications ${_DMG} + # generate dmg + COMMAND genisoimage -quiet -V "${MACOSX_BUNDLE_BUNDLE_NAME}" -D -R -apple -no-pad -o ${_DESTINATION}/${_TV}.dmg ${_DMG} + COMMENT "Generating ${_TV}.dmg" + ) + endif() +endmacro() diff --git a/cmake/PIMacOSBundle.plist.in b/cmake/PIMacOSBundle.plist.in new file mode 100644 index 00000000..f25d84c3 --- /dev/null +++ b/cmake/PIMacOSBundle.plist.in @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + ${MACOSX_BUNDLE_INFO_STRING} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CFBundleLongVersionString + ${MACOSX_BUNDLE_LONG_VERSION_STRING} + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleSignature + ${MACOSX_BUNDLE_SIGNATURE} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CSResourcesFileMapped + + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + NSSupportsAutomaticTermination + + NSSupportsSuddenTermination + + + diff --git a/cmake/TargetArch.cmake b/cmake/TargetArch.cmake new file mode 100644 index 00000000..2e9136dc --- /dev/null +++ b/cmake/TargetArch.cmake @@ -0,0 +1,136 @@ +# Based on the Qt 5 processor detection code, so should be very accurate +# https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h +# Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64) + +# Regarding POWER/PowerPC, just as is noted in the Qt source, +# "There are many more known variants/revisions that we do not handle/detect." + +set(archdetect_c_code " +#if defined(__aarch64__) + #error cmake_ARCH arm64 +#elif defined(__arm__) || defined(__TARGET_ARCH_ARM) + #if defined(__ARM_ARCH_7__) \\ + || defined(__ARM_ARCH_7A__) \\ + || defined(__ARM_ARCH_7R__) \\ + || defined(__ARM_ARCH_7M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) + #error cmake_ARCH armv7 + #elif defined(__ARM_ARCH_6__) \\ + || defined(__ARM_ARCH_6J__) \\ + || defined(__ARM_ARCH_6T2__) \\ + || defined(__ARM_ARCH_6Z__) \\ + || defined(__ARM_ARCH_6K__) \\ + || defined(__ARM_ARCH_6ZK__) \\ + || defined(__ARM_ARCH_6M__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) + #error cmake_ARCH armv6 + #elif defined(__ARM_ARCH_5TEJ__) \\ + || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) + #error cmake_ARCH armv5 + #else + #error cmake_ARCH arm + #endif +#elif defined(__i386) || defined(__i386__) || defined(_M_IX86) + #error cmake_ARCH i386 +#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) + #error cmake_ARCH x86_64 +#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) + #error cmake_ARCH ia64 +#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ + || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ + || defined(_M_MPPC) || defined(_M_PPC) + #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) + #error cmake_ARCH ppc64 + #else + #error cmake_ARCH ppc + #endif +#endif + +#error cmake_ARCH unknown +") + +# Set ppc_support to TRUE before including this file or ppc and ppc64 +# will be treated as invalid architectures since they are no longer supported by Apple + +function(target_architecture output_var) + if(APPLE AND CMAKE_OSX_ARCHITECTURES) + # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set + # First let's normalize the order of the values + + # Note that it's not possible to compile PowerPC applications if you are using + # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we + # disable it by default + # See this page for more information: + # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4 + + # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime. + # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. + + foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) + if("${osx_arch}" STREQUAL "ppc" AND ppc_support) + set(osx_arch_ppc TRUE) + elseif("${osx_arch}" STREQUAL "i386") + set(osx_arch_i386 TRUE) + elseif("${osx_arch}" STREQUAL "x86_64") + set(osx_arch_x86_64 TRUE) + elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support) + set(osx_arch_ppc64 TRUE) + else() + message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") + endif() + endforeach() + + # Now add all the architectures in our normalized order + if(osx_arch_ppc) + list(APPEND ARCH ppc) + endif() + + if(osx_arch_i386) + list(APPEND ARCH i386) + endif() + + if(osx_arch_x86_64) + list(APPEND ARCH x86_64) + endif() + + if(osx_arch_ppc64) + list(APPEND ARCH ppc64) + endif() + else() + file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}") + + enable_language(C) + + # Detect the architecture in a rather creative way... + # This compiles a small C program which is a series of ifdefs that selects a + # particular #error preprocessor directive whose message string contains the + # target architecture. The program will always fail to compile (both because + # file is not a valid C program, and obviously because of the presence of the + # #error preprocessor directives... but by exploiting the preprocessor in this + # way, we can detect the correct target architecture even when cross-compiling, + # since the program itself never needs to be run (only the compiler/preprocessor) + try_run( + run_result_unused + compile_result_unused + "${CMAKE_BINARY_DIR}" + "${CMAKE_BINARY_DIR}/arch.c" + COMPILE_OUTPUT_VARIABLE ARCH + CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} + ) + + # Parse the architecture name from the compiler output + string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") + + # Get rid of the value marker leaving just the architecture name + string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") + + # If we are compiling with an unknown architecture this variable should + # already be set to "unknown" but in the case that it's empty (i.e. due + # to a typo in the code), then set it to unknown + if (NOT ARCH) + set(ARCH unknown) + endif() + endif() + + set(${output_var} "${ARCH}" PARENT_SCOPE) +endfunction()