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