PK *_*out 6 cross-platform cmake
你好,亲爱的stackoverflowers!
我想知道我的问题是否有更好的解决方案.我正在开发一个独立于平台的软件项目,并希望将基于python的单元测试添加到cmake.我现在遇到的问题是,在配置ctest测试并设置正确的PYTHONPATH环境变量以运行我的测试时,我最终会为每个测试提供大量的样板代码:
add_test(my_awesome_test ${PYTHON_EXECUTABLE} my_awesome_test.py)
if("${CMAKE_HOST_SYSTEM}" MATCHES ".*Windows.*")
set_tests_properties(my_awesome_test PROPERTIES ENVIRONMENT "PYTHONPATH=somepath\;anotherpath")
else() # e.g. Linux
set_tests_properties(my_awesome_test PROPERTIES ENVIRONMENT "PYTHONPATH=somepath:anotherpath")
endif()
# more tests like this after this...
Run Code Online (Sandbox Code Playgroud)
这里的问题是分支,这只是因为平台相关的列表分隔符才需要.
有没有更简洁的方法来实现这一目标?
是否有一个常量指定平台分隔符或允许我构造这些列表的函数?
如果没有"正确"的答案,我也想分享我明显但不太好的解决方案:
if("${CMAKE_HOST_SYSTEM}" MATCHES ".*Windows.*")
set(SEP "\\;")
else() # e.g. Linux
set(SEP ":")
endif()
add_test(my_awesome_test ${PYTHON_EXECUTABLE} my_awesome_test.py)
set_tests_properties(my_awesome_test PROPERTIES ENVIRONMENT "PYTHONPATH=somepath${SEP}anotherpath")
# more tests like this after this...
Run Code Online (Sandbox Code Playgroud)
在Windows上";" 必须进行双重转义,否则它将在add_test行中稍后替换为单个";" 再次,然后将其解释为导致错误结果的cmake-list分隔符.但是,让cmake报告哪个字符应该用作列表分隔符仍然会更好...
您可以定义函数/宏,将某些选定的分隔符转换为特定于平台的分隔符。例如,下面的函数将 CMake 列表转换为特定于平台的路径列表:
function(to_path_list var path1)
if("${CMAKE_HOST_SYSTEM}" MATCHES ".*Windows.*")
set(sep "\\;")
else()
set(sep ":")
endif()
set(result "${path1}") # First element doesn't require separator at all...
foreach(path ${ARGN})
set(result "${result}${sep}${path}") # .. but other elements do.
endforeach()
set(${var} "${result}" PARENT_SCOPE)
endfunction()
Run Code Online (Sandbox Code Playgroud)
用法:
to_path_list(pythonpath "somepath" "anotherpath")
set_tests_properties(my_awesome_test PROPERTIES ENVIRONMENT "PYTHONPATH=${pythonpath}")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |