处理CMake中的分隔符

时间:2018-06-19 08:06:26

标签: 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

1 个答案:

答案 0 :(得分:1)

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

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()