如何用单个换行来格式化CMake的错误信息?

编程语言 2026-07-10

使用CMake 3.25,我想打印一个结构如下的错误信息:

Error message. Possible reasons:
    - reason 1
    - reason 2

我尝试了一个简单的message命令,使用多行字符串:

    message (FATAL_ERROR "Error message. Possible reasons:
    - reason 1
    - reason 2")

但输出中的每个换行都被重复了一次,因此输出行之间出现空行:

  Error message.  Possible reasons:

        - reason 1

        - reason 2

尝试了多次使用双引号括起来的字符串:

    message (FATAL_ERROR "Error message. Possible reasons:"
    "- reason 1"
    "- reason 2")

但根本没有换行:

  Error message.  Possible reasons:- reason 1- reason 2

尝试在每行的末尾添加换行符:

    message (FATAL_ERROR "Error message. Possible reasons:\n"
    "- reason 1\n"
    "- reason 2")

尝试在一行的一个字面量中添加换行符:

    message (FATAL_ERROR "Error message. Possible reasons:\n- reason 1\n- reason 2")

但再次,每个“\n”都被复制了

  Error message.  Possible reasons:

  - reason 1

  - reason 2

尝试将错误信息保存到一个变量中,并将该变量传给message(FATAL_ERROR),无论带不带引号,结果都一样,都是 'success'。

尝试使用一些 [=[]=] 语法,我并不怎么熟悉:

    message(FATAL_ERROR [=[Error message. Possible reasons:
    - reason 1
    - reason 2]=])

但每个换行仍然被重复。
有何想法吗?

解决方案

tl;dr: 似乎并不支持 :-(

阅读 关于 message() 命令 的文档,我们发现:

CMake Warning and Error message text displays using a simple markup language. Non-indented text is formatted in line-wrapped paragraphs delimited by newlines. Indented text is considered pre-formatted.

这有点含糊,但我认为发生的情况如下:

  1. 所有字符串片段都会被连接在一起(即 "foo" "bar" "baz""foobarbaz" 相同)。
  2. 如果遇到段落末尾 — 即换行字符 —,它会被替换为两个换行符 — 段落末尾和“分隔符”。

因此,没有办法得到一个 单独的 换行,只能得到成对的换行。这看起来有点怪,但经过一些试验,我得出了这个不幸的结论。请证明我错了!

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章