我正在尝试使用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
答案 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()