QMake复制文件/目录方法

使用QMake语法方便复制文件或文件夹。

使用

# 配置file_copies
CONFIG += file_copies

# 创建examples变量并配置
# 配置需要复制的文件或目录(支持通配符)
examples.files = $$PWD/MyExamples
# 配置需要复制的目标目录, $$OUT_PWD为QMake内置变量,含义为程序输出目录
examples.path = $$OUT_PWD

# 配置COPIES
COPIES += examples

来源

  从Qt5.6引入,该方法是非官方文档说明,后续可能不支持。

https://codereview.qt-project.org/c/qt/qtbase/+/156784

  以Qt 5.12.1的MSVC版本文件路径。

C:\Qt\Qt5.12.1\5.12.1\msvc2017_64\mkspecs\features\file_copies.prf

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

实现

file_copies.prf对应源码:

isEmpty(COPIES): return()
contains(TEMPLATE, .*subdirs): error("COPIES does not work with TEMPLATE=subdirs")

build_pass:build_all:!isEqual(BUILD_PASS, $$first(BUILDS)) {
    # Avoid that multiple build passes race with each other.
    # This will fail to copy anything if the user explicitly invokes
    # only the non-primary build. This is unfixable, as at qmake time
    # we cannot possibly know how make will be invoked, yet we must
    # predict it here.
    return()
}

defineReplace(qtStripProPwd) {
    return($$relative_path($$1, $$_PRO_FILE_PWD_))
}

for (cp, COPIES) {
    isEmpty($${cp}.files): next()
    pfx = copy_$${cp}
    notdir = false
    dir = false
    for (f, $${cp}.files) {
        fil = $$absolute_path($$f, $$_PRO_FILE_PWD_)
        tfiles = $$files($$fil/*)
        isEmpty(tfiles): \
            notdir = true
        else: \
            dir = true
        $${pfx}.files += $$fil
    }
    $$dir:$$notdir: \
        error("COPIES entry $$cp lists both files and directories.")
    path = $$eval($${cp}.path)
    isEmpty(path): error("COPIES entry $$cp defines no .path")
    base = $$eval($${cp}.base)
    isEmpty(base) {
        $${pfx}.output = $$path/${QMAKE_FILE_IN_NAME}
    } else: isEqual(base, $$_PRO_FILE_PWD_) {
        $${pfx}.output = $$path/${QMAKE_FUNC_FILE_IN_qtStripProPwd}
    } else {
        eval(defineReplace(qtStripSrcDir_$$cp) { \
            return(\$\$relative_path(\$\$1, $$val_escape(base))) \
        })
        $${pfx}.output = $$path/${QMAKE_FUNC_FILE_IN_qtStripSrcDir_$$cp}
    }
    $${pfx}.input = $${pfx}.files
    $${pfx}.commands = $(QINSTALL) ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
    $${pfx}.name = COPY ${QMAKE_FILE_IN}
    $${pfx}.CONFIG = no_link no_clean target_predeps
    QMAKE_EXTRA_COMPILERS += $${pfx}
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 QMake 中添加一个复制文件的子目标,可以使用 `QMAKE_EXTRA_TARGETS` 变量和 `QMAKE_EXTRA_COMPILERS` 变量。以下是一个示例: ``` # 定义目标文件路径 DESTDIR = path/to/destination # 定义复制文件列表 COPY_FILES += file1.txt \ file2.txt \ file3.txt \ ... # 定义复制文件的编译器 copy_files.input = COPY_FILES copy_files.output = ${DESTDIR} copy_files.commands = $(COPY_DIR) ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} # 将编译器添加到 QMAKE_EXTRA_COMPILERS 中 QMAKE_EXTRA_COMPILERS += copy_files # 定义子目标 copy_target.target = copy_files copy_target.depends = $(copy_files.output) copy_target.commands = copy_target.clean = $(COPY_DIR) $(DEL_FILE) $(copy_files.output) # 将子目标添加到 QMAKE_EXTRA_TARGETS 中 QMAKE_EXTRA_TARGETS += copy_target ``` 在这个示例中,我们首先定义了目标文件的路径 `DESTDIR`,以及要复制文件列表 `COPY_FILES`。然后,我们定义了一个名为 `copy_files` 的编译器,它的输入为 `COPY_FILES`,输出为 `${DESTDIR}`,命令为将输入文件复制到 `${DESTDIR}` 目录中。接着,我们将编译器添加到 `QMAKE_EXTRA_COMPILERS` 变量中。 然后,我们定义一个名为 `copy_target` 的子目标,它的依赖项为 `copy_files.output`,命令为空,清理命令为删除 `${DESTDIR}` 目录。最后,我们将子目标添加到 `QMAKE_EXTRA_TARGETS` 变量中。 在构建项目时,可以使用 `make copy_target` 命令来执行复制文件的操作。如果需要在构建目标之前执行复制文件操作,可以将 `copy_target` 添加到 `PRE_TARGETDEPS` 变量中。 希望这个方法可以帮助你实现在 QMake 中添加复制文件的子目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值