File: FindClangFormat.cmake

package info (click to toggle)
mlt 7.36.1-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 14,648 kB
  • sloc: cpp: 87,247; ansic: 79,634; python: 504; asm: 311; sh: 221; ruby: 197; javascript: 90; makefile: 45; perl: 33; java: 29; cs: 19; php: 18; tcl: 15
file content (91 lines) | stat: -rw-r--r-- 2,932 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#
# .rst: FindClangFormat
# ---------------
#
# The module defines the following variables
#
# ``CLANGFORMAT_EXECUTABLE`` Path to clang-format executable
# ``CLANGFORMAT_FOUND`` True if the clang-format executable was found.
# ``CLANGFORMAT_VERSION`` The version of clang-format found
#
# Example usage:
#
# .. code-block:: cmake
#
# find_package(ClangFormat)
# if(CLANGFORMAT_FOUND)
# message("clang-format executable found: ${CLANGFORMAT_EXECUTABLE}\n" "version: ${CLANGFORMAT_VERSION}")
# endif()

include(FindPackageHandleStandardArgs)

function(_ClangFormat_get_version clangformat_version result_var clangformat_path)
  execute_process(
    COMMAND "${clangformat_path}" --version
    OUTPUT_VARIABLE full_clangformat_version
    OUTPUT_STRIP_TRAILING_WHITESPACE
    RESULT_VARIABLE version_result
  )

  # full_clangformat_version sample: "clang-format version 3.9.1-4ubuntu3~16.04.1 (tags/RELEASE_391/rc2)"
  # clean clangformat_version sample: "3.9.1"
  string(REGEX
         REPLACE "[^0-9]*([.0-9]+).*"
                 "\\1"
                 clean_clangformat_version
                 "${full_clangformat_version}")

  set(${result_var} ${version_result} PARENT_SCOPE)
  set(${clangformat_version} ${clean_clangformat_version} PARENT_SCOPE)
endfunction()

function(_ClangFromat_version_validator version_match clangformat_path)
    if(NOT DEFINED ClangFormat_FIND_VERSION)
        set(${is_valid_version} TRUE PARENT_SCOPE)
    else()
        _ClangFormat_get_version(candidate_version version_result "${clangformat_path}")

        if(version_result)
            message(DEBUG "Unable to determine candidate clang-format version at ${clangformat_path}: ${version_result}")
        endif()

        find_package_check_version("${candidate_version}" valid_clangformat_version
            HANDLE_VERSION_RANGE
        )

        set(${version_match} "${valid_clangformat_version}" PARENT_SCOPE)
    endif()
endfunction()

find_program(CLANGFORMAT_EXECUTABLE
             NAMES clang-format
                   clang-format-16
                   clang-format-15
                   clang-format-14
                   clang-format-13
                   clang-format-12
                   clang-format-11
                   clang-format-10
             DOC "clang-format executable"
             VALIDATOR _ClangFromat_version_validator
            )
mark_as_advanced(CLANGFORMAT_EXECUTABLE)

if(CLANGFORMAT_EXECUTABLE)
  _ClangFormat_get_version(CLANGFORMAT_VERSION _Clangformat_version_result "${CLANGFORMAT_EXECUTABLE}")

  if(_Clangformat_version_result)
    set(CLANGFORMAT_FOUND FALSE)
    message(WARNING "Unable to determine clang-format version: ${_Clangformat_version_result}")
  else()
    set(CLANGFORMAT_FOUND TRUE)
  endif()
endif()

find_package_handle_standard_args(ClangFormat
  FOUND_VAR CLANGFORMAT_FOUND
  REQUIRED_VARS
    CLANGFORMAT_EXECUTABLE
    CLANGFORMAT_VERSION
  VERSION_VAR CLANGFORMAT_VERSION
)