CMake中检测Java编译失败并将错误输出到stdout的方法咨询
CMake Swagger代码生成环节错误检测与输出配置方案
核心问题分析
当前使用的CMake函数存在两个影响需求实现的写法:
- java命令后追加的
&> ${target_dir}/autogenerate.log语句,将标准输出、标准错误流的所有内容都重定向到了本地日志文件,因此构建控制台不会打印任何swagger生成过程的信息,包括错误 add_custom_target本身自带命令执行结果检测能力,只要COMMAND对应的进程返回非0退出码,就会标记目标执行失败、终止构建,这部分能力不需要额外开发,只是因为输出被重定向,无法直接看到失败原因
修改后的实现代码
function(generate_swagger_code spec_path lang package_name) set(target_dir ${CMAKE_CURRENT_BINARY_DIR}/swagger) get_filename_component(fname_noext ${spec_path} NAME_WE) add_custom_target(generate_swagger_${fname_noext} ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${target_dir} COMMENT "Starting swagger autogeneration in ${target_dir}" COMMAND java -jar ${SWAGGER_CODEGEN_CLI} generate -i ${spec_path} -l ${lang} -DpackageName=${package_name} -o ${target_dir} VERBATIM ) endfunction(generate_swagger_code)
改动说明
- 移除了输出重定向语句,java命令的所有运行日志、错误信息都会直接打印到构建控制台的标准输出流,不会写入本地日志文件
- 保留
VERBATIM参数确保命令参数转义正常,避免路径、特殊字符带来的解析错误 - CMake会自动检测java命令的退出状态:如果swagger代码生成失败(比如Java编译报错、参数错误),构建流程会直接终止报错,所有错误信息可以直接在控制台查看
如果你需要同时保留本地日志文件又要控制台输出,可以将java命令替换为如下写法(仅支持Unix-like环境):
COMMAND bash -c "java -jar ${SWAGGER_CODEGEN_CLI} generate -i ${spec_path} -l ${lang} -DpackageName=${package_name} -o ${target_dir} 2>&1 | tee ${target_dir}/autogenerate.log"
内容的提问来源于stack exchange,提问作者subtleseeker
相关产品推荐
相关产品推荐

