git-svn-id: svn://db.shs.com.ru/pip@975 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2020-03-24 17:57:13 +00:00
parent 4ee31c9106
commit d1294a43d2
3 changed files with 666 additions and 0 deletions

488
cmake/DeployMacros.cmake Normal file
View File

@@ -0,0 +1,488 @@
# set_version(<target> [MAJOR <value>] [MINOR <value>] [REVISION <value>] [SUFFIX <value>] [BUILD <value>] [OUTPUT <file>])
#
# Set target version, optionally creates file
#
# Create variable <target>_VERSION with full version name
#
# If OUTPUT then generate header <file> with
# version macros - <target>_VERSION_<NAME>
# Also create macro <target>_VERSION_NAME with full string version
# Attention: macro <target>_VERSION is byte-packed integer version!
#
#
#
#
# import_version(<target> <source_target>)
#
# Copy all version components from <source_target>
#
#
#
#
# set_deploy_property(<target> [SHARED | STATIC] NAME <value> [NAME <value> [...]])
#
# 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(<target> [DEPLOY_DIR <dir>] [DESTINATION <dir>] [RESOURCE_DIRS <dir> [<dir> ...]])
#
# DEPLOY_DIR - dir where you install
# * executable on Windows, Linux
# * <T>.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(<target> <rc_out_file>)
#
# Generate Windows *.rc file from deploy properties
# and return file path to <rc_out_file>
#
# 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 <winbase.h>
# else
# include <winver.h>
# 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};$<TARGET_FILE_DIR:${_L}>")
set(_DEP_LIBS_CS "${_DEP_LIBS_CS};$<TARGET_FILE_DIR:${_L}>/$<TARGET_FILE_NAME:${_L}>")
set(_DEP_LIBS "${_DEP_LIBS}" "$<TARGET_FILE_DIR:${_L}>/$<TARGET_FILE_NAME:${_L}>")
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()

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
<key>CFBundleGetInfoString</key>
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
<key>CFBundleIconFile</key>
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>CFBundleLongVersionString</key>
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleSignature</key>
<string>${MACOSX_BUNDLE_SIGNATURE}</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>
<string>True</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
</dict>
</plist>

136
cmake/TargetArch.cmake Normal file
View File

@@ -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()