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

标签 c++ linux file cmake

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

#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 文件。我该怎么做?

最佳答案

您可以为此使用 configure_file():

configure_file(version.hpp.in ${DESTPATH}/version.hpp)

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

If the file is modified the build system will re-run CMake to re-configure the file and generate the build system again.

(来源:文档,见下文)

文件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] ])

文档:


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

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

最小示例

版本.h.in

#define VERSION ${VERSION}

只是为了测试......

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)

设置版本.cmake

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

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

关于c++ - CMake:如何使用 make 命令创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193171/

相关文章:

c++ - 对 void 及其含义的困惑。

c++ - std::mt19937 具有非重复值的梅森扭曲分布

android - getExternalCacheDir() 如何在 Android 上运行?

c++ - c++在编译时检查是否调用了函数

c++ - 在什么条件下调用 CCmdTarget::OnFinalRelease?

linux - 在 shell 脚本中执行命令时在双引号内转义单引号

linux - 在 Red Hat Linux 上如何确定 Sybase SQL Anywhere 的版本?

arrays - 如何在 bash shell linux 中交换数组元素?

android - 如何从Android上的SD卡读取选定的文本文件

文件共享