每次使用cmake构建cpp文件

d5vmydt9  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(106)

我想要一个文件,其中包含构建日期要建立的每一次。
经过一些研究,我尝试了许多不同的方法,但我不完全理解他们。我认为下面的代码应该工作,但它没有。它被写入一个CMakeLists.txt文件,该文件是许多级联CMakeLists.txt文件的一部分。

[...]
add_library(${PROJECT_NAME} STATIC
        src/software_version.cpp [...]
)
[...]

set(VERSION_FILE "src/software_version.cpp")
add_custom_target(build_software_version ALL COMMAND ${CMAKE_COMMAND} -E touch ${VERSION_FILE})
#or
add_custom_command(TARGET ${PROJECT_NAME} PRE_BUILD  COMMAND ${CMAKE_COMMAND} -E touch ${VERSION_FILE})

编辑:
我在该文件的一个方法中使用了预定义的__ DATE__,我发现如果我不每次都构建该文件,它就不会是最新的。如果我只是对文件做了一个小的修改,这样文件就可以再次构建,日期是正确的。我希望用touch命令实现这一点。所以我希望在构建日志中看到文件已构建的注解。(每次都有一个文件显示在那里)
此时,第一个命令将编译,但不会更改任何内容。第二个在构建时抛出错误。[错误]:https://i.stack.imgur.com/W5Cle.png

shyt4zoc

shyt4zoc1#

您的add_custom_target解决方案几乎可以工作,只有两件事需要添加:
1.自定义目标从构建目录运行.在那里找不到具有该名称的源文件。前缀CMAKE_CURRENT_SOURCE_DIR解决了这个问题。也可以设置add_custom_targetWORKING_DIRECTORY参数。
1.需要添加依赖项,如Jarod 42在评论中所指出的。
我相信下面的代码可以满足你的要求:

add_custom_target(build_software_version 
    COMMAND ${CMAKE_COMMAND} -E touch src/software_version.cpp
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    )
add_library(${PROJECT_NAME} STATIC src/software_version.cpp)
add_dependencies(${PROJECT_NAME} build_software_version)

更多的想法
虽然上面的文字回答了这个问题,但它不一定是解决根本问题的最佳解决方案。为了将当前日期编译成二进制文件,我使用CMake将日期写入文件,而不是依赖于__DATE__预处理器变量。如果做得好,这将迫使每天只重建一次。

相关问题