configure_file文件列表 - > #includes cmake

时间:2014-05-09 20:33:05

标签: c++ cmake

这似乎应该很容易做到,但我不知道如何去做。

基本上,我想获取一个源列表(目前只是一个变量$ {HDR_LIST}),并将它们作为包含在文件中。所以如果HDR_LIST="foo.h;bar.h;baz.h;quz.h"它会生成文件

#include "foo.h"
#include "bar.h"
#include "baz.h"
#include "quz.h"

我希望此文件仅在HDR_LIST更改时才会更新。

我能想到的唯一方法是创建一个configure_file命令......但是这个宏可能在很多地方。每个项目都设置变量,我不确定它是多么安全。我觉得应该有更好的方式...

2 个答案:

答案 0 :(得分:3)

cmake_minimum_required(VERSION 2.8)

project(MyTest)

set(CMAKE_CONFIGURABLE_FILE_CONTENT
  "#include \"inc1.h\"")
set(CMAKE_CONFIGURABLE_FILE_CONTENT
  "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n#include \"inc2.h\"")
set(CMAKE_CONFIGURABLE_FILE_CONTENT
  "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n#include \"inc3.h\"")
set(CMAKE_CONFIGURABLE_FILE_CONTENT
  "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n#include \"inc4.h\"")

configure_file("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
  "${CMAKE_CURRENT_BINARY_DIR}/myfile.h"
  @ONLY
)
unset(CMAKE_CONFIGURABLE_FILE_CONTENT)

configure_file有一个内置的只写,如果不同。

答案 1 :(得分:1)

我认为您正在寻找foreach()file(APPEND ...)的一些组合:

file(REMOVE "includes.h")
foreach(filename ${HDR_LIST})
    file(APPEND "includes.h" "#include \"${filename}\"")
endforeach(filename)

每当更改HDR_LIST时,将再次运行CMake并重新生成文件。


如果你想只在不同的情况下编写文件,那就有点难了,因为AFAIK,在CMake中没有依赖变量。但你可以做到,例如这个解决方法有一些哈希:

set(new_includes "")
foreach(filename ${HDR_LIST})
    set(new_includes "${new_includes}#include \"${filename}\"")
    if(WIN32)
        set(new_includes "${new_includes}\r\n")
    else()
        set(new_includes "${new_includes}\n")
    endif()
endforeach()
string(SHA256 new_includes_hash "${new_includes}")

file(SHA256 "includes.h" current_includes_hash)
if(NOT current_includes_hash STREQUAL new_includes_hash)
    file(WRITE "includes.h" "${new_includes}")
endif()