Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >源码 | 一键式打包脚本工具

源码 | 一键式打包脚本工具

作者头像
Qt君
发布于 2020-02-10 03:46:11
发布于 2020-02-10 03:46:11
91600
代码可运行
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Author: Qt君
# QQ交流群: 732271126
# INFO: 关注微信公众号: [Qt君] 第一时间获取最新推送.
# --- [start]注意事项[start] --- #
    # 目前仅支持windows平台 #
# --- [end]注意事项[end] --- #

# --- [start]使用方法[start] --- #
    # 复制本脚本代码到你的项目文件中 #
    # 或在项目文件中使用include包含本文件 #
# --- [end]使用方法[end] --- #

# --- [start]输入参数[start] --- #
    # 是否开启打印信息输出(不会影响主项目的打印输出) #
    # 需要屏蔽打印就将它注释即可 #
    # 默认不开启 #
#DEBUG_LOGGER = hello world

    # 是否在编译完成后自动打开目标目录
    # 需要屏蔽该功能就将它注释即可 #
    # 默认开启 #
DEPLOY_COMPLETE_AUTO_OPEN_EXPLORER = hello world

    # 是否开启实验性功能 #
    # 需要屏蔽实验性功能只需注释即可 #
    # 默认不开启 #
#EXPERIMENTAL = hello world # 优化qmake执行速度
# --- [end]输入参数[end] --- #

# --- [start]函数[start] --- #
# 移除多余的debug或release配置项(实验功能)
defineReplace(remove_extra_config_parameter) {
    configs = $$1
    debug_and_release_params =
    keys = debug Debug release Release #debug_and_release
    for (iter, configs) {
        contains(keys, $$lower($$iter)) {
            debug_and_release_params += $$lower($$iter)
        }
    }

    for (iter, debug_and_release_params) {
        configs -= $$iter
    }

    configs += $$last(debug_and_release_params)

    return($$configs)
}

# 获取资源文件中的qml文件
defineReplace(find_qml_file) {
    resources = $$1
    qml_file_list =

    for (resource, resources) {
        content_lines = $$cat($$resource)
        for (iter, content_lines) {
            tmp = $$find(iter, <file>.*</file>)
            !isEmpty(tmp) {
                qml_file_list += $$replace(iter, (<file>(.*)<\/file>), \2)
            }
        }
    }

    return ($$qml_file_list)
}

# 获取qml文件中使用到的模块
defineReplace(get_qml_module_list) {
    qml_file_list = $$1
    default_qml_module_list = QtQuick.Shapes QtQuick.Particles
    qml_module_list =
    for (file, qml_file_list) {
        content_lines = $$cat($$file)
        for (iter, content_lines) {
            contains(default_qml_module_list, $$iter) {
                module_name = $$section(iter, ., 1, 1)
                qml_module_list += $$module_name
            }
        }
    }

    !isEmpty(DEBUG_LOGGER): message(qml_module_list: $$qml_module_list)
    return ($$qml_module_list)
}

