From b0a87caa11ee722202b3bbdf08c3296fab243a20 Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 16 Aug 2021 22:29:55 +0300 Subject: [PATCH] DeployMacros ADD_MANIFEST feature small decomposition --- DeployMacros.cmake | 311 ++++++++------------------------------ DeployTarget.manifest.in | 9 ++ DeployVersionMacros.cmake | 239 +++++++++++++++++++++++++++++ 3 files changed, 310 insertions(+), 249 deletions(-) create mode 100644 DeployTarget.manifest.in create mode 100644 DeployVersionMacros.cmake diff --git a/DeployMacros.cmake b/DeployMacros.cmake index 942bcdd..937dbf8 100644 --- a/DeployMacros.cmake +++ b/DeployMacros.cmake @@ -80,7 +80,9 @@ deploy_target( [DEPLOY_DIR ] [OPTIONS ...] [VERBOSE] [DMG_NO_ZIP] - [DEB_USR_DIR] [DEB_ADD_SERVICE]) + [DEB_USR_DIR] + [DEB_ADD_SERVICE] + [ADD_MANIFEST]) Create make target "deploy_", depends on target "deploy". On this target create release package, containing all dependencies: @@ -145,8 +147,10 @@ This package use contents of CMAKE_CURRENT_SOURCE_DIR/debian-service directory: .service file placed in /opt/FULLNAME, you should copy it to system with script You can use "postinst,postrm,preinst,prerm,config" files to configure service -]] +If ADD_MANIFEST then *.manifest file near package will be created. +This file contains all metainformation about package. +]] cmake_policy(SET CMP0011 NEW) # don`t affect includer policies if (POLICY CMP0057) @@ -155,246 +159,21 @@ endif() if (POLICY CMP0053) cmake_policy(SET CMP0053 NEW) endif() -set(__prop_names "LABEL;FULLNAME;COMPANY;ICON;INFO") -list(APPEND __prop_names "ANDROID_TARGET_SDK;ANDROID_STORE_FILE;ANDROID_STORE_PASSWORD;ANDROID_KEY_PASSWORD;ANDROID_KEY_ALIAS;ANDROID_NEW_LOADER") -set(__version_names "MAJOR;MINOR;REVISION;BUILD;SUFFIX") -include(TargetArch) -if (NOT MY_ARCH) - target_architecture(MY_ARCH) -endif() + if (NOT _dep_exists AND NOT PIP_FREERTOS) set(_dep_exists 1) add_custom_target(deploy COMMENT "Deploy") endif() set(_modules_dir "${CMAKE_ROOT}/Modules") -if (LIBPROJECT) - set(_modules_dir ${PIP_CMAKE_MODULE_PATH}) +if (DEFINED SHSTKPROJECT) + set(_modules_dir "${ROOT_DIR}/cmake") endif() set(_dt_delim "::") - -macro(set_version _T) - set(_VERSION_ 2) # macro version - set(_name) - set(_is_name 1) - set(_is_out 0) - set(_out) - #message("set_version \"${_T}\"") - 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) - #message("set_version component \"${_i}\"") - set(_is_name 0) - if (_i IN_LIST __version_names) - else() - message(FATAL_ERROR "Invalid version component \"${_i}\"!") - endif() - set(_name ${_i}) - set(${_T}_VERSION_${_name}) - else() - #message("set_version value \"${_name}\" = \"${_i}\"") - 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 _${_T}_CACHED_VERSION_VER) OR (NOT ("x${_${_T}_CACHED_VERSION_VER}" STREQUAL "x${_VERSION_}"))) - set(_${_T}_CACHED_VERSION_VER "${_VERSION_}" 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) - string(TIMESTAMP _cur_date "%d.%m.%Y %H:%M") - file(WRITE "${_out}" -"// This file generated by CMake set_version() version ${_VERSION_} - -#ifndef ${_def} -#define ${_def} - - -// Project - -#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}_MAKE_VERSION(major, minor, revision) ((major << 16) | (minor << 8) | revision) -#define ${_TN}_VERSION ${_TN}_MAKE_VERSION(${_TN}_VERSION_MAJOR, ${_TN}_VERSION_MINOR, ${_TN}_VERSION_REVISION) - - -// Tools - -#define ${_TN}_CMAKE_VERSION \"${CMAKE_VERSION}\" -#define ${_TN}_CXX_COMPILER \"${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}\" -#define ${_TN}_BUILD_DATE \"${_cur_date}\" -#define ${_TN}_ARCH \"${MY_ARCH}\" - - -#endif // ${_def} -") - endif() - endif() -endmacro() - - -macro(set_lang _T) - set(${_T}_LANG) - foreach(_i ${ARGN}) - list(APPEND ${_T}_LANG "${_i}") - endforeach() -endmacro() - - -macro(import_version _T _F) - if (NOT "x${_T}" STREQUAL "x${_F}") - set(_names "${__version_names};FULLSUFFIX") - foreach(_i ${_names}) - set(${_T}_VERSION_${_i} "${${_F}_VERSION_${_i}}") - endforeach() - set(${_T}_VERSION "${${_F}_VERSION}") - set(${_T}_LANG "${${_F}_LANG}") - endif() -endmacro() - - -macro(import_deploy_properties _T _F) - if (NOT "x${_T}" STREQUAL "x${_F}") - foreach(_i ${__prop_names}) - set(${_T}_${_i} "${${_F}_${_i}}") - endforeach() - endif() -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() - string(REPLACE "\"" "\"\"" WINDOWS_RC_FULLNAME "${${_T}_FULLNAME}") - string(REPLACE "\"" "\"\"" WINDOWS_RC_VERSION "${${_T}_VERSION}" ) - string(REPLACE "\"" "\"\"" WINDOWS_RC_LABEL "${${_T}_LABEL}" ) - string(REPLACE "\"" "\"\"" WINDOWS_RC_COMPANY "${${_T}_COMPANY}" ) - string(REPLACE "\"" "\"\"" 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() +include(DeployVersionMacros) +if (NOT MY_ARCH) + target_architecture(MY_ARCH) +endif() # Help macros begin @@ -588,8 +367,9 @@ macro(deploy_target _T) set(_ZIP_DMG 1) set(_DEB_OPT 1) set(_DEB_SERVICE 0) + set(_MANIFEST 0) set(_cur_arg) - set(__args "DESTINATION;DEPLOY_DIR;RESOURCES;PLUGINS;FILES;LIBS;OPTIONS;VERBOSE;DMG_NO_ZIP;DEB_USR_DIR;DEB_ADD_SERVICE") + set(__args "DESTINATION;DEPLOY_DIR;RESOURCES;PLUGINS;FILES;LIBS;OPTIONS;VERBOSE;DMG_NO_ZIP;DEB_USR_DIR;DEB_ADD_SERVICE;ADD_MANIFEST") foreach(_i ${ARGN}) if (_i IN_LIST __args) set(_cur_arg "${_i}") @@ -602,6 +382,8 @@ macro(deploy_target _T) set(_DEB_OPT 0) elseif("${_cur_arg}" STREQUAL "DEB_ADD_SERVICE") set(_DEB_SERVICE 1) + elseif("${_cur_arg}" STREQUAL "ADD_MANIFEST") + set(_MANIFEST 1) endif() elseif ("${_cur_arg}" STREQUAL "DESTINATION") set(_cur_arg) @@ -638,6 +420,15 @@ macro(deploy_target _T) #message("app depend ${_T} libpath ${_add_search_path}") set(_CMD_) set(_deployed) + + set(_TARGET_LABEL "${${_T}_LABEL}") + set(_TARGET_FULLNAME "${${_T}_FULLNAME}") + set(_TARGET_VERSION "${${_T}_VERSION}") + set(_TARGET_COMPANY "${${_T}_COMPANY}") + set(_TARGET_INFO "${${_T}_INFO}") + set(_TARGET_OS "???") + set(_TARGET_ARCH "???") + set(_TARGET_PACKAGE "???") if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux") set(_os_id "") set(_os_ver "") @@ -660,32 +451,45 @@ macro(deploy_target _T) endif() endforeach() endif() - set(_build "${${_T}_VERSION_BUILD}") - if (NOT "x${_build}" STREQUAL "x") - set(_build "-${_build}") - endif() string(TOLOWER "${_os_id}${_os_ver}" _TARGET_OS) if ("x${_TARGET_OS}" STREQUAL "x") set(_TARGET_OS "linux") endif() + set(_TARGET_ARCH "${MY_ARCH}") + elseif(WIN32) + set(_TARGET_OS "windows") + set(_TARGET_ARCH "${MY_ARCH}") + elseif (APPLE) + set(_TARGET_OS "macosx") + set(_TARGET_ARCH "x64") + elseif (DEFINED ANDROID_PLATFORM) + set(_TARGET_OS "android") + set(_TARGET_ARCH "all") + endif() + + if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux") + set(_build "${${_T}_VERSION_BUILD}") + if (NOT "x${_build}" STREQUAL "x") + set(_build "-${_build}") + endif() string(REPLACE "_" "-" _DEBNAME "${_T}") set(_DEBVERSION "${${_T}_VERSION_MAJOR}.${${_T}_VERSION_MINOR}.${${_T}_VERSION_REVISION}${_build}${${_T}_VERSION_FULLSUFFIX}+${_TARGET_OS}") string(REPLACE "_" "-" _DEBVERSION "${_DEBVERSION}") string(TOLOWER "${_DEBNAME}" _DEBNAME) set(_DEB_ARCH) - if("_${MY_ARCH}" STREQUAL "_arm64") + if("_${_TARGET_ARCH}" STREQUAL "_arm64") set(_DEB_ARCH "arm64") - elseif("_${MY_ARCH}" STREQUAL "_armv7") + elseif("_${_TARGET_ARCH}" STREQUAL "_armv7") set(_DEB_ARCH "armhf") - elseif("_${MY_ARCH}" STREQUAL "_i386") + elseif("_${_TARGET_ARCH}" STREQUAL "_i386") set(_DEB_ARCH "i386") - elseif("_${MY_ARCH}" STREQUAL "_x86_64") + elseif("_${_TARGET_ARCH}" STREQUAL "_x86_64") set(_DEB_ARCH "amd64") - elseif("_${MY_ARCH}" STREQUAL "_ppc") + elseif("_${_TARGET_ARCH}" STREQUAL "_ppc") set(_DEB_ARCH "PowerPC") - elseif("_${MY_ARCH}" STREQUAL "_ppc64") + elseif("_${_TARGET_ARCH}" STREQUAL "_ppc64") set(_DEB_ARCH "PPC64") - elseif("_${MY_ARCH}" STREQUAL "_ia64") + elseif("_${_TARGET_ARCH}" STREQUAL "_ia64") set(_DEB_ARCH "ia64") endif() if (NOT "x${${_T}_FULLNAME}" STREQUAL "x") @@ -761,6 +565,7 @@ macro(deploy_target _T) endif() list(APPEND _dt_opts -q "${Qt5_ROOT}" --qt-conf-dir "${_bin_path}" --qt-plugins-dir "${_pli_path}" --rpath) set(_deb_name "${_TV}_${_TARGET_OS}_${_DEB_ARCH}.deb") + set(_TARGET_PACKAGE "${_deb_name}") #message("VER = \"${_DEBVERSION}\"") #message("DEB = \"${_deb_name}\"") list(APPEND _CMD_ COMMAND echo "Package: ${_DEBNAME}" ${_C_echof}) @@ -872,7 +677,8 @@ macro(deploy_target _T) __make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES "${_AGD}") __make_copy(_CMD_ _FILE_DIRS _FILE_FILES "${_AGD}") __make_copy(_CMD_ _LIBS_DIRS _LIBS_FILES "${_AGD}") - set(_zip_name "${_TV}_windows_${MY_ARCH}.zip") + set(_zip_name "${_TV}_${_TARGET_OS}_${_TARGET_ARCH}.zip") + set(_TARGET_PACKAGE "${_zip_name}") add_custom_target(deploy_${_T} # gather dir ${_CMD_} @@ -915,7 +721,8 @@ macro(deploy_target _T) if (NOT CMAKE_PREFIX_PATH) set(CMAKE_PREFIX_PATH "/usr/local") endif() - set(_dmg_name "${_TV}_macosx_x64.dmg") + set(_dmg_name "${_TV}_${_TARGET_OS}_${_TARGET_ARCH}.dmg") + set(_TARGET_PACKAGE "${_dmg_name}") set(_cmd_gen_dmg COMMAND genisoimage -quiet -V "${MACOSX_BUNDLE_BUNDLE_NAME}" -D -R -apple -no-pad -o "${_DESTINATION}/${_dmg_name}" "${_DMG}") if (__mac_host) set(_cmd_gen_dmg COMMAND hdiutil create "${_DESTINATION}/${_dmg_name}" -ov -volname "${MACOSX_BUNDLE_BUNDLE_NAME}" -fs HFS+ -srcfolder "${_DMG}") @@ -1075,7 +882,8 @@ macro(deploy_target _T) set(_CMD_ ${_CMD_} COMMAND "${Qt5_BIN}/androiddeployqt" --aux-mode --android-platform ${ANDROID_PLATFORM} --output "\"${_AGD}\"" --input "\"${_out_json}\"") set(_CMD_ ${_CMD_} COMMAND "${_AGD}/gradlew" ${_gradle_home} --no-daemon -p "\"${_AGD}\"" assembleDebug) set(_CMD_ ${_CMD_} COMMAND "${_AGD}/gradlew" ${_gradle_home} --no-daemon -p "\"${_AGD}\"" bundleRelease) - set(_base_name "${_TV}_android_all") + set(_base_name "${_TV}_${_TARGET_OS}_${_TARGET_ARCH}") + set(_TARGET_PACKAGE "${_base_name}.apk") set(_CMD_ ${_CMD_} COMMAND "${CMAKE_COMMAND}" -E copy "${_AGD}/build/outputs/apk/debug/${_T}.android-debug.apk" "${_DESTINATION}/${_base_name}.apk") if (ANDROID_STORE_FILE) set(_CMD_ ${_CMD_} COMMAND "${CMAKE_COMMAND}" -E copy "${_AGD}/build/outputs/bundle/release/${_T}.android-release.aab" "${_DESTINATION}/${_base_name}.aab") @@ -1087,6 +895,11 @@ macro(deploy_target _T) ) set(_deployed "deploy_${_T}") endif() + + if (_MANIFEST) + configure_file("${_modules_dir}/DeployTarget.manifest.in" "${_DESTINATION}/${_TARGET_PACKAGE}.manifest") + endif() + foreach (_d ${_deployed}) add_dependencies(deploy ${_d}) endforeach() diff --git a/DeployTarget.manifest.in b/DeployTarget.manifest.in new file mode 100644 index 0000000..8e123c9 --- /dev/null +++ b/DeployTarget.manifest.in @@ -0,0 +1,9 @@ +{ + "label": "${_TARGET_LABEL}", + "fullname": "${_TARGET_FULLNAME}", + "version": "${_TARGET_VERSION}", + "company": "${_TARGET_COMPANY}", + "info": "${_TARGET_INFO}", + "system": "${_TARGET_OS}", + "arch": "${_TARGET_ARCH}" +} diff --git a/DeployVersionMacros.cmake b/DeployVersionMacros.cmake new file mode 100644 index 0000000..ab12f6f --- /dev/null +++ b/DeployVersionMacros.cmake @@ -0,0 +1,239 @@ +cmake_policy(SET CMP0011 NEW) # don`t affect includer policies +if (POLICY CMP0057) + cmake_policy(SET CMP0057 NEW) # Support if() IN_LIST +endif() +if (POLICY CMP0053) + cmake_policy(SET CMP0053 NEW) +endif() +set(__prop_names "LABEL;FULLNAME;COMPANY;ICON;INFO") +list(APPEND __prop_names "ANDROID_TARGET_SDK;ANDROID_STORE_FILE;ANDROID_STORE_PASSWORD;ANDROID_KEY_PASSWORD;ANDROID_KEY_ALIAS;ANDROID_NEW_LOADER") +set(__version_names "MAJOR;MINOR;REVISION;BUILD;SUFFIX") + +include(TargetArch) +if (NOT MY_ARCH) + target_architecture(MY_ARCH) +endif() + + +macro(set_version _T) + set(_VERSION_ 2) # macro version + set(_name) + set(_is_name 1) + set(_is_out 0) + set(_out) + #message("set_version \"${_T}\"") + 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) + #message("set_version component \"${_i}\"") + set(_is_name 0) + if (_i IN_LIST __version_names) + else() + message(FATAL_ERROR "Invalid version component \"${_i}\"!") + endif() + set(_name ${_i}) + set(${_T}_VERSION_${_name}) + else() + #message("set_version value \"${_name}\" = \"${_i}\"") + 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 _${_T}_CACHED_VERSION_VER) OR (NOT ("x${_${_T}_CACHED_VERSION_VER}" STREQUAL "x${_VERSION_}"))) + set(_${_T}_CACHED_VERSION_VER "${_VERSION_}" 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) + string(TIMESTAMP _cur_date "%d.%m.%Y %H:%M") + file(WRITE "${_out}" +"// This file generated by CMake set_version() version ${_VERSION_} + +#ifndef ${_def} +#define ${_def} + + +// Project + +#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}_MAKE_VERSION(major, minor, revision) ((major << 16) | (minor << 8) | revision) +#define ${_TN}_VERSION ${_TN}_MAKE_VERSION(${_TN}_VERSION_MAJOR, ${_TN}_VERSION_MINOR, ${_TN}_VERSION_REVISION) + + +// Tools + +#define ${_TN}_CMAKE_VERSION \"${CMAKE_VERSION}\" +#define ${_TN}_CXX_COMPILER \"${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}\" +#define ${_TN}_BUILD_DATE \"${_cur_date}\" +#define ${_TN}_ARCH \"${MY_ARCH}\" + + +#endif // ${_def} +") + endif() + endif() +endmacro() + + +macro(set_lang _T) + set(${_T}_LANG) + foreach(_i ${ARGN}) + list(APPEND ${_T}_LANG "${_i}") + endforeach() +endmacro() + + +macro(import_version _T _F) + if (NOT "x${_T}" STREQUAL "x${_F}") + set(_names "${__version_names};FULLSUFFIX") + foreach(_i ${_names}) + set(${_T}_VERSION_${_i} "${${_F}_VERSION_${_i}}") + endforeach() + set(${_T}_VERSION "${${_F}_VERSION}") + set(${_T}_LANG "${${_F}_LANG}") + endif() +endmacro() + + +macro(import_deploy_properties _T _F) + if (NOT "x${_T}" STREQUAL "x${_F}") + foreach(_i ${__prop_names}) + set(${_T}_${_i} "${${_F}_${_i}}") + endforeach() + endif() +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() + string(REPLACE "\"" "\"\"" WINDOWS_RC_FULLNAME "${${_T}_FULLNAME}") + string(REPLACE "\"" "\"\"" WINDOWS_RC_VERSION "${${_T}_VERSION}" ) + string(REPLACE "\"" "\"\"" WINDOWS_RC_LABEL "${${_T}_LABEL}" ) + string(REPLACE "\"" "\"\"" WINDOWS_RC_COMPANY "${${_T}_COMPANY}" ) + string(REPLACE "\"" "\"\"" 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()