CMake:使用忍者构建时如何处理添加自定义命令子构建 我使用CMASE来构建一个C++项目(在Linux上)。该项目由多个子项目组成,每个子项目都可以调用函数来创建有用的link\u date.c源文件,其中包含链接发生时的时间戳。我使用这一方法可靠地将构建时间嵌入到二进制文件中,而不管自上次构建以来发生了哪些源更改
此函数声明如下:CMake:使用忍者构建时如何处理添加自定义命令子构建 我使用CMASE来构建一个C++项目(在Linux上)。该项目由多个子项目组成,每个子项目都可以调用函数来创建有用的link\u date.c源文件,其中包含链接发生时的时间戳。我使用这一方法可靠地将构建时间嵌入到二进制文件中,而不管自上次构建以来发生了哪些源更改,cmake,build,migration,ninja,add-custom-command,Cmake,Build,Migration,Ninja,Add Custom Command,此函数声明如下: function(add_link_date TARGET) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/link_date.c.in " const char *link_date() { return(\"@LINK_DATE@\"); } ") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/link_date.cmake "
function(add_link_date TARGET)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/link_date.c.in "
const char *link_date() { return(\"@LINK_DATE@\"); }
")
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/link_date.cmake "
EXECUTE_PROCESS(
COMMAND date
OUTPUT_VARIABLE LINK_DATE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
CONFIGURE_FILE(\${SRC} \${DST} @ONLY)
")
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/link_date.c
COMMAND ${CMAKE_COMMAND} -DSRC=link_date.c.in -DDST=link_date.c
-P link_date.cmake
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/link_date.c.in)
add_library(link_date-${TARGET} STATIC EXCLUDE_FROM_ALL link_date.c)
target_link_libraries(${TARGET} link_date-${TARGET})
add_custom_command(
TARGET ${TARGET}
PRE_LINK
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/link_date.c.in
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR} --target link_date-${TARGET})
endfunction()
此函数为其调用的每个目标创建一个link\u date.c.in
模板,然后使用此模板仅为该目标创建link\u date.c
。然后将其添加到特定于目标的库中,然后该库与目标可执行文件链接。最后一个add_custom_命令
用于确保每次CMake将要链接目标可执行文件时都重建链接日期库。我从你那里得到了这个的原始代码
关键是它总是将构建时间戳注入到可执行文件中,无论是谁构建它-开发人员、CI管道等。它与Makefiles生成器配合得非常好,我已经使用了12个多月,没有任何问题
最近,我一直在考虑更新我们的构建以使用Ninja,因为在我的大多数管道中,Ninja的速度明显更快,但是在这个项目中,它遇到了一个问题,特别是在运行子构建的最后一个add_custom_COMMAND
(PRE_LINK)语句的最后一个命令中。这会将cd
插入调用add\u link\u date
的子项目的build子目录,但因为CMake只在build目录顶部生成一个Ninjabuild.Ninja
文件,子cmake--build
失败,因为此子项目目录中没有build.ninja
有没有办法修改这个过程来与忍者合作
我知道并不是每个CMake项目都可以从Makefiles迁移到Ninja,但是这是我在这个项目中遇到的唯一真正的障碍,所以找到一个解决方法会很好