首页 > 解决方案 > 在 CMake 中处理分隔符

问题描述

我正在尝试使用 CMake 编译一些 Java 代码(我知道 Java 并不是 CMake 的真正用例)并且我想提供文件的类路径。编译应该适用于 Unix 和 Windows 系统。我遇到的问题是分离不同的类路径。使用:

set(CLASS_PATH ${PATH1} ${PATH2})
message(STATUS "${CLASS_PATH}")

印刷

<PATH1>;<PATH2>

但这在 Unix 和 Windows 上都会发生。所以我必须手动添加分隔符。我这样做的方式是

if(${CMAKE_HOST_WIN32})
    set(SEP "\;")
elseif(${CMAKE_HOST_UNIX})
    set(SEP ":")
endif(${CMAKE_HOST_WIN32})

这真的是处理分隔符的最佳方法吗?我觉得我错过了什么。

更新 - MCVE

描述我的想法:FILE_LIST将包含我要编译的所有 java 文件。我定义了一个自定义函数,我可以调用它FILE_LIST并编译文件。也许我在函数参数上做错了什么?

cmake_minimum_required(VERSION 3.11)


set(CLASS_PATH E:/tmp/cmake/separator C:/tmp/)

set(FILE_LIST 1.txt 2.txt 3.txt)

add_custom_target(war ALL)

function(compile_java clp)
    foreach(java_file ${ARGN})
        add_custom_command(
            TARGET war
            PRE_BUILD
            COMMAND echo "${clp}" ${java_file}
        )
    endforeach(java_file)
endfunction()


compile_java("${CLASS_PATH}" ${FILE_LIST}) # I have to pass CLASS_PATH in quotes

标签: cmake

解决方案


因此,根据注释,您希望路径列表作为单个命令行参数,并带有特定于平台的分隔符。您可以使用字符串操作来实现这一点:

function(compile_java clp)
    if(NOT CMAKE_HOST_WIN32)
        string(REPLACE ";" ":" clp "${clp}")
    endif()
    foreach(java_file ${ARGN})
        add_custom_command(
            TARGET war
            PRE_BUILD
            COMMAND echo "${clp}" ${java_file}
        )
    endforeach(java_file)
endfunction()

推荐阅读