CMake:在回显文件时取消显示空白
作为构建过程的一部分,我们在实际构建过程中通过valgrind自动运行单元测试(即:它不是一个单独的目标,例如CMake:在回显文件时取消显示空白,cmake,Cmake,作为构建过程的一部分,我们在实际构建过程中通过valgrind自动运行单元测试(即:它不是一个单独的目标,例如maketest) 当测试通过时,我们创建一个sentinel文件,以便后续构建在没有必要时不会重新运行测试 我们还将命令行和测试输出保存到一个文件中 在这里,我构建了valgrind命令行: set(VALGRIND_BIN "valgrind") set(VALGRIND_OPTS "--leak-check=full --track-origins=yes") set(VALG
maketest
)
当测试通过时,我们创建一个sentinel文件,以便后续构建在没有必要时不会重新运行测试
我们还将命令行和测试输出保存到一个文件中
在这里,我构建了valgrind命令行:
set(VALGRIND_BIN "valgrind")
set(VALGRIND_OPTS "--leak-check=full --track-origins=yes")
set(VALGRIND_CMD "${VALGRIND_BIN} ${VALGRIND_OPTS}")
separate_arguments(VALGRIND_CMD)
这些是“传递的”sentinal文件和测试输出文件
set(OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${ARG_NAME}.output)
set(PASSED_FILE ${CMAKE_CURRENT_BINARY_DIR}/${ARG_NAME}.passed)
在这里,我添加了一个custom_命令
,其工作方式如下:
- 它回显命令行并将其保存到输出文件中
- 它通过valgrind运行测试,将所有输出保存到输出文件中
- 如果测试不通过,它将对输出文件进行cat,并且命令失败
- 如果测试通过,它将接触通过的sentinel文件
add_custom_command(
OUTPUT
${PASSED_FILE}
COMMAND
echo "\"${VALGRIND_BIN} ${VALGRIND_OPTS} $<TARGET_FILE:${TEST_NAME}>\"" > ${OUTPUT_FILE}
COMMAND
${VALGRIND_CMD} $<TARGET_FILE:${TEST_NAME}> >> ${OUTPUT_FILE} 2>&1 || (cat ${OUTPUT_FILE} && false)
COMMAND
${CMAKE_COMMAND} -E touch ${PASSED_FILE}
COMMENT
"Running ${ARG_NAME} tests"
DEPENDS
${TEST_NAME}
USES_TERMINAL
)
我已经向自己证明了转义不在变量中,就好像我输出了一条消息
它们不在那里一样
message(STATUS "\"${VALGRIND_BIN} ${VALGRIND_OPTS} $<TARGET_FILE:${TEST_NAME}>\"")
但事实是:
valgrind --leak-check=full --track-origins=yes /home/steve/src/test
正如@MuertoExcobito所指出的,option VERBATIM关心正确转义参数,不需要手动转义额外的双引号:
COMMAND
echo "${VALGRIND_BIN} ${VALGRIND_OPTS} $<TARGET_FILE:${TEST_NAME}>" > ${OUTPUT_FILE}
VERBATIM
命令
echo“${VALGRIND\u BIN}${VALGRIND\u OPTS}$”>${OUTPUT\u FILE}
逐字的
(CMake需要外部双引号,不要分隔echo参数)。您可以将所有内容放入列表中,列表将展开,空格将不会转义 因为如果CMake相信字符串是单个参数,它将转义空格。将其作为列表将每个元素作为单独的参数:
列表(附加VALGRIND_CMD“$”)
添加自定义命令(
输出
${PASSED_FILE}
命令
${CMAKE_COMMAND}-E echo\“${VALGRIND_CMD}\”>${OUTPUT_FILE}
命令
${VALGRIND_CMD}>${OUTPUT_FILE}2>&1 | |(cat${OUTPUT_FILE}&&false)
命令
${CMAKE_COMMAND}-E touch${PASSED_FILE}
评论
“正在运行${ARG_NAME}测试”
使用U终端
)
参考资料
echo
有效,但它破坏了测试命令的第二部分(调用| | |(cat${OUTPUT_FILE}&&false)
,因为它用引号”(
)包围了paren,导致| | |(“cat OUTPUT|u FILE&&false”)”
虽然这适用于echo
,但它破坏了测试命令的第二部分(调用| | |(cat${OUTPUT_FILE}&&false)
),因为它用引号”(“
)包围了paren,导致| |”(“cat OUTPUT_FILE&&false”)”)
,因此问题应该被命名为“如何在没有逐字逐句的情况下取消显示空白”:D.那么,对于这种特定情况,为什么需要将echo
(外部双引号)的参数分开?输出时,此命令会自动用空格分隔其参数。
valgrind\ --leak-check=full\ --track-origins=yes\ /home/steve/src/test\
valgrind --leak-check=full --track-origins=yes /home/steve/src/test
COMMAND
echo "${VALGRIND_BIN} ${VALGRIND_OPTS} $<TARGET_FILE:${TEST_NAME}>" > ${OUTPUT_FILE}
VERBATIM