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

Create dir & Copy files with qmake

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

唯一有效的方法是 system(mkdir $$OUT_PWD/newFolder),但我正在尝试使用 QMAKE_EXTRA_TARGETS for $(MKDIR) followed by $(COPY) from this example.

使用 Qt 4.8.6 和 qmake 2.01a。

这就是我 运行 qmake 的方式: qmake Server.pro -r -spec linux-g++ CONFIG+=debug CONFIG+=declarative_debug

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

# 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

对我来说,缺少的部分是我没有使用正确的参数执行 make。在调用还包括 qmake INSTALLS 文件的 make install 之后,代码将执行。然而,这在干净的构建上失败并出现给定错误:安装:缺少文件操作数。如果我用例如 copy 重命名安装命令,我会收到此错误:make: copy: Command not found。有什么线索吗?

此文档似乎没有使用 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

...您也可以尝试使用“&&”而不是“;”,以获得对 return 代码的严格检查。您可以选择创建 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

成功了。一些旁注……如果启用了影子构建,QtCreator 默认会创建 build-project-kit-debug/release 构建目录。此代码在与列出的 DIRS 作为子目录的同一级别上创建 install-project-kit-debug/release 目录。使用 create 命令编译后会创建目录。目标二进制文件在链接后被复制到 DIRS 目录。

感谢 macetw POST_TARGETDEPS 这也让我达到了 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