2015-09-18 36 views
0

CMake的变量管理我发疯....CMake的:从嵌套函数设置变量调用

我想调用一个函数,谁在为了修改一个变量,最终以调用另一个函数是要写入的文件的内容。

它看起来像这样:

function(QMAKE_ADD_LINE_TO_VAR var line) 
    set(${var} "${${var}}\n${line}\n" PARENT_SCOPE) 
endfunction() 

function(QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR var relline debugline) 
    QMAKE_ADD_LINE_TO_VAR(${var} "release:${relline} (two functions call)") 
    QMAKE_ADD_LINE_TO_VAR(${var} "debug:${debugline} (two functions call)") 
endfunction() 

QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "#Generated by CMake scripts!") 
QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR(FILE_CONTENT "foo" "bar") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "release:foo (single function call)") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "debug:bar (single function call)") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "EOF") 

file(WRITE myFile.txt ${FILE_CONTENT}) 

这会产生MYFILE.TXT:

#Generated by CMake scripts! 
release:foo (single function call) 
debug:bar (single function call) 
EOF 

当我期望:

#Generated by CMake scripts! 
release:foo (two functions call) 
debug:bar (two functions call) 
release:foo (single function call) 
debug:bar (single function call) 
EOF 

最有可能的,问题是,(set ... PARENT_SCOPE)QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR中的变量,但不在其父范围内...

我试图用macros替换functions,然后我得到正确的输出,但是引入了一个具有特殊字符管理的错误(How to escape accolade characters in CMake)。所以这对我来说不是一个可接受的解决方案。

我尝试使用缓存的变量,就像这样:

function(QMAKE_ADD_LINE_TO_VAR var line) 
    set(${var} "${${var}}\n${line}\n" CACHE INTERNAL "" FORCE) 
endfunction() 

function(QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR var relline debugline) 
    QMAKE_ADD_LINE_TO_VAR(${var} "release:${relline} (two functions call)") 
    QMAKE_ADD_LINE_TO_VAR(${var} "debug:${debugline} (two functions call)") 
endfunction() 

set(FILE_CONTENT "" CACHE INTERNAL "" FORCE)  
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "#Generated by CMake scripts!") 
QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR(FILE_CONTENT "foo" "bar") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "release:foo (single function call)") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "debug:bar (single function call)") 
QMAKE_ADD_LINE_TO_VAR(FILE_CONTENT "EOF") 

file(WRITE myFile.txt ${FILE_CONTENT}) 

这工作,但后来,我第二次调用CMake的,我得到很多由于无效CMakeCache.txt内容错误的。

任何解决这个问题的想法,无论是使用全新的解决方案,还是让函数或缓存变量以更好的方式工作的方法都会受到欢迎。

回答

0

我找到的最好的办法是实际下降的变量,直接写在函数的文件(效率较低,但谁真正关心... ):

function(QMAKE_ADD_LINE_TO_VAR file line) 
    file(APPEND ${file} "${line}\n") 
endfunction() 

function(QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR file relline debugline) 
    QMAKE_ADD_LINE_TO_VAR(${file} "release:${relline} (two functions call)") 
    QMAKE_ADD_LINE_TO_VAR(${file} "debug:${debugline} (two functions call)") 
endfunction() 

file(WRITE myFile.txt "") 
QMAKE_ADD_LINE_TO_VAR(myFile.txt "#Generated by CMake scripts!") 
QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR(myFile.txt "foo" "bar") 
QMAKE_ADD_LINE_TO_VAR(myFile.txt "release:foo (single function call)") 
QMAKE_ADD_LINE_TO_VAR(myFile.txt "debug:bar (single function call)") 
QMAKE_ADD_LINE_TO_VAR(myFile.txt "EOF") 
1

添加另一个PARENT_SCOPE分配在QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR,即:

function(QMAKE_ADD_RELEASE_AND_DEBUG_LINES_TO_VAR var relline debugline) 
    QMAKE_ADD_LINE_TO_VAR(${var} "release:${relline} (two functions call)") 
    QMAKE_ADD_LINE_TO_VAR(${var} "debug:${debugline} (two functions call)") 
    set(${var} "${${var}}" PARENT_SCOPE) 
endfunction() 
+0

好戏!谢谢。 – jpo38