如何使用分号值在 CMake 中创建列表?

How do I make a list in CMake with the semicolon value?

我认为它应该非常简单,但似乎不受支持...在 CMake 中甚至可以让列表的一个值包含分号吗?

原因非常简单 - 因为我在 Windows 上是 运行,而在 Windows 上,分号是一个环境变量中两个或多个文件夹之间的分隔符(即PATH).

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "MY_FLAG=1"
    )

    # <...>

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "PATH=first_folder_path;second_folder_path"
    #                        ^--- here is the problem
    )

    # <...>


   set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})

我尝试删除和添加双引号,我尝试转义 \;,我尝试添加相同的环境变量两次 - 但是 none 这些工作!

不幸的是,CMake 内部的列表只是用分号分隔的字符串。如果你这样做:

set(MyList
    ABC
    DEF;GHI
)

您正在定义一个包含三个元素的列表。如果你偷看内容:

message(${MyList})
message("${MyList}")

您将分别得到 ABCDEFGHIABC;DEF;GHI,因此无法知道在这两种情况下您实际想要多少元素。大多数 CMake 命令,如 add_executabletarget_compile_definitions 以这种方式解释传递的参数,您将无法将包含分号的元素的列表传递给它们。

请注意,当您将变量放在引号中时,分号不会被删除(参见上面的示例),因此如果您正在调用一些外部命令,例如 powershell 脚本,那么 PATH 变量应该是正确通过。但是你不会为你的参数列表使用列表(因为元素是分号分隔符),而是构建你自己的 space 分隔的字符串。

通过使用反斜杠转义分号,您走在了正确的轨道上。但是,在 ENVIRONMENT 测试 属性 中设置列​​表时,这不是列表将被使用的最后位置(并由 CMake 解释)。然后 MY_TEST_ENVIRONMENT 列表用于填充 CTestTestfile.cmake,稍后 CTest 会读取它来设置您的测试环境。

简而言之,您需要 更多 个转义字符来将分号传播到测试环境。具体来说,使用双反斜杠 \extra 反斜杠连同 \; 转义分号一起转义到列表中。这里有 CMake 的 escape characters 文档供参考。总的来说,三个 个反斜杠应该可以工作:

list(
  APPEND
  MY_TEST_ENVIRONMENT
  "MY_FLAG=1"
)

# <...>

list(
  APPEND
  MY_TEST_ENVIRONMENT
  "PATH=first_folder_path\\;second_folder_path"
#                         ^--- Use three backslashes here
)

# <...>

set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})