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

时间:2014-10-04 13:12:31

标签: 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"
)

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

最小示例

Version.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