diff options
Diffstat (limited to 'build_files/cmake/Modules/FindClangTidy.cmake')
-rw-r--r-- | build_files/cmake/Modules/FindClangTidy.cmake | 104 |
1 files changed, 104 insertions, 0 deletions
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() |