]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cmake: add cppcheck and iwyu static analysis targets
authorYuval Lifshitz <yuvalif@yahoo.com>
Mon, 11 Nov 2019 10:19:34 +0000 (12:19 +0200)
committerYuval Lifshitz <yuvalif@yahoo.com>
Mon, 18 Nov 2019 17:43:14 +0000 (19:43 +0200)
Signed-off-by: Yuval Lifshitz <yuvalif@yahoo.com>
CMakeLists.txt
cmake/modules/FindCppCheck.cmake [new file with mode: 0644]
cmake/modules/FindIWYU.cmake [new file with mode: 0644]

index 48ff49df83ab3a82fb33d83dc702dde7bf20fe9f..a30658eea9ce5663c402f40575c3c65ebcd3c69a 100644 (file)
@@ -647,3 +647,6 @@ add_tags(ctags
   EXCLUDE_OPTS ${CTAG_EXCLUDES}
   EXCLUDES "*.js" "*.css")
 add_custom_target(tags DEPENDS ctags)
+
+find_package(CppCheck)
+find_package(IWYU)
diff --git a/cmake/modules/FindCppCheck.cmake b/cmake/modules/FindCppCheck.cmake
new file mode 100644 (file)
index 0000000..5dabfa6
--- /dev/null
@@ -0,0 +1,30 @@
+unset(CPPCHECK_BIN CACHE)
+find_program(CPPCHECK_BIN cppcheck)
+
+if(CPPCHECK_BIN)
+  find_file(PROJECT_FILE compile_commands.json PATH .)
+  if(NOT PROJECT_FILE)
+    message(STATUS "Found cppcheck, but no \"compile_commands.json\" file. To enable cppcheck, set CMAKE_EXPORT_COMPILE_COMMANDS to \"ON\" and build again.")
+    return()
+  endif()
+
+  include(ProcessorCount)
+  ProcessorCount(N)
+   
+  execute_process(COMMAND cppcheck --version OUTPUT_VARIABLE CPPCHECK_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+  separate_arguments(CPPCHECK_VERSION)
+  list(GET CPPCHECK_VERSION 1 VERSION_NUMBER)
+  if(VERSION_NUMBER VERSION_GREATER_EQUAL 1.88)
+    set(CPP_STD_VERSION "c++17")
+  else()
+    set(CPP_STD_VERSION "c++14")
+  endif()
+
+  add_custom_target(cppcheck
+    COMMAND ${CPPCHECK_BIN} --verbose -j${N} --std=${CPP_STD_VERSION} --inline-suppr --project=${PROJECT_FILE} 2> cppcheck.txt | grep done
+    )
+
+  message(STATUS "Found cppcheck. To perform static analysis using cppcheck, use: \"make cppcheck\". Results will be stored in \"cppcheck.txt\".")
+else()
+  message(STATUS "Could not find cppcheck. To perform static analysis using cppcheck install the tool (e.g. \"yum install cppcheck\").")
+endif()
diff --git a/cmake/modules/FindIWYU.cmake b/cmake/modules/FindIWYU.cmake
new file mode 100644 (file)
index 0000000..adbdbb2
--- /dev/null
@@ -0,0 +1,27 @@
+unset(IWYU_BIN CACHE)
+find_program(IWYU_BIN iwyu_tool.py)
+
+if(IWYU_BIN)
+  find_file(PROJECT_FILE compile_commands.json PATH .)
+  if(NOT PROJECT_FILE)
+    message(STATUS "Found IWYU, but no \"compile_commands.json\" file. To enable IWYU, set CMAKE_EXPORT_COMPILE_COMMANDS to \"ON\" and build again.")
+    return()
+  endif()
+
+  if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+    message(STATUS "Found IWYU, but clang++ is not used used. To enable IWYU, set CMAKE_C_COMPILER to \"clang\" and CMAKE_CXX_COMPILER to \"clang++\" and build again.")
+    return()
+  endif()
+
+  include(ProcessorCount)
+  ProcessorCount(N)
+   
+  add_custom_target(iwyu
+    COMMAND echo "IWYU is analyzing includes - this may take a while..."
+    COMMAND ${IWYU_BIN} -j${N} -p . > iwyu.txt
+    )
+
+  message(STATUS "Found IWYU. To perform header analysis using IWYU, use: \"make iwyu\". Results will be stored in \"iwyu.txt\".")
+else()
+  message(STATUS "Could not find IWYU. To perform header analysis using IWYU install the tool (e.g. \"yum install iwyu\").")
+endif()