这里的目标是帮助人们在用C++开发嵌入式系统时捕捉一些bug。作为这个目标的一部分,我试图让clang-tidy为小型嵌入式目标工作。
我正在尝试设置CMake来执行以下操作:
1.在构建时运行clang tidy;然后
1.使用GCC 8.2编译
但是,clang-tidy失败,出现“unknown target CPU 'armv 6-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()
字符串
armv 6-m是CMake脚本的一部分,但它仅用于GCC,以下内容用于设置GCC标志:
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生成的build消息是:
[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
型
target(armv 6-m)字段似乎与GCC使用的字段相同,但我不确定为什么要用target字段调用clang-tidy。
4条答案
按热度按时间yyyllmsg1#
在源代码中,我们可以看到:
字符串
来源:https://github.com/Kitware/CMake/blob/09032f09f8d2b4f7af658060ef434083f9d6a0d4/Source/cmcmd.cxx#L196-L207
所以我会说,所有的编译器选项,即CMAKE_CXX_FLAGS也默认传递给clang-tidy.
kuuvgm7e2#
作为一种解决方法,你可以写一个小脚本来过滤接收到的参数,然后用过滤后的参数列表调用
clang-tidy
。然后这个脚本可以交给CMAKE_CXX_CLANG_TIDY
,而不是实际的可执行文件。gdx19jrr3#
正如其他人提到的,这是由于CMake将所有标志传递给
clang-tidy
,而clang-tidy
并不理解所有这些标志。在我的情况下,它被RISC-Vmarch
标志绊倒了。我使用的解决方法是生成一个中间脚本,该脚本使用
sed
在将march
标志传递给clang-tidy
之前剥离march
标志。该解决方案完全包含在CMake中,但也可以将脚本放在磁盘上。我的解决方案(在您的情况下使用
CMAKE_CXX_CLANG_TIDY
代替):字符串
23c0lvtd4#
我在几年前提出了这个解决方案,但最近不得不在另一个平台上重新使用它。对于任何喜欢Python的人来说,它是:
个字符