在cmake中正确使用特定于平台的分隔符的方法

8

我想知道是否有更好的解决方案来解决我的问题。我正在开发一个独立于平台的软件项目,希望在cmake中添加基于python的单元测试。现在遇到的问题是,在配置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...

问题在于需要进行分支,这是由于平台相关的列表分隔符所导致的。

有没有更简单的方法来解决这个问题?

是否有一个常量指定平台分隔符或一个函数允许我构建这些列表?


如果没有“正确”的答案,我也想分享我的显而易见但不太好的解决方案:

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...

在Windows上,";"必须双倍转义,否则它会在add_test行中被替换为单个";",这将被解释为cmake-list分隔符,导致错误的结果。但是,让cmake报告应该使用哪个字符作为列表分隔符仍然更好...
3个回答

2

不幸的是,在Unix平台上,file(TO_NATIVE_PATH ...不能将;转换为:。因此,我认为最简单的方法是这样的:

很遗憾,file(TO_NATIVE_PATH ...在Unix平台上无法将;转换为:。因此,最简单的方法可能是像这样:


set(PATH "/usr/bin" "/bin")

if (UNIX)
  string(REPLACE ";" ":" PATH "${PATH}")
endif()

这能够正常工作是因为CMake列表实际上是用分号;分隔的字符串,所以在Windows上,您可以直接使用它们作为路径列表。但对于包含分号;或冒号:的路径将无法正常工作,不过这也会影响到99%的Unix软件,所以我认为不必担心。"最初的回答"

1

1
不幸的是,file(TO_NATIVE_PATH... 函数存在问题 - 它无法将以 ; 分隔的 CMake 列表转换为在 Unix 上以 : 分隔的路径,因此这并不是一个真正的解决方案。 - Timmmm

0

您可以定义函数/宏,将某些选择的分隔符转换为特定于平台的分隔符。例如,下面的函数将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()

使用方法:

to_path_list(pythonpath "somepath" "anotherpath")
set_tests_properties(my_awesome_test PROPERTIES ENVIRONMENT "PYTHONPATH=${pythonpath}")

最终,这基本上是我找到的相同解决方案,但将所有内容放入函数以自动构建字符串是个好主意!不过,我会保持帖子开放,并等待是否有人提供基于CMake的答案。目前似乎语言本身不支持此功能。许多不同的开源项目都遇到了类似的问题 - 如果你搜索一下,会发现很多相关的错误跟踪器都涉及到这个问题。所以让我们看看未来会带来什么。 - PK Cakeout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接