blob: 5746afb5eb3ffd13f105c21e5ec6966a14151b2c [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")
Louis Dionne28b73212019-08-19 23:51:26 +000012 if (NOT IS_DIRECTORY "${LLVM_PATH}")
13 message(FATAL_ERROR "The provided LLVM_PATH (${LLVM_PATH}) is not a valid directory")
14 endif()
Chris Bieneman6567d582016-08-18 21:31:51 +000015 elseif(LLVM_CONFIG_PATH)
16 message(STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH}")
Eric Fiselier95353d52016-11-14 02:43:12 +000017 set(LIBCXX_USING_INSTALLED_LLVM 1)
Chris Bieneman6567d582016-08-18 21:31:51 +000018 set(CONFIG_COMMAND ${LLVM_CONFIG_PATH}
Eric Fiselier156a46d2015-07-30 22:30:34 +000019 "--includedir"
20 "--prefix"
21 "--src-root")
22 execute_process(
23 COMMAND ${CONFIG_COMMAND}
24 RESULT_VARIABLE HAD_ERROR
25 OUTPUT_VARIABLE CONFIG_OUTPUT
26 )
27 if(NOT HAD_ERROR)
28 string(REGEX REPLACE
29 "[ \t]*[\r\n]+[ \t]*" ";"
30 CONFIG_OUTPUT ${CONFIG_OUTPUT})
31 else()
32 string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
33 message(STATUS "${CONFIG_COMMAND_STR}")
34 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
35 endif()
36
37 list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
38 list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
39 list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)
40
41 set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
42 set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
43 set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
Michal Gornyc54e5572017-01-09 23:41:38 +000044
45 # --cmakedir is supported since llvm r291218 (4.0 release)
46 execute_process(
47 COMMAND ${LLVM_CONFIG_PATH} --cmakedir
48 RESULT_VARIABLE HAD_ERROR
Eric Fiselier903ed062017-01-14 03:35:15 +000049 OUTPUT_VARIABLE CONFIG_OUTPUT
50 ERROR_QUIET)
Michal Gornyc54e5572017-01-09 23:41:38 +000051 if(NOT HAD_ERROR)
Martin Storsjo57a4aef2018-06-20 21:03:34 +000052 string(STRIP "${CONFIG_OUTPUT}" LLVM_CMAKE_PATH_FROM_LLVM_CONFIG)
53 file(TO_CMAKE_PATH "${LLVM_CMAKE_PATH_FROM_LLVM_CONFIG}" LLVM_CMAKE_PATH)
Michal Gornyc54e5572017-01-09 23:41:38 +000054 else()
Martin Storsjo57a4aef2018-06-20 21:03:34 +000055 file(TO_CMAKE_PATH "${LLVM_BINARY_DIR}" LLVM_BINARY_DIR_CMAKE_STYLE)
56 set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR_CMAKE_STYLE}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
Michal Gornyc54e5572017-01-09 23:41:38 +000057 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +000058 else()
59 set(LLVM_FOUND OFF)
Petr Hoseka0541652016-12-12 05:05:46 +000060 message(WARNING "UNSUPPORTED LIBCXX CONFIGURATION DETECTED: "
61 "llvm-config not found and LLVM_PATH not defined.\n"
62 "Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config "
63 "or -DLLVM_PATH=path/to/llvm-source-root.")
Eric Fiselier156a46d2015-07-30 22:30:34 +000064 return()
65 endif()
66
Michal Gorny66952682016-10-19 12:34:17 +000067 if (EXISTS "${LLVM_CMAKE_PATH}")
68 list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
69 elseif (EXISTS "${LLVM_MAIN_SRC_DIR}/cmake/modules")
70 list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
71 else()
Eric Fiselierd419fe22015-08-12 06:36:19 +000072 set(LLVM_FOUND OFF)
Michal Gorny66952682016-10-19 12:34:17 +000073 message(WARNING "Neither ${LLVM_CMAKE_PATH} nor ${LLVM_MAIN_SRC_DIR}/cmake/modules found")
Eric Fiselierd419fe22015-08-12 06:36:19 +000074 return()
Eric Fiselier156a46d2015-07-30 22:30:34 +000075 endif()
76
Eric Fiselier156a46d2015-07-30 22:30:34 +000077 set(LLVM_FOUND ON)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000078endmacro(find_llvm_parts)
Eric Fiselier156a46d2015-07-30 22:30:34 +000079
Eric Fiselier95353d52016-11-14 02:43:12 +000080macro(configure_out_of_tree_llvm)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000081 message(STATUS "Configuring for standalone build.")
Eric Fiselier95353d52016-11-14 02:43:12 +000082 set(LIBCXX_STANDALONE_BUILD 1)
Eric Fiselier0f932cb2015-12-30 03:39:03 +000083
84 find_llvm_parts()
85
Eric Fiselier95353d52016-11-14 02:43:12 +000086 # Add LLVM Functions --------------------------------------------------------
87 if (LLVM_FOUND AND LIBCXX_USING_INSTALLED_LLVM)
88 include(LLVMConfig) # For TARGET_TRIPLE
89 else()
90 if (WIN32)
91 set(LLVM_ON_UNIX 0)
92 set(LLVM_ON_WIN32 1)
93 else()
94 set(LLVM_ON_UNIX 1)
95 set(LLVM_ON_WIN32 0)
96 endif()
97 endif()
98 if (LLVM_FOUND)
99 include(AddLLVM OPTIONAL)
100 endif()
101
Eric Fiselier156a46d2015-07-30 22:30:34 +0000102 # LLVM Options --------------------------------------------------------------
Eric Fiselier156a46d2015-07-30 22:30:34 +0000103 if (NOT DEFINED LLVM_INCLUDE_TESTS)
104 set(LLVM_INCLUDE_TESTS ${LLVM_FOUND})
105 endif()
Eric Fiselierf12577b2015-08-22 20:26:42 +0000106 if (NOT DEFINED LLVM_INCLUDE_DOCS)
107 set(LLVM_INCLUDE_DOCS ${LLVM_FOUND})
108 endif()
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000109 if (NOT DEFINED LLVM_ENABLE_SPHINX)
110 set(LLVM_ENABLE_SPHINX OFF)
111 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +0000112
Zachary Turnere6c96702017-09-19 17:19:10 +0000113 # In a standalone build, we don't have llvm to automatically generate the
114 # llvm-lit script for us. So we need to provide an explicit directory that
115 # the configurator should write the script into.
116 set(LLVM_LIT_OUTPUT_DIR "${libcxx_BINARY_DIR}/bin")
117
Zachary Turner00c4bc32017-09-20 16:01:50 +0000118 if (LLVM_INCLUDE_TESTS)
119 # Required LIT Configuration ------------------------------------------------
120 # Define the default arguments to use with 'lit', and an option for the user
121 # to override.
Michal Gornyd956cf52019-01-28 15:16:03 +0000122 set(LLVM_DEFAULT_EXTERNAL_LIT "${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py")
Zachary Turner00c4bc32017-09-20 16:01:50 +0000123 set(LIT_ARGS_DEFAULT "-sv --show-xfail --show-unsupported")
124 if (MSVC OR XCODE)
125 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
126 endif()
127 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
Eric Fiselier156a46d2015-07-30 22:30:34 +0000128 endif()
Eric Fiselier156a46d2015-07-30 22:30:34 +0000129
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000130 # Required doc configuration
131 if (LLVM_ENABLE_SPHINX)
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000132 find_package(Sphinx REQUIRED)
Eric Fiselierd720d1f2015-08-22 19:40:49 +0000133 endif()
134
Eric Fiselier95353d52016-11-14 02:43:12 +0000135 if (LLVM_ON_UNIX AND NOT APPLE)
136 set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
137 else()
Eric Fiselier0b09dd12015-10-15 22:41:51 +0000138 set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
Eric Fiselier95353d52016-11-14 02:43:12 +0000139 endif()
140endmacro(configure_out_of_tree_llvm)
Eric Fiselier0b09dd12015-10-15 22:41:51 +0000141
Eric Fiselier95353d52016-11-14 02:43:12 +0000142configure_out_of_tree_llvm()