如何以依赖感知方式复制文件,同时考虑存在和时间戳

Posted

技术标签:

【中文标题】如何以依赖感知方式复制文件,同时考虑存在和时间戳【英文标题】:How to copy file(s) in a dependency-aware manner, taking existence and time stamp into account 【发布时间】:2014-10-06 11:49:05 【问题描述】:

我在 qmake 中遇到了一个奇怪的问题。 我需要make 根据存在和时间戳的规则复制文件。我有 subdirs (TEMPLATE=subdirs) 项目类型。我试过这个:

__file = script.py
__target_file = $$DESTDIR/$$__file

my_target.target = $$__target_file
my_target.commands = cp -f $$__file $$__target_file
my_target.depends = $$__file

all_target.target = all
all_target.depends = $$__target_file

QMAKE_EXTRA_TARGETS *= my_target all_target

我使用 GNU Make 为 Linux 和 Mac OS 构建这个项目。

这里的主要问题是 Makefile 以 all 目标的两条规则结束。第一个是

all: FORCE

第二个是我自定义的all_target

在这种情况下,make 调用不会产生任何结果,而make all 会执行all_target

如果是 libapp 项目类型,使用 qmake 变量 POST_TARGETDEPS 复制任何额外的依赖项会更容易。

附:我还需要能够通过 Visual Studio 9 构建它。

【问题讨论】:

我设法使用first 目标为 GNU Make 解决了这个问题。不幸的是,它在 Visual Studio 中根本不起作用:( 【参考方案1】:

我必须将此项目作为 Visual Studio 9 的 lib-type 使用空源文件 stub.c。并且每次script.py发生变化时,使用黑客方法重新生成stub.c。这很烦人。

.pro-file 的完整代码:

TARGET = my_module

win32: TEMPLATE = lib
else: TEMPLATE = subdirs

SCRIPT_MODULE_FILE = script.py

__file = ...
__target_file = ...
__copy_cmd = ...

win32 
   CONFIG *= staticlib
   DESTDIR = ...
   GENERATED_FILES = stub.c
   my_target.input = SCRIPT_MODULE_FILE
   my_target.output = stub.c
   my_target.commands = $$__copy_cmd && copy /y nul stub.c > nul
   QMAKE_EXTRA_COMPILERS *= my_target

else 
   my_target.target = $$__target_file
   my_target.commands = $$__copy_cmd
   my_target.depends = $$__file
   first.depends = $(first) my_target
   QMAKE_EXTRA_TARGETS *= first my_target

【讨论】:

以上是关于如何以依赖感知方式复制文件,同时考虑存在和时间戳的主要内容,如果未能解决你的问题,请参考以下文章

如何以非阻塞方式压缩文件

如何使用 MVC 模型动态过滤 javafx 中的列表视图控件,同时以多种方式更新? [关闭]

如何使 emf 文件 dpi 感知

如何在保持导航栏存在的同时以模态方式呈现视图控制器。 (对于设置视图控制器)

如何以编程方式复制包含的文件

Java对象的深拷贝