CMake:从嵌套函数调用中设置变量

jpo38

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而不是在其父范围内设置了变量

我尝试用替换functionsmacros,然后得到正确的输出,但是引入了一个带有特殊字符管理的错误(如何在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

我发现最好的替代方法是实际删除变量,然后直接从函数中写入文件(效率较低,但是谁在乎呢……):

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" )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章