# 获取需要复制qml库的命令行
defineReplace(get_copy_qml_library_cmd_line) {
    qt_dir = $$1
    qt_bin_dir = $$2
    target_out_dir = $$3
    resources = $$4
    cmd_line =

    qml_file_list = $$find_qml_file($$resources)

    !isEmpty(DEBUG_LOGGER): !isEmpty(qml_file_list): message(result: $$qml_file_list)

    qml_module_list = $$get_qml_module_list($$qml_file_list)
    !isEmpty(DEBUG_LOGGER): !isEmpty(qml_module_list): message($$qml_module_list)

    for (qml_module, qml_module_list) {
        if (equals(qml_module, Particles)) {
            # 源qml的quick的某个模块库目录
            source = $${qt_dir}qml/QtQuick/$${qml_module}.2
            # 目标qml的quick的某个模块源库目录
            dest   = $${target_out_dir}QtQuick/$${qml_module}.2
        }
        else {
            # 源qml的quick的某个模块库目录
            source = $${qt_dir}qml/QtQuick/$${qml_module}
            # 目标qml的quick的某个模块源库目录
            dest   = $${target_out_dir}QtQuick/$${qml_module}
        }

        source = $$replace(source, /, \\)
        dest   = $$replace(dest, /, \\)

        mkdir_qml_quick_module_dest_cmd_line = cmd /c mkdir $$dest # 创建模块目录在QtQuick
        copy_qml_quick_module_file_cmd_line = cmd /c xcopy /s/y $$source $$dest # 复制Qml模块到指定目录

        # 复制qml模块(dll)(命令行)
        CONFIG(debug, debug|release) {
            qml_module_params = $${qt_bin_dir}Qt5Quick$${qml_module}d.dll $${target_out_dir}
        }
        else {
            qml_module_params = $${qt_bin_dir}Qt5Quick$${qml_module}.dll $${target_out_dir}
        }

        qml_module_params = $$replace(qml_module_params, /, \\)
        copy_qml_module_cmd_line = cmd /c copy $$qml_module_params

        cmd_line += && $$mkdir_qml_quick_module_dest_cmd_line
        cmd_line += & $$copy_qml_quick_module_file_cmd_line
        cmd_line += && $$copy_qml_module_cmd_line
    }

    return ($$cmd_line)
}
# --- [end]函数[end] --- #

# 获取从QMake执行文件的所在目录得出Qt的bin路径
QT_BIN_DIR = $$replace(QMAKE_QMAKE, ^(\S*/)\S+$, \1)
# 获取Qt开发环境路径
QT_DIR = $${QT_BIN_DIR}../

# Qt打包工具参数配置集合
DEPLOY_OPTIONS += --force

# 可用的Qt模块
QT_AVAILABLE_LIBRARY_LIST = \
    bluetooth concurrent core declarative designer designercomponents enginio \
    gamepad gui qthelp multimedia multimediawidgets multimediaquick network nfc \
    opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets \
    script scripttools sensors serialport sql svg test webkit webkitwidgets \
    websockets widgets winextras xml xmlpatterns webenginecore webengine \
    webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput 3danimation \
    3dextras geoservices webchannel texttospeech serialbus webview

# 扫描QT变量用于打包模块的参数配置
for (LIBRARY_MODULE, QT_AVAILABLE_LIBRARY_LIST) {
    if (contains(QT, $$LIBRARY_MODULE)) {
        DEPLOY_OPTIONS += --$$LIBRARY_MODULE
    }
    else {
        DEPLOY_OPTIONS += --no-$$LIBRARY_MODULE
    }
}

# 针对Qml模块配置打包参数
if (contains(QT, quick)) {
    DEPLOY_OPTIONS -= --no-qml
    DEPLOY_OPTIONS += --qml

    DEPLOY_OPTIONS -= --no-network
    DEPLOY_OPTIONS += --network

    DEPLOY_OPTIONS += --qmldir $${QT_DIR}qml/
}

if (!isEmpty(DESTDIR)) {
    # 如有设置目标输出路径则定向于该路径
    TARGET_OUT_DIR = $$OUT_PWD/$$DESTDIR/
}
else {
    # 判断是debug版本还是release版本
    CONFIG(debug, debug|release) {
        TARGET_OUT_DIR = $${OUT_PWD}/debug/
        DEPLOY_OPTIONS += --debug
    }
    else {
        TARGET_OUT_DIR = $${OUT_PWD}/release/
        DEPLOY_OPTIONS += --release
    }
}

# 实验性功能
!isEmpty(EXPERIMENTAL) {
    # 该功能(用于优化qmake调试输出)是否开放还需待定,因为会导致其他未知的问题。
    CONFIG = $$remove_extra_config_parameter($$CONFIG)
}

# 调试输出
!isEmpty(DEBUG_LOGGER) {
    message(TARGET_OUT_DIR: $$TARGET_OUT_DIR) # 生成文件的输出目录
    message(QMAKE_POST_LINK: $$QMAKE_POST_LINK) # 打印命令
}

