作为构建过程的一部分,我们将构建好的二进制文件安装到某个位置。
我有一个自定义的cmake脚本,检查构建的二进制文件的时间戳,如果它比已安装的二进制文件更新,则复制它。
以下是脚本的节选:
if(SRC_FILE IS_NEWER_THAN DEST_FILE)
message(STATUS "installing ${DEST_FILE}")
execute_process(
COMMAND
${CMAKE_COMMAND} -E make_directory ${INSTALL_DIR}
COMMAND
${CMAKE_COMMAND} -E copy ${SRC_FILE} ${DEST_FILE}
# copy preserves timestamps, so touch to make the installed file newer
COMMAND
${CMAKE_COMMAND} -E touch ${DEST_FILE}
)
endif()
由于某种原因,我一直从IS_NEWER_THAN
返回true
,所以我添加了一些调试语句来打印两个文件的时间戳:
file(TIMESTAMP ${DEST_FILE} DEST_TIMESTAMP)
file(TIMESTAMP ${SRC_FILE} SRC_TIMESTAMP)
message("DST_FILE: ${DEST_TIMESTAMP} ${DEST_FILE}")
message("SRC_FILE: ${SRC_TIMESTAMP} ${SRC_FILE}")
if(SRC_FILE IS_NEWER_THAN DEST_FILE)
message("SRC is newer than DEST")
endif()
下面是一些示例输出:
DST_FILE: 2016-11-17T15:08:28 /home/steve/src/install/app SRC_FILE: 2016-11-17T14:56:35 /home/steve/src/.build/app/app.bin SRC is newer than DEST
这清楚地表明SRC_FILE
在14:56:35
创建,DEST_FILE
在15:08:28
创建。
为什么IS_NEWER_THAN
为SRC_FILE
返回true
?
从文档中可以看出,if(file1 IS_NEWER_THAN file2)
接受两个文件名,而不是变量。
if(file1 IS_NEWER_THAN file2) True if file1 is newer than file2 or if one of the two files doesn’t exist.
因此,您需要评估变量,以便将实际路径传递给if
。
:
错误:
if(SRC_FILE IS_NEWER_THAN DEST_FILE)
正确的:
if(${SRC_FILE} IS_NEWER_THAN ${DEST_FILE})
我遇到的另一个问题是相对文件名。如文档所示,IS_NEWER_THAN
仅对绝对路径可靠地工作。一种解决方法是像这样创建文件名变量:
set(${PROJECT_NAME}_param_file ${CMAKE_SOURCE_DIR}/param/file)