FindClang.cmake 3.52 KB
Newer Older
Kevin Funk's avatar
Kevin Funk committed
1
2
3
# Detect Clang libraries
#
# Defines the following variables:
4
5
6
7
#  CLANG_FOUND                 - True if Clang was found
#  CLANG_INCLUDE_DIR           - Where to find Clang includes
#  CLANG_LIBRARY_DIR           - Where to find Clang libraries
#
Kevin Funk's avatar
Kevin Funk committed
8
#  CLANG_CLANG_LIB             - LibClang library
Kevin Funk's avatar
Kevin Funk committed
9
#  CLANG_CLANGFRONTEND_LIB     - Clang Frontend Library
Kevin Funk's avatar
Kevin Funk committed
10
11
12
13
14
15
16
#  CLANG_CLANGDRIVER_LIB       - Clang Driver Library
#  ...
#
# Uses the same include and library paths detected by FindLLVM.cmake
#
# See http://clang.llvm.org/docs/InternalsManual.html for full list of libraries

Kevin Funk's avatar
Kevin Funk committed
17
#=============================================================================
Kevin Funk's avatar
Kevin Funk committed
18
# Copyright 2014 Kevin Funk <kfunk@kde.org>
Kevin Funk's avatar
Kevin Funk committed
19
20
21
22
23
24
25
#
# 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.
26

Kevin Funk's avatar
Kevin Funk committed
27
28
#=============================================================================

Milian Wolff's avatar
Milian Wolff committed
29
30
31
32
33
if (${Clang_FIND_REQUIRED})
    find_package(LLVM ${Clang_FIND_VERSION} REQUIRED)
else ()
    find_package(LLVM ${Clang_FIND_VERSION})
endif ()
Kevin Funk's avatar
Kevin Funk committed
34

Kevin Funk's avatar
Kevin Funk committed
35
36
set(CLANG_FOUND FALSE)

37
38
39
if (LLVM_FOUND AND LLVM_LIBRARY_DIR)
  macro(FIND_AND_ADD_CLANG_LIB _libname_)
    string(TOUPPER ${_libname_} _prettylibname_)
40
    find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} HINTS ${LLVM_LIBRARY_DIR})
41
42
43
44
    if(CLANG_${_prettylibname_}_LIB)
      set(CLANG_LIBS ${CLANG_LIBS} ${CLANG_${_prettylibname_}_LIB})
    endif()
  endmacro(FIND_AND_ADD_CLANG_LIB)
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
  FIND_AND_ADD_CLANG_LIB(clang) # LibClang: high-level C interface
  FIND_AND_ADD_CLANG_LIB(clangFrontend)
  FIND_AND_ADD_CLANG_LIB(clangDriver)
  FIND_AND_ADD_CLANG_LIB(clangCodeGen)
  FIND_AND_ADD_CLANG_LIB(clangSema)
  FIND_AND_ADD_CLANG_LIB(clangChecker)
  FIND_AND_ADD_CLANG_LIB(clangAnalysis)
  FIND_AND_ADD_CLANG_LIB(clangRewrite)
  FIND_AND_ADD_CLANG_LIB(clangAST)
  FIND_AND_ADD_CLANG_LIB(clangParse)
  FIND_AND_ADD_CLANG_LIB(clangLex)
  FIND_AND_ADD_CLANG_LIB(clangBasic)
  FIND_AND_ADD_CLANG_LIB(clangARCMigrate)
  FIND_AND_ADD_CLANG_LIB(clangEdit)
  FIND_AND_ADD_CLANG_LIB(clangFrontendTool)
  FIND_AND_ADD_CLANG_LIB(clangRewrite)
  FIND_AND_ADD_CLANG_LIB(clangSerialization)
  FIND_AND_ADD_CLANG_LIB(clangTooling)
  FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerCheckers)
  FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerCore)
  FIND_AND_ADD_CLANG_LIB(clangStaticAnalyzerFrontend)
  FIND_AND_ADD_CLANG_LIB(clangSema)
  FIND_AND_ADD_CLANG_LIB(clangRewriteCore)
endif()
70
71
72

if(CLANG_LIBS)
  set(CLANG_FOUND TRUE)
Kevin Funk's avatar
Kevin Funk committed
73
74
else()
  message(STATUS "Could not find any Clang libraries in ${LLVM_LIBRARY_DIR}")
Kevin Funk's avatar
Kevin Funk committed
75
endif()
76
77

if(CLANG_FOUND)
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  set(CLANG_LIBRARY_DIR ${LLVM_LIBRARY_DIR})
  set(CLANG_INCLUDE_DIR ${LLVM_INCLUDE_DIR})

  # check whether llvm-config comes from an install prefix
  execute_process(
    COMMAND ${LLVM_CONFIG_EXECUTABLE} --src-root
    OUTPUT_VARIABLE _llvmSourceRoot
    OUTPUT_STRIP_TRAILING_WHITESPACE
  )
  string(FIND "${LLVM_INCLUDE_DIR}" "${_llvmSourceRoot}" _llvmIsInstalled)
  if (NOT _llvmIsInstalled)
    message(STATUS "Detected that llvm-config comes from a build-tree, adding includes from source dir")
    list(APPEND CLANG_INCLUDE_DIR "${_llvmSourceRoot}/tools/clang/include")
  endif()

Kevin Funk's avatar
Kevin Funk committed
93
  message(STATUS "Found Clang (LLVM version: ${LLVM_VERSION})")
94
95
  message(STATUS "  Include dirs:  ${CLANG_INCLUDE_DIR}")
  message(STATUS "  Libraries:     ${CLANG_LIBS}")
Kevin Funk's avatar
Kevin Funk committed
96
else()
97
  if(Clang_FIND_REQUIRED)
98
    message(FATAL_ERROR "Could NOT find Clang")
99
  endif()
Kevin Funk's avatar
Kevin Funk committed
100
endif()