diff --git a/cmake/DeployMacros.cmake b/cmake/DeployMacros.cmake index 8198152d..a72b01f8 100644 --- a/cmake/DeployMacros.cmake +++ b/cmake/DeployMacros.cmake @@ -83,6 +83,9 @@ 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") set(__version_names "MAJOR;MINOR;REVISION;BUILD;SUFFIX") include(TargetArch) @@ -467,40 +470,71 @@ macro(deploy_target _T) 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}") + set(_win_host 0) 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}\"") + set(_win_host 1) endif() - foreach(_d ${_RES_DIRS} ${_PLUG_DIRS}) - get_filename_component(_dirname "${_d}" NAME) - file(TO_NATIVE_PATH "${_d}/" _wr) - if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows") - set(_CMD_COPY ${_CMD_COPY} COMMAND if not exist "\"${_AGD}${_dirname}\"" mkdir "\"${_AGD}${_dirname}\"") - string(REPLACE "/" "\\" _wr "${_wr}") - else() - set(_CMD_COPY ${_CMD_COPY} COMMAND mkdir -p "${_AGD}${_dirname}") + macro(__make_win_path _in_path _out_var _is_dir _out_dir) + set(_add "") + if (${_is_dir}) + set(_add "/") endif() - set(_CMD_COPY ${_CMD_COPY} COMMAND ${_COPY} "${_wr}*" "\"${_AGD}${_dirname}${_SEP}\"" ${_COPY_SUFFIX}) - endforeach() + file(TO_NATIVE_PATH "${_in_path}" ${_out_var}) + string(REPLACE "//" "/" ${_out_var} "${${_out_var}}${_add}") + if (NOT "x${_out_dir}" STREQUAL "x") + string(LENGTH "${${_out_var}}" __sl) + math(EXPR __sl ${__sl}-1) + string(SUBSTRING "${${_out_var}}" 0 ${__sl} __substr) + get_filename_component(${_out_dir} "${__substr}" NAME) + #message("dirname src=\"${${_out_var}}\", len=${__sl} \"${__substr}\" = \"${${_out_dir}}\"") + endif() + string(REPLACE "/" "\\" ${_out_var} "${${_out_var}}") + endmacro() + macro(__make_dir _cmd _dest) + if (_win_host) + __make_win_path("${_dest}" __d 1 "") + set(${_cmd} ${${_cmd}} COMMAND if not exist "\"${__d}\"" mkdir "\"${__d}\"") + else() + set(${_cmd} ${${_cmd}} COMMAND mkdir -p "${_dest}") + endif() + endmacro() + macro(__make_copy _cmd _dirs _files _dest) + if (${_dirs} OR ${_files}) + __make_dir(${_cmd} "${_dest}") + endif() + if (_win_host) + __make_win_path("${_dest}" _wdest 1 "") + foreach(_d ${${_dirs}}) + __make_win_path("${_d}" _wsrc 1 _dirname) + __make_dir(${_cmd} "${_dest}/${_dirname}") + set(${_cmd} ${${_cmd}} COMMAND xcopy /y /r "${_wsrc}*" "\"${_wdest}${_dirname}\\\"" 1> NUL) + endforeach() + foreach(_f ${${_files}}) + __make_win_path("${_f}" _wsrc 0 "") + set(${_cmd} ${${_cmd}} COMMAND xcopy /y /r "\"${_wsrc}\"" "\"${_wdest}\"" 1> NUL) + endforeach() + else() + foreach(_d ${${_dirs}}) + set(${_cmd} ${${_cmd}} COMMAND cp -rf "${_d}" "${_dest}/") + endforeach() + foreach(_f ${${_files}}) + set(${_cmd} ${${_cmd}} COMMAND cp -f "${_f}" "${_dest}/") + endforeach() + endif() + endmacro() + if (_win_host) + string(REPLACE "/" "\\" CMAKE_OBJDUMP "${CMAKE_OBJDUMP}") + endif() + set(_var_exe "${_DEPLOY_DIR}/${_T}.exe") + set(_var_empty) + __make_dir(_CMD_COPY "${_AGD}") + __make_dir(_CMD_COPY "${_DESTINATION}") + __make_copy(_CMD_COPY _var_empty _var_exe "${_AGD}") + __make_copy(_CMD_COPY _RES_DIRS _RES_FILES "${_AGD}") + __make_copy(_CMD_COPY _PLUG_DIRS _PLUG_FILES "${_AGD}") + __make_copy(_CMD_COPY _FILE_DIRS _FILE_FILES "${_AGD}") add_custom_target(deploy_${_T} # 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_COPY} 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\"" ${_PLUG_DIRS} @@ -523,20 +557,27 @@ macro(deploy_target _T) 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") + macro(__make_copy _cmd _dirs _files _dest) + if (${_dirs} OR ${_files}) + set(${_cmd} ${${_cmd}} COMMAND mkdir -p "${_dest}") + endif() + foreach(_d ${${_dirs}}) + set(${_cmd} ${${_cmd}} COMMAND cp -rf "${_d}" "${_dest}/") + endforeach() + foreach(_f ${${_files}}) + set(${_cmd} ${${_cmd}} COMMAND cp -f "${_f}" "${_dest}/") + endforeach() + endmacro() + __make_copy(_CMD_COPY _RES_DIRS _RES_FILES "${_AGD}/Contents/Resources") + __make_copy(_CMD_COPY _PLUG_DIRS _PLUG_FILES "${_AGD}/Contents/PlugIns") + __make_copy(_CMD_COPY _FILE_DIRS _FILE_FILES "${_AGD}/Contents/MacOS") if (_ICON_NAME) set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_ICON_FN} ${_AGD}/Contents/Resources) endif() - foreach(_d ${_RES_DIRS}) - set(_CMD_COPY ${_CMD_COPY} COMMAND cp -r "${_d}" "${_AGD}/Contents/Resources") - endforeach() - foreach(_d ${_PLUG_DIRS}) - set(_CMD_COPY ${_CMD_COPY} COMMAND cp -r "${_d}" "${_AGD}/Contents/PlugIns") - endforeach() add_custom_target(deploy_${_T} # gather .app dir COMMAND mkdir -p ${_AGD}/Contents/Resources COMMAND mkdir -p ${_AGD}/Contents/Frameworks - COMMAND mkdir -p ${_AGD}/Contents/PlugIns COMMAND mkdir -p ${_DESTINATION} ${_CMD_COPY} #COMMAND cp ${_ICON_FN} ${_AGD}/Contents/Resources