【问题标题】:Evaluate return value from ninja clang-tidy using CMake in batch使用 CMake 批量评估 ninja clang-tidy 的返回值
【发布时间】:2017-02-10 08:11:34
【问题描述】:

我正在使用 CMake 3.6 生成 ninja 1.6.0 配置,使用 clang-tidy(LLVM 版本 3.9.1)编译和静态分析我的代码:

# file copied from http://www.labri.fr/perso/fleury/posts/programming/using-clang-tidy-and-clang-format.html

# Additional targets to perform clang-format/clang-tidy
# Get all project files
file(GLOB_RECURSE
     ALL_CXX_SOURCE_FILES
     *.[chi]pp *.[chi]xx *.cc *.hh *.ii *.[CHI]
     )

# Adding clang-tidy target if executable is found
find_program(CLANG_TIDY "clang-tidy")
if(CLANG_TIDY)
  add_custom_target(
    clang-tidy
    COMMAND clang-tidy
    ${ALL_CXX_SOURCE_FILES}
    --
    -std=c++11
    ${INCLUDE_DIRECTORIES}
    )
endif()

.clang-tidy 文件:

---
Checks:          '-*,readability-*'
AnalyzeTemporaryDtors: false
WarningsAsErrors: '*'
HeaderFilterRegex: 'src/'
User:            mgalos
CheckOptions:
  - key:             readability-identifier-naming.AbstractClassCase
    value:           CamelCase
...

build.bat:

cmake -H. -B_build -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_INSTALL_PREFIX=_build/_release -DCMAKE_BUILD_TYPE=GENERIC_RELEASE -DBoost_COMPILER=-vc100

我得到的输出是:

96 warnings treated as errors ninja: build stopped: subcommand failed.

%errorlevel% 为 0,尽管 ninja 明确表示子命令失败。这个变量很重要,因为它由构建服务器评估,并将构建标记为失败。

如何将%errorlevel% 正确设置为 != 0?

【问题讨论】:

  • 但是如果errorlevel!=0,子命令将被标记为失败。那你怎么知道是0
  • warnings treated as errors 看起来更像errorlevel!=0。所以要么不要将警告视为错误,在外部 CMake 脚本中使用 execute_process,使用 -k“继续前进”标志调用 ninja,或者如果你例如使用 Jenkins“执行 Windows 批处理命令”在末尾添加 EXIT /B 0
  • 弗洛里安,我真的很想将警告视为错误,因为静态分析需要遵守样式指南(在 .clang-tidy 中指定),它将被扩展。

标签: batch-file cmake llvm ninja clang-tidy


【解决方案1】:

看起来这是known problem

您可以采取的缓解措施是将cmake 的所有输出通过管道传输到一个文件,并扫描该输出中是否出现指示错误的字符串,在您的情况下似乎是build stopped: subcommand failed。如果存在,只需使用任意非零退出代码退出。

@ECHO OFF
cmake -H. -B_build -GNinja (...) > log.txt 2>&1
FOR /F %%G IN ('FINDSTR /C:"build stopped: subcommand failed" log.txt') DO EXIT /B 255

【讨论】:

    【解决方案2】:

    感谢您的支持。 正如建议的那样,我最终做了一个:

    ninja clang-tidy | tee clang-tidy.log
    grep 'error.*generated' clang-tidy.log | cut -d" " -f4 | gawk "{if($1 != \"0\")  {print \"-1\"; exit -1}}" > clang-tidy_result.log
    set /p ErrorLevel=<clang-tidy_result.log
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多