From 9ea5469178a9a4ab5d4048f7aaf18af85a8265a3 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 5 Jun 2020 11:37:49 +0200 Subject: Initial support of clang-tidy toolchain Clang Tidy is a Clang based "linter" tool which goal is to help fixing typical programming errors. It is run as a separate compile step of every file, which slows compilation down but allows to fully analyze the file the same way as compiler does and catch non-trivial bugprone cases. This change includes: - CMake option called `WITH_CLANG_TIDY` which enables Clang Tidy linter tool on all source in the `source/` directory. This option is only available on Linux, as it is currently the easiest platform to get the Clang Tidy toolchain to work. - CMake module which is aimed to find latest available Clang Tidy. - Set of rules which allows to have Blender fully compiled without extra issues. The goal of this change is to provide a base ground so that solving all the warnings can happen later on, as a team effort. It should be possible to use Clang Tidy side-by-side with both GCC and Clang, but there seems to be some tweaks to be done in CMake to make it really work for Blender. For now use Clang toolchain if there are issues with GCC+Clang Tidy. It will be worked on in the nearest future to bring seamless experience for all configurations. Currently there is no official way of getting Clang Tidy on macOS, and on Windows there are some difficulties of hooking up Clang Tidy from LLVM package to the MSVC compiler toolchain. The actual warnings in the code will be addressed as a part of the Code Quality Days, task T78535. Differential Revision: https://developer.blender.org/D7937 --- build_files/cmake/Modules/FindClangTidy.cmake | 104 ++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 build_files/cmake/Modules/FindClangTidy.cmake (limited to 'build_files') diff --git a/build_files/cmake/Modules/FindClangTidy.cmake b/build_files/cmake/Modules/FindClangTidy.cmake new file mode 100644 index 00000000000..f556d05a0b9 --- /dev/null +++ b/build_files/cmake/Modules/FindClangTidy.cmake @@ -0,0 +1,104 @@ +# - Find clang-tidy executable +# +# Find the native clang-tidy executable +# +# This module defines +# CLANG_TIDY_EXECUTABLE, the ful lpath to clang-tidy executable +# +# CLANG_TIDY_VERSION, the full version of the clang-tidy in the +# major,minor.patch format +# +# CLANG_TIDY_VERSION_MAJOR, +# CLANG_TIDY_VERSION_MINOR, +# CLANG_TIDY_VERSION_PATCH, individual components of the clang-tidy version. +# +# CLANG_TIDY_FOUND, If false, do not try to use Eigen3. + +#============================================================================= +# Copyright 2020 Blender Foundation. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= + +# If CLANG_TIDY_ROOT_DIR was defined in the environment, use it. +if(NOT CLANG_TIDY_ROOT_DIR AND NOT $ENV{CLANG_TIDY_ROOT_DIR} STREQUAL "") + set(CLANG_TIDY_ROOT_DIR $ENV{CLANG_TIDY_ROOT_DIR}) +endif() + +set(_clang_tidy_SEARCH_DIRS + ${CLANG_TIDY_ROOT_DIR} + /usr/local/bin +) + +# TODO(sergey): Find more reliable way of finding the latest clang-tidy. +find_program(CLANG_TIDY_EXECUTABLE + NAMES + clang-tidy-10 + clang-tidy-9 + clang-tidy-8 + clang-tidy-7 + clang-tidy + HINTS + ${_clang_tidy_SEARCH_DIRS} +) + +if(CLANG_TIDY_EXECUTABLE) + # Mark clang-tidy as found. + set(CLANG_TIDY_FOUND TRUE) + + # Setup fallback values. + set(CLANG_TIDY_VERSION_MAJOR 0) + set(CLANG_TIDY_VERSION_MINOR 0) + set(CLANG_TIDY_VERSION_PATCH 0) + + # Get version from the output. + # + # NOTE: Don't use name of the executable file since that only includes a + # major version. Also, even the major version might be missing in the + # executable name. + execute_process(COMMAND ${CLANG_TIDY_EXECUTABLE} -version + OUTPUT_VARIABLE CLANG_TIDY_VERSION_RAW + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # Parse parts. + if(CLANG_TIDY_VERSION_RAW MATCHES "LLVM version .*") + # Strip the LLVM prefix and get list of individual version components. + string(REGEX REPLACE + ".*LLVM version ([.0-9]+).*" "\\1" + CLANG_SEMANTIC_VERSION "${CLANG_TIDY_VERSION_RAW}") + string(REPLACE "." ";" CLANG_VERSION_PARTS "${CLANG_SEMANTIC_VERSION}") + list(LENGTH CLANG_VERSION_PARTS NUM_CLANG_TIDY_VERSION_PARTS) + + # Extract components into corresponding variables. + if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 0) + list(GET CLANG_VERSION_PARTS 0 CLANG_TIDY_VERSION_MAJOR) + endif() + if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 1) + list(GET CLANG_VERSION_PARTS 1 CLANG_TIDY_VERSION_MINOR) + endif() + if(NUM_CLANG_TIDY_VERSION_PARTS GREATER 2) + list(GET CLANG_VERSION_PARTS 2 CLANG_TIDY_VERSION_PATCH) + endif() + + # Unset temp variables. + unset(NUM_CLANG_TIDY_VERSION_PARTS) + unset(CLANG_SEMANTIC_VERSION) + unset(CLANG_VERSION_PARTS) + endif() + + # Construct full semantic version. + set(CLANG_TIDY_VERSION "${CLANG_TIDY_VERSION_MAJOR}.\ +${CLANG_TIDY_VERSION_MINOR}.\ +${CLANG_TIDY_VERSION_PATCH}") + unset(CLANG_TIDY_VERSION_RAW) + + message(STATUS "Found clang-tidy ${CLANG_TIDY_EXECUTABLE} (${CLANG_TIDY_VERSION})") +else() + set(CLANG_TIDY_FOUND FALSE) +endif() -- cgit v1.2.3