【问题标题】:How to change file timestamp from CMake?如何从 CMake 更改文件时间戳?
【发布时间】:2018-07-10 22:18:09
【问题描述】:

我正在从 CMake 脚本为 QtCreator 生成 .pro 文件。稍后将使用 QMAKE_EXTRA_COMPILERS 指令生成项目中的文件(仅当文件比它们旧时,才使用外部工具从其他文件重新生成文件)。

  • 为确保要生成的文件在没有警告的情况下导入 QtCreator 项目,我需要创建它(否则 QtCreator 在解析 .pro 文件时会报告警告)。
  • 为确保文件在第一次编译时生成,我需要将时间戳更改为非常旧(比用于生成它的任何输入文件都旧)。这是 QMAKE_EXTRA_COMPILERS 需要重新生成文件的必要条件。

为此,我这样做:

file(WRITE ${output_file_path} "To be generated..." )
execute_process( COMMAND touch.exe ${output_file_path} -t 0001010101 )

但是,execute_process( COMMAND touch.exe ${output_file_path} -t 0001010101 ) 需要一段时间。我的项目中有数百个类似的文件,并且评论此execute_process 行会将我的 CMake 生成时间除以 2(0m45s 与 1m30s)。我敢打赌,外部进程的执行会减慢速度......

有没有办法使用纯 CMake 命令更改文件时间戳?

【问题讨论】:

  • 最好使用cmake内置命令:execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${output_file_path} -t 0001010101)。你不能在一个命令中触摸所有文件吗?
  • @KamilCuk:您应该将此作为答案发布。即使使用 cmake 内置命令实际上并没有加快速度,它也回答了这个问题。一次触摸多个文件实际上是加快速度的好方法,让我节省了几秒钟......

标签: cmake


【解决方案1】:

cmake 内置命令是首选方式。您可以使用touch 文件:

execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${output_file_path} -t 0001010101)

这也适用于任何平台,独立于 linux 或 windows。

如果你有“数百个文件”,你可以通过提供带有多个参数的 touch 命令在一个语句中触摸它们,从而节省运行 make/build 系统命令的时间(更少的依赖关系来解决 cmake 构建系统:)。

【讨论】:

  • 其实我只是注意到execute_process( COMMAND ${CMAKE_COMMAND} -E touch ${output_file_path} -t 0001010101 )没有修改文件时间戳(我在Windows下和${output_file_path}有斜线...)。
  • 噗,对,我知道有问题。 cmake 的 touch 太粗糙了,看不懂-t 选项。可能它创建了名为 -t0001010101 的文件。
  • 不知道它是做什么的,但它最终不起作用,路径使用斜杠或反斜杠......
  • 所以可能正确的答案是“不幸的是,你不能用 CMake 内置命令来做到这一点......”;-)
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2013-10-24
  • 2011-08-06
  • 1970-01-01
  • 2016-01-09
  • 2018-11-27
  • 2017-11-18
相关资源
最近更新 更多