如何使用分号值在 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}")
您将分别得到 ABCDEFGHI
和 ABC;DEF;GHI
,因此无法知道在这两种情况下您实际想要多少元素。大多数 CMake 命令,如 add_executable
或 target_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})
我认为它应该非常简单,但似乎不受支持...在 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}")
您将分别得到 ABCDEFGHI
和 ABC;DEF;GHI
,因此无法知道在这两种情况下您实际想要多少元素。大多数 CMake 命令,如 add_executable
或 target_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})