创建目录&使用qmake复制文件

时间:2015-09-17 13:07:28

标签: qt qmake

我正在尝试将目标二进制文件复制到多个文件夹中。在第一步中,我必须创建这些多个文件夹。我跟着这个example没有成功。

唯一可行的是system(mkdir $$OUT_PWD/newFolder),但我正在尝试使用 QMAKE_EXTRA_TARGETS的{​​{1}}后跟example$(MKDIR)

将Qt 4.8.6与qmake 2.01a一起使用。

这是我运行qmake的方式: $(COPY)

更新: 这是我当前的实现,它创建目录列表并将目标二进制文件复制到选定的目录。

qmake Server.pro -r -spec linux-g++ CONFIG+=debug CONFIG+=declarative_debug

我缺少的部分是我没有使用正确的参数执行make。在调用# List all server directories DIRS = server-1 \ server-2 \ server-3 \ server-4 INSTALL_PATH = $$OUT_PWD # Shadow build detection !equals(PWD, $$OUT_PWD) INSTALL_PATH = $$replace(INSTALL_PATH, build, install) # Loop over all given directories and append the 'install' directory to make absolute paths for(DIR, DIRS) ABS_DIRS += $$INSTALL_PATH/$$DIR # Create 'copy' commands for $DIRS for(DIR, ABS_DIRS) CP_CMD += $(COPY) $$OUT_PWD/$$TARGET $$DIR && # Ignore last && CP_CMD += true install.commands = $(MKDIR) $$ABS_DIRS && $$CP_CMD QMAKE_EXTRA_TARGETS += install QMAKE_POST_LINK += install 并且还包含qmake make install文件后,代码将执行。但是,如果出现以下错误,则无法进行干净构建:安装:缺少文件操作数。如果我使用例如copy重命名install命令,则会收到以下错误:make:copy:找不到命令。有线索吗?

2 个答案:

答案 0 :(得分:2)

此文档似乎缺少使用PRE_TARGETDEPSPOST_TARGETDEPS

这意味着Makefile具有执行它需要做的操作的指令,但这些目标没有内置到依赖链中,因此Make工具永远不会执行它们。

如果问题是关于做两件事(而不仅仅是一件),请尝试将2个命令放在同一行中。像这样:

QMAKE_EXTRA_TARGETS += foo
foo.target = $$OUT_PWD/newFolder
foo.commands = $(MKDIR) $$OUT_PWD/newFolder ; $(COPY_DIR) $SOURCE $$OUT_PWD/newFolder

...您也可以尝试“&&”而不是“;”,以获得强大的返回代码检查。您可以选择创建彼此依赖的2 QMAKE_EXTRA_TARGETS

QMAKE_EXTRA_TARGETS += foo bar
foo.target = $$OUT_PWD/newFolder
foo.commands = $(MKDIR) $$OUT_PWD/newFolder
bar.target = $$OUT_PWD/newFolder/file
bar.commands = $(COPY_DIR) $SOURCEOFFILE $$OUT_PWD/newFolder
bar.depends = foo

答案 1 :(得分:2)

搞定了。一些附注...如果启用了阴影构建,QtCreator默认会创建build-project-kit-debug / release目录以进行构建。此代码在同一级别上创建install-project-kit-debug / release目录,并列出DIRS作为子目录。使用create命令编译后创建目录。然后在链接后将目标二进制文件复制到DIRS目录。

感谢POST_TARGETDEPS的macetw,它也引导我QMAKE_POST_LINKqmakemake在没有任何额外参数的情况下运行。

# Sets target destination dir - platform independent
win32 {
    build_pass: CONFIG(debug, debug|release) {
        DESTDIR = $$OUT_PWD/debug
    }
    else: build_pass {
        DESTDIR = $$OUT_PWD/release
    }
}

unix {
    DESTDIR = $$OUT_PWD
}

# List all server directories
DIRS = server-1 \
       server-2 \
       server-3 \
       server-4

INSTALL_PATH = $$DESTDIR
# Shadow build detection
!equals(PWD, $$DESTDIR) INSTALL_PATH = $$replace(INSTALL_PATH, build, install)

# Loop over all given directories and append the 'install' directory to make absolute paths
for(DIR, DIRS) ABS_DIRS += $$INSTALL_PATH/$$DIR
# Create 'copy' commands for $DIRS
for(DIR, ABS_DIRS) CP_CMD += $(COPY) $$DESTDIR/$$TARGET $$DIR ;

create.commands = $(MKDIR) $$ABS_DIRS

QMAKE_EXTRA_TARGETS += create
POST_TARGETDEPS += create

QMAKE_POST_LINK += $$CP_CMD