xref: /openbsd-src/gnu/llvm/clang/CMakeLists.txt (revision 12c855180aad702bbcca06e0398d774beeafb155)
1a9ac8606Spatrickcmake_minimum_required(VERSION 3.13.4)
2e5dd7070Spatrick
3*12c85518Srobertif(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
4*12c85518Srobert  set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
5*12c85518Srobertendif()
6*12c85518Srobertinclude(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
7*12c85518Srobert  NO_POLICY_SCOPE)
8*12c85518Srobert
9e5dd7070Spatrick# If we are not building as a part of LLVM, build Clang as an
10e5dd7070Spatrick# standalone project, using LLVM as an external library:
11e5dd7070Spatrickif(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12e5dd7070Spatrick  project(Clang)
13*12c85518Srobert  set(CLANG_BUILT_STANDALONE TRUE)
14*12c85518Srobert  if ("${CMAKE_VERSION}" VERSION_LESS "3.20.0")
15*12c85518Srobert    message(WARNING
16*12c85518Srobert      "Your CMake version is ${CMAKE_VERSION}. Starting with LLVM 17.0.0, the "
17*12c85518Srobert      "minimum version of CMake required to build LLVM will become 3.20.0, and "
18*12c85518Srobert      "using an older CMake will become an error. Please upgrade your CMake to "
19*12c85518Srobert      "at least 3.20.0 now to avoid issues in the future!")
20*12c85518Srobert  endif()
21*12c85518Srobertendif()
22e5dd7070Spatrick
23*12c85518Srobert# Must go below project(..)
24*12c85518Srobertinclude(GNUInstallDirs)
25*12c85518Srobert
26*12c85518Srobertif(CLANG_BUILT_STANDALONE)
27*12c85518Srobert  set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
28ec727ea7Spatrick  set(CMAKE_CXX_STANDARD_REQUIRED YES)
29ec727ea7Spatrick  set(CMAKE_CXX_EXTENSIONS NO)
30ec727ea7Spatrick
31e5dd7070Spatrick  if(NOT MSVC_IDE)
32e5dd7070Spatrick    set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
33e5dd7070Spatrick      CACHE BOOL "Enable assertions")
34e5dd7070Spatrick    # Assertions should follow llvm-config's.
35e5dd7070Spatrick    mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
36e5dd7070Spatrick  endif()
37e5dd7070Spatrick
38*12c85518Srobert  find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
39*12c85518Srobert  list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
40e5dd7070Spatrick
41*12c85518Srobert  # Turn into CACHE PATHs for overwritting
42*12c85518Srobert  set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
43*12c85518Srobert  set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree")
44*12c85518Srobert  set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree")
45*12c85518Srobert  set(LLVM_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
46*12c85518Srobert  set(LLVM_LIBRARY_DIR "${LLVM_LIBRARY_DIR}" CACHE PATH "Path to llvm/lib")
47e5dd7070Spatrick
48e5dd7070Spatrick  find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
49e5dd7070Spatrick    NO_DEFAULT_PATH)
50e5dd7070Spatrick
51e5dd7070Spatrick  # They are used as destination of target generators.
52e5dd7070Spatrick  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
53e5dd7070Spatrick  set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
54e5dd7070Spatrick  if(WIN32 OR CYGWIN)
55e5dd7070Spatrick    # DLL platform -- put DLLs into bin.
56e5dd7070Spatrick    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
57e5dd7070Spatrick  else()
58e5dd7070Spatrick    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
59e5dd7070Spatrick  endif()
60e5dd7070Spatrick
61e5dd7070Spatrick  option(LLVM_INSTALL_TOOLCHAIN_ONLY
62e5dd7070Spatrick    "Only include toolchain files in the 'install' target." OFF)
63e5dd7070Spatrick
64e5dd7070Spatrick  option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
65e5dd7070Spatrick    "Set to ON to force using an old, unsupported host toolchain." OFF)
66e5dd7070Spatrick  option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
67e5dd7070Spatrick  option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON)
68e5dd7070Spatrick
69e5dd7070Spatrick  include(AddLLVM)
70e5dd7070Spatrick  include(TableGen)
71e5dd7070Spatrick  include(HandleLLVMOptions)
72e5dd7070Spatrick  include(VersionFromVCS)
73*12c85518Srobert  include(CheckAtomic)
74a9ac8606Spatrick  include(GetErrcMessages)
75e5dd7070Spatrick  include(LLVMDistributionSupport)
76e5dd7070Spatrick
77e5dd7070Spatrick  set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
78ec727ea7Spatrick  set(BUG_REPORT_URL "${LLVM_PACKAGE_BUGREPORT}" CACHE STRING
79ec727ea7Spatrick    "Default URL where bug reports are to be submitted.")
80e5dd7070Spatrick
81e5dd7070Spatrick  if (NOT DEFINED LLVM_INCLUDE_TESTS)
82e5dd7070Spatrick    set(LLVM_INCLUDE_TESTS ON)
83e5dd7070Spatrick  endif()
84e5dd7070Spatrick
85*12c85518Srobert  include_directories(${LLVM_INCLUDE_DIRS})
86e5dd7070Spatrick  link_directories("${LLVM_LIBRARY_DIR}")
87e5dd7070Spatrick
88e5dd7070Spatrick  set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
89e5dd7070Spatrick  set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
90e5dd7070Spatrick  set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
91e5dd7070Spatrick
92e5dd7070Spatrick  if(LLVM_INCLUDE_TESTS)
93a9ac8606Spatrick    find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
94a9ac8606Spatrick      COMPONENTS Interpreter)
95ec727ea7Spatrick
96e5dd7070Spatrick    # Check prebuilt llvm/utils.
97e5dd7070Spatrick    if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
98e5dd7070Spatrick        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}
99e5dd7070Spatrick        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
100e5dd7070Spatrick      set(LLVM_UTILS_PROVIDED ON)
101e5dd7070Spatrick    endif()
102e5dd7070Spatrick
103*12c85518Srobert    # Seek installed Lit.
104*12c85518Srobert    find_program(LLVM_LIT
105*12c85518Srobert                 NAMES llvm-lit lit.py lit
106*12c85518Srobert                 PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
107*12c85518Srobert                 DOC "Path to lit.py")
108*12c85518Srobert
109e5dd7070Spatrick    if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
110e5dd7070Spatrick      # Note: path not really used, except for checking if lit was found
111e5dd7070Spatrick      if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit)
112e5dd7070Spatrick        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit)
113e5dd7070Spatrick      endif()
114e5dd7070Spatrick      if(NOT LLVM_UTILS_PROVIDED)
115e5dd7070Spatrick        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
116e5dd7070Spatrick        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)
117e5dd7070Spatrick        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
118e5dd7070Spatrick        set(LLVM_UTILS_PROVIDED ON)
119e5dd7070Spatrick        set(CLANG_TEST_DEPS FileCheck count not)
120e5dd7070Spatrick      endif()
121*12c85518Srobert      set(UNITTEST_DIR ${LLVM_THIRD_PARTY_DIR}/unittest)
122e5dd7070Spatrick      if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
123e5dd7070Spatrick          AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
124e5dd7070Spatrick          AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
125*12c85518Srobert        add_subdirectory(${UNITTEST_DIR} third-party/unittest)
126e5dd7070Spatrick      endif()
127e5dd7070Spatrick    endif()
128e5dd7070Spatrick
129e5dd7070Spatrick    if(LLVM_LIT)
130e5dd7070Spatrick      # Define the default arguments to use with 'lit', and an option for the user
131e5dd7070Spatrick      # to override.
132e5dd7070Spatrick      set(LIT_ARGS_DEFAULT "-sv")
133e5dd7070Spatrick      if (MSVC OR XCODE)
134e5dd7070Spatrick        set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
135e5dd7070Spatrick      endif()
136e5dd7070Spatrick      set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
137e5dd7070Spatrick
138a9ac8606Spatrick      get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
139a9ac8606Spatrick
140e5dd7070Spatrick      # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
141e5dd7070Spatrick      if( WIN32 AND NOT CYGWIN )
142e5dd7070Spatrick        set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
143e5dd7070Spatrick      endif()
144e5dd7070Spatrick    else()
145e5dd7070Spatrick      set(LLVM_INCLUDE_TESTS OFF)
146e5dd7070Spatrick    endif()
147e5dd7070Spatrick
148*12c85518Srobert    umbrella_lit_testsuite_begin(check-all)
149*12c85518Srobert  endif() # LLVM_INCLUDE_TESTS
150*12c85518Srobertendif() # standalone
151e5dd7070Spatrick
152e5dd7070Spatrick# Make sure that our source directory is on the current cmake module path so that
153e5dd7070Spatrick# we can include cmake files from this directory.
154*12c85518Srobertlist(INSERT CMAKE_MODULE_PATH 0
155*12c85518Srobert  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
156*12c85518Srobert  "${LLVM_COMMON_CMAKE_UTILS}/Modules"
157*12c85518Srobert  )
158e5dd7070Spatrick
159*12c85518Srobert# This allows disabling clang's XML dependency even if LLVM finds libxml2.
160*12c85518Srobert# By default, clang depends on libxml2 if LLVM does.
161*12c85518Srobertoption(CLANG_ENABLE_LIBXML2 "Whether libclang may depend on libxml2"
162*12c85518Srobert       ${LLVM_ENABLE_LIBXML2})
163*12c85518Srobert
164*12c85518Srobertif(CLANG_ENABLE_LIBXML2)
165e5dd7070Spatrick  # Don't look for libxml if we're using MSan, since uninstrumented third party
166e5dd7070Spatrick  # code may call MSan interceptors like strlen, leading to false positives.
167e5dd7070Spatrick  if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
168e5dd7070Spatrick    set (LIBXML2_FOUND 0)
169e5dd7070Spatrick    find_package(LibXml2 2.5.3 QUIET)
170e5dd7070Spatrick    if (LIBXML2_FOUND)
171e5dd7070Spatrick      set(CLANG_HAVE_LIBXML 1)
172e5dd7070Spatrick    endif()
173e5dd7070Spatrick  endif()
174e5dd7070Spatrickendif()
175e5dd7070Spatrick
176e5dd7070Spatrickinclude(CheckIncludeFile)
177e5dd7070Spatrickcheck_include_file(sys/resource.h CLANG_HAVE_RLIMITS)
178e5dd7070Spatrick
179e5dd7070Spatrickset(CLANG_RESOURCE_DIR "" CACHE STRING
180e5dd7070Spatrick  "Relative directory from the Clang binary to its resource files.")
181e5dd7070Spatrick
182e5dd7070Spatrickset(C_INCLUDE_DIRS "" CACHE STRING
183e5dd7070Spatrick  "Colon separated list of directories clang will search for headers.")
184e5dd7070Spatrick
185e5dd7070Spatrickset(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
186ec727ea7Spatrickset(DEFAULT_SYSROOT "" CACHE STRING
187e5dd7070Spatrick  "Default <path> to all compiler invocations for --sysroot=<path>." )
188e5dd7070Spatrick
189e5dd7070Spatrickset(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
190e5dd7070Spatrick
191a9ac8606Spatrickset(ENABLE_X86_RELAX_RELOCATIONS ON CACHE BOOL
192e5dd7070Spatrick    "enable x86 relax relocations by default")
193e5dd7070Spatrick
194*12c85518Srobertset(PPC_LINUX_DEFAULT_IEEELONGDOUBLE OFF CACHE BOOL
195*12c85518Srobert    "Enable IEEE binary128 as default long double format on PowerPC Linux.")
196*12c85518Srobert
197e5dd7070Spatrickset(CLANG_SPAWN_CC1 OFF CACHE BOOL
198e5dd7070Spatrick    "Whether clang should use a new process for the CC1 invocation")
199e5dd7070Spatrick
200*12c85518Srobertoption(CLANG_DEFAULT_PIE_ON_LINUX "Default to -fPIE and -pie on linux-gnu" ON)
201e5dd7070Spatrick
202e5dd7070Spatrickset(CLANG_DEFAULT_LINKER "" CACHE STRING
203e5dd7070Spatrick  "Default linker to use (linker name or absolute path, empty for platform default)")
204e5dd7070Spatrick
205e5dd7070Spatrickset(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING
206e5dd7070Spatrick  "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default")
207e5dd7070Spatrickif (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR
208e5dd7070Spatrick        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR
209e5dd7070Spatrick        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++"))
210e5dd7070Spatrick  message(WARNING "Resetting default C++ stdlib to use platform default")
211e5dd7070Spatrick  set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING
212e5dd7070Spatrick    "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default" FORCE)
213e5dd7070Spatrickendif()
214e5dd7070Spatrick
215e5dd7070Spatrickset(CLANG_DEFAULT_RTLIB "" CACHE STRING
216e5dd7070Spatrick  "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)")
217e5dd7070Spatrickif (NOT(CLANG_DEFAULT_RTLIB STREQUAL "" OR
218e5dd7070Spatrick        CLANG_DEFAULT_RTLIB STREQUAL "libgcc" OR
219e5dd7070Spatrick        CLANG_DEFAULT_RTLIB STREQUAL "compiler-rt"))
220e5dd7070Spatrick  message(WARNING "Resetting default rtlib to use platform default")
221e5dd7070Spatrick  set(CLANG_DEFAULT_RTLIB "" CACHE STRING
222e5dd7070Spatrick    "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)" FORCE)
223e5dd7070Spatrickendif()
224e5dd7070Spatrick
225e5dd7070Spatrickset(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING
226e5dd7070Spatrick  "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)")
227e5dd7070Spatrickif (CLANG_DEFAULT_UNWINDLIB STREQUAL "")
228e5dd7070Spatrick  if (CLANG_DEFAULT_RTLIB STREQUAL "libgcc")
229e5dd7070Spatrick    set (CLANG_DEFAULT_UNWINDLIB "libgcc" CACHE STRING "" FORCE)
230e5dd7070Spatrick  endif()
231e5dd7070Spatrickendif()
232e5dd7070Spatrick
233e5dd7070Spatrickif (NOT(CLANG_DEFAULT_UNWINDLIB STREQUAL "" OR
234e5dd7070Spatrick        CLANG_DEFAULT_UNWINDLIB STREQUAL "none" OR
235e5dd7070Spatrick        CLANG_DEFAULT_UNWINDLIB STREQUAL "libgcc" OR
236e5dd7070Spatrick        CLANG_DEFAULT_UNWINDLIB STREQUAL "libunwind"))
237e5dd7070Spatrick  message(WARNING "Resetting default unwindlib to use platform default")
238e5dd7070Spatrick  set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING
239a9ac8606Spatrick    "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)" FORCE)
240e5dd7070Spatrickendif()
241e5dd7070Spatrick
242e5dd7070Spatrickset(CLANG_DEFAULT_OBJCOPY "objcopy" CACHE STRING
243e5dd7070Spatrick  "Default objcopy executable to use.")
244e5dd7070Spatrick
245e5dd7070Spatrickset(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING
246e5dd7070Spatrick  "Default OpenMP runtime used by -fopenmp.")
247e5dd7070Spatrick
248ec727ea7Spatrickset(CLANG_SYSTEMZ_DEFAULT_ARCH "z10" CACHE STRING "SystemZ Default Arch")
249ec727ea7Spatrick
250e5dd7070Spatrickset(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
251e5dd7070Spatrick  "Vendor-specific text for showing with version information.")
252e5dd7070Spatrick
253e5dd7070Spatrickset(CLANG_REPOSITORY_STRING "" CACHE STRING
254e5dd7070Spatrick  "Vendor-specific text for showing the repository the source is taken from.")
255e5dd7070Spatrick
256e5dd7070Spatrickif(CLANG_REPOSITORY_STRING)
257e5dd7070Spatrick  add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}")
258e5dd7070Spatrickendif()
259e5dd7070Spatrick
260e5dd7070Spatrickset(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING
261e5dd7070Spatrick  "Vendor-specific uti.")
262e5dd7070Spatrick
263e5dd7070Spatrickset(CLANG_PYTHON_BINDINGS_VERSIONS "" CACHE STRING
264e5dd7070Spatrick    "Python versions to install libclang python bindings for")
265e5dd7070Spatrick
266e5dd7070Spatrickset(CLANG_LINK_CLANG_DYLIB ${LLVM_LINK_LLVM_DYLIB} CACHE BOOL
267e5dd7070Spatrick    "Link tools against libclang-cpp.so")
268e5dd7070Spatrick
269e5dd7070Spatrickif (NOT LLVM_LINK_LLVM_DYLIB AND CLANG_LINK_CLANG_DYLIB)
270e5dd7070Spatrick  message(FATAL_ERROR "Cannot set CLANG_LINK_CLANG_DYLIB=ON when "
271e5dd7070Spatrick                      "LLVM_LINK_LLVM_DYLIB=OFF")
272e5dd7070Spatrickendif()
273e5dd7070Spatrick
274e5dd7070Spatrick# The libdir suffix must exactly match whatever LLVM's configuration used.
275e5dd7070Spatrickset(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")
276e5dd7070Spatrick
277*12c85518Srobertset(CLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
278*12c85518Srobert    "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
279*12c85518Srobertmark_as_advanced(CLANG_TOOLS_INSTALL_DIR)
280*12c85518Srobert
281e5dd7070Spatrickset(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
282e5dd7070Spatrickset(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
283e5dd7070Spatrick
284e5dd7070Spatrickif( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
285e5dd7070Spatrick  message(FATAL_ERROR "In-source builds are not allowed. "
286e5dd7070Spatrick"Please create a directory and run cmake "
287e5dd7070Spatrick"from there, passing the path to this source directory as the last argument. "
288e5dd7070Spatrick"This process created the file `CMakeCache.txt' and the directory "
289e5dd7070Spatrick"`CMakeFiles'. Please delete them.")
290e5dd7070Spatrickendif()
291e5dd7070Spatrick
292e5dd7070Spatrick# If CLANG_VERSION_* is specified, use it, if not use LLVM_VERSION_*.
293e5dd7070Spatrickif(NOT DEFINED CLANG_VERSION_MAJOR)
294e5dd7070Spatrick  set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
295e5dd7070Spatrickendif()
296e5dd7070Spatrickif(NOT DEFINED CLANG_VERSION_MINOR)
297e5dd7070Spatrick  set(CLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})
298e5dd7070Spatrickendif()
299e5dd7070Spatrickif(NOT DEFINED CLANG_VERSION_PATCHLEVEL)
300e5dd7070Spatrick  set(CLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
301e5dd7070Spatrickendif()
302e5dd7070Spatrick# Unlike PACKAGE_VERSION, CLANG_VERSION does not include LLVM_VERSION_SUFFIX.
303e5dd7070Spatrickset(CLANG_VERSION "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}.${CLANG_VERSION_PATCHLEVEL}")
304e5dd7070Spatrickmessage(STATUS "Clang version: ${CLANG_VERSION}")
305e5dd7070Spatrick
306e5dd7070Spatrick# Configure the Version.inc file.
307e5dd7070Spatrickconfigure_file(
308e5dd7070Spatrick  ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in
309e5dd7070Spatrick  ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc)
310e5dd7070Spatrick
311e5dd7070Spatrick# Add appropriate flags for GCC
312e5dd7070Spatrickif (LLVM_COMPILER_IS_GCC_COMPATIBLE)
313e5dd7070Spatrick  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual")
314e5dd7070Spatrick  if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
315e5dd7070Spatrick    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
316e5dd7070Spatrick  endif ()
317e5dd7070Spatrick
318e5dd7070Spatrick  # Enable -pedantic for Clang even if it's not enabled for LLVM.
319e5dd7070Spatrick  if (NOT LLVM_ENABLE_PEDANTIC)
320e5dd7070Spatrick    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long")
321e5dd7070Spatrick  endif ()
322e5dd7070Spatrick
323e5dd7070Spatrick  check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
324e5dd7070Spatrick  if( CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG )
325e5dd7070Spatrick    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" )
326e5dd7070Spatrick  endif()
327e5dd7070Spatrickendif ()
328e5dd7070Spatrick
329e5dd7070Spatrick# Determine HOST_LINK_VERSION on Darwin.
330e5dd7070Spatrickset(HOST_LINK_VERSION)
331*12c85518Srobertif (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*")
332e5dd7070Spatrick  set(LD_V_OUTPUT)
333e5dd7070Spatrick  execute_process(
334e5dd7070Spatrick    COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
335e5dd7070Spatrick    RESULT_VARIABLE HAD_ERROR
336e5dd7070Spatrick    OUTPUT_VARIABLE LD_V_OUTPUT
337e5dd7070Spatrick  )
338a9ac8606Spatrick  if (HAD_ERROR)
339a9ac8606Spatrick    message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
340a9ac8606Spatrick  endif()
341e5dd7070Spatrick  if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
342e5dd7070Spatrick    string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
343e5dd7070Spatrick  elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
344e5dd7070Spatrick    string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
345e5dd7070Spatrick  endif()
346a9ac8606Spatrick  message(STATUS "Host linker version: ${HOST_LINK_VERSION}")
347e5dd7070Spatrickendif()
348e5dd7070Spatrick
349e5dd7070Spatrickinclude(CMakeParseArguments)
350e5dd7070Spatrickinclude(AddClang)
351e5dd7070Spatrick
352e5dd7070Spatrickset(CMAKE_INCLUDE_CURRENT_DIR ON)
353e5dd7070Spatrick
354e5dd7070Spatrickinclude_directories(BEFORE
355e5dd7070Spatrick  ${CMAKE_CURRENT_BINARY_DIR}/include
356e5dd7070Spatrick  ${CMAKE_CURRENT_SOURCE_DIR}/include
357e5dd7070Spatrick  )
358e5dd7070Spatrick
359e5dd7070Spatrickif (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
360e5dd7070Spatrick  install(DIRECTORY include/clang include/clang-c
361*12c85518Srobert    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
362e5dd7070Spatrick    COMPONENT clang-headers
363e5dd7070Spatrick    FILES_MATCHING
364e5dd7070Spatrick    PATTERN "*.def"
365e5dd7070Spatrick    PATTERN "*.h"
366e5dd7070Spatrick    PATTERN "config.h" EXCLUDE
367e5dd7070Spatrick    )
368e5dd7070Spatrick
369e5dd7070Spatrick  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
370*12c85518Srobert    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
371e5dd7070Spatrick    COMPONENT clang-headers
372e5dd7070Spatrick    FILES_MATCHING
373e5dd7070Spatrick    PATTERN "CMakeFiles" EXCLUDE
374e5dd7070Spatrick    PATTERN "*.inc"
375e5dd7070Spatrick    PATTERN "*.h"
376e5dd7070Spatrick    )
377e5dd7070Spatrick
378e5dd7070Spatrick  # Installing the headers needs to depend on generating any public
379e5dd7070Spatrick  # tablegen'd headers.
380e5dd7070Spatrick  add_custom_target(clang-headers DEPENDS clang-tablegen-targets)
381e5dd7070Spatrick  set_target_properties(clang-headers PROPERTIES FOLDER "Misc")
382e5dd7070Spatrick  if(NOT LLVM_ENABLE_IDE)
383e5dd7070Spatrick    add_llvm_install_targets(install-clang-headers
384e5dd7070Spatrick                             DEPENDS clang-headers
385e5dd7070Spatrick                             COMPONENT clang-headers)
386e5dd7070Spatrick  endif()
387e5dd7070Spatrick
388e5dd7070Spatrick  add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh)
389*12c85518Srobert  install(FILES utils/bash-autocomplete.sh
390*12c85518Srobert          DESTINATION "${CMAKE_INSTALL_DATADIR}/clang"
391e5dd7070Spatrick          COMPONENT bash-autocomplete)
392e5dd7070Spatrick  if(NOT LLVM_ENABLE_IDE)
393e5dd7070Spatrick    add_llvm_install_targets(install-bash-autocomplete
394e5dd7070Spatrick                             DEPENDS bash-autocomplete
395e5dd7070Spatrick                             COMPONENT bash-autocomplete)
396e5dd7070Spatrick  endif()
397e5dd7070Spatrickendif()
398e5dd7070Spatrick
399e5dd7070Spatrickoption(CLANG_BUILD_TOOLS
400e5dd7070Spatrick  "Build the Clang tools. If OFF, just generate build targets." ON)
401e5dd7070Spatrick
402*12c85518Srobertif(LLVM_ENABLE_PLUGINS OR LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
403*12c85518Srobert  set(HAVE_CLANG_PLUGIN_SUPPORT ON)
404*12c85518Srobertelse()
405*12c85518Srobert  set(HAVE_CLANG_PLUGIN_SUPPORT OFF)
406*12c85518Srobertendif()
407*12c85518SrobertCMAKE_DEPENDENT_OPTION(CLANG_PLUGIN_SUPPORT
408*12c85518Srobert  "Build clang with plugin support" ON
409*12c85518Srobert  "HAVE_CLANG_PLUGIN_SUPPORT" OFF)
410*12c85518Srobert
411*12c85518Srobert# If libstdc++ is statically linked, clang-repl needs to statically link libstdc++
412*12c85518Srobert# itself, which is not possible in many platforms because of current limitations in
413*12c85518Srobert# JIT stack. (more platforms need to be supported by JITLink)
414*12c85518Srobertif(NOT LLVM_STATIC_LINK_CXX_STDLIB)
415*12c85518Srobert  set(HAVE_CLANG_REPL_SUPPORT ON)
416*12c85518Srobertendif()
417*12c85518Srobert
418e5dd7070Spatrickoption(CLANG_ENABLE_ARCMT "Build ARCMT." ON)
419a9ac8606Spatrickoption(CLANG_ENABLE_STATIC_ANALYZER
420a9ac8606Spatrick  "Include static analyzer in clang binary." ON)
421e5dd7070Spatrick
422e5dd7070Spatrickoption(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF)
423e5dd7070Spatrick
424e5dd7070Spatrickif(NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
425e5dd7070Spatrick  message(FATAL_ERROR "Cannot disable static analyzer while enabling ARCMT or Z3")
426e5dd7070Spatrickendif()
427e5dd7070Spatrick
428e5dd7070Spatrickif(CLANG_ENABLE_ARCMT)
429e5dd7070Spatrick  set(CLANG_ENABLE_OBJC_REWRITER ON)
430e5dd7070Spatrickendif()
431e5dd7070Spatrick
432*12c85518Srobert# This option is a stop-gap, we should commit to removing this as
433*12c85518Srobert# soon as possible. See discussion:
434*12c85518Srobert# https://discourse.llvm.org/t/rationale-for-removing-versioned-libclang-middle-ground-to-keep-it-behind-option/
435*12c85518Srobertoption(CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION
436*12c85518Srobert  "Force the SOVERSION of libclang to be equal to CLANG_MAJOR" ON)
437a9ac8606Spatrick
438e5dd7070Spatrick# Clang version information
439e5dd7070Spatrickset(CLANG_EXECUTABLE_VERSION
440e5dd7070Spatrick    "${CLANG_VERSION_MAJOR}" CACHE STRING
441e5dd7070Spatrick    "Major version number that will be appended to the clang executable name")
442e5dd7070Spatrickset(LIBCLANG_LIBRARY_VERSION
443a9ac8606Spatrick    "${CLANG_VERSION_MAJOR}" CACHE STRING
444e5dd7070Spatrick    "Major version number that will be appended to the libclang library")
445e5dd7070Spatrickmark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION)
446e5dd7070Spatrick
447e5dd7070Spatrickoption(CLANG_INCLUDE_TESTS
448e5dd7070Spatrick       "Generate build targets for the Clang unit tests."
449e5dd7070Spatrick       ${LLVM_INCLUDE_TESTS})
450e5dd7070Spatrick
451*12c85518Srobertoption(CLANG_ENABLE_HLSL "Include HLSL build products" Off)
452*12c85518Srobert# While HLSL support is experimental this should stay hidden.
453*12c85518Srobertmark_as_advanced(CLANG_ENABLE_HLSL)
454*12c85518Srobert
455e5dd7070Spatrickadd_subdirectory(utils/TableGen)
456e5dd7070Spatrick
457*12c85518Srobert# Export CLANG_TABLEGEN_EXE for use by flang docs.
458*12c85518Srobertset(CLANG_TABLEGEN_EXE "${CLANG_TABLEGEN_EXE}" CACHE INTERNAL "")
459*12c85518Srobert
460e5dd7070Spatrickadd_subdirectory(include)
461e5dd7070Spatrick
462e5dd7070Spatrick# All targets below may depend on all tablegen'd files.
463e5dd7070Spatrickget_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS)
464ec727ea7Spatrickadd_custom_target(clang-tablegen-targets
465ec727ea7Spatrick  DEPENDS
466ec727ea7Spatrick  omp_gen
467ec727ea7Spatrick  ${CLANG_TABLEGEN_TARGETS})
468e5dd7070Spatrickset_target_properties(clang-tablegen-targets PROPERTIES FOLDER "Misc")
469e5dd7070Spatricklist(APPEND LLVM_COMMON_DEPENDS clang-tablegen-targets)
470e5dd7070Spatrick
471e5dd7070Spatrick# Force target to be built as soon as possible. Clang modules builds depend
472e5dd7070Spatrick# header-wise on it as they ship all headers from the umbrella folders. Building
473e5dd7070Spatrick# an entire module might include header, which depends on intrinsics_gen.
474a9ac8606Spatrickif(LLVM_ENABLE_MODULES)
475e5dd7070Spatrick  list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen)
476e5dd7070Spatrickendif()
477e5dd7070Spatrick
478e5dd7070Spatrickadd_subdirectory(lib)
479e5dd7070Spatrickadd_subdirectory(tools)
480e5dd7070Spatrickadd_subdirectory(runtime)
481e5dd7070Spatrick
482e5dd7070Spatrickoption(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF)
483e5dd7070Spatrickadd_subdirectory(examples)
484e5dd7070Spatrick
485e5dd7070Spatrickif(APPLE)
486e5dd7070Spatrick  # this line is needed as a cleanup to ensure that any CMakeCaches with the old
487e5dd7070Spatrick  # default value get updated to the new default.
488e5dd7070Spatrick  if(CLANG_ORDER_FILE STREQUAL "")
489e5dd7070Spatrick    unset(CLANG_ORDER_FILE CACHE)
490e5dd7070Spatrick    unset(CLANG_ORDER_FILE)
491e5dd7070Spatrick  endif()
492e5dd7070Spatrick
493e5dd7070Spatrick
494e5dd7070Spatrick  set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH
495e5dd7070Spatrick    "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).")
496e5dd7070Spatrick
497e5dd7070Spatrick  if(NOT EXISTS ${CLANG_ORDER_FILE})
498e5dd7070Spatrick    string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)
499e5dd7070Spatrick    if(PATH_START EQUAL 0)
500e5dd7070Spatrick      file(WRITE ${CLANG_ORDER_FILE} "\n")
501e5dd7070Spatrick    else()
502e5dd7070Spatrick      message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does not exist.")
503e5dd7070Spatrick    endif()
504e5dd7070Spatrick  endif()
505e5dd7070Spatrickendif()
506e5dd7070Spatrick
507e5dd7070Spatrick
508e5dd7070Spatrickif( CLANG_INCLUDE_TESTS )
509*12c85518Srobert  if(EXISTS ${LLVM_THIRD_PARTY_DIR}/unittest/googletest/include/gtest/gtest.h)
510e5dd7070Spatrick    add_subdirectory(unittests)
511e5dd7070Spatrick    list(APPEND CLANG_TEST_DEPS ClangUnitTests)
512e5dd7070Spatrick    list(APPEND CLANG_TEST_PARAMS
513e5dd7070Spatrick      clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg
514e5dd7070Spatrick      )
515e5dd7070Spatrick  endif()
516e5dd7070Spatrick  add_subdirectory(test)
517e5dd7070Spatrick  add_subdirectory(bindings/python/tests)
518e5dd7070Spatrick
519e5dd7070Spatrick  if(CLANG_BUILT_STANDALONE)
520*12c85518Srobert    umbrella_lit_testsuite_end(check-all)
521e5dd7070Spatrick  endif()
522e5dd7070Spatrick  add_subdirectory(utils/perf-training)
523e5dd7070Spatrickendif()
524e5dd7070Spatrick
525e5dd7070Spatrickoption(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs."
526e5dd7070Spatrick  ${LLVM_INCLUDE_DOCS})
527e5dd7070Spatrickif( CLANG_INCLUDE_DOCS )
528e5dd7070Spatrick  add_subdirectory(docs)
529e5dd7070Spatrickendif()
530e5dd7070Spatrick
531e5dd7070Spatrick# Custom target to install all clang libraries.
532e5dd7070Spatrickadd_custom_target(clang-libraries)
533e5dd7070Spatrickset_target_properties(clang-libraries PROPERTIES FOLDER "Misc")
534e5dd7070Spatrick
535e5dd7070Spatrickif(NOT LLVM_ENABLE_IDE)
536e5dd7070Spatrick  add_llvm_install_targets(install-clang-libraries
537e5dd7070Spatrick                           DEPENDS clang-libraries
538e5dd7070Spatrick                           COMPONENT clang-libraries)
539e5dd7070Spatrickendif()
540e5dd7070Spatrick
541e5dd7070Spatrickget_property(CLANG_LIBS GLOBAL PROPERTY CLANG_LIBS)
542e5dd7070Spatrickif(CLANG_LIBS)
543e5dd7070Spatrick  list(REMOVE_DUPLICATES CLANG_LIBS)
544e5dd7070Spatrick  foreach(lib ${CLANG_LIBS})
545e5dd7070Spatrick    add_dependencies(clang-libraries ${lib})
546e5dd7070Spatrick    if(NOT LLVM_ENABLE_IDE)
547e5dd7070Spatrick      add_dependencies(install-clang-libraries install-${lib})
548ec727ea7Spatrick      add_dependencies(install-clang-libraries-stripped install-${lib}-stripped)
549e5dd7070Spatrick    endif()
550e5dd7070Spatrick  endforeach()
551e5dd7070Spatrickendif()
552e5dd7070Spatrick
553e5dd7070Spatrickadd_subdirectory(cmake/modules)
554e5dd7070Spatrick
555e5dd7070Spatrickif(CLANG_STAGE)
556e5dd7070Spatrick  message(STATUS "Setting current clang stage to: ${CLANG_STAGE}")
557e5dd7070Spatrickendif()
558e5dd7070Spatrick
559e5dd7070Spatrickif (CLANG_ENABLE_BOOTSTRAP)
560e5dd7070Spatrick  include(ExternalProject)
561e5dd7070Spatrick
562e5dd7070Spatrick  add_custom_target(clang-bootstrap-deps DEPENDS clang)
563e5dd7070Spatrick
564e5dd7070Spatrick  if(NOT CLANG_STAGE)
565e5dd7070Spatrick    set(CLANG_STAGE stage1)
566e5dd7070Spatrick  endif()
567e5dd7070Spatrick
568e5dd7070Spatrick  string(REGEX MATCH "stage([0-9]*)" MATCHED_STAGE "${CLANG_STAGE}")
569e5dd7070Spatrick  if(MATCHED_STAGE)
570e5dd7070Spatrick    if(NOT LLVM_BUILD_INSTRUMENTED)
571e5dd7070Spatrick      math(EXPR STAGE_NUM "${CMAKE_MATCH_1} + 1")
572e5dd7070Spatrick      set(NEXT_CLANG_STAGE stage${STAGE_NUM})
573e5dd7070Spatrick    else()
574e5dd7070Spatrick      set(NEXT_CLANG_STAGE stage${CMAKE_MATCH_1})
575e5dd7070Spatrick    endif()
576e5dd7070Spatrick  else()
577e5dd7070Spatrick    set(NEXT_CLANG_STAGE bootstrap)
578e5dd7070Spatrick  endif()
579e5dd7070Spatrick
580e5dd7070Spatrick  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
581e5dd7070Spatrick    set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented)
582e5dd7070Spatrick  endif()
583e5dd7070Spatrick  message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}")
584e5dd7070Spatrick
585e5dd7070Spatrick
586e5dd7070Spatrick  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/)
587e5dd7070Spatrick  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-bins/)
588e5dd7070Spatrick
589e5dd7070Spatrick  if(BOOTSTRAP_LLVM_ENABLE_LLD)
590a9ac8606Spatrick    # adding lld to clang-bootstrap-deps without having it enabled in
591a9ac8606Spatrick    # LLVM_ENABLE_PROJECTS just generates a cryptic error message.
592a9ac8606Spatrick    if (NOT "lld" IN_LIST LLVM_ENABLE_PROJECTS)
593*12c85518Srobert      message(FATAL_ERROR "LLD is enabled in the bootstrap build, but lld is not in LLVM_ENABLE_PROJECTS")
594a9ac8606Spatrick    endif()
595e5dd7070Spatrick    add_dependencies(clang-bootstrap-deps lld)
596e5dd7070Spatrick  endif()
597e5dd7070Spatrick
598e5dd7070Spatrick  # If the next stage is LTO we need to depend on LTO and possibly lld or LLVMgold
599e5dd7070Spatrick  if(BOOTSTRAP_LLVM_ENABLE_LTO OR LLVM_ENABLE_LTO AND NOT LLVM_BUILD_INSTRUMENTED)
600e5dd7070Spatrick    if(APPLE)
601e5dd7070Spatrick      add_dependencies(clang-bootstrap-deps LTO)
602e5dd7070Spatrick      # on Darwin we need to set DARWIN_LTO_LIBRARY so that -flto will work
603e5dd7070Spatrick      # using the just-built compiler, and we need to override DYLD_LIBRARY_PATH
604e5dd7070Spatrick      # so that the host object file tools will use the just-built libLTO.
605e5dd7070Spatrick      # However if System Integrity Protection is enabled the DYLD variables
606e5dd7070Spatrick      # will be scrubbed from the environment of any base system commands. This
607e5dd7070Spatrick      # includes /bin/sh, which ninja uses when executing build commands. To
608e5dd7070Spatrick      # work around the envar being filtered away we pass it in as a CMake
609e5dd7070Spatrick      # variable, and have LLVM's CMake append the envar to the archiver calls.
610e5dd7070Spatrick      set(LTO_LIBRARY -DDARWIN_LTO_LIBRARY=${LLVM_SHLIB_OUTPUT_INTDIR}/libLTO.dylib
611e5dd7070Spatrick        -DDYLD_LIBRARY_PATH=${LLVM_LIBRARY_OUTPUT_INTDIR})
612e5dd7070Spatrick    elseif(NOT WIN32)
613e5dd7070Spatrick      add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)
614e5dd7070Spatrick      if(NOT BOOTSTRAP_LLVM_ENABLE_LLD AND LLVM_BINUTILS_INCDIR)
615e5dd7070Spatrick        add_dependencies(clang-bootstrap-deps LLVMgold)
616e5dd7070Spatrick      endif()
617e5dd7070Spatrick      set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)
618e5dd7070Spatrick      set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)
619e5dd7070Spatrick    endif()
620e5dd7070Spatrick  endif()
621e5dd7070Spatrick
622e5dd7070Spatrick  if(CLANG_BOOTSTRAP_EXTRA_DEPS)
623e5dd7070Spatrick    add_dependencies(clang-bootstrap-deps ${CLANG_BOOTSTRAP_EXTRA_DEPS})
624e5dd7070Spatrick  endif()
625e5dd7070Spatrick
626e5dd7070Spatrick  add_custom_target(${NEXT_CLANG_STAGE}-clear
627e5dd7070Spatrick    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
628e5dd7070Spatrick    )
629e5dd7070Spatrick  add_custom_command(
630e5dd7070Spatrick    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
631e5dd7070Spatrick    DEPENDS clang-bootstrap-deps
632e5dd7070Spatrick    COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
633e5dd7070Spatrick    COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR}
634e5dd7070Spatrick    COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
635e5dd7070Spatrick    COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR}
636e5dd7070Spatrick    COMMENT "Clobberring ${NEXT_CLANG_STAGE} build and stamp directories"
637e5dd7070Spatrick    )
638e5dd7070Spatrick
639e5dd7070Spatrick  if(CMAKE_VERBOSE_MAKEFILE)
640e5dd7070Spatrick    set(verbose -DCMAKE_VERBOSE_MAKEFILE=On)
641e5dd7070Spatrick  endif()
642e5dd7070Spatrick
643e5dd7070Spatrick  set(_BOOTSTRAP_DEFAULT_PASSTHROUGH
644e5dd7070Spatrick    PACKAGE_VERSION
645e5dd7070Spatrick    PACKAGE_VENDOR
646e5dd7070Spatrick    LLVM_VERSION_MAJOR
647e5dd7070Spatrick    LLVM_VERSION_MINOR
648e5dd7070Spatrick    LLVM_VERSION_PATCH
649e5dd7070Spatrick    CLANG_VERSION_MAJOR
650e5dd7070Spatrick    CLANG_VERSION_MINOR
651e5dd7070Spatrick    CLANG_VERSION_PATCHLEVEL
652ec727ea7Spatrick    CLANG_VENDOR
653e5dd7070Spatrick    LLVM_VERSION_SUFFIX
654e5dd7070Spatrick    LLVM_BINUTILS_INCDIR
655e5dd7070Spatrick    CLANG_REPOSITORY_STRING
656e5dd7070Spatrick    CMAKE_C_COMPILER_LAUNCHER
657e5dd7070Spatrick    CMAKE_CXX_COMPILER_LAUNCHER
658e5dd7070Spatrick    CMAKE_MAKE_PROGRAM
659e5dd7070Spatrick    CMAKE_OSX_ARCHITECTURES
660*12c85518Srobert    CMAKE_BUILD_TYPE
661e5dd7070Spatrick    LLVM_ENABLE_PROJECTS
662e5dd7070Spatrick    LLVM_ENABLE_RUNTIMES)
663e5dd7070Spatrick
664e5dd7070Spatrick  # We don't need to depend on compiler-rt/libcxx if we're building instrumented
665e5dd7070Spatrick  # because the next stage will use the same compiler used to build this stage.
666e5dd7070Spatrick  if(NOT LLVM_BUILD_INSTRUMENTED)
667e5dd7070Spatrick    if(TARGET compiler-rt)
668e5dd7070Spatrick      add_dependencies(clang-bootstrap-deps compiler-rt)
669e5dd7070Spatrick    endif()
670e5dd7070Spatrick    if(TARGET cxx-headers)
671e5dd7070Spatrick      add_dependencies(clang-bootstrap-deps cxx-headers)
672e5dd7070Spatrick    endif()
673e5dd7070Spatrick  endif()
674e5dd7070Spatrick
675e5dd7070Spatrick  set(C_COMPILER "clang")
676e5dd7070Spatrick  set(CXX_COMPILER "clang++")
677e5dd7070Spatrick  if(WIN32)
678e5dd7070Spatrick    set(C_COMPILER "clang-cl.exe")
679e5dd7070Spatrick    set(CXX_COMPILER "clang-cl.exe")
680e5dd7070Spatrick  endif()
681e5dd7070Spatrick
682e5dd7070Spatrick  set(COMPILER_OPTIONS
683e5dd7070Spatrick    -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER}
684e5dd7070Spatrick    -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}
685e5dd7070Spatrick    -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}
686e5dd7070Spatrick    -DCMAKE_ASM_COMPILER_ID=Clang)
687e5dd7070Spatrick
688a9ac8606Spatrick  # cmake requires CMAKE_LINKER to be specified if the compiler is MSVC-like,
689a9ac8606Spatrick  # otherwise it defaults the linker to be link.exe.
690a9ac8606Spatrick  if(BOOTSTRAP_LLVM_ENABLE_LLD)
691a9ac8606Spatrick    if((WIN32 AND NOT BOOTSTRAP_CMAKE_SYSTEM_NAME) OR BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Windows")
692a9ac8606Spatrick      set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
693a9ac8606Spatrick    endif()
694a9ac8606Spatrick  endif()
695a9ac8606Spatrick
696e5dd7070Spatrick  if(BOOTSTRAP_CMAKE_SYSTEM_NAME)
697e5dd7070Spatrick    set(${CLANG_STAGE}_TABLEGEN
698e5dd7070Spatrick      -DLLVM_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-tblgen
699e5dd7070Spatrick      -DCLANG_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-tblgen)
700e5dd7070Spatrick    if(BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Linux")
701e5dd7070Spatrick      if(BOOTSTRAP_LLVM_ENABLE_LLD)
702e5dd7070Spatrick        set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld)
703e5dd7070Spatrick      endif()
704e5dd7070Spatrick      if(NOT BOOTSTRAP_LLVM_ENABLE_LTO)
705e5dd7070Spatrick        add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)
706e5dd7070Spatrick        set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)
707e5dd7070Spatrick        set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)
708e5dd7070Spatrick      endif()
709e5dd7070Spatrick      add_dependencies(clang-bootstrap-deps llvm-objcopy llvm-strip)
710e5dd7070Spatrick      set(${CLANG_STAGE}_OBJCOPY -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy)
711e5dd7070Spatrick      set(${CLANG_STAGE}_STRIP -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip)
712*12c85518Srobert      set(${CLANG_STAGE}_READELF -DCMAKE_READELF=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-readelf)
713e5dd7070Spatrick    endif()
714e5dd7070Spatrick  endif()
715e5dd7070Spatrick
716e5dd7070Spatrick  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
717e5dd7070Spatrick    add_dependencies(clang-bootstrap-deps llvm-profdata)
718e5dd7070Spatrick    set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata)
719e5dd7070Spatrick  endif()
720e5dd7070Spatrick
721e5dd7070Spatrick  if(LLVM_BUILD_INSTRUMENTED)
722e5dd7070Spatrick    add_dependencies(clang-bootstrap-deps generate-profdata)
723e5dd7070Spatrick    set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata)
724e5dd7070Spatrick    # Use the current tools for LTO instead of the instrumented ones
725e5dd7070Spatrick    list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH
726e5dd7070Spatrick      CMAKE_CXX_COMPILER
727e5dd7070Spatrick      CMAKE_C_COMPILER
728e5dd7070Spatrick      CMAKE_ASM_COMPILER
729e5dd7070Spatrick      CMAKE_AR
730e5dd7070Spatrick      CMAKE_RANLIB
731e5dd7070Spatrick      DARWIN_LTO_LIBRARY
732e5dd7070Spatrick      DYLD_LIBRARY_PATH)
733e5dd7070Spatrick
734e5dd7070Spatrick    set(COMPILER_OPTIONS)
735e5dd7070Spatrick    set(LTO_LIBRARY)
736e5dd7070Spatrick    set(LTO_AR)
737e5dd7070Spatrick    set(LTO_RANLIB)
738e5dd7070Spatrick  endif()
739e5dd7070Spatrick
740*12c85518Srobert  # Populate the passthrough variables
741*12c85518Srobert  foreach(variableName ${CLANG_BOOTSTRAP_PASSTHROUGH} ${_BOOTSTRAP_DEFAULT_PASSTHROUGH})
742*12c85518Srobert    if(DEFINED ${variableName})
743*12c85518Srobert      if("${${variableName}}" STREQUAL "")
744*12c85518Srobert        set(value "")
745*12c85518Srobert      else()
746*12c85518Srobert        string(REPLACE ";" "|" value "${${variableName}}")
747*12c85518Srobert      endif()
748*12c85518Srobert      list(APPEND PASSTHROUGH_VARIABLES
749*12c85518Srobert        -D${variableName}=${value})
750*12c85518Srobert    endif()
751*12c85518Srobert  endforeach()
752*12c85518Srobert
753e5dd7070Spatrick  # Find all variables that start with BOOTSTRAP_ and populate a variable with
754e5dd7070Spatrick  # them.
755e5dd7070Spatrick  get_cmake_property(variableNames VARIABLES)
756e5dd7070Spatrick  foreach(variableName ${variableNames})
757e5dd7070Spatrick    if(variableName MATCHES "^BOOTSTRAP_")
758e5dd7070Spatrick      string(SUBSTRING ${variableName} 10 -1 varName)
759e5dd7070Spatrick      string(REPLACE ";" "|" value "${${variableName}}")
760e5dd7070Spatrick      list(APPEND PASSTHROUGH_VARIABLES
761e5dd7070Spatrick        -D${varName}=${value})
762e5dd7070Spatrick    endif()
763e5dd7070Spatrick    if(${variableName} AND variableName MATCHES "LLVM_EXTERNAL_.*_SOURCE_DIR")
764e5dd7070Spatrick      list(APPEND PASSTHROUGH_VARIABLES
765e5dd7070Spatrick        -D${variableName}=${${variableName}})
766e5dd7070Spatrick    endif()
767e5dd7070Spatrick  endforeach()
768e5dd7070Spatrick
769*12c85518Srobert  # Build arguments for native tool used in CMake.
770*12c85518Srobert  set(build_configuration "$<CONFIG>")
771*12c85518Srobert  set(build_tool_args "${LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS}")
772*12c85518Srobert  if(NOT build_tool_args STREQUAL "")
773*12c85518Srobert    string(PREPEND build_tool_args "-- ")
774*12c85518Srobert    separate_arguments(build_tool_args UNIX_COMMAND "${build_tool_args}")
775e5dd7070Spatrick  endif()
776e5dd7070Spatrick
777e5dd7070Spatrick  ExternalProject_Add(${NEXT_CLANG_STAGE}
778e5dd7070Spatrick    DEPENDS clang-bootstrap-deps
779e5dd7070Spatrick    PREFIX ${NEXT_CLANG_STAGE}
780e5dd7070Spatrick    SOURCE_DIR ${CMAKE_SOURCE_DIR}
781e5dd7070Spatrick    STAMP_DIR ${STAMP_DIR}
782e5dd7070Spatrick    BINARY_DIR ${BINARY_DIR}
783e5dd7070Spatrick    EXCLUDE_FROM_ALL 1
784e5dd7070Spatrick    CMAKE_ARGS
785e5dd7070Spatrick                # We shouldn't need to set this here, but INSTALL_DIR doesn't
786e5dd7070Spatrick                # seem to work, so instead I'm passing this through
787e5dd7070Spatrick                -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
788e5dd7070Spatrick                ${PASSTHROUGH_VARIABLES}
789e5dd7070Spatrick                ${CLANG_BOOTSTRAP_CMAKE_ARGS}
790e5dd7070Spatrick                 -DCLANG_STAGE=${NEXT_CLANG_STAGE}
791e5dd7070Spatrick                ${COMPILER_OPTIONS}
792e5dd7070Spatrick                ${${CLANG_STAGE}_TABLEGEN}
793e5dd7070Spatrick                ${LTO_LIBRARY} ${verbose} ${PGO_OPT}
794e5dd7070Spatrick                ${${CLANG_STAGE}_LINKER}
795e5dd7070Spatrick                ${${CLANG_STAGE}_AR}
796e5dd7070Spatrick                ${${CLANG_STAGE}_RANLIB}
797e5dd7070Spatrick                ${${CLANG_STAGE}_OBJCOPY}
798e5dd7070Spatrick                ${${CLANG_STAGE}_STRIP}
799*12c85518Srobert    BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR}
800*12c85518Srobert                                   --config ${build_configuration}
801*12c85518Srobert                                   ${build_tool_args}
802e5dd7070Spatrick    INSTALL_COMMAND ""
803e5dd7070Spatrick    STEP_TARGETS configure build
804e5dd7070Spatrick    USES_TERMINAL_CONFIGURE 1
805e5dd7070Spatrick    USES_TERMINAL_BUILD 1
806e5dd7070Spatrick    USES_TERMINAL_INSTALL 1
807e5dd7070Spatrick    LIST_SEPARATOR |
808e5dd7070Spatrick    )
809e5dd7070Spatrick
810e5dd7070Spatrick  # exclude really-install from main target
811e5dd7070Spatrick  set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On)
812e5dd7070Spatrick  ExternalProject_Add_Step(${NEXT_CLANG_STAGE} really-install
813e5dd7070Spatrick    COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install
814e5dd7070Spatrick    COMMENT "Performing install step for '${NEXT_CLANG_STAGE}'"
815e5dd7070Spatrick    DEPENDEES build
816e5dd7070Spatrick    USES_TERMINAL 1
817e5dd7070Spatrick  )
818e5dd7070Spatrick  ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} really-install)
819e5dd7070Spatrick  add_custom_target(${NEXT_CLANG_STAGE}-install DEPENDS ${NEXT_CLANG_STAGE}-really-install)
820e5dd7070Spatrick
821e5dd7070Spatrick  if(NOT CLANG_BOOTSTRAP_TARGETS)
822e5dd7070Spatrick    set(CLANG_BOOTSTRAP_TARGETS check-llvm check-clang check-all)
823e5dd7070Spatrick  endif()
824e5dd7070Spatrick  foreach(target ${CLANG_BOOTSTRAP_TARGETS})
825a9ac8606Spatrick    # Install targets have side effects, so we always want to execute them.
826a9ac8606Spatrick    # "install" is reserved by CMake and can't be used as a step name for
827a9ac8606Spatrick    # ExternalProject_Add_Step, so we can match against "^install-" instead of
828a9ac8606Spatrick    # "^install" to get a tighter match. CMake's installation scripts already
829a9ac8606Spatrick    # skip up-to-date files, so there's no behavior change if you install to the
830a9ac8606Spatrick    # same destination multiple times.
831a9ac8606Spatrick    if(target MATCHES "^install-")
832a9ac8606Spatrick      set(step_always ON)
833a9ac8606Spatrick    else()
834a9ac8606Spatrick      set(step_always OFF)
835a9ac8606Spatrick    endif()
836e5dd7070Spatrick
837e5dd7070Spatrick    ExternalProject_Add_Step(${NEXT_CLANG_STAGE} ${target}
838e5dd7070Spatrick      COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target ${target}
839e5dd7070Spatrick      COMMENT "Performing ${target} for '${NEXT_CLANG_STAGE}'"
840e5dd7070Spatrick      DEPENDEES configure
841a9ac8606Spatrick      ALWAYS ${step_always}
842a9ac8606Spatrick      EXCLUDE_FROM_MAIN ON
843e5dd7070Spatrick      USES_TERMINAL 1
844e5dd7070Spatrick    )
845e5dd7070Spatrick
846e5dd7070Spatrick    if(target MATCHES "^stage[0-9]*")
847e5dd7070Spatrick      add_custom_target(${target} DEPENDS ${NEXT_CLANG_STAGE}-${target})
848e5dd7070Spatrick    endif()
849e5dd7070Spatrick
850e5dd7070Spatrick    ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} ${target})
851e5dd7070Spatrick  endforeach()
852e5dd7070Spatrickendif()
853e5dd7070Spatrick
854*12c85518Srobertif (CLANG_BOLT_INSTRUMENT AND NOT LLVM_BUILD_INSTRUMENTED)
855*12c85518Srobert  set(CLANG_PATH ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
856*12c85518Srobert  set(CLANGXX_PATH ${CLANG_PATH}++)
857*12c85518Srobert  set(CLANG_INSTRUMENTED ${CLANG_PATH}-bolt.inst)
858*12c85518Srobert  set(CLANGXX_INSTRUMENTED ${CLANGXX_PATH}-bolt.inst)
859*12c85518Srobert  set(CLANG_OPTIMIZED ${CLANG_PATH}-bolt)
860*12c85518Srobert  set(CLANGXX_OPTIMIZED ${CLANGXX_PATH}-bolt)
861*12c85518Srobert
862*12c85518Srobert  # Instrument clang with BOLT
863*12c85518Srobert  add_custom_target(clang-instrumented
864*12c85518Srobert    DEPENDS ${CLANG_INSTRUMENTED}
865*12c85518Srobert  )
866*12c85518Srobert  add_custom_command(OUTPUT ${CLANG_INSTRUMENTED}
867*12c85518Srobert    DEPENDS clang llvm-bolt
868*12c85518Srobert    COMMAND llvm-bolt ${CLANG_PATH} -o ${CLANG_INSTRUMENTED}
869*12c85518Srobert      -instrument --instrumentation-file-append-pid
870*12c85518Srobert      --instrumentation-file=${CMAKE_CURRENT_BINARY_DIR}/prof.fdata
871*12c85518Srobert    COMMENT "Instrumenting clang binary with BOLT"
872*12c85518Srobert    VERBATIM
873*12c85518Srobert  )
874*12c85518Srobert
875*12c85518Srobert  # Make a symlink from clang-bolt.inst to clang++-bolt.inst
876*12c85518Srobert  add_custom_target(clang++-instrumented
877*12c85518Srobert    DEPENDS ${CLANGXX_INSTRUMENTED}
878*12c85518Srobert  )
879*12c85518Srobert  add_custom_command(OUTPUT ${CLANGXX_INSTRUMENTED}
880*12c85518Srobert    DEPENDS clang-instrumented
881*12c85518Srobert    COMMAND ${CMAKE_COMMAND} -E create_symlink
882*12c85518Srobert      ${CLANG_INSTRUMENTED}
883*12c85518Srobert      ${CLANGXX_INSTRUMENTED}
884*12c85518Srobert    COMMENT "Creating symlink from BOLT instrumented clang to clang++"
885*12c85518Srobert    VERBATIM
886*12c85518Srobert  )
887*12c85518Srobert
888*12c85518Srobert  # Build specified targets with instrumented Clang to collect the profile
889*12c85518Srobert  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt-instrumented-clang-stamps/)
890*12c85518Srobert  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bolt-instrumented-clang-bins/)
891*12c85518Srobert  set(build_configuration "$<CONFIG>")
892*12c85518Srobert  include(ExternalProject)
893*12c85518Srobert  ExternalProject_Add(bolt-instrumentation-profile
894*12c85518Srobert    DEPENDS clang++-instrumented
895*12c85518Srobert    PREFIX bolt-instrumentation-profile
896*12c85518Srobert    SOURCE_DIR ${CMAKE_SOURCE_DIR}
897*12c85518Srobert    STAMP_DIR ${STAMP_DIR}
898*12c85518Srobert    BINARY_DIR ${BINARY_DIR}
899*12c85518Srobert    EXCLUDE_FROM_ALL 1
900*12c85518Srobert    CMAKE_ARGS
901*12c85518Srobert                ${CLANG_BOLT_INSTRUMENT_EXTRA_CMAKE_FLAGS}
902*12c85518Srobert                # We shouldn't need to set this here, but INSTALL_DIR doesn't
903*12c85518Srobert                # seem to work, so instead I'm passing this through
904*12c85518Srobert                -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
905*12c85518Srobert                -DCMAKE_C_COMPILER=${CLANG_INSTRUMENTED}
906*12c85518Srobert                -DCMAKE_CXX_COMPILER=${CLANGXX_INSTRUMENTED}
907*12c85518Srobert                -DCMAKE_ASM_COMPILER=${CLANG_INSTRUMENTED}
908*12c85518Srobert                -DCMAKE_ASM_COMPILER_ID=Clang
909*12c85518Srobert                -DCMAKE_BUILD_TYPE=Release
910*12c85518Srobert                -DLLVM_ENABLE_PROJECTS=${CLANG_BOLT_INSTRUMENT_PROJECTS}
911*12c85518Srobert                -DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD}
912*12c85518Srobert    BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR}
913*12c85518Srobert                                   --config ${build_configuration}
914*12c85518Srobert                                   --target ${CLANG_BOLT_INSTRUMENT_TARGETS}
915*12c85518Srobert    INSTALL_COMMAND ""
916*12c85518Srobert    STEP_TARGETS configure build
917*12c85518Srobert    USES_TERMINAL_CONFIGURE 1
918*12c85518Srobert    USES_TERMINAL_BUILD 1
919*12c85518Srobert    USES_TERMINAL_INSTALL 1
920*12c85518Srobert  )
921*12c85518Srobert
922*12c85518Srobert  # Merge profiles into one using merge-fdata
923*12c85518Srobert  add_custom_target(clang-bolt-profile
924*12c85518Srobert    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata
925*12c85518Srobert  )
926*12c85518Srobert  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata
927*12c85518Srobert    DEPENDS merge-fdata bolt-instrumentation-profile-build
928*12c85518Srobert    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
929*12c85518Srobert    COMMAND ${Python3_EXECUTABLE}
930*12c85518Srobert      ${CMAKE_CURRENT_SOURCE_DIR}/utils/perf-training/perf-helper.py merge-fdata
931*12c85518Srobert      $<TARGET_FILE:merge-fdata> ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata
932*12c85518Srobert      ${CMAKE_CURRENT_BINARY_DIR}
933*12c85518Srobert    COMMENT "Preparing BOLT profile"
934*12c85518Srobert    VERBATIM
935*12c85518Srobert  )
936*12c85518Srobert
937*12c85518Srobert  # Optimize original (pre-bolt) Clang using the collected profile
938*12c85518Srobert  add_custom_target(clang-bolt
939*12c85518Srobert    DEPENDS ${CLANG_OPTIMIZED}
940*12c85518Srobert  )
941*12c85518Srobert  add_custom_command(OUTPUT ${CLANG_OPTIMIZED}
942*12c85518Srobert    DEPENDS clang-bolt-profile
943*12c85518Srobert    COMMAND llvm-bolt ${CLANG_PATH}
944*12c85518Srobert      -o ${CLANG_OPTIMIZED}
945*12c85518Srobert      -data ${CMAKE_CURRENT_BINARY_DIR}/prof.fdata
946*12c85518Srobert      -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions
947*12c85518Srobert      -split-all-cold -split-eh -dyno-stats -icf=1 -use-gnu-stack
948*12c85518Srobert    COMMENT "Optimizing Clang with BOLT"
949*12c85518Srobert    VERBATIM
950*12c85518Srobert  )
951*12c85518Srobert
952*12c85518Srobert  # Make a symlink from clang-bolt to clang++-bolt
953*12c85518Srobert  add_custom_target(clang++-bolt
954*12c85518Srobert    DEPENDS ${CLANGXX_OPTIMIZED}
955*12c85518Srobert  )
956*12c85518Srobert  add_custom_command(OUTPUT ${CLANGXX_OPTIMIZED}
957*12c85518Srobert    DEPENDS clang-bolt
958*12c85518Srobert    COMMAND ${CMAKE_COMMAND} -E create_symlink
959*12c85518Srobert      ${CLANG_OPTIMIZED}
960*12c85518Srobert      ${CLANGXX_OPTIMIZED}
961*12c85518Srobert    COMMENT "Creating symlink from BOLT optimized clang to clang++"
962*12c85518Srobert    VERBATIM
963*12c85518Srobert  )
964*12c85518Srobertendif()
965*12c85518Srobert
966e5dd7070Spatrickif (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
967e5dd7070Spatrick  add_subdirectory(utils/ClangVisualizers)
968e5dd7070Spatrickendif()
969e5dd7070Spatrickadd_subdirectory(utils/hmaptool)
970e5dd7070Spatrick
971e5dd7070Spatrickif(CLANG_BUILT_STANDALONE)
972e5dd7070Spatrick  llvm_distribution_add_targets()
973389bb291Spatrick  process_llvm_pass_plugins()
974e5dd7070Spatrickendif()
975e5dd7070Spatrick
976*12c85518Srobertset(CLANG_INSTALL_LIBDIR_BASENAME "lib${CLANG_LIBDIR_SUFFIX}")
977*12c85518Srobert
978e5dd7070Spatrickconfigure_file(
979e5dd7070Spatrick  ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake
980e5dd7070Spatrick  ${CLANG_BINARY_DIR}/include/clang/Config/config.h)
981