xref: /aosp_15_r20/external/clang/CMakeLists.txt (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Licmake_minimum_required(VERSION 3.4.3)
2*67e74705SXin Li
3*67e74705SXin Li# If we are not building as a part of LLVM, build Clang as an
4*67e74705SXin Li# standalone project, using LLVM as an external library:
5*67e74705SXin Liif( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
6*67e74705SXin Li  project(Clang)
7*67e74705SXin Li
8*67e74705SXin Li  # Rely on llvm-config.
9*67e74705SXin Li  set(CONFIG_OUTPUT)
10*67e74705SXin Li  find_program(LLVM_CONFIG "llvm-config")
11*67e74705SXin Li  if(LLVM_CONFIG)
12*67e74705SXin Li    message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
13*67e74705SXin Li    set(CONFIG_COMMAND ${LLVM_CONFIG}
14*67e74705SXin Li      "--assertion-mode"
15*67e74705SXin Li      "--bindir"
16*67e74705SXin Li      "--libdir"
17*67e74705SXin Li      "--includedir"
18*67e74705SXin Li      "--prefix"
19*67e74705SXin Li      "--src-root")
20*67e74705SXin Li    execute_process(
21*67e74705SXin Li      COMMAND ${CONFIG_COMMAND}
22*67e74705SXin Li      RESULT_VARIABLE HAD_ERROR
23*67e74705SXin Li      OUTPUT_VARIABLE CONFIG_OUTPUT
24*67e74705SXin Li    )
25*67e74705SXin Li    if(NOT HAD_ERROR)
26*67e74705SXin Li      string(REGEX REPLACE
27*67e74705SXin Li        "[ \t]*[\r\n]+[ \t]*" ";"
28*67e74705SXin Li        CONFIG_OUTPUT ${CONFIG_OUTPUT})
29*67e74705SXin Li    else()
30*67e74705SXin Li      string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
31*67e74705SXin Li      message(STATUS "${CONFIG_COMMAND_STR}")
32*67e74705SXin Li      message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
33*67e74705SXin Li    endif()
34*67e74705SXin Li  else()
35*67e74705SXin Li    message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}")
36*67e74705SXin Li  endif()
37*67e74705SXin Li
38*67e74705SXin Li  list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS)
39*67e74705SXin Li  list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
40*67e74705SXin Li  list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
41*67e74705SXin Li  list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
42*67e74705SXin Li  list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
43*67e74705SXin Li  list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR)
44*67e74705SXin Li
45*67e74705SXin Li  if(NOT MSVC_IDE)
46*67e74705SXin Li    set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
47*67e74705SXin Li      CACHE BOOL "Enable assertions")
48*67e74705SXin Li    # Assertions should follow llvm-config's.
49*67e74705SXin Li    mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
50*67e74705SXin Li  endif()
51*67e74705SXin Li
52*67e74705SXin Li  set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")
53*67e74705SXin Li  set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")
54*67e74705SXin Li  set(LLVM_MAIN_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
55*67e74705SXin Li  set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
56*67e74705SXin Li  set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
57*67e74705SXin Li
58*67e74705SXin Li  find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
59*67e74705SXin Li    NO_DEFAULT_PATH)
60*67e74705SXin Li
61*67e74705SXin Li  set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
62*67e74705SXin Li  set(LLVMCONFIG_FILE "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
63*67e74705SXin Li  if(EXISTS ${LLVMCONFIG_FILE})
64*67e74705SXin Li    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
65*67e74705SXin Li    include(${LLVMCONFIG_FILE})
66*67e74705SXin Li  else()
67*67e74705SXin Li    message(FATAL_ERROR "Not found: ${LLVMCONFIG_FILE}")
68*67e74705SXin Li  endif()
69*67e74705SXin Li
70*67e74705SXin Li  # They are used as destination of target generators.
71*67e74705SXin Li  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
72*67e74705SXin Li  set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
73*67e74705SXin Li  if(WIN32 OR CYGWIN)
74*67e74705SXin Li    # DLL platform -- put DLLs into bin.
75*67e74705SXin Li    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
76*67e74705SXin Li  else()
77*67e74705SXin Li    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
78*67e74705SXin Li  endif()
79*67e74705SXin Li
80*67e74705SXin Li  option(LLVM_INSTALL_TOOLCHAIN_ONLY
81*67e74705SXin Li    "Only include toolchain files in the 'install' target." OFF)
82*67e74705SXin Li
83*67e74705SXin Li  option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
84*67e74705SXin Li    "Set to ON to force using an old, unsupported host toolchain." OFF)
85*67e74705SXin Li  option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
86*67e74705SXin Li
87*67e74705SXin Li  include(AddLLVM)
88*67e74705SXin Li  include(TableGen)
89*67e74705SXin Li  include(HandleLLVMOptions)
90*67e74705SXin Li  include(VersionFromVCS)
91*67e74705SXin Li
92*67e74705SXin Li  set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
93*67e74705SXin Li
94*67e74705SXin Li  if (NOT DEFINED LLVM_INCLUDE_TESTS)
95*67e74705SXin Li    set(LLVM_INCLUDE_TESTS ON)
96*67e74705SXin Li  endif()
97*67e74705SXin Li
98*67e74705SXin Li  include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}")
99*67e74705SXin Li  link_directories("${LLVM_LIBRARY_DIR}")
100*67e74705SXin Li
101*67e74705SXin Li  set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
102*67e74705SXin Li  set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
103*67e74705SXin Li  set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
104*67e74705SXin Li
105*67e74705SXin Li  if(LLVM_INCLUDE_TESTS)
106*67e74705SXin Li    set(Python_ADDITIONAL_VERSIONS 2.7)
107*67e74705SXin Li    include(FindPythonInterp)
108*67e74705SXin Li    if(NOT PYTHONINTERP_FOUND)
109*67e74705SXin Li      message(FATAL_ERROR
110*67e74705SXin Li"Unable to find Python interpreter, required for builds and testing.
111*67e74705SXin Li
112*67e74705SXin LiPlease install Python or specify the PYTHON_EXECUTABLE CMake variable.")
113*67e74705SXin Li    endif()
114*67e74705SXin Li
115*67e74705SXin Li    if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )
116*67e74705SXin Li      message(FATAL_ERROR "Python 2.7 or newer is required")
117*67e74705SXin Li    endif()
118*67e74705SXin Li
119*67e74705SXin Li    # Check prebuilt llvm/utils.
120*67e74705SXin Li    if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
121*67e74705SXin Li        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}
122*67e74705SXin Li        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
123*67e74705SXin Li      set(LLVM_UTILS_PROVIDED ON)
124*67e74705SXin Li    endif()
125*67e74705SXin Li
126*67e74705SXin Li    if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
127*67e74705SXin Li      set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
128*67e74705SXin Li      if(NOT LLVM_UTILS_PROVIDED)
129*67e74705SXin Li        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
130*67e74705SXin Li        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)
131*67e74705SXin Li        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
132*67e74705SXin Li        set(LLVM_UTILS_PROVIDED ON)
133*67e74705SXin Li        set(CLANG_TEST_DEPS FileCheck count not)
134*67e74705SXin Li      endif()
135*67e74705SXin Li      set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
136*67e74705SXin Li      if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
137*67e74705SXin Li          AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
138*67e74705SXin Li          AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
139*67e74705SXin Li        add_subdirectory(${UNITTEST_DIR} utils/unittest)
140*67e74705SXin Li      endif()
141*67e74705SXin Li    else()
142*67e74705SXin Li      # Seek installed Lit.
143*67e74705SXin Li      find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit
144*67e74705SXin Li        DOC "Path to lit.py")
145*67e74705SXin Li    endif()
146*67e74705SXin Li
147*67e74705SXin Li    if(LLVM_LIT)
148*67e74705SXin Li      # Define the default arguments to use with 'lit', and an option for the user
149*67e74705SXin Li      # to override.
150*67e74705SXin Li      set(LIT_ARGS_DEFAULT "-sv")
151*67e74705SXin Li      if (MSVC OR XCODE)
152*67e74705SXin Li        set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
153*67e74705SXin Li      endif()
154*67e74705SXin Li      set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
155*67e74705SXin Li
156*67e74705SXin Li      # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
157*67e74705SXin Li      if( WIN32 AND NOT CYGWIN )
158*67e74705SXin Li        set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
159*67e74705SXin Li      endif()
160*67e74705SXin Li    else()
161*67e74705SXin Li      set(LLVM_INCLUDE_TESTS OFF)
162*67e74705SXin Li    endif()
163*67e74705SXin Li  endif()
164*67e74705SXin Li
165*67e74705SXin Li  set( CLANG_BUILT_STANDALONE 1 )
166*67e74705SXin Li  set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}")
167*67e74705SXin Lielse()
168*67e74705SXin Li  set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}")
169*67e74705SXin Liendif()
170*67e74705SXin Li
171*67e74705SXin Li# Make sure that our source directory is on the current cmake module path so that
172*67e74705SXin Li# we can include cmake files from this directory.
173*67e74705SXin Lilist(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
174*67e74705SXin Li
175*67e74705SXin Lifind_package(LibXml2 2.5.3 QUIET)
176*67e74705SXin Liif (LIBXML2_FOUND)
177*67e74705SXin Li  set(CLANG_HAVE_LIBXML 1)
178*67e74705SXin Liendif()
179*67e74705SXin Li
180*67e74705SXin Liset(CLANG_RESOURCE_DIR "" CACHE STRING
181*67e74705SXin Li  "Relative directory from the Clang binary to its resource files.")
182*67e74705SXin Li
183*67e74705SXin Liset(C_INCLUDE_DIRS "" CACHE STRING
184*67e74705SXin Li  "Colon separated list of directories clang will search for headers.")
185*67e74705SXin Li
186*67e74705SXin Liset(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
187*67e74705SXin Liset(DEFAULT_SYSROOT "" CACHE PATH
188*67e74705SXin Li  "Default <path> to all compiler invocations for --sysroot=<path>." )
189*67e74705SXin Li
190*67e74705SXin Liset(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
191*67e74705SXin Li
192*67e74705SXin Liset(ENABLE_X86_RELAX_RELOCATIONS OFF CACHE BOOL
193*67e74705SXin Li    "enable x86 relax relocations by default")
194*67e74705SXin Li
195*67e74705SXin Liset(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING
196*67e74705SXin Li  "Default C++ stdlib to use (empty for architecture default, \"libstdc++\" or \"libc++\"")
197*67e74705SXin Liif (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR
198*67e74705SXin Li        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR
199*67e74705SXin Li        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++"))
200*67e74705SXin Li  message(WARNING "Resetting default C++ stdlib to use architecture default")
201*67e74705SXin Li  set(CLANG_DEFAULT_CXX_STDLIB "")
202*67e74705SXin Liendif()
203*67e74705SXin Li
204*67e74705SXin Liset(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING
205*67e74705SXin Li  "Default OpenMP runtime used by -fopenmp.")
206*67e74705SXin Li
207*67e74705SXin Liset(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
208*67e74705SXin Li  "Vendor-specific text for showing with version information.")
209*67e74705SXin Li
210*67e74705SXin Liif( CLANG_VENDOR )
211*67e74705SXin Li  add_definitions( -DCLANG_VENDOR="${CLANG_VENDOR} " )
212*67e74705SXin Liendif()
213*67e74705SXin Li
214*67e74705SXin Liset(CLANG_REPOSITORY_STRING "" CACHE STRING
215*67e74705SXin Li  "Vendor-specific text for showing the repository the source is taken from.")
216*67e74705SXin Li
217*67e74705SXin Liif(CLANG_REPOSITORY_STRING)
218*67e74705SXin Li  add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}")
219*67e74705SXin Liendif()
220*67e74705SXin Li
221*67e74705SXin Liset(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING
222*67e74705SXin Li  "Vendor-specific uti.")
223*67e74705SXin Li
224*67e74705SXin Li# The libdir suffix must exactly match whatever LLVM's configuration used.
225*67e74705SXin Liset(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")
226*67e74705SXin Li
227*67e74705SXin Liset(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
228*67e74705SXin Liset(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
229*67e74705SXin Li
230*67e74705SXin Liif( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
231*67e74705SXin Li  message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
232*67e74705SXin Li"the makefiles distributed with LLVM. Please create a directory and run cmake "
233*67e74705SXin Li"from there, passing the path to this source directory as the last argument. "
234*67e74705SXin Li"This process created the file `CMakeCache.txt' and the directory "
235*67e74705SXin Li"`CMakeFiles'. Please delete them.")
236*67e74705SXin Liendif()
237*67e74705SXin Li
238*67e74705SXin Liif( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
239*67e74705SXin Li  file(GLOB_RECURSE
240*67e74705SXin Li    tablegenned_files_on_include_dir
241*67e74705SXin Li    "${CLANG_SOURCE_DIR}/include/clang/*.inc")
242*67e74705SXin Li  if( tablegenned_files_on_include_dir )
243*67e74705SXin Li    message(FATAL_ERROR "Apparently there is a previous in-source build, "
244*67e74705SXin Li"probably as the result of running `configure' and `make' on "
245*67e74705SXin Li"${CLANG_SOURCE_DIR}. This may cause problems. The suspicious files are:\n"
246*67e74705SXin Li"${tablegenned_files_on_include_dir}\nPlease clean the source directory.")
247*67e74705SXin Li  endif()
248*67e74705SXin Liendif()
249*67e74705SXin Li
250*67e74705SXin Li# Compute the Clang version from the LLVM version.
251*67e74705SXin Listring(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION
252*67e74705SXin Li  ${PACKAGE_VERSION})
253*67e74705SXin Limessage(STATUS "Clang version: ${CLANG_VERSION}")
254*67e74705SXin Li
255*67e74705SXin Listring(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" CLANG_VERSION_MAJOR
256*67e74705SXin Li  ${CLANG_VERSION})
257*67e74705SXin Listring(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" CLANG_VERSION_MINOR
258*67e74705SXin Li  ${CLANG_VERSION})
259*67e74705SXin Liif (${CLANG_VERSION} MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
260*67e74705SXin Li  set(CLANG_HAS_VERSION_PATCHLEVEL 1)
261*67e74705SXin Li  string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" CLANG_VERSION_PATCHLEVEL
262*67e74705SXin Li    ${CLANG_VERSION})
263*67e74705SXin Lielse()
264*67e74705SXin Li  set(CLANG_HAS_VERSION_PATCHLEVEL 0)
265*67e74705SXin Liendif()
266*67e74705SXin Li
267*67e74705SXin Li# Configure the Version.inc file.
268*67e74705SXin Liconfigure_file(
269*67e74705SXin Li  ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in
270*67e74705SXin Li  ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc)
271*67e74705SXin Li
272*67e74705SXin Li# Add appropriate flags for GCC
273*67e74705SXin Liif (LLVM_COMPILER_IS_GCC_COMPATIBLE)
274*67e74705SXin Li  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual")
275*67e74705SXin Li  if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
276*67e74705SXin Li    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
277*67e74705SXin Li  endif ()
278*67e74705SXin Li
279*67e74705SXin Li  # Enable -pedantic for Clang even if it's not enabled for LLVM.
280*67e74705SXin Li  if (NOT LLVM_ENABLE_PEDANTIC)
281*67e74705SXin Li    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long")
282*67e74705SXin Li  endif ()
283*67e74705SXin Li
284*67e74705SXin Li  check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
285*67e74705SXin Li  if( CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG )
286*67e74705SXin Li    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" )
287*67e74705SXin Li  endif()
288*67e74705SXin Liendif ()
289*67e74705SXin Li
290*67e74705SXin Li# Determine HOST_LINK_VERSION on Darwin.
291*67e74705SXin Liset(HOST_LINK_VERSION)
292*67e74705SXin Liif (APPLE)
293*67e74705SXin Li  set(LD_V_OUTPUT)
294*67e74705SXin Li  execute_process(
295*67e74705SXin Li    COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
296*67e74705SXin Li    RESULT_VARIABLE HAD_ERROR
297*67e74705SXin Li    OUTPUT_VARIABLE LD_V_OUTPUT
298*67e74705SXin Li  )
299*67e74705SXin Li  if (NOT HAD_ERROR)
300*67e74705SXin Li    if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
301*67e74705SXin Li      string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
302*67e74705SXin Li    elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
303*67e74705SXin Li      string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
304*67e74705SXin Li    endif()
305*67e74705SXin Li  else()
306*67e74705SXin Li    message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
307*67e74705SXin Li  endif()
308*67e74705SXin Liendif()
309*67e74705SXin Li
310*67e74705SXin Liconfigure_file(
311*67e74705SXin Li  ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake
312*67e74705SXin Li  ${CLANG_BINARY_DIR}/include/clang/Config/config.h)
313*67e74705SXin Li
314*67e74705SXin Liinclude(CMakeParseArguments)
315*67e74705SXin Liinclude(AddClang)
316*67e74705SXin Li
317*67e74705SXin Liset(CMAKE_INCLUDE_CURRENT_DIR ON)
318*67e74705SXin Li
319*67e74705SXin Liinclude_directories(BEFORE
320*67e74705SXin Li  ${CMAKE_CURRENT_BINARY_DIR}/include
321*67e74705SXin Li  ${CMAKE_CURRENT_SOURCE_DIR}/include
322*67e74705SXin Li  )
323*67e74705SXin Li
324*67e74705SXin Liif (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
325*67e74705SXin Li  install(DIRECTORY include/clang include/clang-c
326*67e74705SXin Li    DESTINATION include
327*67e74705SXin Li    FILES_MATCHING
328*67e74705SXin Li    PATTERN "*.def"
329*67e74705SXin Li    PATTERN "*.h"
330*67e74705SXin Li    PATTERN "config.h" EXCLUDE
331*67e74705SXin Li    PATTERN ".svn" EXCLUDE
332*67e74705SXin Li    )
333*67e74705SXin Li
334*67e74705SXin Li  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
335*67e74705SXin Li    DESTINATION include
336*67e74705SXin Li    FILES_MATCHING
337*67e74705SXin Li    PATTERN "CMakeFiles" EXCLUDE
338*67e74705SXin Li    PATTERN "*.inc"
339*67e74705SXin Li    PATTERN "*.h"
340*67e74705SXin Li    )
341*67e74705SXin Liendif()
342*67e74705SXin Li
343*67e74705SXin Liadd_definitions( -D_GNU_SOURCE )
344*67e74705SXin Li
345*67e74705SXin Lioption(CLANG_BUILD_TOOLS
346*67e74705SXin Li  "Build the Clang tools. If OFF, just generate build targets." ON)
347*67e74705SXin Li
348*67e74705SXin Lioption(CLANG_ENABLE_ARCMT "Build ARCMT." ON)
349*67e74705SXin Liif (CLANG_ENABLE_ARCMT)
350*67e74705SXin Li  set(ENABLE_CLANG_ARCMT "1")
351*67e74705SXin Lielse()
352*67e74705SXin Li  set(ENABLE_CLANG_ARCMT "0")
353*67e74705SXin Liendif()
354*67e74705SXin Li
355*67e74705SXin Lioption(CLANG_ENABLE_STATIC_ANALYZER "Build static analyzer." ON)
356*67e74705SXin Liif (CLANG_ENABLE_STATIC_ANALYZER)
357*67e74705SXin Li  set(ENABLE_CLANG_STATIC_ANALYZER "1")
358*67e74705SXin Lielse()
359*67e74705SXin Li  set(ENABLE_CLANG_STATIC_ANALYZER "0")
360*67e74705SXin Liendif()
361*67e74705SXin Li
362*67e74705SXin Liif (NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
363*67e74705SXin Li  message(FATAL_ERROR "Cannot disable static analyzer while enabling ARCMT")
364*67e74705SXin Liendif()
365*67e74705SXin Li
366*67e74705SXin Liif(CLANG_ENABLE_ARCMT)
367*67e74705SXin Li  add_definitions(-DCLANG_ENABLE_ARCMT)
368*67e74705SXin Li  add_definitions(-DCLANG_ENABLE_OBJC_REWRITER)
369*67e74705SXin Liendif()
370*67e74705SXin Liif(CLANG_ENABLE_STATIC_ANALYZER)
371*67e74705SXin Li  add_definitions(-DCLANG_ENABLE_STATIC_ANALYZER)
372*67e74705SXin Liendif()
373*67e74705SXin Li
374*67e74705SXin Li# Clang version information
375*67e74705SXin Liset(CLANG_EXECUTABLE_VERSION
376*67e74705SXin Li     "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}" CACHE STRING
377*67e74705SXin Li    "Version number that will be placed into the clang executable, in the form XX.YY")
378*67e74705SXin Liset(LIBCLANG_LIBRARY_VERSION
379*67e74705SXin Li     "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}" CACHE STRING
380*67e74705SXin Li    "Version number that will be placed into the libclang library , in the form XX.YY")
381*67e74705SXin Limark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION)
382*67e74705SXin Li
383*67e74705SXin Lioption(CLANG_INCLUDE_TESTS
384*67e74705SXin Li       "Generate build targets for the Clang unit tests."
385*67e74705SXin Li       ${LLVM_INCLUDE_TESTS})
386*67e74705SXin Li
387*67e74705SXin Liadd_subdirectory(utils/TableGen)
388*67e74705SXin Li
389*67e74705SXin Liadd_subdirectory(include)
390*67e74705SXin Li
391*67e74705SXin Li# All targets below may depend on all tablegen'd files.
392*67e74705SXin Liget_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS)
393*67e74705SXin Lilist(APPEND LLVM_COMMON_DEPENDS ${CLANG_TABLEGEN_TARGETS})
394*67e74705SXin Li
395*67e74705SXin Liadd_subdirectory(lib)
396*67e74705SXin Liadd_subdirectory(tools)
397*67e74705SXin Liadd_subdirectory(runtime)
398*67e74705SXin Li
399*67e74705SXin Lioption(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF)
400*67e74705SXin Liif (CLANG_BUILD_EXAMPLES)
401*67e74705SXin Li  set(ENABLE_CLANG_EXAMPLES "1")
402*67e74705SXin Lielse()
403*67e74705SXin Li  set(ENABLE_CLANG_EXAMPLES "0")
404*67e74705SXin Liendif()
405*67e74705SXin Liadd_subdirectory(examples)
406*67e74705SXin Li
407*67e74705SXin Liif( CLANG_INCLUDE_TESTS )
408*67e74705SXin Li  if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h)
409*67e74705SXin Li    add_subdirectory(unittests)
410*67e74705SXin Li    list(APPEND CLANG_TEST_DEPS ClangUnitTests)
411*67e74705SXin Li    list(APPEND CLANG_TEST_PARAMS
412*67e74705SXin Li      clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg
413*67e74705SXin Li      )
414*67e74705SXin Li  endif()
415*67e74705SXin Li  add_subdirectory(test)
416*67e74705SXin Li
417*67e74705SXin Li  if(CLANG_BUILT_STANDALONE)
418*67e74705SXin Li    # Add a global check rule now that all subdirectories have been traversed
419*67e74705SXin Li    # and we know the total set of lit testsuites.
420*67e74705SXin Li    get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
421*67e74705SXin Li    get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
422*67e74705SXin Li    get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
423*67e74705SXin Li    get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
424*67e74705SXin Li    add_lit_target(check-all
425*67e74705SXin Li      "Running all regression tests"
426*67e74705SXin Li      ${LLVM_LIT_TESTSUITES}
427*67e74705SXin Li      PARAMS ${LLVM_LIT_PARAMS}
428*67e74705SXin Li      DEPENDS ${LLVM_LIT_DEPENDS}
429*67e74705SXin Li      ARGS ${LLVM_LIT_EXTRA_ARGS}
430*67e74705SXin Li      )
431*67e74705SXin Li  endif()
432*67e74705SXin Li  add_subdirectory(utils/perf-training)
433*67e74705SXin Liendif()
434*67e74705SXin Li
435*67e74705SXin Lioption(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs."
436*67e74705SXin Li  ${LLVM_INCLUDE_DOCS})
437*67e74705SXin Liif( CLANG_INCLUDE_DOCS )
438*67e74705SXin Li  add_subdirectory(docs)
439*67e74705SXin Liendif()
440*67e74705SXin Li
441*67e74705SXin Li
442*67e74705SXin Liif(APPLE)
443*67e74705SXin Li  # this line is needed as a cleanup to ensure that any CMakeCaches with the old
444*67e74705SXin Li  # default value get updated to the new default.
445*67e74705SXin Li  if(CLANG_ORDER_FILE STREQUAL "")
446*67e74705SXin Li    unset(CLANG_ORDER_FILE CACHE)
447*67e74705SXin Li    unset(CLANG_ORDER_FILE)
448*67e74705SXin Li  endif()
449*67e74705SXin Li
450*67e74705SXin Li
451*67e74705SXin Li  set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH
452*67e74705SXin Li    "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).")
453*67e74705SXin Li
454*67e74705SXin Li  if(CLANG_ORDER_FILE AND NOT EXISTS ${CLANG_ORDER_FILE})
455*67e74705SXin Li    string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)
456*67e74705SXin Li    if(PATH_START EQUAL 0)
457*67e74705SXin Li      file(WRITE ${CLANG_ORDER_FILE} "\n")
458*67e74705SXin Li    else()
459*67e74705SXin Li      message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does not exist.")
460*67e74705SXin Li    endif()
461*67e74705SXin Li  endif()
462*67e74705SXin Liendif()
463*67e74705SXin Li
464*67e74705SXin Liadd_subdirectory(cmake/modules)
465*67e74705SXin Li
466*67e74705SXin Liif (CLANG_ENABLE_BOOTSTRAP)
467*67e74705SXin Li  include(ExternalProject)
468*67e74705SXin Li
469*67e74705SXin Li  if(NOT CLANG_STAGE)
470*67e74705SXin Li    set(CLANG_STAGE stage1)
471*67e74705SXin Li    message(STATUS "Setting current clang stage to: ${CLANG_STAGE}")
472*67e74705SXin Li  endif()
473*67e74705SXin Li
474*67e74705SXin Li  string(REGEX MATCH "stage([0-9]*)" MATCHED_STAGE "${CLANG_STAGE}")
475*67e74705SXin Li  if(MATCHED_STAGE)
476*67e74705SXin Li    if(NOT LLVM_BUILD_INSTRUMENTED)
477*67e74705SXin Li      math(EXPR STAGE_NUM "${CMAKE_MATCH_1} + 1")
478*67e74705SXin Li      set(NEXT_CLANG_STAGE stage${STAGE_NUM})
479*67e74705SXin Li    else()
480*67e74705SXin Li      set(NEXT_CLANG_STAGE stage${CMAKE_MATCH_1})
481*67e74705SXin Li    endif()
482*67e74705SXin Li  else()
483*67e74705SXin Li    set(NEXT_CLANG_STAGE bootstrap)
484*67e74705SXin Li  endif()
485*67e74705SXin Li
486*67e74705SXin Li  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
487*67e74705SXin Li    set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented)
488*67e74705SXin Li  endif()
489*67e74705SXin Li  message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}")
490*67e74705SXin Li
491*67e74705SXin Li
492*67e74705SXin Li  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/)
493*67e74705SXin Li  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-bins/)
494*67e74705SXin Li  set(cmake_command ${CMAKE_COMMAND})
495*67e74705SXin Li
496*67e74705SXin Li  # If the next stage is LTO we need to depend on LTO and possibly LLVMgold
497*67e74705SXin Li  if(BOOTSTRAP_LLVM_ENABLE_LTO OR LLVM_ENABLE_LTO)
498*67e74705SXin Li    set(LTO_DEP LTO)
499*67e74705SXin Li    if(APPLE)
500*67e74705SXin Li      # on Darwin we need to set DARWIN_LTO_LIBRARY so that -flto will work
501*67e74705SXin Li      # using the just-built compiler, and we need to override DYLD_LIBRARY_PATH
502*67e74705SXin Li      # so that the host object file tools will use the just-built libLTO.
503*67e74705SXin Li      set(LTO_LIBRARY -DDARWIN_LTO_LIBRARY=${LLVM_SHLIB_OUTPUT_INTDIR}/libLTO.dylib)
504*67e74705SXin Li      set(cmake_command ${CMAKE_COMMAND} -E env DYLD_LIBRARY_PATH=${LLVM_LIBRARY_OUTPUT_INTDIR} ${CMAKE_COMMAND})
505*67e74705SXin Li    elseif(NOT WIN32)
506*67e74705SXin Li      list(APPEND LTO_DEP LLVMgold llvm-ar llvm-ranlib)
507*67e74705SXin Li      set(LTO_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)
508*67e74705SXin Li      set(LTO_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)
509*67e74705SXin Li    endif()
510*67e74705SXin Li  endif()
511*67e74705SXin Li
512*67e74705SXin Li  add_custom_target(${NEXT_CLANG_STAGE}-clear
513*67e74705SXin Li    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
514*67e74705SXin Li    )
515*67e74705SXin Li  add_custom_command(
516*67e74705SXin Li    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
517*67e74705SXin Li    DEPENDS clang ${LTO_DEP}
518*67e74705SXin Li    COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
519*67e74705SXin Li    COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR}
520*67e74705SXin Li    COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
521*67e74705SXin Li    COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR}
522*67e74705SXin Li    COMMENT "Clobberring ${NEXT_CLANG_STAGE} build and stamp directories"
523*67e74705SXin Li    )
524*67e74705SXin Li
525*67e74705SXin Li  if(CMAKE_VERBOSE_MAKEFILE)
526*67e74705SXin Li    set(verbose -DCMAKE_VERBOSE_MAKEFILE=On)
527*67e74705SXin Li  endif()
528*67e74705SXin Li
529*67e74705SXin Li  set(BOOTSTRAP_DEFAULT_PASSTHROUGH
530*67e74705SXin Li    PACKAGE_VERSION
531*67e74705SXin Li    LLVM_VERSION_MAJOR
532*67e74705SXin Li    LLVM_VERSION_MINOR
533*67e74705SXin Li    LLVM_VERSION_PATCH
534*67e74705SXin Li    LLVM_VERSION_SUFFIX
535*67e74705SXin Li    LLVM_BINUTILS_INCDIR
536*67e74705SXin Li    CLANG_REPOSITORY_STRING
537*67e74705SXin Li    CMAKE_MAKE_PROGRAM)
538*67e74705SXin Li
539*67e74705SXin Li  if(TARGET compiler-rt)
540*67e74705SXin Li    set(RUNTIME_DEP compiler-rt)
541*67e74705SXin Li  endif()
542*67e74705SXin Li
543*67e74705SXin Li  set(COMPILER_OPTIONS
544*67e74705SXin Li    -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++
545*67e74705SXin Li    -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
546*67e74705SXin Li    -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
547*67e74705SXin Li
548*67e74705SXin Li  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
549*67e74705SXin Li    set(PGO_DEP llvm-profdata)
550*67e74705SXin Li    set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata)
551*67e74705SXin Li  endif()
552*67e74705SXin Li
553*67e74705SXin Li  if(LLVM_BUILD_INSTRUMENTED)
554*67e74705SXin Li    set(PGO_DEP generate-profdata)
555*67e74705SXin Li    set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata)
556*67e74705SXin Li    set(COMPILER_OPTIONS
557*67e74705SXin Li      -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
558*67e74705SXin Li      -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
559*67e74705SXin Li      -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER})
560*67e74705SXin Li    set(RUNTIME_DEP) # Don't set runtime dependencies
561*67e74705SXin Li  endif()
562*67e74705SXin Li
563*67e74705SXin Li  # Find all variables that start with BOOTSTRAP_ and populate a variable with
564*67e74705SXin Li  # them.
565*67e74705SXin Li  get_cmake_property(variableNames VARIABLES)
566*67e74705SXin Li  foreach(variableName ${variableNames})
567*67e74705SXin Li    if(variableName MATCHES "^BOOTSTRAP_")
568*67e74705SXin Li      string(SUBSTRING ${variableName} 10 -1 varName)
569*67e74705SXin Li      string(REPLACE ";" "\;" value "${${variableName}}")
570*67e74705SXin Li      list(APPEND PASSTHROUGH_VARIABLES
571*67e74705SXin Li        -D${varName}=${value})
572*67e74705SXin Li    endif()
573*67e74705SXin Li    if(${variableName} AND variableName MATCHES "LLVM_EXTERNAL_.*_SOURCE_DIR")
574*67e74705SXin Li      list(APPEND PASSTHROUGH_VARIABLES
575*67e74705SXin Li        -D${variableName}=${${variableName}})
576*67e74705SXin Li    endif()
577*67e74705SXin Li  endforeach()
578*67e74705SXin Li
579*67e74705SXin Li  # Populate the passthrough variables
580*67e74705SXin Li  foreach(variableName ${CLANG_BOOTSTRAP_PASSTHROUGH} ${BOOTSTRAP_DEFAULT_PASSTHROUGH})
581*67e74705SXin Li    if(${variableName})
582*67e74705SXin Li      string(REPLACE ";" "\;" value ${${variableName}})
583*67e74705SXin Li      list(APPEND PASSTHROUGH_VARIABLES
584*67e74705SXin Li        -D${variableName}=${value})
585*67e74705SXin Li    endif()
586*67e74705SXin Li  endforeach()
587*67e74705SXin Li
588*67e74705SXin Li  ExternalProject_Add(${NEXT_CLANG_STAGE}
589*67e74705SXin Li    DEPENDS clang ${LTO_DEP} ${RUNTIME_DEP} ${PGO_DEP}
590*67e74705SXin Li    PREFIX ${NEXT_CLANG_STAGE}
591*67e74705SXin Li    SOURCE_DIR ${CMAKE_SOURCE_DIR}
592*67e74705SXin Li    STAMP_DIR ${STAMP_DIR}
593*67e74705SXin Li    BINARY_DIR ${BINARY_DIR}
594*67e74705SXin Li    EXCLUDE_FROM_ALL 1
595*67e74705SXin Li    CMAKE_ARGS
596*67e74705SXin Li                # We shouldn't need to set this here, but INSTALL_DIR doesn't
597*67e74705SXin Li                # seem to work, so instead I'm passing this through
598*67e74705SXin Li                -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
599*67e74705SXin Li                ${CLANG_BOOTSTRAP_CMAKE_ARGS}
600*67e74705SXin Li                ${PASSTHROUGH_VARIABLES}
601*67e74705SXin Li                 -DCLANG_STAGE=${NEXT_CLANG_STAGE}
602*67e74705SXin Li                ${COMPILER_OPTIONS}
603*67e74705SXin Li                ${LTO_LIBRARY} ${LTO_AR} ${LTO_RANLIB} ${verbose} ${PGO_OPT}
604*67e74705SXin Li    CMAKE_COMMAND ${cmake_command}
605*67e74705SXin Li    INSTALL_COMMAND ""
606*67e74705SXin Li    STEP_TARGETS configure build
607*67e74705SXin Li    USES_TERMINAL_CONFIGURE 1
608*67e74705SXin Li    USES_TERMINAL_BUILD 1
609*67e74705SXin Li    USES_TERMINAL_INSTALL 1
610*67e74705SXin Li    )
611*67e74705SXin Li
612*67e74705SXin Li  # exclude really-install from main target
613*67e74705SXin Li  set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On)
614*67e74705SXin Li  ExternalProject_Add_Step(${NEXT_CLANG_STAGE} really-install
615*67e74705SXin Li    COMMAND ${cmake_command} --build <BINARY_DIR> --target install
616*67e74705SXin Li    COMMENT "Performing install step for '${NEXT_CLANG_STAGE}'"
617*67e74705SXin Li    DEPENDEES build
618*67e74705SXin Li    USES_TERMINAL 1
619*67e74705SXin Li  )
620*67e74705SXin Li  ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} really-install)
621*67e74705SXin Li  add_custom_target(${NEXT_CLANG_STAGE}-install DEPENDS ${NEXT_CLANG_STAGE}-really-install)
622*67e74705SXin Li
623*67e74705SXin Li  if(NOT CLANG_BOOTSTRAP_TARGETS)
624*67e74705SXin Li    set(CLANG_BOOTSTRAP_TARGETS check-llvm check-clang check-all)
625*67e74705SXin Li  endif()
626*67e74705SXin Li  foreach(target ${CLANG_BOOTSTRAP_TARGETS})
627*67e74705SXin Li    # exclude from main target
628*67e74705SXin Li    set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_${target}_EXCLUDE_FROM_MAIN On)
629*67e74705SXin Li
630*67e74705SXin Li    ExternalProject_Add_Step(${NEXT_CLANG_STAGE} ${target}
631*67e74705SXin Li      COMMAND ${cmake_command} --build <BINARY_DIR> --target ${target}
632*67e74705SXin Li      COMMENT "Performing ${target} for '${NEXT_CLANG_STAGE}'"
633*67e74705SXin Li      DEPENDEES configure
634*67e74705SXin Li      USES_TERMINAL 1
635*67e74705SXin Li    )
636*67e74705SXin Li
637*67e74705SXin Li    if(target MATCHES "^stage[0-9]*")
638*67e74705SXin Li      add_custom_target(${target} DEPENDS ${NEXT_CLANG_STAGE}-${target})
639*67e74705SXin Li    endif()
640*67e74705SXin Li
641*67e74705SXin Li    ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} ${target})
642*67e74705SXin Li  endforeach()
643*67e74705SXin Liendif()
644*67e74705SXin Li
645*67e74705SXin Liif (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
646*67e74705SXin Li  add_subdirectory(utils/ClangVisualizers)
647*67e74705SXin Liendif()
648