Home | History | Annotate | Download | only in clang
      1 cmake_minimum_required(VERSION 2.8.8)
      2 
      3 # FIXME: It may be removed when we use 2.8.12.
      4 if(CMAKE_VERSION VERSION_LESS 2.8.12)
      5   # Invalidate a couple of keywords.
      6   set(cmake_2_8_12_INTERFACE)
      7   set(cmake_2_8_12_PRIVATE)
      8 else()
      9   # Use ${cmake_2_8_12_KEYWORD} intead of KEYWORD in target_link_libraries().
     10   set(cmake_2_8_12_INTERFACE INTERFACE)
     11   set(cmake_2_8_12_PRIVATE PRIVATE)
     12   if(POLICY CMP0022)
     13     cmake_policy(SET CMP0022 NEW) # automatic when 2.8.12 is required
     14   endif()
     15 endif()
     16 
     17 # If we are not building as a part of LLVM, build Clang as an
     18 # standalone project, using LLVM as an external library:
     19 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
     20   project(Clang)
     21 
     22   # Rely on llvm-config.
     23   set(CONFIG_OUTPUT)
     24   find_program(LLVM_CONFIG "llvm-config")
     25   if(LLVM_CONFIG)
     26     message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
     27     set(CONFIG_COMMAND ${LLVM_CONFIG}
     28       "--assertion-mode"
     29       "--bindir"
     30       "--libdir"
     31       "--includedir"
     32       "--prefix"
     33       "--src-root")
     34     execute_process(
     35       COMMAND ${CONFIG_COMMAND}
     36       RESULT_VARIABLE HAD_ERROR
     37       OUTPUT_VARIABLE CONFIG_OUTPUT
     38     )
     39     if(NOT HAD_ERROR)
     40       string(REGEX REPLACE
     41         "[ \t]*[\r\n]+[ \t]*" ";"
     42         CONFIG_OUTPUT ${CONFIG_OUTPUT})
     43     else()
     44       string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
     45       message(STATUS "${CONFIG_COMMAND_STR}")
     46       message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
     47     endif()
     48   else()
     49     message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}")
     50   endif()
     51 
     52   list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS)
     53   list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
     54   list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
     55   list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
     56   list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
     57   list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR)
     58 
     59   if(NOT MSVC_IDE)
     60     set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
     61       CACHE BOOL "Enable assertions")
     62     # Assertions should follow llvm-config's.
     63     mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
     64   endif()
     65 
     66   set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")
     67   set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")
     68   set(LLVM_MAIN_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
     69   set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
     70   set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
     71 
     72   find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
     73     NO_DEFAULT_PATH)
     74 
     75   set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/llvm/cmake")
     76   set(LLVMCONFIG_FILE "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
     77   if(EXISTS ${LLVMCONFIG_FILE})
     78     list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
     79     include(${LLVMCONFIG_FILE})
     80   else()
     81     message(FATAL_ERROR "Not found: ${LLVMCONFIG_FILE}")
     82   endif()
     83 
     84   # They are used as destination of target generators.
     85   set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
     86   set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
     87   if(WIN32 OR CYGWIN)
     88     # DLL platform -- put DLLs into bin.
     89     set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
     90   else()
     91     set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
     92   endif()
     93 
     94   option(LLVM_INSTALL_TOOLCHAIN_ONLY
     95     "Only include toolchain files in the 'install' target." OFF)
     96 
     97   option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
     98     "Set to ON to force using an old, unsupported host toolchain." OFF)
     99 
    100   include(AddLLVM)
    101   include(TableGen)
    102   include(HandleLLVMOptions)
    103 
    104   set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
    105 
    106   if (NOT DEFINED LLVM_INCLUDE_TESTS)
    107     set(LLVM_INCLUDE_TESTS ON)
    108   endif()
    109 
    110   include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}")
    111   link_directories("${LLVM_LIBRARY_DIR}")
    112 
    113   set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
    114   set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
    115   set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
    116 
    117   if(LLVM_INCLUDE_TESTS)
    118     # Check prebuilt llvm/utils.
    119     if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
    120         AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}
    121         AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
    122       set(LLVM_UTILS_PROVIDED ON)
    123     endif()
    124 
    125     if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
    126       set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
    127       if(NOT LLVM_UTILS_PROVIDED)
    128         add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
    129         add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)
    130         add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
    131         set(LLVM_UTILS_PROVIDED ON)
    132         set(CLANG_TEST_DEPS FileCheck count not)
    133       endif()
    134       set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
    135       if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
    136           AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
    137           AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
    138         add_subdirectory(${UNITTEST_DIR} utils/unittest)
    139       endif()
    140     else()
    141       # Seek installed Lit.
    142       find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit
    143         DOC "Path to lit.py")
    144     endif()
    145 
    146     if(LLVM_LIT)
    147       # Define the default arguments to use with 'lit', and an option for the user
    148       # to override.
    149       set(LIT_ARGS_DEFAULT "-sv")
    150       if (MSVC OR XCODE)
    151         set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
    152       endif()
    153       set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
    154 
    155       # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
    156       if( WIN32 AND NOT CYGWIN )
    157         set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
    158       endif()
    159     else()
    160       set(LLVM_INCLUDE_TESTS OFF)
    161     endif()
    162   endif()
    163 
    164   set( CLANG_BUILT_STANDALONE 1 )
    165   set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}")
    166 else()
    167   set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}")
    168 endif()
    169 
    170 find_package(LibXml2)
    171 if (LIBXML2_FOUND)
    172   set(CLANG_HAVE_LIBXML 1)
    173 endif()
    174 
    175 set(CLANG_RESOURCE_DIR "" CACHE STRING
    176   "Relative directory from the Clang binary to its resource files.")
    177 
    178 set(C_INCLUDE_DIRS "" CACHE STRING
    179   "Colon separated list of directories clang will search for headers.")
    180 
    181 set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
    182 set(DEFAULT_SYSROOT "" CACHE PATH
    183   "Default <path> to all compiler invocations for --sysroot=<path>." )
    184 
    185 set(CLANG_VENDOR "" CACHE STRING
    186   "Vendor-specific text for showing with version information.")
    187 
    188 if( CLANG_VENDOR )
    189   add_definitions( -DCLANG_VENDOR="${CLANG_VENDOR} " )
    190 endif()
    191 
    192 set(CLANG_REPOSITORY_STRING "" CACHE STRING
    193   "Vendor-specific text for showing the repository the source is taken from.")
    194 
    195 if(CLANG_REPOSITORY_STRING)
    196   add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}")
    197 endif()
    198 
    199 set(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING
    200   "Vendor-specific uti.")
    201 
    202 # The libdir suffix must exactly match whatever LLVM's configuration used.
    203 set(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")
    204 
    205 set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    206 set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
    207 
    208 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
    209   message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
    210 "the makefiles distributed with LLVM. Please create a directory and run cmake "
    211 "from there, passing the path to this source directory as the last argument. "
    212 "This process created the file `CMakeCache.txt' and the directory "
    213 "`CMakeFiles'. Please delete them.")
    214 endif()
    215 
    216 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
    217   file(GLOB_RECURSE
    218     tablegenned_files_on_include_dir
    219     "${CLANG_SOURCE_DIR}/include/clang/*.inc")
    220   if( tablegenned_files_on_include_dir )
    221     message(FATAL_ERROR "Apparently there is a previous in-source build, "
    222 "probably as the result of running `configure' and `make' on "
    223 "${CLANG_SOURCE_DIR}. This may cause problems. The suspicious files are:\n"
    224 "${tablegenned_files_on_include_dir}\nPlease clean the source directory.")
    225   endif()
    226 endif()
    227 
    228 # Compute the Clang version from the LLVM version.
    229 string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION
    230   ${PACKAGE_VERSION})
    231 message(STATUS "Clang version: ${CLANG_VERSION}")
    232 
    233 string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" CLANG_VERSION_MAJOR
    234   ${CLANG_VERSION})
    235 string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" CLANG_VERSION_MINOR
    236   ${CLANG_VERSION})
    237 if (${CLANG_VERSION} MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
    238   set(CLANG_HAS_VERSION_PATCHLEVEL 1)
    239   string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" CLANG_VERSION_PATCHLEVEL
    240     ${CLANG_VERSION})
    241 else()
    242   set(CLANG_HAS_VERSION_PATCHLEVEL 0)
    243 endif()
    244 
    245 # Configure the Version.inc file.
    246 configure_file(
    247   ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in
    248   ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc)
    249 
    250 # Add appropriate flags for GCC
    251 if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
    252   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual -fno-strict-aliasing")
    253 
    254   # Enable -pedantic for Clang even if it's not enabled for LLVM.
    255   if (NOT LLVM_ENABLE_PEDANTIC)
    256     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long")
    257   endif ()
    258 
    259   check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
    260   if( CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG )
    261     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" )
    262   endif()
    263 endif ()
    264 
    265 # Determine HOST_LINK_VERSION on Darwin.
    266 set(HOST_LINK_VERSION)
    267 if (APPLE)
    268   set(LD_V_OUTPUT)
    269   execute_process(
    270     COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
    271     RESULT_VARIABLE HAD_ERROR
    272     OUTPUT_VARIABLE LD_V_OUTPUT
    273   )
    274   if (NOT HAD_ERROR)
    275     if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
    276       string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
    277     elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
    278       string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
    279     endif()
    280   else()
    281     message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
    282   endif()
    283 endif()
    284 
    285 configure_file(
    286   ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake
    287   ${CLANG_BINARY_DIR}/include/clang/Config/config.h)
    288 
    289 include(CMakeParseArguments)
    290 
    291 function(clang_tablegen)
    292   # Syntax:
    293   # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file
    294   # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]
    295   #
    296   # Generates a custom command for invoking tblgen as
    297   #
    298   # tblgen source-file -o=output-file tablegen-arg ...
    299   #
    300   # and, if cmake-target-name is provided, creates a custom target for
    301   # executing the custom command depending on output-file. It is
    302   # possible to list more files to depend after DEPENDS.
    303 
    304   cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN})
    305 
    306   if( NOT CTG_SOURCE )
    307     message(FATAL_ERROR "SOURCE source-file required by clang_tablegen")
    308   endif()
    309 
    310   set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} )
    311   tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS})
    312 
    313   if(CTG_TARGET)
    314     add_public_tablegen_target(${CTG_TARGET})
    315     set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning")
    316     set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET})
    317   endif()
    318 endfunction(clang_tablegen)
    319 
    320 macro(add_clang_library name)
    321   cmake_parse_arguments(ARG
    322     ""
    323     ""
    324     "ADDITIONAL_HEADERS"
    325     ${ARGN})
    326   set(srcs)
    327   if(MSVC_IDE OR XCODE)
    328     # Add public headers
    329     file(RELATIVE_PATH lib_path
    330       ${CLANG_SOURCE_DIR}/lib/
    331       ${CMAKE_CURRENT_SOURCE_DIR}
    332     )
    333     if(NOT lib_path MATCHES "^[.][.]")
    334       file( GLOB_RECURSE headers
    335         ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h
    336         ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def
    337       )
    338       set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
    339 
    340       file( GLOB_RECURSE tds
    341         ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td
    342       )
    343       source_group("TableGen descriptions" FILES ${tds})
    344       set_source_files_properties(${tds}} PROPERTIES HEADER_FILE_ONLY ON)
    345 
    346       if(headers OR tds)
    347 	set(srcs ${headers} ${tds})
    348       endif()
    349     endif()
    350   endif(MSVC_IDE OR XCODE)
    351   if(srcs OR ARG_ADDITIONAL_HEADERS)
    352     set(srcs
    353       ADDITIONAL_HEADERS
    354       ${srcs}
    355       ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args.
    356       )
    357   endif()
    358   llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
    359 
    360   if(TARGET ${name})
    361     target_link_libraries(${name} ${cmake_2_8_12_INTERFACE} ${LLVM_COMMON_LIBS})
    362 
    363     if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libclang")
    364       install(TARGETS ${name}
    365         LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
    366         ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
    367         RUNTIME DESTINATION bin)
    368     endif()
    369     set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
    370   else()
    371     # Add empty "phony" target
    372     add_custom_target(${name})
    373   endif()
    374 
    375   set_target_properties(${name} PROPERTIES FOLDER "Clang libraries")
    376 endmacro(add_clang_library)
    377 
    378 macro(add_clang_executable name)
    379   add_llvm_executable( ${name} ${ARGN} )
    380   set_target_properties(${name} PROPERTIES FOLDER "Clang executables")
    381 endmacro(add_clang_executable)
    382 
    383 set(CMAKE_INCLUDE_CURRENT_DIR ON)
    384 
    385 include_directories(BEFORE
    386   ${CMAKE_CURRENT_BINARY_DIR}/include
    387   ${CMAKE_CURRENT_SOURCE_DIR}/include
    388   )
    389 
    390 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
    391   install(DIRECTORY include/clang include/clang-c
    392     DESTINATION include
    393     FILES_MATCHING
    394     PATTERN "*.def"
    395     PATTERN "*.h"
    396     PATTERN "config.h" EXCLUDE
    397     PATTERN ".svn" EXCLUDE
    398     )
    399 
    400   install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
    401     DESTINATION include
    402     FILES_MATCHING
    403     PATTERN "CMakeFiles" EXCLUDE
    404     PATTERN "*.inc"
    405     PATTERN "*.h"
    406     )
    407 endif()
    408 
    409 install(DIRECTORY include/clang-c
    410   DESTINATION include
    411   FILES_MATCHING
    412   PATTERN "*.h"
    413   PATTERN ".svn" EXCLUDE
    414   )
    415 
    416 add_definitions( -D_GNU_SOURCE )
    417 
    418 option(CLANG_ENABLE_ARCMT "Build ARCMT." ON)
    419 if (CLANG_ENABLE_ARCMT)
    420   set(ENABLE_CLANG_ARCMT "1")
    421 else()
    422   set(ENABLE_CLANG_ARCMT "0")
    423 endif()
    424 
    425 option(CLANG_ENABLE_STATIC_ANALYZER "Build static analyzer." ON)
    426 if (CLANG_ENABLE_STATIC_ANALYZER)
    427   set(ENABLE_CLANG_STATIC_ANALYZER "1")
    428 else()
    429   set(ENABLE_CLANG_STATIC_ANALYZER "0")
    430 endif()
    431 
    432 if (NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
    433   message(FATAL_ERROR "Cannot disable static analyzer while enabling ARCMT")
    434 endif()
    435 
    436 if(CLANG_ENABLE_ARCMT)
    437   add_definitions(-DCLANG_ENABLE_ARCMT)
    438   add_definitions(-DCLANG_ENABLE_OBJC_REWRITER)
    439 endif()
    440 if(CLANG_ENABLE_STATIC_ANALYZER)
    441   add_definitions(-DCLANG_ENABLE_STATIC_ANALYZER)
    442 endif()
    443 
    444 # Clang version information
    445 set(CLANG_EXECUTABLE_VERSION
    446      "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}" CACHE STRING
    447     "Version number that will be placed into the clang executable, in the form XX.YY")
    448 set(LIBCLANG_LIBRARY_VERSION
    449      "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}" CACHE STRING
    450     "Version number that will be placed into the libclang library , in the form XX.YY")
    451 mark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION)
    452 
    453 add_subdirectory(utils/TableGen)
    454 
    455 add_subdirectory(include)
    456 
    457 # All targets below may depend on all tablegen'd files.
    458 get_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS)
    459 list(APPEND LLVM_COMMON_DEPENDS ${CLANG_TABLEGEN_TARGETS})
    460 
    461 add_subdirectory(lib)
    462 add_subdirectory(tools)
    463 add_subdirectory(runtime)
    464 
    465 option(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF)
    466 if (CLANG_BUILD_EXAMPLES)
    467   set(ENABLE_CLANG_EXAMPLES "1")
    468 else()
    469   set(ENABLE_CLANG_EXAMPLES "0")
    470 endif()
    471 add_subdirectory(examples)
    472 
    473 option(CLANG_INCLUDE_TESTS
    474        "Generate build targets for the Clang unit tests."
    475        ${LLVM_INCLUDE_TESTS})
    476 
    477 if( CLANG_INCLUDE_TESTS )
    478   if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h)
    479     add_subdirectory(unittests)
    480     list(APPEND CLANG_TEST_DEPS ClangUnitTests)
    481     list(APPEND CLANG_TEST_PARAMS
    482       clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg
    483       )
    484   endif()
    485   add_subdirectory(test)
    486 
    487   if(CLANG_BUILT_STANDALONE)
    488     # Add a global check rule now that all subdirectories have been traversed
    489     # and we know the total set of lit testsuites.
    490     get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
    491     get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
    492     get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
    493     get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
    494     add_lit_target(check-all
    495       "Running all regression tests"
    496       ${LLVM_LIT_TESTSUITES}
    497       PARAMS ${LLVM_LIT_PARAMS}
    498       DEPENDS ${LLVM_LIT_DEPENDS}
    499       ARGS ${LLVM_LIT_EXTRA_ARGS}
    500       )
    501   endif()
    502 endif()
    503 
    504 option(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs."
    505   ${LLVM_INCLUDE_DOCS})
    506 if( CLANG_INCLUDE_DOCS )
    507   add_subdirectory(docs)
    508 endif()
    509 
    510 set(CLANG_ORDER_FILE "" CACHE FILEPATH
    511   "Order file to use when compiling clang in order to improve startup time.")
    512 
    513 if (CLANG_BUILT_STANDALONE)
    514   # Generate a list of CMake library targets so that other CMake projects can
    515   # link against them. LLVM calls its version of this file LLVMExports.cmake, but
    516   # the usual CMake convention seems to be ${Project}Targets.cmake.
    517   set(CLANG_INSTALL_PACKAGE_DIR share/clang/cmake)
    518   set(clang_cmake_builddir "${CMAKE_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}")
    519   get_property(CLANG_EXPORTS GLOBAL PROPERTY CLANG_EXPORTS)
    520   export(TARGETS ${CLANG_EXPORTS} FILE ${clang_cmake_builddir}/ClangTargets.cmake)
    521 
    522   # Install a <prefix>/share/clang/cmake/ClangConfig.cmake file so that
    523   # find_package(Clang) works. Install the target list with it.
    524   install(FILES
    525     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/ClangConfig.cmake
    526     ${CLANG_BINARY_DIR}/share/clang/cmake/ClangTargets.cmake
    527     DESTINATION share/clang/cmake)
    528 
    529   # Also copy ClangConfig.cmake to the build directory so that dependent projects
    530   # can build against a build directory of Clang more easily.
    531   configure_file(
    532     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/ClangConfig.cmake
    533     ${CLANG_BINARY_DIR}/share/clang/cmake/ClangConfig.cmake
    534     COPYONLY)
    535 endif ()
    536