cmake - 在 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
解决方案
因此,根据注释,您希望路径列表作为单个命令行参数,并带有特定于平台的分隔符。您可以使用字符串操作来实现这一点:
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()
推荐阅读
- ruby-on-rails - 使用 Octokit 的 Github API 请求极慢
- javascript - 为基于 AJAX 的应用程序建议最好的 noSQL 数据库(即没有 Websockets)
- ruby-on-rails - 如何将表编号中的值替换为单词
- javascript - Kibana Canvas 插件不适用于 SearchGuard
- css - 防止全局 CSS 在 Angular 5 中应用组件
- python - python中的图像分割
- android - 即使在应用程序重新启动后,如何始终选中复选框,直到用户在 android 中取消选中它?
- c# - 在现有数据库中实现 ASP.NET Identity
- postgresql - Postgresql 查询以从将数据存储为对象的列中检索数据
- python - GitHub:Webhook 有效负载中的 API 名称/身份?