diff --git a/cmake/DeployMacros.cmake b/cmake/DeployMacros.cmake index 9c891dc2..61843968 100644 --- a/cmake/DeployMacros.cmake +++ b/cmake/DeployMacros.cmake @@ -336,6 +336,8 @@ END endmacro() +# Help macros begin + macro(__add_file_or_dir _DIR_VAR _FILE_VAR _PATH _RELPATH) set(_p) if (IS_ABSOLUTE "${_PATH}") @@ -352,6 +354,64 @@ macro(__add_file_or_dir _DIR_VAR _FILE_VAR _PATH _RELPATH) endif() endmacro() +set(__win_host 0) +if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows") + set(__win_host 1) +endif() + +macro(__make_win_path _in_path _out_var _is_dir _out_dir) + set(_add "") + if (${_is_dir}) + set(_add "/") + endif() + 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 ${_VERB} -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 /e "${_wsrc}*" "\"${_wdest}${_dirname}\\\"" ${_WVERB}) + endforeach() + foreach(_f ${${_files}}) + __make_win_path("${_f}" _wsrc 0 "") + set(${_cmd} ${${_cmd}} COMMAND xcopy /y /r "\"${_wsrc}\"" "\"${_wdest}\"" ${_WVERB}) + endforeach() + else() + foreach(_d ${${_dirs}}) + set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -rf "${_d}" "${_dest}/") + endforeach() + foreach(_f ${${_files}}) + set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -f "${_f}" "${_dest}/") + endforeach() + endif() +endmacro() + +# Help macros end + macro(deploy_target _T) set(_DESTINATION "${CMAKE_INSTALL_PREFIX}") @@ -414,7 +474,7 @@ macro(deploy_target _T) endif() endforeach() #message("app depend libpath ${_DEP_LIBPATH}") - set(_CMD_COPY) + set(_CMD_) set(_has_deploy 0) if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux") if (NOT CMAKE_LDD) @@ -444,25 +504,14 @@ 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") - macro(__make_copy _cmd _dirs _files _dest) - if (${_dirs} OR ${_files}) - set(${_cmd} ${${_cmd}} COMMAND mkdir ${_VERB} -p "${_dest}") - endif() - foreach(_d ${${_dirs}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -rf "${_d}" "${_dest}/") - endforeach() - foreach(_f ${${_files}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -f "${_f}" "${_dest}/") - endforeach() - endmacro() - __make_copy(_CMD_COPY _RES_DIRS _RES_FILES "${_AGD}/usr/share/${${_T}_COMPANY}/${_T}") - __make_copy(_CMD_COPY _PLUG_DIRS _PLUG_FILES "${_AGD}/usr/lib/${${_T}_COMPANY}/${_T}") - __make_copy(_CMD_COPY _FILE_DIRS _FILE_FILES "${_AGD}/usr/bin") + __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") if (_DEP_LIBS) - set(_CMD_COPY ${_CMD_COPY} COMMAND cp ${_VERB} -f ${_DEP_LIBS} ${_AGD}/usr/lib) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f ${_DEP_LIBS} ${_AGD}/usr/lib) endif() if (_ICON_NAME) - set(_CMD_COPY ${_CMD_COPY} COMMAND cp ${_VERB} -f ${_ICON_FN} ${_AGD}/usr/share/pixmaps) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f ${_ICON_FN} ${_AGD}/usr/share/pixmaps) endif() add_custom_target(deploy_${_T} # gather deb dir @@ -472,7 +521,7 @@ macro(deploy_target _T) 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 - ${_CMD_COPY} + ${_CMD_} COMMAND echo "Package: ${_DEBNAME}" ${_C_echof} COMMAND echo "Version: ${_DEBVERSION}" ${_C_echo} @@ -512,72 +561,20 @@ macro(deploy_target _T) find_program(CMAKE_OBJDUMP objdump) endif() set(_AGD "${_DEPLOY_DIR}/${_TV}_win_${MY_ARCH}/") - set(_win_host 0) - if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows") - set(_win_host 1) - endif() - macro(__make_win_path _in_path _out_var _is_dir _out_dir) - set(_add "") - if (${_is_dir}) - set(_add "/") - endif() - 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 ${_VERB} -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}\\\"" ${_WVERB}) - endforeach() - foreach(_f ${${_files}}) - __make_win_path("${_f}" _wsrc 0 "") - set(${_cmd} ${${_cmd}} COMMAND xcopy /y /r "\"${_wsrc}\"" "\"${_wdest}\"" ${_WVERB}) - endforeach() - else() - foreach(_d ${${_dirs}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -rf "${_d}" "${_dest}/") - endforeach() - foreach(_f ${${_files}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -f "${_f}" "${_dest}/") - endforeach() - endif() - endmacro() - if (_win_host) + 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}") + __make_dir(_CMD_ "${_AGD}") + __make_dir(_CMD_ "${_DESTINATION}") + __make_copy(_CMD_ _var_empty _var_exe "${_AGD}") + __make_copy(_CMD_ _RES_DIRS _RES_FILES "${_AGD}") + __make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES "${_AGD}") + __make_copy(_CMD_ _FILE_DIRS _FILE_FILES "${_AGD}") add_custom_target(deploy_${_T} # gather dir - ${_CMD_COPY} + ${_CMD_} COMMAND deploy_tool ${_VERB} ${_OPTIONS} -W "\"${CMAKE_OBJDUMP}\"" -P windows,minimal -S windows -q "\"${Qt5_ROOT}\"" -s "\"${CMAKE_PREFIX_PATH}/bin;${MINGW_BIN};${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD} -p ${_AGD} "\"${_AGD}${_T}.exe\"" ${_ADD_DEPS} # zip @@ -599,29 +596,18 @@ 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 ${_VERB} -p "${_dest}") - endif() - foreach(_d ${${_dirs}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -rf "${_d}" "${_dest}/") - endforeach() - foreach(_f ${${_files}}) - set(${_cmd} ${${_cmd}} COMMAND cp ${_VERB} -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") + __make_copy(_CMD_ _RES_DIRS _RES_FILES "${_AGD}/Contents/Resources") + __make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES "${_AGD}/Contents/PlugIns") + __make_copy(_CMD_ _FILE_DIRS _FILE_FILES "${_AGD}/Contents/MacOS") if (_ICON_NAME) - set(_CMD_COPY ${_CMD_COPY} COMMAND cp ${_VERB} -f ${_ICON_FN} ${_AGD}/Contents/Resources) + set(_CMD_ ${_CMD_} COMMAND cp ${_VERB} -f ${_ICON_FN} ${_AGD}/Contents/Resources) endif() add_custom_target(deploy_${_T} # gather .app dir COMMAND mkdir ${_VERB} -p ${_AGD}/Contents/Resources COMMAND mkdir ${_VERB} -p ${_AGD}/Contents/Frameworks COMMAND mkdir ${_VERB} -p ${_DESTINATION} - ${_CMD_COPY} + ${_CMD_} #COMMAND cp ${_ICON_FN} ${_AGD}/Contents/Resources #COMMAND cp -r ${_DEPLOY_DIR}/lang ${_AGD}/Contents/Resources COMMAND deploy_tool ${_VERB} ${_OPTIONS} -M "${CMAKE_OTOOL}" -P cocoa,minimal -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} ${_ADD_DEPS} @@ -636,20 +622,77 @@ macro(deploy_target _T) ) set(_has_deploy 1) elseif (DEFINED ANDROID_PLATFORM) - set(_AT ${_T}) - get_target_property(_TT ${_T} TYPE) - if (NOT "x${_TT}" STREQUAL "xSHARED_LIBRARY") - set(_AT ${_T}_lib) - get_target_property(_sources ${_T} SOURCES) - get_target_property(_libs ${_T} LINK_LIBRARIES) - get_target_property(_incs ${_T} INCLUDE_DIRECTORIES) - add_library(${_AT} SHARED ${_sources}) - target_link_libraries(${_AT} ${_libs}) - target_include_directories(${_AT} PRIVATE ${_incs}) - message("create new target ${_AT} ${_sources} ${_libs}") - endif() + set(_AT ${_T}_lib) + set(_ATA ${_AT}_${ANDROID_ABI}) + get_target_property(_sources ${_T} SOURCES) + get_target_property(_libs ${_T} LINK_LIBRARIES) + get_target_property(_incs ${_T} INCLUDE_DIRECTORIES) + add_library(${_ATA} SHARED ${_sources}) + target_link_libraries(${_ATA} ${_libs}) + target_include_directories(${_ATA} PRIVATE ${_incs}) + set_target_properties(${_T} PROPERTIES EXCLUDE_FROM_ALL 1) + #message("create new target ${_ATA} ${_sources} ${_libs}") + set(_AGD "${_DEPLOY_DIR}/${_T}.android") + set(_file) + __make_dir(_CMD_ "${_AGD}") + set(_dir "${CMAKE_BINARY_DIR}/android-build/libs") + __make_copy(_CMD_ _dir _file "${_AGD}") + set(_dir "${CMAKE_CURRENT_SOURCE_DIR}/android/res") + __make_copy(_CMD_ _dir _file "${_AGD}") + set(_dir "${CMAKE_CURRENT_SOURCE_DIR}/android/src") + __make_copy(_CMD_ _dir _file "${_AGD}") + set(_dir) + set(_file "${Qt5_ROOT}/src/android/templates/res/values/libs.xml") + __make_copy(_CMD_ _dir _file "${_AGD}/res/values") + __make_copy(_CMD_ _RES_DIRS _RES_FILES "${_AGD}/res") + #__make_copy(_CMD_ _PLUG_DIRS _PLUG_FILES "${_AGD}/") + #__make_copy(_CMD_ _FILE_DIRS _FILE_FILES "${_AGD}/Contents/MacOS") + message("bindir = ${CMAKE_CURRENT_SOURCE_DIR}") #get_target_property(_LL ${_T} ) - add_custom_target(deploy_${_T}) + set(__archs "armeabi-v7a" "arm64-v8a" "x86" "x86_64") + set(QT_ANDROID_ARCHITECTURES) + find_library(_lib_ c++_shared) + foreach (_a ${__archs}) + set(_aname "${_a}") + if ("${_a}" STREQUAL "armeabi-v7a") + set(_aname "arm") + elseif ("${_a}" STREQUAL "arm64-v8a") + set(_aname "arm64") + endif() + set(_exist 0) + if ("${_a}" STREQUAL "${ANDROID_ABI}") + set(_exist 1) + elseif (EXISTS "${CMAKE_BINARY_DIR}/android-build/libs/${_a}") + set(_exist 1) + endif() + if (_exist) + string(REPLACE "${ANDROID_ABI}" "${_a}" _a_prefix "${CMAKE_PREFIX_PATH}") + string(REPLACE "arch-${ANDROID_ARCH_NAME}" "arch-${_aname}" _a_prefix "${_a_prefix}") + list(APPEND QT_ANDROID_ARCHITECTURES " \"${_a}\" : \"${ANDROID_SYSROOT_${_a}}\"") + string(REPLACE "${ANDROID_SYSROOT_${ANDROID_ABI}}" "${ANDROID_SYSROOT_${_a}}" _lib_${_a} "${_lib_}") + #message("search = ${_a_prefix}/lib") + __make_copy(_CMD_ _empty _lib_${_a} "${_AGD}/libs/${_a}") + set(_CMD_ ${_CMD_} COMMAND deploy_tool ${_VERB} ${_OPTIONS} -L "\"${CMAKE_READELF}\"" -s "\"${_a_prefix}/lib\"" -o "\"${_AGD}/libs/${_a}\"" --ignore "\"c:m:dl\"" "\"${_AGD}/libs/${_a}/lib${_AT}_${_a}.so\"" ${_ADD_DEPS}) + #message("c++_${_a} -> ${_lib_${_a}}") + endif() + endforeach() + string(REPLACE ";" ",\n" QT_ANDROID_ARCHITECTURES "${QT_ANDROID_ARCHITECTURES}") + set(QT_ANDROID_APPLICATION_BINARY ${_AT}) + set(ANDROID_LABEL "${${_T}_LABEL}") + set(ANDROID_ICON "${${_T}_ICON}") + set(ANDROID_VERSION "${${_T}_VERSION}") + set(ANDROID_BUILD "${${_T}_VERSION_BUILD}") + set(ANDROID_PACKAGE "${${_T}_FULLNAME}") + set(QT_DIR ${Qt5_ROOT}) + set(_out_json "${CMAKE_CURRENT_BINARY_DIR}/${_T}_android_deployment_settings.json") + configure_file("${CMAKE_BINARY_DIR}/android_deployment_settings.json.in" "${_out_json}") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml.in" "${_AGD}/AndroidManifest.xml") + set(_CMD_ ${_CMD_} COMMAND "${Qt5_BIN}/androiddeployqt" --aux-mode --android-platform ${ANDROID_PLATFORM} --output "\"${_AGD}\"" --input "\"${_out_json}\"") + add_custom_target(deploy_${_T} + # gather .app dir + ${_CMD_} + COMMENT "Generating ${_TV}.apk/aab" + ) set(_has_deploy 1) endif() if (_has_deploy) diff --git a/utils/deploy_tool/main.cpp b/utils/deploy_tool/main.cpp index 6ff20cdf..711dc1a4 100644 --- a/utils/deploy_tool/main.cpp +++ b/utils/deploy_tool/main.cpp @@ -43,8 +43,8 @@ void usage() { piCout << "\"*=\" disable optional plugins."; piCout << ""; piCout << Green << Bold << "Usage:" << Default << "\"deploy_tool [-hvfC] [--dependencies [--prefix ]] " - "[-p ] [-s ] [-S ] [-l ] " - "[-D ] [-L | -W | -M ] " + "[-p ] [-s ] [--ignore ] [-S ] " + "[-l ] [-D ] [-L | -W | -M ] " "[-d ] [-q ] [-a ] [-S ] " "[-P ] [--qt-plugins ] -o [ ...]\"" << NewLine; piCout << Green << Bold << "Details:"; @@ -55,6 +55,7 @@ void usage() { piCout << Bold << "Processing control"; piCout << "-f, --fake " << Green << "- don`t copy, only print"; piCout << "-s " << Green << "- set search pathes for system libraries, may be separated by \";\", default \"/usr/lib\""; + piCout << "--ignore " << Green << "- ignore libraries names, may be separated by \":\", default \"\""; piCout << "-l " << Green << "- \"ldd\" path, default \"/usr/bin/ldd\""; piCout << "-L " << Green << "- \"readelf\" path, overrides \"ldd\""; piCout << "-W " << Green << "- \"objdump\" path, overrides \"ldd\""; @@ -107,7 +108,7 @@ int depth = 5; bool fake = false, is_ldd = true, is_deps = false, need_qt = false; PIString ldd, readelf, objdump, otool, dpkg, out_dir, qt_dir, out_plugins_dir; PIStringList styles, lib_dirs, add_libs, platforms, sqldrivers; -PISet all_libs, miss_libs, all_deps, frameworks, miss_frameworks, qt_plugins; +PISet all_libs, miss_libs, all_deps, frameworks, miss_frameworks, qt_plugins, ignore_libs; PIMap qt_filters; @@ -247,6 +248,12 @@ void procLdd(PIString file, bool ext_lib = false, int cur_depth = 0) { if (all_libs[l]) continue; PIFile::FileInfo fi; fi.path = l; + PIString lname = fi.baseName(); + if (lname.startsWith("lib")) lname.cutLeft(3); + //piCout << "check ignore" << lname << ignore_libs; + if (ignore_libs.contains(lname)) { + continue; + } checkQtLib(fi.name().toLowerCase()); cur_libs << l; all_libs << l; @@ -354,6 +361,7 @@ int main(int argc, char * argv[]) { cli.addArgument("output", true); cli.addArgument("pqt_out_plugins", true); cli.addArgument("search_path", true); + cli.addArgument("ignore", PIChar('\0'), true); cli.addArgument("Styles", true); cli.addArgument("Platforms", true); cli.addArgument("qt-plugins", PIChar('\0'), true); @@ -377,12 +385,19 @@ int main(int argc, char * argv[]) { out_dir = cli.argumentValue("output"); lib_dirs = cli.argumentValue("search_path").split(";"); add_libs = cli.argumentValue("add_libs").split(";"); + ignore_libs = cli.argumentValue("ignore").split(":"); qt_dir = cli.argumentValue("qtdir"); ldd = cli.argumentValue("ldd"); readelf = cli.argumentValue("Lreadelf"); objdump = cli.argumentValue("Wobjdump"); otool = cli.argumentValue("Motool"); dpkg = cli.argumentValue("Dpkg"); +#ifdef WINDOWS + readelf.replaceAll("/", "\\"); + objdump.replaceAll("/", "\\"); + otool.replaceAll("/", "\\"); + dpkg.replaceAll("/", "\\"); +#endif if (dpkg.isEmpty()) dpkg = "/usr/bin/dpkg"; out_plugins_dir = out_dir; @@ -407,6 +422,7 @@ int main(int argc, char * argv[]) { lib_dirs << (qbin + "bin"); } piForeach (PIString & s, lib_dirs) { + s.trim(); if (!s.endsWith("/")) s += "/"; } if (out_dir.isEmpty()) out_dir = ".";