CMake:在回显文件时取消显示空白

CMake:在回显文件时取消显示空白,cmake,Cmake,作为构建过程的一部分,我们在实际构建过程中通过valgrind自动运行单元测试(即:它不是一个单独的目标,例如maketest) 当测试通过时,我们创建一个sentinel文件,以便后续构建在没有必要时不会重新运行测试 我们还将命令行和测试输出保存到一个文件中 在这里,我构建了valgrind命令行: set(VALGRIND_BIN "valgrind") set(VALGRIND_OPTS "--leak-check=full --track-origins=yes") set(VALG

作为构建过程的一部分,我们在实际构建过程中通过valgrind自动运行单元测试(即:它不是一个单独的目标,例如
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文件
以下是cmake的来源:

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终端
)
参考资料


-也许“VERBATIM”标志对您有效?@MuertoExcobito虽然它对
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