c++ - 带有 CMake 和嵌入式目标的 clang-tidy

标签 c++ cmake embedded clang-tidy

这里的目标是帮助人们在使用 C++ 进行开发时捕获嵌入式系统上的一些错误。作为其中的一部分,我正在尝试让 clang-tidy 为小型嵌入式目标工作。

我正在尝试设置 CMake 以执行以下操作:

  1. 在构建时运行 clang tidy;然后
  2. 使用 GCC 8.2 编译

但是,clang-tidy 失败并显示“未知 objective-c PU 'armv6-m”

--

我用过的CMake脚本如下:

ClangTidy.cmake

set(ENABLE_CLANG_TIDY ON CACHE BOOL "Add clang-tidy automatically to builds")
if (ENABLE_CLANG_TIDY)
    find_program(CLANG_TIDY_EXE NAMES "C:\\Program Files\\LLVM\\bin\\clang-tidy.exe")
    if (CLANG_TIDY_EXE)
        message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}")
        set(CLANG_TIDY_CHECKS "-*,modernize-*")
        set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-checks=${CLANG_TIDY_CHECKS};-header-filter='${CMAKE_SOURCE_DIR}/*'"
        CACHE STRING "" FORCE)
    else()
        message(AUTHOR_WARNING "clang-tidy not found!")
        set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) # delete it
    endif()
endif()

armv6-m 是 CMake 脚本的一部分,但它仅用于 GCC,以下用于设置 GCcflags:

set(TARGET STM32F070x6)
set(ARCH armv6-m)
set(CORE cortex-m0)
set(CMAKE_CXX_FLAGS "-march=${ARCH} -mcpu=${CORE} -D${TARGET}")

然后构建以下内容:

#
# Including extra cmake rules
include(cmake/ClangTidy.cmake)

#Compile and link the exe :)
add_executable(${TARGET}.elf ${MAIN_SOURCE})

#Print the size of the .hex
add_custom_target(size ALL arm-none-eabi-size ${TARGET}.elf DEPENDS ${TARGET}.elf)
add_custom_target(${TARGET}.bin ALL DEPENDS ${TARGET}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin)

cmake 构建生成的构建消息是:

[build] "C:\Program Files\CMake\bin\cmake.exe" -E __run_co_compile 
--tidy="C:/Program Files/LLVM/bin/clang-tidy.exe;-checks=-*,modernize-*;-header-filter='G:/Files/Git/projectname/*'" --source=../src/main.cpp 
-- C:\PROGRA~2\GNUTOO~1\82018-~1\bin\AR10B2~1.EXE  -DHSE_VALUE=48000000 -DSTM32F070x6 -DTRACE -DUSE_STDPERIPH_DRIVER -I../include -I../system -I../library -I../library/usb -I../library/usb/HID -I../library/usb/LL -I../library/usb/Standard -I../library/usb/Types -I../library/common -I../library/common/SCPI -I../library/common/containers -I../library/peripherals -I../library/peripherals/Bitbanging -I../st-library/include -I../st-library/include/arm -I../st-library/include/cmsis -I../st-library/include/cortexm -I../st-library/include/diag -I../st-library/include/stm32f0-stdperiph -march=armv6-m -mcpu=cortex-m0 -DSTM32F070x6 -Os -mthumb -g2 -ggdb -pedantic -Wall -Wextra -Wfloat-equal -Wshadow -Wall -Wl,--gc-sections -fmessage-length=0 -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -std=c++1z -fno-rtti -fno-exceptions -fno-use-cxa-atexit -fno-threadsafe-statics -ftemplate-backtrace-limit=0 -O2 -g -DNDEBUG -MD -MT CMakeFiles/STM32F070x6.elf.dir/src/main.cpp.obj -MF CMakeFiles\STM32F070x6.elf.dir\src\main.cpp.obj.d -o CMakeFiles/STM32F070x6.elf.dir/src/main.cpp.obj -c ../src/main.cpp

在上述错误发生后立即:

[build] error: unknown target CPU 'armv6-m' [clang-diagnostic-error]
[build] note: valid target CPU values are: nocona, core2, penryn, bonnell, atom, silvermont, slm, goldmont, goldmont-plus, tremont, nehalem, corei7, westmere, sandybridge, corei7-avx, ivybridge, core-avx-i, haswell, core-avx2, broadwell, skylake, skylake-avx512, skx, cascadelake, cannonlake, icelake-client, icelake-server, knl, knm, k8, athlon64, athlon-fx, opteron, k8-sse3, athlon64-sse3, opteron-sse3, amdfam10, barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, znver1, x86-64

目标 ( armv6-m ) 字段似乎与 GCC 使用的相同。但我不确定为什么要使用目标字段调用 clang-tidy。

最佳答案

在源码中我们可以看到:

static int HandleTidy(const std::string& runCmd, const std::string& sourceFile,
                      const std::vector<std::string>& orig_cmd)
{
  // Construct the clang-tidy command line by taking what was given
  // and adding our compiler command line.  The clang-tidy tool will
  // automatically skip over the compiler itself and extract the
  // options.
  int ret;
  std::vector<std::string> tidy_cmd = cmExpandedList(runCmd, true);
  tidy_cmd.push_back(sourceFile);
  tidy_cmd.emplace_back("--");
  cmAppend(tidy_cmd, orig_cmd);

来源:https://github.com/Kitware/CMake/blob/09032f09f8d2b4f7af658060ef434083f9d6a0d4/Source/cmcmd.cxx#L196-L207

所以我想说,所有编译器选项,即 CMAKE_CXX_FLAGS 也默认传递给 clang-tidy...

关于c++ - 带有 CMake 和嵌入式目标的 clang-tidy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851621/

相关文章:

c++ - QT半透明窗口和远程桌面

c++ - NVCC 和 NVRTC 在编译为 PTX 时的区别

c++ - 如何使用 cmake 制作仅头文件的库?

c++ - 强制 CMake 将 C++ 编译器用于带有 Visual Studio 的 C 文件

c++ - 减小 .rodata 的大小

c++ - Dice Game C++错误未声明的标识符/代码检查

c++ - static_cast<T&&>(t) 编译速度比 std::forward<T>(t) 快?

c++ - 使用 CMake 安装时永久存储环境变量

c - 是否可以使用STM32生成CAN总线错误?

assembly - 软件看门狗定时器复位 MPC875 CPU 过快