win32 {
    # 拼接Qt部署程序的文件(windows平台下为windeployqt.exe)
    WIN_DEPLOY_BIN = $${QT_BIN_DIR}windeployqt.exe

    # 编译完成后执行打包命令
    QMAKE_POST_LINK += $$WIN_DEPLOY_BIN $$DEPLOY_OPTIONS $$TARGET_OUT_DIR$${TARGET}.exe

    # 扫描Qml依赖库,并在编译完成后自动复制qml依赖库到目标目录
    QMAKE_POST_LINK += $$get_copy_qml_library_cmd_line($$QT_DIR, $$QT_BIN_DIR, $$TARGET_OUT_DIR, $$RESOURCES)

    !isEmpty(DEPLOY_COMPLETE_AUTO_OPEN_EXPLORER) {
        # 打包完成后自动打开目标路径
        QMAKE_POST_LINK += && start $$TARGET_OUT_DIR
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
发布一键式打包脚本工具
  欢迎大家一起协作完善。 https://github.com/aeagean/DeployByQmake
Qt君
2020/02/10
1.1K0
​11 Building CGAL​
The results of a successful configuration are build files that control the build step. The nature of the build files depends on the generator used during configuration, but in all cases they contain several targets, one per library, and a default global target corresponding to all the libraries.
用户3519280
2023/07/08
4030
QT软件开发源码工程前端QMake管理
欢迎学习烛照QT机器视觉软件开发教程,本文为课程附属文档,完整视频教程见文末网站链接。
周旋
2024/04/26
1580
QT软件开发源码工程前端QMake管理
linuxdeployqt-linux下Qt打包工具
基于Windows-Qt 发布的打包工具windeployqt,主要打包Qt相关依赖库,但是在linux,qt官方并未发布对应的打包版本。在github中,有人开源了这个版本linuxdeployqt,之前一直知道但是没怎么用,最近因为要打包对应工程,又拿出研究了一下。
何其不顾四月天
2023/03/10
3.5K0
使用python批量编译Qt工程脚本
主要用于windows平台(msvc编译器)。 部署环境   设置脚本内的build_list变量的值即可。 qmake.exe路径; jom.exe路径; 编译环境变量; 编译项目。 源码 import os import datetime import subprocess build_list = [ { 'qmake': r'C:\Qt\Qt5.12.2\5.12.2\msvc2017_64\bin\qmake.exe', 'qmake_params': r
Qt君
2019/10/23
1K0
Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(2)
在上一篇文档中,文档末尾提到了,win10,win7兼容问题,QCamera未发现的问题,这里都做一下说明。
何其不顾四月天
2023/03/10
1.2K0
Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(2)
将 QT 应用程序打包成如意玲珑软件包
在上一篇文章《国产系统之如意玲珑》中,我为大家介绍了一款创新的国产软件包管理工具——如意玲珑(Linyaps)。该工具集致力于解决 Linux 系统下传统软件包格式带来的复杂性和依赖问题,提供了一种更独立、更简洁的打包和管理方式。
云水木石
2025/01/23
980
将 QT 应用程序打包成如意玲珑软件包
QT的cmake项目工程配置
QT的项目工程默认使用的是qmake,这本来也没什么问题。但是由于要用到vcpkg这个工具来管理第三方库,好像这个 vcpkg工具只能在cmake的项目中才能使用。
杨永贞
2022/04/13
3.6K0
ant命令征集详解
ANT的命令到此结束。他们的依赖关系,大家细细琢磨。本人目前已经不使用ANT脚本很久了。目前使用的maven,maven比ANT好多了,具体好在哪里大家可以到网上搜一搜。等以后有时间了给大家贡献maven的讲解。请大家多多关注本人的博客!!
业余草
2019/01/21
6970
ant命令征集详解
程序打包问题及解决方法汇总
  小白:怎么我编译好的程序在QtCreator能运行,但我在文件夹下打开却不行了呢?   Qt君:因为QtCreator运行下的程序附带了运行环境,而离开了QtCreator软件没有运行环境会报以下的一些错误(库找不到)。
Qt君
2019/09/30
2K0
程序打包问题及解决方法汇总
Python numpyf2py链接库
用户在使用 Python 的 numpy/f2py 模块将 FORTRAN 程序包装成 Python 模块时遇到了问题。在链接 FORTRAN 程序中用到的外部库时,遇到了错误信息:
华科云商小徐
2025/02/12
850
Qt-qmake install相关
在之前的博文中,已经说过相关 autotools,qmake转cmake,cmake-cpack,checkinstall,linuxdeployqt ,本博文将qt 安装配置做一个简单的讲解,搭配 linuxdeployqt 来说明,qmake 安装配置。
何其不顾四月天
2023/03/10
1.5K0
QMake 工程 转换为CMake 工程
QMake 工程 转换为CMake 工程 源码目录结构 . ├── build.sh ├── businesscontrol.cpp ├── businesscontrol.h ├── globaldef.h ├── lib │ └── x86_64 ├── log │ ├── LogFileManager.cpp │ ├── LogFileManager.h ├── main.cpp ├── mqtt │ ├── mqttclient.cpp │ ├── mqttclient.h ├
何其不顾四月天
2023/03/10
1.1K0
linux下编译qt5.6.0静态库
编译QT是一件比较麻烦的事情。所以如果没有必要,就不要编译了。如果你只需要使用QT的一些基本功能,那么就只编译源码目录下的qtbase目录下的东西即可。 下面所介绍的都只是在linux下适用的(windows下使用MinGW也可以,QT提供的MinGW安装包是32位的,需要64位的可以参考)。 在编译前,最好先安装完成相关的依赖包,主要是xcb/opengl等。编译器使用gcc5及以上版本速度会比较快。i5-4460 CPU @ 3.20GHz+8G内存下编译时间大概是2.5个小时。 编译的时候对磁盘空间要求非常非常的大75G ./qt-src/qt-opensource-src-5.6.0(这是还没有完全编译完时候的情况),如果无法接受,就别编译debug版本和examples了。
用户3519280
2023/07/06
1.2K0
linux下编译qt5.6.0静态库
https://jaredtao.gitee.io/2019/09/02/Qt实用技能6-程序发布指南/
有很多人向涛哥询问,Qt程序发布的相关问题,网络上虽然可以搜到一大堆教程,但是可靠的比较少。
用户3519280
2023/07/06
3270
https://jaredtao.gitee.io/2019/09/02/Qt实用技能6-程序发布指南/
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
2.9K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake库打包以及支持find_package
本文对CMake中库的打包,安装,导出以及支持find_package,使其能够很简单的应用到其他的项目中进行详细的总结。
泽霖
2023/11/29
5680
漫谈C++ - 实践之路
从开始学习C++聊起吧,大学的专业是电子信息工程,从大一开始接触C++,最开始的时候,照着书敲,都会有一大堆错误,也就是熟悉的 烫烫烫烫,再后来接触嵌入式,然后到正式工作,也就正式开始C++的开始旅程。开发的IDE从Vs Studio到Qt,到notpad++,再到 vs code,也一直在边工作边看书,慢慢的经验在累积也学到的越来越多了。工作到现在大概也有7年了,也应证了那句话,了解的越多也越觉得自己浅薄。也趁着这次的活动记得机会,简单的说一下自己对C++的理解以及使用。
何其不顾四月天
2023/12/19
2510
【QT】:QT(介绍、下载安装、认识 QT Creator)
所谓客户端就是直接和用户打交道的一端从程序,就比如 chrome,cctalk,……
IsLand1314
2024/12/20
4.1K0
【QT】:QT(介绍、下载安装、认识 QT Creator)
rsync 运维利器,同步工具
rsync - faster, flexible replacement for rcp
WindWant
2020/09/11
2.3K0
相关推荐
发布一键式打包脚本工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验