blob: 11c13315585bfce3a20591c688067a6a32a2af5c [file] [log] [blame]
Eric Fiselier0f932cb2015-12-30 03:39:03 +00001macro(find_llvm_parts)
Eric Fiselier156a46d2015-07-30 22:30:34 +00002# Rely on llvm-config.
3 set(CONFIG_OUTPUT)
Chris Bieneman6567d582016-08-18 21:31:51 +00004 if(NOT LLVM_CONFIG_PATH)
5 find_program(LLVM_CONFIG_PATH "llvm-config")
6 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +00007 if(DEFINED LLVM_PATH)
8 set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
9 set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
10 set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
11 set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
Chris Bieneman6567d582016-08-18 21:31:51 +000012 elseif(LLVM_CONFIG_PATH)
13 message(STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH}")
Eric Fiselier95353d52016-11-14 02:43:12 +000014 set(LIBCXX_USING_INSTALLED_LLVM 1)
Chris Bieneman6567d582016-08-18 21:31:51 +000015 set(CONFIG_COMMAND ${LLVM_CONFIG_PATH}
Eric Fiselier156a46d2015-07-30 22:30:34 +000016 "--includedir"
17 "--prefix"
18 "--src-root")
19 execute_process(
20 COMMAND ${CONFIG_COMMAND}
21 RESULT_VARIABLE HAD_ERROR
22 OUTPUT_VARIABLE CONFIG_OUTPUT
23 )
24 if(NOT HAD_ERROR)
25 string(REGEX REPLACE
26 "[ \t]*[\r\n]+[ \t]*" ";"
27 CONFIG_OUTPUT ${CONFIG_OUTPUT})
28 else()
29 string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
30 message(STATUS "${CONFIG_COMMAND_STR}")
31 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
32 endif()
33
34 list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
35 list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
36 list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)
37
38 set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
39 set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
40 set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
Michal Gornyc54e5572017-01-09 23:41:38 +000041
42 # --cmakedir is supported since llvm r291218 (4.0 release)
43 execute_process(
44 COMMAND ${LLVM_CONFIG_PATH} --cmakedir
45 RESULT_VARIABLE HAD_ERROR
Eric Fiselier903ed062017-01-14 03:35:15 +000046 OUTPUT_VARIABLE CONFIG_OUTPUT
47 ERROR_QUIET)
Michal Gornyc54e5572017-01-09 23:41:38 +000048 if(NOT HAD_ERROR)
Martin Storsjo57a4aef2018-06-20 21:03:34 +000049 string(STRIP "${CONFIG_OUTPUT}" LLVM_CMAKE_PATH_FROM_LLVM_CONFIG)
50 file(TO_CMAKE_PATH "${LLVM_CMAKE_PATH_FROM_LLVM_CONFIG}" LLVM_CMAKE_PATH)
Michal Gornyc54e5572017-01-09 23:41:38 +000051 else()
Martin Storsjo57a4aef2018-06-20 21:03:34 +000052 file(TO_CMAKE_PATH "${LLVM_BINARY_DIR}" LLVM_BINARY_DIR_CMAKE_STYLE)
53 set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR_CMAKE_STYLE}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
Michal Gornyc54e5572017-01-09 23:41:38 +000054 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +000055 else()
56 set(LLVM_FOUND OFF)
Petr Hoseka0541652016-12-12 05:05:46 +000057 message(WARNING "UNSUPPORTED LIBCXX CONFIGURATION DETECTED: "
58 "llvm-config not found and LLVM_PATH not defined.\n"
59 "Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config "
60 "or -DLLVM_PATH=path/to/llvm-source-root.")
Eric Fiselier156a46d2015-07-30 22:30:34 +000061 return()
62 endif()
63
Michal Gorny66952682016-10-19 12:34:17 +000064 if (EXISTS "${LLVM_CMAKE_PATH}")
65 list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
66 elseif (EXISTS "${LLVM_MAIN_SRC_DIR}/cmake/modules")
67 list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
68 else()
Eric Fiselierd419fe22015-08-12 06:36:19 +000069 set(LLVM_FOUND OFF)
Michal Gorny66952682016-10-19 12:34:17 +000070 message(WARNING "Neither ${LLVM_CMAKE_PATH} nor ${LLVM_MAIN_SRC_DIR}/cmake/modules found")
Eric Fiselierd419fe22015-08-12 06:36:19 +000071 return()
Eric Fiselier156a46d2015-07-30 22:30:34 +000072 endif()
73
Eric Fiselier156a46d2015-07-30 22:30:34 +000074 set(LLVM_FOUND ON)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000075endmacro(find_llvm_parts)
Eric Fiselier156a46d2015-07-30 22:30:34 +000076
Eric Fiselier95353d52016-11-14 02:43:12 +000077macro(configure_out_of_tree_llvm)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000078 message(STATUS "Configuring for standalone build.")
Eric Fiselier95353d52016-11-14 02:43:12 +000079 set(LIBCXX_STANDALONE_BUILD 1)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000080
81 find_llvm_parts()
82
Eric Fiselier95353d52016-11-14 02:43:12 +000083 # Add LLVM Functions --------------------------------------------------------
84 if (LLVM_FOUND AND LIBCXX_USING_INSTALLED_LLVM)
85 include(LLVMConfig) # For TARGET_TRIPLE
86 else()
87 if (WIN32)
88 set(LLVM_ON_UNIX 0)
89 set(LLVM_ON_WIN32 1)
90 else()
91 set(LLVM_ON_UNIX 1)
92 set(LLVM_ON_WIN32 0)
93 endif()
94 endif()
95 if (LLVM_FOUND)
96 include(AddLLVM OPTIONAL)
97 endif()
98
Eric Fiselier156a46d2015-07-30 22:30:34 +000099 # LLVM Options --------------------------------------------------------------
Eric Fiselier156a46d2015-07-30 22:30:34 +0000100 if (NOT DEFINED LLVM_INCLUDE_TESTS)
101 set(LLVM_INCLUDE_TESTS ${LLVM_FOUND})
102 endif()
Eric Fiselierf12577b2015-08-22 20:26:42 +0000103 if (NOT DEFINED LLVM_INCLUDE_DOCS)
104 set(LLVM_INCLUDE_DOCS ${LLVM_FOUND})
105 endif()
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000106 if (NOT DEFINED LLVM_ENABLE_SPHINX)
107 set(LLVM_ENABLE_SPHINX OFF)
108 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +0000109
Zachary Turnere6c96702017-09-19 17:19:10 +0000110 # In a standalone build, we don't have llvm to automatically generate the
111 # llvm-lit script for us. So we need to provide an explicit directory that
112 # the configurator should write the script into.
113 set(LLVM_LIT_OUTPUT_DIR "${libcxx_BINARY_DIR}/bin")
114
Zachary Turner00c4bc32017-09-20 16:01:50 +0000115 if (LLVM_INCLUDE_TESTS)
116 # Required LIT Configuration ------------------------------------------------
117 # Define the default arguments to use with 'lit', and an option for the user
118 # to override.
Michal Gornyd956cf52019-01-28 15:16:03 +0000119 set(LLVM_DEFAULT_EXTERNAL_LIT "${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py")
Zachary Turner00c4bc32017-09-20 16:01:50 +0000120 set(LIT_ARGS_DEFAULT "-sv --show-xfail --show-unsupported")
121 if (MSVC OR XCODE)
122 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
123 endif()
124 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
Eric Fiselier156a46d2015-07-30 22:30:34 +0000125 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +0000126
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000127 # Required doc configuration
128 if (LLVM_ENABLE_SPHINX)
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000129 find_package(Sphinx REQUIRED)
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000130 endif()
131
Eric Fiselier95353d52016-11-14 02:43:12 +0000132 if (LLVM_ON_UNIX AND NOT APPLE)
133 set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
134 else()
Eric Fiselier0b09dd12015-10-15 22:41:51 +0000135 set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
Eric Fiselier95353d52016-11-14 02:43:12 +0000136 endif()
137endmacro(configure_out_of_tree_llvm)
Eric Fiselier0b09dd12015-10-15 22:41:51 +0000138
Eric Fiselier95353d52016-11-14 02:43:12 +0000139configure_out_of_tree_llvm()