Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:使用忍者构建时如何处理添加自定义命令子构建 我使用CMASE来构建一个C++项目(在Linux上)。该项目由多个子项目组成,每个子项目都可以调用函数来创建有用的link\u date.c源文件,其中包含链接发生时的时间戳。我使用这一方法可靠地将构建时间嵌入到二进制文件中,而不管自上次构建以来发生了哪些源更改_Cmake_Build_Migration_Ninja_Add Custom Command - Fatal编程技术网

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目录顶部生成一个Ninja
build.Ninja
文件,子
cmake--build
失败,因为此子项目目录中没有
build.ninja

有没有办法修改这个过程来与忍者合作

我知道并不是每个CMake项目都可以从Makefiles迁移到Ninja,但是这是我在这个项目中遇到的唯一真正的障碍,所以找到一个解决方法会很好