From 25ddc832af39cf0c0aa31a3dcb7fd541fb1c22b9 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Thu, 7 May 2020 17:41:26 +0300 Subject: [PATCH] deploy features --- CMakeLists.txt | 2 +- cmake/DeployMacros.cmake | 90 ++++++++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e83ae4db..eeb4bc76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,7 +130,7 @@ else() set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/lib;@loader_path/../lib") set(CMAKE_MACOSX_RPATH 1) else() - set(CMAKE_INSTALL_RPATH "\$ORIGIN/lib") + set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib") endif() endif() if(LIB) diff --git a/cmake/DeployMacros.cmake b/cmake/DeployMacros.cmake index f0d8afdb..fcc18b49 100644 --- a/cmake/DeployMacros.cmake +++ b/cmake/DeployMacros.cmake @@ -73,16 +73,16 @@ deploy_target( [DEPLOY_DIR ] [DESTINATION ] [RESOURCES [ ...] ] [PLUGINS [ ...] ] [FILES [ ...] ] - [OPTIONS ...] [VERBOSE] [ZIP_DMG]) + [OPTIONS ...] [VERBOSE] [ZIP_NO_DMG] [DEB_USR_DIR]) -Create make target "deploy_", depends on target "deploy" +Create make target "deploy_", depends on target "deploy". On this target create release package, containing all dependencies: -*.zip on Windows, *.deb on Linux, *.dmg an MacOS, *.apk and *.aab on Android -If defined ZIP_DMG then *.dmg.zip will be created on MacOS +*.zip on Windows, *.deb on Linux, *.dmg an MacOS, *.apk and *.aab on Android. +If not defined ZIP_NO_DMG then *.dmg.zip will be created on MacOS. You should set version and deploy properties before call this macro, see -"set_version()" and "set_deploy_property()" +"set_version()" and "set_deploy_property()". Example: deploy_target(my_app DESTINATION packages) @@ -95,11 +95,11 @@ DEPLOY_DIR - dir where you install DESTINATION - dir where macro place package RESOURCES, PLUGINS and FILES - list of directories and files, copied to: -| | Windows | Linux | MacOS | -| ----------|---------|---------------------------|--------------------| -| RESOURCES | root | /usr/share/COMPANY/target | Contents/Resources | -| PLUGINS | root | /usr/lib/COMPANY/target | Contents/PlugIns | -| FILES | root | /usr/bin | Contents/MacOS | +| | Windows | Linux | Linux (DEB_USR_DIR) | MacOS | +|-----------|---------|---------------------|---------------------------|--------------------| +| RESOURCES | root | /opt/COMPANY/target | /usr/share/COMPANY/target | Contents/Resources | +| PLUGINS | root | /opt/COMPANY/target | /usr/lib/COMPANY/target | Contents/PlugIns | +| FILES | root | /opt/COMPANY/target | /usr/bin | Contents/MacOS | Relative paths are taken from DEPLOY_DIR Also check library dependencies from PLUGINS and FILES @@ -548,17 +548,20 @@ macro(deploy_target _T) set(_VERB) set(_WVERB 1> NUL) set(_OPTIONS) - set(_ZIP_DMG 0) + set(_ZIP_DMG 1) + set(_DEB_OPT 1) set(_cur_arg) - set(__args "DESTINATION;DEPLOY_DIR;RESOURCES;PLUGINS;FILES;OPTIONS;VERBOSE;ZIP_DMG") + set(__args "DESTINATION;DEPLOY_DIR;RESOURCES;PLUGINS;FILES;OPTIONS;VERBOSE;ZIP_NO_DMG;DEB_USR_DIR") foreach(_i ${ARGN}) if (_i IN_LIST __args) set(_cur_arg "${_i}") if ("${_cur_arg}" STREQUAL "VERBOSE") set(_VERB -v) set(_WVERB) - elseif("${_cur_arg}" STREQUAL "ZIP_DMG") - set(_ZIP_DMG 1) + elseif("${_cur_arg}" STREQUAL "ZIP_NO_DMG") + set(_ZIP_DMG 0) + elseif("${_cur_arg}" STREQUAL "DEB_USR_DIR") + set(_DEB_OPT 0) endif() elseif ("${_cur_arg}" STREQUAL "DESTINATION") set(_cur_arg) @@ -595,9 +598,6 @@ macro(deploy_target _T) set(_CMD_) set(_has_deploy 0) if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux") - if (NOT CMAKE_LDD) - find_program(CMAKE_LDD ldd) - endif() string(REPLACE "_" "-" _DEBNAME "${_T}") string(REPLACE "_" "-" _DEBVERSION "${${_T}_VERSION}") set(_DEB_ARCH) @@ -622,14 +622,44 @@ macro(deploy_target _T) set(_C_echo ">>" "${_AGD}/DEBIAN/control") set(_D_echof ">" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop") set(_D_echo ">>" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop") - __make_copy(_CMD_ _RES_DIRS _RES_FILES "${_AGD}/usr/share/${${_T}_COMPANY}/${_T}") - __make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES "${_AGD}/usr/lib/${${_T}_COMPANY}/${_T}") - __make_copy(_CMD_ _FILE_DIRS _FILE_FILES "${_AGD}/usr/bin") + set(_bin_path "${_AGD}/usr/bin") + set(_lib_path "${_AGD}/usr/lib") + set(_pli_path "${_AGD}/usr/lib/${${_T}_COMPANY}/${_T}") + set(_res_path "${_AGD}/usr/share/${${_T}_COMPANY}/${_T}") + set(_ico_path "${_AGD}/usr/share/pixmaps") + set(_app_bin_path "/usr/bin") + set(_app_ico_path "/usr/share/pixmaps") + if(_DEB_OPT) + set(_bin_path "${_AGD}/opt/${${_T}_COMPANY}/${_T}") + set(_lib_path "${_AGD}/opt/${${_T}_COMPANY}/${_T}/lib") + set(_pli_path "${_AGD}/opt/${${_T}_COMPANY}/${_T}") + set(_res_path "${_AGD}/opt/${${_T}_COMPANY}/${_T}") + set(_ico_path "${_AGD}/opt/${${_T}_COMPANY}/${_T}/pixmaps") + set(_app_bin_path "/opt/${${_T}_COMPANY}/${_T}") + set(_app_ico_path "/opt/${${_T}_COMPANY}/${_T}/pixmaps") + endif() + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_bin_path}") + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_lib_path}") + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_pli_path}") + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_res_path}") + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_ico_path}") + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_AGD}/usr/share/applications") + __make_copy(_CMD_ _FILE_DIRS _FILE_FILES ${_bin_path}) + __make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES ${_pli_path}) + __make_copy(_CMD_ _RES_DIRS _RES_FILES ${_res_path}) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f "${_DEPLOY_DIR}/${_T}" "${_bin_path}/") if (_DEP_LIBS) - set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f ${_DEP_LIBS} ${_AGD}/usr/lib) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f "${_DEP_LIBS}" "${_lib_path}/") endif() if (_ICON_NAME) - set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f ${_ICON_FN} ${_AGD}/usr/share/pixmaps) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f "${_ICON_FN}" "${_ico_path}/") + endif() + if(_DEB_OPT) + set(_CMD_ ${_CMD_} COMMAND mkdir ${_VERB} -p "${_AGD}/usr/bin") + set(_CMD_ ${_CMD_} COMMAND ln -srf ${_VERB} "${_bin_path}/${_T}" "${_AGD}/usr/bin/${_T}") + endif() + if (NOT CMAKE_LDD) + find_program(CMAKE_LDD ldd) endif() set(_dt_opts -l "${CMAKE_LDD}") if (CMAKE_CROSSCOMPILING) @@ -643,19 +673,15 @@ macro(deploy_target _T) set(_deb_name "${_TV}_debian_${_DEB_ARCH}.deb") add_custom_target(deploy_${_T} # gather deb dir - COMMAND mkdir ${_VERB} -p ${_AGD}/DEBIAN - COMMAND mkdir ${_VERB} -p ${_AGD}/usr/bin - COMMAND mkdir ${_VERB} -p ${_AGD}/usr/lib - COMMAND mkdir ${_VERB} -p ${_AGD}/usr/share/pixmaps - COMMAND mkdir ${_VERB} -p ${_AGD}/usr/share/applications - COMMAND cp ${_VERB} -f ${_DEPLOY_DIR}/${_T} ${_AGD}/usr/bin + COMMAND rm -rf ${_VERB} "${_AGD}" + COMMAND mkdir ${_VERB} -p "${_AGD}/DEBIAN" ${_CMD_} COMMAND echo "Package: ${_DEBNAME}" ${_C_echof} COMMAND echo "Version: ${_DEBVERSION}" ${_C_echo} COMMAND echo "Architecture: ${_DEB_ARCH}" ${_C_echo} COMMAND echo "Maintainer: ${${_T}_COMPANY} <>" ${_C_echo} - COMMAND ${PIP_DEPLOY_TOOL} ${_OPTIONS} --prefix "Depends: " --dependencies ${_dt_opts} -a "${_DEP_LIBS_CS}" -o "${_AGD}/usr/lib" ${_DEPLOY_DIR}/${_T} ${_ADD_DEPS} ${_C_echo} + COMMAND ${PIP_DEPLOY_TOOL} ${_OPTIONS} --prefix "Depends: " --dependencies ${_dt_opts} -a "${_DEP_LIBS_CS}" -o "${_lib_path}" ${_DEPLOY_DIR}/${_T} ${_ADD_DEPS} ${_C_echo} COMMAND echo "Conflicts:" ${_C_echo} COMMAND echo "Replaces:" ${_C_echo} COMMAND echo "Section: misc" ${_C_echo} @@ -668,8 +694,8 @@ macro(deploy_target _T) 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 "Exec=${_app_bin_path}/${_T}" ${_D_echo} + COMMAND echo "Icon=${_app_ico_path}/${_ICON_NAME}" ${_D_echo} COMMAND echo "Terminal=false" ${_D_echo} COMMAND echo "StartupNotify=true" ${_D_echo} #COMMAND echo "X-KDE-StartupNotify=true" ${_D_echo} @@ -677,7 +703,7 @@ macro(deploy_target _T) #COMMAND -l "${CMAKE_LDD}" -P xcb -q ${Qt5_ROOT} -s "\"${CMAKE_PREFIX_PATH}/lib;${_add_search_path}\"" -o ${_AGD}/usr/lib -p ${_AGD}/usr/ ${_AGD}/Contents/MacOS/${_T} # generate deb - COMMAND cd ${_AGD} "&&" md5deep -rl usr ">" DEBIAN/md5sums + COMMAND cd ${_AGD} "&&" md5deep -rl usr opt ">" DEBIAN/md5sums COMMAND mkdir ${_VERB} -p ${_DESTINATION} COMMAND dpkg-deb -b ${_AGD} ${_DESTINATION}/${_deb_name} VERBATIM