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

The*_*her 4 windows makefile list cmake cmake-language

我认为它应该是非常微不足道的,但似乎不支持它......在 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})
Run Code Online (Sandbox Code Playgroud)

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

squ*_*les 8

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

简而言之,您需要更多转义字符来将分号传播到测试环境。具体来说,使用双反斜杠\\额外的反斜杠与转义的分号一起转义到列表中\;。这里是CMake的转义字符文档供参考。总共三个反斜杠应该有效:

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})
Run Code Online (Sandbox Code Playgroud)