CMake:如何使用make命令创建文件

13
我需要在makefile中的任何目标执行之前创建以下始终过时的文件: ${CMAKE_BINARY_DIR}/version.hpp.in。文件内容如下:

#define RELEASE_VERSION "${RELEASE}"
#define MAJOR_VERSION "${MAJOR}"
#define MINOR_VERSION "${MINOR}"
#define PATCH_VERSION "${PATCH}"
#define REVISION "${REVISION}"
#define SVNPATH "${SVNPATH}"

我在我的CMake文件中有以下代码片段,但只有在运行cmake命令后才会执行:
FILE(WRITE ${CMAKE_BINARY_DIR}/version.hpp.in
"#define RELEASE_VERSION \"${RELEASE}\"\n"
"#define MAJOR_VERSION \"${MAJOR}\"\n"
"#define MINOR_VERSION \"${MINOR}\"\n"
"#define PATCH_VERSION \"${PATCH}\"\n"
"#define REVISION \"${REVISION}\"\n"
"#define SVNPATH \"${SVNPATH}\"\n"
)

我希望每次运行make命令时都能生成version.hpp.in文件。我该怎么做?

2个回答

7
您可以使用configure_file()来完成这个任务:
configure_file(version.hpp.in ${DESTPATH}/version.hpp)

DESTPATH是可选的,用于设置您想要的文件路径。

如果修改了该文件,则构建系统将重新运行CMake以重新配置该文件并再次生成构建系统。

(来源: 文档,见下文)

文件version.hpp:

#define RELEASE_VERSION "${RELEASE}"
#define MAJOR_VERSION "${MAJOR}"
#define MINOR_VERSION "${MINOR}"
#define PATCH_VERSION "${PATCH}"
#define REVISION "${REVISION}"
#define SVNPATH "${SVNPATH}" 

语法:

configure_file(<input> <output>
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

Documentation:


# 'example' is the targetname here, eg. using add_executable(example example.cpp)

add_custom_command(TARGET example PRE_BUILD COMMAND <CMAKE COMMAND HERE>)

最简示例

Version.h.in

#define VERSION ${VERSION}

Just for testing …

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

set(VERSION 1.10)
set(TEMPLATE_DIR ${CMAKE_CURRENT_SOURCE_DIR})

add_executable(example example.cpp)

add_custom_command(TARGET example PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/SetVersion.cmake)

SetVersion.cmake

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../Version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/../Version.h)
message("Version set") # For testing only

现在按照惯例运行cmakemake,并检查make是否打印出HELLO


我明白了,所以你可以测试add_custom_command(),例如在这里所述(http://cmake.3232098.n2.nabble.com/configure-file-as-a-build-step-td7518670.html)。希望这能更有帮助。 - ollo
你能否帮我一个忙,在你的回答中集成一下这个?我无法理解它... - B Faley
cmake版本:2.8.10.1。如果我删除了配置文件,那么configure_file命令不会被执行,因为它的输入没有改变。 - B Faley
好的,但是问题在3.0.2中没有解决,对吧?我会将其余部分编辑到我的答案中,只需要给我一些时间。 - ollo
没有修复。非常感谢您。 - B Faley
显示剩余11条评论

0

你可以使用add_custom_command(也许还有add_custom_target)来完成这种操作。

既然你在询问如何将版本符号嵌入程序中,我会告诉你我使用的略微不同的方法。我在这里提出了一个相关问题,并附上了一些代码:在NetBeans远程构建期间将Git修订版嵌入可执行文件

我使用的概念是直接从文本文件中生成对象文件中的实际符号,这个文本文件是我在构建(或git pull)时编写的。然后将此文件链接到可执行文件中。


configure_file is the defacto. Not objcopy - daparic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接