【问题标题】:CMake: Extracting tar gives an error without a messageCMake:提取 tar 会出现错误但没有消息
【发布时间】:2019-01-26 16:35:38
【问题描述】:

我想下载一个 tar 文件并将其解压缩到 ${CMAKE_BINARY_DIR}。我所有的尝试都失败了,我一直得到一个非零的返回值。以下是一个 MCVE:

cmake_minimum_required(VERSION 3.0)

set(QRCODE_LIB_URL "https://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.bz2")
set(QRCODE_LIB_DOWNLOAD_TARGET "${CMAKE_BINARY_DIR}/qrencode.tar.bz")
file(DOWNLOAD ${QRCODE_LIB_URL} ${QRCODE_LIB_DOWNLOAD_TARGET} SHOW_PROGRESS)
execute_process(
    COMMAND "${CMAKE_COMMAND} -E tar xvz ${QRCODE_LIB_DOWNLOAD_TARGET}"
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    OUTPUT_VARIABLE QRCODE_EXTRACT_OUTPUT
    ERROR_VARIABLE QRCODE_EXTRACT_OUTPUT
    RESULT_VARIABLE QRCODE_EXTRACT_RETURN_VALUE
    )

if (NOT QRCODE_EXTRACT_RETURN_VALUE EQUAL 0)
    message(FATAL_ERROR "Error: ${QRCODE_EXTRACT_OUTPUT}")
endif()

project(cmakeTarTest)
add_executable(${PROJECT_NAME} "main.cpp") # this can be removed

最有问题的部分是错误没有显示任何消息,我不明白。一段时间以来,我一直在使用相同的配方(execute_process)来运行许多脚本,包括 python 脚本。显然这里有一些我无法理解的不同之处。

【问题讨论】:

  • @Tsyvarev 如果您指的是为什么两个变量具有相同的名称,这就是 cmake 合并 stderr 和 stdout 的方式。
  • 糟糕,没有注意到您对两个选项使用了相同的变量。
  • 顺便说一句,删除 COMMAND 选项值周围的双引号 - 双引号内的所有内容都被视为 single 命令行标记,但 cmake 及其选项(@ 987654326@等)应该是不同的令牌。
  • @Tsyvarev 感谢您的提示。我想通了。

标签: c++ linux build cmake tar


【解决方案1】:

我想出了解决办法。命令应该是这样的:

COMMAND "${CMAKE_COMMAND}" "-E" "tar" "xvz" "${QRCODE_LIB_DOWNLOAD_TARGET}"

Tsyvarev 评论的暗示让我意识到这一点。

编辑:我仍然不明白为什么错误变量为空。

【讨论】:

  • ERROR_VARIABLEOUTPUT_VARIABLE 是空的,因为它们包含标准错误的输出和正在运行的命令的标准输出。原来的命令是cmake -E tar whatever.tar,它不是一个有效的文件名,并且不能被系统运行,因此在标准错误或标准输出中没有捕获任何内容。变量 RESULT_VARIABLE 包含一个错误值,在 Windows 上该值为:The system cannot find the file specified
猜你喜欢
  • 2017-07-08
  • 2014-04-01
  • 2019-05-22
  • 2017-01-10
  • 2016-04-17
  • 1970-01-01
  • 2013-08-25
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多