【问题标题】:CMake: How to create a file with make commandCMake:如何使用 make 命令创建文件
【发布时间】:2014-11-29 08:26:20
【问题描述】:

我需要创建以下始终过期的文件:${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 文件。我该怎么做?

【问题讨论】:

    标签: c++ linux file cmake


    【解决方案1】:

    您可以为此使用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] ])
    

    文档:


    # '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)
    

    SetVersion.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 上。

    【讨论】:

    • 重点是我已经在使用configure_file!我试图生成的version.hpp.in 文件应该是configure_file 命令的 文件。问题是 configure_file 仅在 被修改后执行。这就是为什么我总是尝试生成 文件 (version.hpp.in) 以便始终执行 configure_file
    • 我明白了,所以你可以测试add_custom_command(),例如。如here 所述。我希望这会有所帮助。
    • 您能帮我一个忙并将其整合到您的答案中吗?我无法理解它......
    • 一个更好地理解你的问题的问题:如果你改变一个变量,例如。 RELEASE 在你的 cmake 文件中,运行 make 也应该重新运行 cmake。
    • 即使删除了配置文件,也会在make上重新创建。顺便提一句。你用的是什么版本的cmake? -- 5 分钟编辑时间结束 :-(
    【解决方案2】:

    您可以使用add_custom_command(也许还有add_custom_target)来做这种事情。

    由于您要在程序中构建版本符号,我将告诉您我使用的一种稍微不同的方法。我在这里问了一个与它相关的问题,有一些代码:Embed Git revision in executable during remote build with NetBeans

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

    【讨论】:

    • configure_file 是事实。不是objcopy
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多