代码之家  ›  专栏  ›  技术社区  ›  krizajb

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

  •  6
  • krizajb  · 技术社区  · 9 年前

    我正在尝试复制多个文件夹中的目标二进制文件。在第一步中,我必须创建多个文件夹。我遵循了这个 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。呼叫后 make install 其中还包括qmake INSTALLS 文件,代码将执行。但是,这在清理生成时失败,并出现给定错误:install:缺少文件操作数。如果使用例如copy重命名安装命令,则会出现以下错误:make:copy:command not found。有线索吗?

    2 回复  |  直到 9 年前
        1
  •  5
  •   krizajb    9 年前

    工作正常。一些附带说明…如果启用了影子构建,QtCreator默认会为构建创建构建项目工具包调试/发布目录。此代码在与列出的相同级别上创建安装项目工具包调试/发布目录 DIRS 作为子目录。使用编译后创建目录 create 命令然后将目标二进制文件复制到 迪尔斯 链接后的目录。

    感谢mactw POST_TARGETDEPS 这也导致我 QMAKE_POST_LINK . qmake make 在没有任何额外参数的情况下运行。

    # 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
    
        2
  •  3
  •   krizajb    9 年前

    本文档似乎缺少 PRE_TARGETDEPS POST_TARGETDEPS .

    这意味着Makefile具有执行所需操作的指令,但这些目标没有内置到依赖链中,因此Make工具从不执行这些操作。

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

    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