summaryrefslogtreecommitdiff
path: root/cmake/Modules/HandleOutOfTreeLLVM.cmake
blob: 1dcaf9036a54803474d4e529e3bf5ad3460aaa26 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
macro(find_llvm_parts)
# Rely on llvm-config.
  set(CONFIG_OUTPUT)
  if(NOT LLVM_CONFIG_PATH)
    find_program(LLVM_CONFIG_PATH "llvm-config")
  endif()
  if(DEFINED LLVM_PATH)
    set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
    set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
    set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
    set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
  elseif(LLVM_CONFIG_PATH)
    message(STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH}")
    set(LIBCXXABI_USING_INSTALLED_LLVM 1)
    set(CONFIG_COMMAND ${LLVM_CONFIG_PATH}
      "--includedir"
      "--prefix"
      "--src-root")
    execute_process(
      COMMAND ${CONFIG_COMMAND}
      RESULT_VARIABLE HAD_ERROR
      OUTPUT_VARIABLE CONFIG_OUTPUT
    )
    if(NOT HAD_ERROR)
      string(REGEX REPLACE
        "[ \t]*[\r\n]+[ \t]*" ";"
        CONFIG_OUTPUT ${CONFIG_OUTPUT})
    else()
      string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
      message(STATUS "${CONFIG_COMMAND_STR}")
      message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
    endif()

    list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
    list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
    list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)

    set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
    set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
    set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")

    # --cmakedir is supported since llvm r291218 (4.0 release)
    execute_process(
      COMMAND ${LLVM_CONFIG_PATH} --cmakedir
      RESULT_VARIABLE HAD_ERROR
      OUTPUT_VARIABLE CONFIG_OUTPUT
      ERROR_QUIET)
    if(NOT HAD_ERROR)
      string(STRIP "${CONFIG_OUTPUT}" LLVM_CMAKE_PATH)
    else()
      set(LLVM_CMAKE_PATH
          "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
    endif()
  else()
    set(LLVM_FOUND OFF)
    message(WARNING "UNSUPPORTED LIBCXXABI CONFIGURATION DETECTED: "
                    "llvm-config not found and LLVM_PATH not defined.\n"
                    "Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config "
                    "or -DLLVM_PATH=path/to/llvm-source-root.")
    return()
  endif()

  if (EXISTS "${LLVM_CMAKE_PATH}")
    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
  elseif (EXISTS "${LLVM_MAIN_SRC_DIR}/cmake/modules")
    list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
  else()
    set(LLVM_FOUND OFF)
    message(WARNING "Neither ${LLVM_CMAKE_PATH} nor ${LLVM_MAIN_SRC_DIR}/cmake/modules found")
    return()
  endif()

  set(LLVM_FOUND ON)
endmacro(find_llvm_parts)

macro(configure_out_of_tree_llvm)
  message(STATUS "Configuring for standalone build.")
  set(LIBCXXABI_STANDALONE_BUILD 1)

  find_llvm_parts()

  # Add LLVM Functions --------------------------------------------------------
  if (LLVM_FOUND AND LIBCXXABI_USING_INSTALLED_LLVM)
    include(LLVMConfig) # For TARGET_TRIPLE
  else()
    if (WIN32)
      set(LLVM_ON_UNIX 0)
      set(LLVM_ON_WIN32 1)
    else()
      set(LLVM_ON_UNIX 1)
      set(LLVM_ON_WIN32 0)
    endif()
  endif()
  if (LLVM_FOUND)
    include(AddLLVM OPTIONAL)
  endif()

  # LLVM Options --------------------------------------------------------------
  if (NOT DEFINED LLVM_INCLUDE_TESTS)
    set(LLVM_INCLUDE_TESTS ${LLVM_FOUND})
  endif()
  if (NOT DEFINED LLVM_INCLUDE_DOCS)
    set(LLVM_INCLUDE_DOCS ${LLVM_FOUND})
  endif()
  if (NOT DEFINED LLVM_ENABLE_SPHINX)
    set(LLVM_ENABLE_SPHINX OFF)
  endif()

  # Required LIT Configuration ------------------------------------------------
  # Define the default arguments to use with 'lit', and an option for the user
  # to override.
  set(LIT_ARGS_DEFAULT "-sv --show-xfail --show-unsupported")
  if (MSVC OR XCODE)
    set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
  endif()
  set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")

  # Required doc configuration
  if (LLVM_ENABLE_SPHINX)
    find_package(Sphinx REQUIRED)
  endif()

  if (LLVM_ON_UNIX AND NOT APPLE)
    set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
  else()
    set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
  endif()
endmacro(configure_out_of_tree_llvm)

configure_out_of_tree_llvm()