这似乎应该很容易做到,但我不知道如何去做。
基本上,我想获取一个源列表(目前只是一个变量$ {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命令......但是这个宏可能在很多地方。每个项目都设置变量,我不确定它是多么安全。我觉得应该有更好的方式...
答案 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()