文件(生成)的限制?
Limitations of file(GENERATE)?
我正在尝试生成文件,但无法解析变量。由于 file(generate) 在生成步骤中运行,它可以解析的变量是否有限制? (例如,仅缓存变量?)
尽管定义了变量,但我的变量没有得到解析。
message("Registered composites: ${COURAGE_COMPOSITES}")
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml INPUT ${INPUT_PATH}/output.xml.in)
output.xml.in
<imports>
$<$<NOT:$<STREQUAL:"${COURAGE_COMPOSITES}","">>:<import iuts="yes"$<ANGLE-R>$<JOIN:${COURAGE_COMPOSITES},</import$<ANGLE-R><import iuts="yes"$<ANGLE-R>></import$<ANGLE-R>>
</imports>
output.xml
<imports>
<import iuts="yes">${COURAGE_COMPOSITES}</import>
</imports>
实际上,file(GENERATE)
根本不展开变量。
该命令的 Documentation 没有说明变量的扩展
Generate an output file for each build configuration supported by the current CMake Generator. Evaluate generator expressions from the input content to produce the output content.
如果你想扩展变量,你可以先用命令configure_file将它们扩展到中间文件,然后在那个文件中使用[=12]扩展生成器表达式=]:
# output.xml.in -> output.xml.im
configure_file(${INPUT_PATH}/output.xml.in ${OUTPUT_PATH}/output.xml.im)
# output.xml.im -> output.xml
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml INPUT ${OUTPUT_PATH}/output.xml.im)
或者,如果您的输入文件很小,您可以将其作为 字符串 嵌入到 CMakeLists.txt
中,并使用 CONTENT
参数作为 file(GENERATE)
:
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml CONTENT
[=[
<imports>
$<$<NOT:$<STREQUAL:"${COURAGE_COMPOSITES}","">>:<import iuts="yes"$<ANGLE-R>$<JOIN:${COURAGE_COMPOSITES},</import$<ANGLE-R><import iuts="yes"$<ANGLE-R>></import$<ANGLE-R>>
</imports>
]=]
)
在这种情况下,CMake 将在将字符串传递给命令之前自行执行变量替换。
我正在尝试生成文件,但无法解析变量。由于 file(generate) 在生成步骤中运行,它可以解析的变量是否有限制? (例如,仅缓存变量?)
尽管定义了变量,但我的变量没有得到解析。
message("Registered composites: ${COURAGE_COMPOSITES}")
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml INPUT ${INPUT_PATH}/output.xml.in)
output.xml.in
<imports>
$<$<NOT:$<STREQUAL:"${COURAGE_COMPOSITES}","">>:<import iuts="yes"$<ANGLE-R>$<JOIN:${COURAGE_COMPOSITES},</import$<ANGLE-R><import iuts="yes"$<ANGLE-R>></import$<ANGLE-R>>
</imports>
output.xml
<imports>
<import iuts="yes">${COURAGE_COMPOSITES}</import>
</imports>
实际上,file(GENERATE)
根本不展开变量。
Documentation 没有说明变量的扩展
Generate an output file for each build configuration supported by the current CMake Generator. Evaluate generator expressions from the input content to produce the output content.
如果你想扩展变量,你可以先用命令configure_file将它们扩展到中间文件,然后在那个文件中使用[=12]扩展生成器表达式=]:
# output.xml.in -> output.xml.im
configure_file(${INPUT_PATH}/output.xml.in ${OUTPUT_PATH}/output.xml.im)
# output.xml.im -> output.xml
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml INPUT ${OUTPUT_PATH}/output.xml.im)
或者,如果您的输入文件很小,您可以将其作为 字符串 嵌入到 CMakeLists.txt
中,并使用 CONTENT
参数作为 file(GENERATE)
:
file(GENERATE OUTPUT ${OUTPUT_PATH}/output.xml CONTENT
[=[
<imports>
$<$<NOT:$<STREQUAL:"${COURAGE_COMPOSITES}","">>:<import iuts="yes"$<ANGLE-R>$<JOIN:${COURAGE_COMPOSITES},</import$<ANGLE-R><import iuts="yes"$<ANGLE-R>></import$<ANGLE-R>>
</imports>
]=]
)
在这种情况下,CMake 将在将字符串传递给命令之前自行执行变量替换。