aboutsummaryrefslogtreecommitdiff
path: root/backend/cmake/modules/RCCBackendBuild.cmake
blob: 36809eccf10bc18478212c9d49c56add0daa0acb (plain)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# SPDX-License-Identifier: GPL-3.0-or-later

function(rcc_backend_initialize_toolchain)
  string(REGEX MATCH "^[0-9]+" RCCBackendClangMajor "${CMAKE_CXX_COMPILER_VERSION}")

  find_program(
    RCC_BACKEND_CLANG_FORMAT
    NAMES "clang-format-${RCCBackendClangMajor}" clang-format
    REQUIRED
  )
  find_program(
    RCC_BACKEND_CLANG_TIDY
    NAMES "clang-tidy-${RCCBackendClangMajor}" clang-tidy
    REQUIRED
  )
  find_program(
    RCC_BACKEND_CLANG_TIDY_DIFF
    NAMES clang-tidy-diff.py
    HINTS "/usr/lib/llvm-${RCCBackendClangMajor}/share/clang"
    REQUIRED
  )
  find_program(
    RCC_BACKEND_RUN_CLANG_TIDY
    NAMES "run-clang-tidy-${RCCBackendClangMajor}" run-clang-tidy
    REQUIRED
  )
  find_program(RCC_BACKEND_GIT NAMES git REQUIRED)

  foreach(Tool IN ITEMS RCC_BACKEND_CLANG_FORMAT RCC_BACKEND_CLANG_TIDY)
    execute_process(
      COMMAND "${${Tool}}" --version
      OUTPUT_VARIABLE ToolVersionOutput
      ERROR_VARIABLE ToolVersionError
      RESULT_VARIABLE ToolVersionResult
    )
    if(NOT ToolVersionResult EQUAL 0)
      message(
        FATAL_ERROR
          "Unable to query ${Tool}: ${ToolVersionOutput}${ToolVersionError}"
      )
    endif()

    string(REGEX MATCH "version[ \t]+([0-9]+)" ToolVersionMatch "${ToolVersionOutput}")
    if(NOT CMAKE_MATCH_1 STREQUAL RCCBackendClangMajor)
      message(
        FATAL_ERROR
          "${Tool} must have Clang major version ${RCCBackendClangMajor}: "
          "${ToolVersionOutput}"
      )
    endif()
  endforeach()

  set(RCC_BACKEND_CLANG_FORMAT "${RCC_BACKEND_CLANG_FORMAT}" PARENT_SCOPE)
  set(RCC_BACKEND_CLANG_TIDY "${RCC_BACKEND_CLANG_TIDY}" PARENT_SCOPE)
  set(RCC_BACKEND_CLANG_TIDY_DIFF "${RCC_BACKEND_CLANG_TIDY_DIFF}" PARENT_SCOPE)
  set(RCC_BACKEND_RUN_CLANG_TIDY "${RCC_BACKEND_RUN_CLANG_TIDY}" PARENT_SCOPE)
  set(RCC_BACKEND_GIT "${RCC_BACKEND_GIT}" PARENT_SCOPE)
endfunction()

function(rcc_backend_configure_target Target)
  target_compile_features("${Target}" PUBLIC cxx_std_23)
  set_target_properties(
    "${Target}"
    PROPERTIES
      CXX_EXTENSIONS OFF
      CXX_STANDARD 23
      CXX_STANDARD_REQUIRED ON
  )

  target_compile_options(
    "${Target}"
    PRIVATE
      -Wall
      -Wextra
      -Wpedantic
      -Wconversion
      -Wsign-conversion
      -Wshadow
      -Wnon-virtual-dtor
      -Wold-style-cast
      -Wcast-align
      -Woverloaded-virtual
      -Wnull-dereference
      -Wdouble-promotion
      -Wformat=2
  )

  if(RCC_BACKEND_ENABLE_EH)
    target_compile_options("${Target}" PRIVATE -fexceptions)
  else()
    target_compile_options("${Target}" PRIVATE -fno-exceptions)
  endif()

  if(RCC_BACKEND_ENABLE_RTTI)
    target_compile_options("${Target}" PRIVATE -frtti)
  else()
    target_compile_options("${Target}" PRIVATE -fno-rtti)
  endif()

  if(RCC_BACKEND_WARNINGS_AS_ERRORS)
    target_compile_options("${Target}" PRIVATE -Werror)
  endif()

  if(RCC_BACKEND_ENABLE_CLANG_TIDY)
    set_target_properties(
      "${Target}"
      PROPERTIES
        CXX_CLANG_TIDY
          "${RCC_BACKEND_CLANG_TIDY};--warnings-as-errors=*"
    )
  endif()
endfunction()

function(rcc_backend_register_format_files)
  set_property(GLOBAL APPEND PROPERTY RCC_BACKEND_FORMAT_FILES ${ARGN})
endfunction()