CMakeLists.txt raw

   1  cmake_minimum_required(VERSION 3.22)
   2  
   3  project(bitcoin-tidy
   4      VERSION
   5      1.0.0
   6      DESCRIPTION "clang-tidy checks for Bitcoin Core"
   7      LANGUAGES CXX)
   8  
   9  include(GNUInstallDirs)
  10  
  11  set(CMAKE_CXX_STANDARD 20)
  12  set(CMAKE_CXX_STANDARD_REQUIRED True)
  13  set(CMAKE_CXX_EXTENSIONS False)
  14  
  15  set(CMAKE_DISABLE_FIND_PACKAGE_CURL ON)
  16  set(CMAKE_DISABLE_FIND_PACKAGE_FFI ON)
  17  set(CMAKE_DISABLE_FIND_PACKAGE_LibEdit ON)
  18  set(CMAKE_DISABLE_FIND_PACKAGE_LibXml2 ON)
  19  set(CMAKE_DISABLE_FIND_PACKAGE_Terminfo ON)
  20  set(CMAKE_DISABLE_FIND_PACKAGE_ZLIB ON)
  21  set(CMAKE_DISABLE_FIND_PACKAGE_zstd ON)
  22  
  23  find_package(LLVM REQUIRED CONFIG)
  24  find_program(CLANG_TIDY_EXE REQUIRED NAMES "clang-tidy-${LLVM_VERSION_MAJOR}" "clang-tidy" HINTS ${LLVM_TOOLS_BINARY_DIR})
  25  message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
  26  message(STATUS "Found clang-tidy: ${CLANG_TIDY_EXE}")
  27  
  28  add_library(bitcoin-tidy MODULE bitcoin-tidy.cpp nontrivial-threadlocal.cpp)
  29  target_include_directories(bitcoin-tidy SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS})
  30  
  31  # Disable RTTI and exceptions as necessary
  32  if (MSVC)
  33      target_compile_options(bitcoin-tidy PRIVATE /GR-)
  34  else()
  35      target_compile_options(bitcoin-tidy PRIVATE -fno-rtti)
  36      target_compile_options(bitcoin-tidy PRIVATE -fno-exceptions)
  37  endif()
  38  
  39  if(CMAKE_HOST_APPLE)
  40      # ld64 expects no undefined symbols by default
  41      target_link_options(bitcoin-tidy PRIVATE -Wl,-flat_namespace)
  42      target_link_options(bitcoin-tidy PRIVATE -Wl,-undefined -Wl,suppress)
  43  endif()
  44  
  45  # Add warnings
  46  if (MSVC)
  47      target_compile_options(bitcoin-tidy PRIVATE /W4)
  48  else()
  49      target_compile_options(bitcoin-tidy PRIVATE -Wall)
  50      target_compile_options(bitcoin-tidy PRIVATE -Wextra)
  51  endif()
  52  
  53  if(CMAKE_VERSION VERSION_LESS 3.27)
  54      set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "--load=${CMAKE_BINARY_DIR}/${CMAKE_SHARED_MODULE_PREFIX}bitcoin-tidy${CMAKE_SHARED_MODULE_SUFFIX}" "-checks=-*,bitcoin-*")
  55  else()
  56      # CLANG_TIDY_COMMAND supports generator expressions as of 3.27
  57      set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "--load=$<TARGET_FILE:bitcoin-tidy>" "-checks=-*,bitcoin-*")
  58  endif()
  59  
  60  # Create a dummy library that runs clang-tidy tests as a side-effect of building
  61  add_library(bitcoin-tidy-tests OBJECT EXCLUDE_FROM_ALL example_nontrivial-threadlocal.cpp)
  62  add_dependencies(bitcoin-tidy-tests bitcoin-tidy)
  63  
  64  set_target_properties(bitcoin-tidy-tests PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
  65  
  66  
  67  install(TARGETS bitcoin-tidy LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
  68