首页 文章

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

提问于
浏览
3

我试图在多个文件夹中复制目标二进制文件 . 在第一步中,我必须创建这些多个文件夹 . 我没跟上这个example但没有成功 .

唯一有用的是 system(mkdir $$OUT_PWD/newFolder) ,但我正在尝试使用 QMAKE_EXTRA_TARGETS$(MKDIR) ,然后使用 $(COPY) 来自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重命名install命令,则会收到以下错误:make:copy:找不到命令 . 有什么线索吗?

2 回答

  • 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
    
  • 2

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

    感谢macetw为 POST_TARGETDEPS ,这也引导我 QMAKE_POST_LINK . qmakemake 在没有任何额外参数的情况下运行 .

    # 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
    

相关问题