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

Mey*_*sam 7 c++ linux file cmake


在 make 文件中执行任何目标之前,我需要创建以下始终过时的文件:${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"
)
Run Code Online (Sandbox Code Playgroud)

我想version.hpp.in每次运行make命令时生成文件。我怎样才能做到这一点?

oll*_*llo 8

您可以configure_file()为此使用:

\n\n
configure_file(version.hpp.in ${DESTPATH}/version.hpp)\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中DESTPATH是可选的并设置为您想要该文件的路径。

\n\n
\n

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

\n
\n\n

(来源:文档,见下文)

\n\n

文件version.hpp

\n\n
#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
Run Code Online (Sandbox Code Playgroud)\n\n

句法:

\n\n
configure_file(<input> <output>\n               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]\n               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])\n
Run Code Online (Sandbox Code Playgroud)\n\n

文档:

\n\n\n\n
\n\n
# \'example\' is the targetname here, eg. using add_executable(example example.cpp)\n\nadd_custom_command(TARGET example PRE_BUILD COMMAND <CMAKE COMMAND HERE>)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

最小的例子

\n\n

版本.h.in

\n\n
#define VERSION ${VERSION}\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅用于测试 \xe2\x80\xa6

\n\n

CMakeLists.txt

\n\n
cmake_minimum_required(VERSION 2.8.12)\n\nset(VERSION 1.10)\nset(TEMPLATE_DIR ${CMAKE_CURRENT_SOURCE_DIR})\n\nadd_executable(example example.cpp)\n\nadd_custom_command(TARGET example PRE_BUILD \n        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/SetVersion.cmake)\n
Run Code Online (Sandbox Code Playgroud)\n\n

设置版本.cmake

\n\n
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../Version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/../Version.h)\nmessage("Version set") # For testing only\n
Run Code Online (Sandbox Code Playgroud)\n\n

cmake现在像往常一样运行make并检查是否HELLO打印在 上make

\n


Joh*_*nck 0

您可以使用add_custom_command(也许add_custom_target)来执行此类操作。

既然您询问如何在程序中构建版本符号,我将告诉您我使用的稍微不同的方法。我在这里问了一个与之相关的问题,并使用了一些代码:Embed Git revision inexecutable during Remote build with NetBeans

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