如何让cmake在实际构建/链接后创建时间戳文件? (如果可执行文件没有更改,则不执

时间:2012-11-16 15:09:13

标签: cmake

我想为我生成的三个可执行文件date +"%s" > ${TIMESTAMP}myapp_datamyapp_live中的每一个调用myapp_sim(即只创建相应可执行文件的时间戳)已创建)。

我似乎无法弄清楚为什么即使我删除二进制文件并重新链接后我的自定义命令仍未执行。构建工作正常 - 只有时间戳生成不起作用。

MACRO( MY_APP TAG )
  SET( BINARY_TGT "myapp_${TAG}" )
  SET( TIMESTAMP  "TIMESTAMP_${TAG}" )
  ADD_EXECUTABLE( ${BINARY_TGT} ${APP_SRCS} )

  ADD_CUSTOM_COMMAND(
    OUTPUT  ${TIMESTAMP}
    COMMAND date 
    ARGS    +\"%s\" > ${TIMESTAMP}
    DEPENDS ${BINARY_TGT}
  )
ENDMACRO( MY_APP )

SUBDIRS( data )
SUBDIRS( live )
SUBDIRS( sim  )

在数据目录中,我有:

FILE(GLOB APP_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} main_data.cpp)
SET( MY_TAG data )
MY_APP( "${MY_TAG}" )

1 个答案:

答案 0 :(得分:2)

CMake不会运行自立式自定义命令,除非取决于它们的输出。一种选择是将自定义命令更改为后期构建:

add_custom_command(
  TARGET ${BINARY_TGT}
  POST_BUILD
  COMMAND date +\"%s\" > ${TIMESTAMP}
  VERBATIM
)

另一个选项是添加自定义目标以驱动自定义命令。一个目标足以用于所有自定义命令。

add_custom_target(
  GenerateTimestamps ALL
  DEPENDS ${yourListOfTimestampFiles}
)

但是,我不确定重定向是否会按预期工作。在shell /命令提示符下键入>时,它不是程序的参数,而是shell /命令处理器的指令。如果它不起作用(我从未测试过),则必须将date的调用放入脚本中。