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
内容错误的。
任何解决这个问题的想法,无论是使用全新的解决方案,还是让函数或缓存变量以更好的方式工作的方法都会受到欢迎。
好戏!谢谢。 – jpo38