2014-05-09 31 views
1

這似乎是應該很容易做的事情,但我不能爲我的生活弄清楚如何去做。configure_file文件列表 - > #includes 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命令......但是這個宏可能在很多地方。每個項目都設置了變量,我不確定這是多麼安全。我覺得應該有一個更好的辦法...

回答

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有一個內置的只寫-IF-不同。

+0

我正在考慮使用配置文件。不過,我正在寫這個函數用於一些項目。如果將CMAKE_CONFIGURABLE_FILE_CONTENT設置在一堆不同的目錄中,是否有任何風險? – IdeaHat

+0

您可以取消它。我剛剛擴展我的例子來做到這一點。 – steveire

+0

偉大的功能感謝指出。這裏使用'@ ONLY'有意義嗎? – triclosan

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() 
+0

是和否。如果我在那裏做了你所擁有的,那麼它就會在每一次構建中運行。頭文件C文件將在每個構建中被觸及(並因此被重建),這是令人討厭的。 – IdeaHat

+0

只有當CMake再次運行時,只有當CMake檢測到您修改了一些CMakeLists.txt或更改了變量時纔會發生這種情況。即使在這種情況下你想避免它?理想情況下爲 – Yirkha

+0

。如果我可以添加一個依賴項到一個變量,我可以用echo來做... – IdeaHat