brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.0 KiB · 975798a Raw
482 lines · plain
1include(ExternalProject)2 3# llvm_ExternalProject_BuildCmd(out_var target)4#   Utility function for constructing command lines for external project targets5function(llvm_ExternalProject_BuildCmd out_var target bin_dir stamp_dir)6  cmake_parse_arguments(ARG "" "CONFIGURATION" "" ${ARGN})7  if(NOT ARG_CONFIGURATION)8    set(ARG_CONFIGURATION "$<CONFIG>")9  endif()10  if (CMAKE_GENERATOR MATCHES "Make")11    # Use special command for Makefiles to support parallelism.12    string(JOIN "@" make_cmd "$(MAKE)" "-C" "${bin_dir}" "${target}")13    set(file_lock_script "${LLVM_CMAKE_DIR}/FileLock.cmake")14    set(${out_var} ${CMAKE_COMMAND} "-DLOCK_FILE_PATH=${stamp_dir}/cmake.lock"15                                    "-DCOMMAND=${make_cmd}"16                                    "-P" "${file_lock_script}" PARENT_SCOPE)17  else()18    set(tool_args "${LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS}")19    if(NOT tool_args STREQUAL "")20      string(CONFIGURE "${tool_args}" tool_args @ONLY)21      string(PREPEND tool_args "-- ")22      separate_arguments(tool_args UNIX_COMMAND "${tool_args}")23    endif()24    set(${out_var} ${CMAKE_COMMAND} --build ${bin_dir} --target ${target}25                                    --config ${ARG_CONFIGURATION} ${tool_args} PARENT_SCOPE)26  endif()27endfunction()28 29# is_msvc_triple(out_var triple)30#   Checks whether the passed triple refers to an MSVC environment31function(is_msvc_triple out_var triple)32  if (triple MATCHES ".*-windows-msvc.*")33    set(${out_var} TRUE PARENT_SCOPE)34  else()35    set(${out_var} FALSE PARENT_SCOPE)36  endif()37endfunction()38 39 40# llvm_ExternalProject_Add(name source_dir ...41#   ENABLE_FORTRAN42#     External project requires the Flang compiler43#   USE_TOOLCHAIN44#     Use just-built tools (see TOOLCHAIN_TOOLS)45#   EXCLUDE_FROM_ALL46#     Exclude this project from the all target47#   NO_INSTALL48#     Don't generate install targets for this project49#   ALWAYS_CLEAN50#     Always clean the sub-project before building51#   CMAKE_ARGS arguments...52#     Optional cmake arguments to pass when configuring the project53#   TOOLCHAIN_TOOLS targets...54#     Targets for toolchain tools (defaults to clang;lld)55#   DEPENDS targets...56#     Targets that this project depends on57#   EXTRA_TARGETS targets...58#     Extra targets in the subproject to generate targets for59#   PASSTHROUGH_PREFIXES prefix...60#     Extra variable prefixes (name is always included) to pass down61#   STRIP_TOOL path62#     Use provided strip tool instead of the default one.63#   TARGET_TRIPLE triple64#     Optional target triple to pass to the compiler65#   FOLDER66#     For IDEs, the Folder to put the targets into.67#   )68function(llvm_ExternalProject_Add name source_dir)69  cmake_parse_arguments(ARG70    "ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"71    "SOURCE_DIR;FOLDER"72    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"73    ${ARGN})74  canonicalize_tool_name(${name} nameCanon)75 76  foreach(arg ${ARG_CMAKE_ARGS})77    if(arg MATCHES "^-DCMAKE_SYSTEM_NAME=")78      string(REGEX REPLACE "^-DCMAKE_SYSTEM_NAME=(.*)$" "\\1" _cmake_system_name "${arg}")79    endif()80  endforeach()81 82  # If CMAKE_SYSTEM_NAME is not set explicitly in the arguments passed to us,83  # reflect CMake's own default.84  if (NOT _cmake_system_name)85    set(_cmake_system_name "${CMAKE_HOST_SYSTEM_NAME}")86  endif()87 88  if(NOT ARG_TARGET_TRIPLE)89    set(target_triple ${LLVM_DEFAULT_TARGET_TRIPLE})90  else()91    set(target_triple ${ARG_TARGET_TRIPLE})92  endif()93 94  is_msvc_triple(is_msvc_target "${target_triple}")95 96  if(NOT ARG_TOOLCHAIN_TOOLS)97    set(ARG_TOOLCHAIN_TOOLS clang)98    if (ARG_ENABLE_FORTRAN)99      list(APPEND ARG_TOOLCHAIN_TOOLS flang)100    endif ()101    # AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.102    if(NOT _cmake_system_name STREQUAL "AIX")103      list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)104      if(_cmake_system_name STREQUAL Darwin)105        list(APPEND ARG_TOOLCHAIN_TOOLS llvm-libtool-darwin llvm-lipo)106      elseif(is_msvc_target)107        list(APPEND ARG_TOOLCHAIN_TOOLS llvm-lib llvm-rc)108        if (LLVM_ENABLE_LIBXML2)109          list(APPEND ARG_TOOLCHAIN_TOOLS llvm-mt)110        endif()111      else()112        # TODO: These tools don't fully support Mach-O format yet.113        list(APPEND ARG_TOOLCHAIN_TOOLS llvm-objcopy llvm-strip llvm-readelf)114      endif()115    endif()116  endif()117  foreach(tool ${ARG_TOOLCHAIN_TOOLS})118    if(TARGET ${tool})119      list(APPEND TOOLCHAIN_TOOLS ${tool})120 121      # $<TARGET_FILE:tgt> only works on add_executable or add_library targets122      # The below logic mirrors cmake's own implementation123      get_target_property(target_type "${tool}" TYPE)124      if(NOT target_type STREQUAL "OBJECT_LIBRARY" AND125         NOT target_type STREQUAL "UTILITY" AND126         NOT target_type STREQUAL "GLOBAL_TARGET" AND127         NOT target_type STREQUAL "INTERFACE_LIBRARY")128        list(APPEND TOOLCHAIN_BINS $<TARGET_FILE:${tool}>)129      endif()130 131    endif()132  endforeach()133 134  if(NOT ARG_RUNTIME_LIBRARIES)135    set(ARG_RUNTIME_LIBRARIES compiler-rt libcxx)136  endif()137  foreach(lib ${ARG_RUNTIME_LIBRARIES})138    if(TARGET ${lib})139      list(APPEND RUNTIME_LIBRARIES ${lib})140    endif()141  endforeach()142 143  if(ARG_ALWAYS_CLEAN)144    set(always_clean clean)145  endif()146 147  if(clang IN_LIST TOOLCHAIN_TOOLS)148    set(CLANG_IN_TOOLCHAIN On)149  endif()150 151  if(flang IN_LIST TOOLCHAIN_TOOLS)152    set(FLANG_IN_TOOLCHAIN On)153  endif()154 155  if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)156    list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})157  endif()158 159  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-stamps/)160  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-bins/)161 162  add_custom_target(${name}-clear163    COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}164    COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}165    COMMENT "Clobbering ${name} build and stamp directories"166    USES_TERMINAL167    )168  if (ARG_FOLDER)169    set_target_properties(${name}-clear PROPERTIES FOLDER "${ARG_FOLDER}")170  endif ()171 172  set(DEFAULT_PASSTHROUGH_VARIABLES173    LibEdit_INCLUDE_DIRS174    LibEdit_LIBRARIES175    ZLIB_INCLUDE_DIR176    ZLIB_LIBRARY177    zstd_INCLUDE_DIR178    zstd_LIBRARY179    LIBXML2_LIBRARY180    LIBXML2_INCLUDE_DIR181    CURL_INCLUDE_DIR182    CURL_LIBRARY183    HTTPLIB_INCLUDE_DIR184    HTTPLIB_HEADER_PATH185    Python3_EXECUTABLE186    Python3_LIBRARIES187    Python3_INCLUDE_DIRS188    Python3_RPATH189    )190  foreach(variable ${DEFAULT_PASSTHROUGH_VARIABLES})191    get_property(is_value_set CACHE ${variable} PROPERTY VALUE SET)192    if(${is_value_set})193      get_property(value CACHE ${variable} PROPERTY VALUE)194      list(APPEND CMAKE_CACHE_DEFAULT_ARGS "-D${variable}:STRING=${value}")195    endif()196  endforeach()197 198  # Find all variables that start with a prefix and propagate them through199  get_cmake_property(variableNames VARIABLES)200 201  list(APPEND ARG_PASSTHROUGH_PREFIXES ${nameCanon})202  foreach(prefix ${ARG_PASSTHROUGH_PREFIXES})203    foreach(variableName ${variableNames})204      if(variableName MATCHES "^${prefix}")205        string(REPLACE ";" "|" value "${${variableName}}")206        list(APPEND PASSTHROUGH_VARIABLES207          -D${variableName}=${value})208      endif()209    endforeach()210  endforeach()211 212  # Populate the non-project-specific passthrough variables213  foreach(variableName ${LLVM_EXTERNAL_PROJECT_PASSTHROUGH})214    if(DEFINED ${variableName})215      if("${${variableName}}" STREQUAL "")216        set(value "")217      else()218        string(REPLACE ";" "|" value "${${variableName}}")219      endif()220      list(APPEND PASSTHROUGH_VARIABLES221        -D${variableName}=${value})222    endif()223  endforeach()224 225  if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING)226    if(CLANG_IN_TOOLCHAIN)227      if(is_msvc_target)228        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}229                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}230                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})231      else()232        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX}233                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${CMAKE_EXECUTABLE_SUFFIX}234                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX})235      endif()236    endif()237    if(FLANG_IN_TOOLCHAIN)238      list(APPEND compiler_args -DCMAKE_Fortran_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/flang${CMAKE_EXECUTABLE_SUFFIX})239    endif()240    if(lld IN_LIST TOOLCHAIN_TOOLS)241      if(is_msvc_target)242        list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})243      elseif(NOT _cmake_system_name STREQUAL Darwin)244        list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld${CMAKE_EXECUTABLE_SUFFIX})245      endif()246    endif()247    if(llvm-ar IN_LIST TOOLCHAIN_TOOLS)248      if(is_msvc_target)249        list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-lib${CMAKE_EXECUTABLE_SUFFIX})250      else()251        list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar${CMAKE_EXECUTABLE_SUFFIX})252      endif()253    endif()254    if(llvm-libtool-darwin IN_LIST TOOLCHAIN_TOOLS)255      list(APPEND compiler_args -DCMAKE_LIBTOOL=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-libtool-darwin${CMAKE_EXECUTABLE_SUFFIX})256    endif()257    if(llvm-lipo IN_LIST TOOLCHAIN_TOOLS)258      list(APPEND compiler_args -DCMAKE_LIPO=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-lipo${CMAKE_EXECUTABLE_SUFFIX})259    endif()260    if(llvm-ranlib IN_LIST TOOLCHAIN_TOOLS)261      list(APPEND compiler_args -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib${CMAKE_EXECUTABLE_SUFFIX})262    endif()263    if(llvm-nm IN_LIST TOOLCHAIN_TOOLS)264      list(APPEND compiler_args -DCMAKE_NM=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-nm${CMAKE_EXECUTABLE_SUFFIX})265    endif()266    if(llvm-objdump IN_LIST TOOLCHAIN_TOOLS)267      list(APPEND compiler_args -DCMAKE_OBJDUMP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objdump${CMAKE_EXECUTABLE_SUFFIX})268    endif()269    if(llvm-objcopy IN_LIST TOOLCHAIN_TOOLS)270      list(APPEND compiler_args -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy${CMAKE_EXECUTABLE_SUFFIX})271    endif()272    if(llvm-strip IN_LIST TOOLCHAIN_TOOLS AND NOT ARG_STRIP_TOOL)273      list(APPEND compiler_args -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip${CMAKE_EXECUTABLE_SUFFIX})274    endif()275    if(llvm-readelf IN_LIST TOOLCHAIN_TOOLS)276      list(APPEND compiler_args -DCMAKE_READELF=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-readelf${CMAKE_EXECUTABLE_SUFFIX})277    endif()278    if(llvm-mt IN_LIST TOOLCHAIN_TOOLS AND is_msvc_target)279      list(APPEND compiler_args -DCMAKE_MT=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-mt${CMAKE_EXECUTABLE_SUFFIX})280    endif()281    if(llvm-rc IN_LIST TOOLCHAIN_TOOLS AND is_msvc_target)282      list(APPEND compiler_args -DCMAKE_RC_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-rc${CMAKE_EXECUTABLE_SUFFIX})283    endif()284    list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS})285    # Add LLVMgold.so dependency if it is available, as clang may need it for286    # LTO.287    if(CLANG_IN_TOOLCHAIN AND TARGET LLVMgold)288      list(APPEND ARG_DEPENDS LLVMgold)289    endif()290  endif()291 292  if(ARG_STRIP_TOOL)293    list(APPEND compiler_args -DCMAKE_STRIP=${ARG_STRIP_TOOL})294  endif()295 296  add_custom_command(297    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp298    DEPENDS ${ARG_DEPENDS}299    COMMAND ${CMAKE_COMMAND} -E touch ${BINARY_DIR}/CMakeCache.txt300    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_DIR}/${name}-mkdir301    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp302    COMMENT "Clobbering bootstrap build and stamp directories"303    )304 305  add_custom_target(${name}-clobber306    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)307  if (ARG_FOLDER)308    set_target_properties(${name}-clobber PROPERTIES FOLDER "${ARG_FOLDER}")309  endif ()310 311  if(ARG_EXCLUDE_FROM_ALL)312    set(exclude EXCLUDE_FROM_ALL 1)313  endif()314 315  if(CMAKE_SYSROOT)316    set(sysroot_arg -DCMAKE_SYSROOT=${CMAKE_SYSROOT})317  endif()318 319  if(CMAKE_CROSSCOMPILING)320    set(compiler_args -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER}321                      -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}322                      -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}323                      -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER}324                      -DCMAKE_LINKER=${CMAKE_LINKER}325                      -DCMAKE_AR=${CMAKE_AR}326                      -DCMAKE_RANLIB=${CMAKE_RANLIB}327                      -DCMAKE_NM=${CMAKE_NM}328                      -DCMAKE_OBJCOPY=${CMAKE_OBJCOPY}329                      -DCMAKE_OBJDUMP=${CMAKE_OBJDUMP}330                      -DCMAKE_STRIP=${CMAKE_STRIP}331                      -DCMAKE_READELF=${CMAKE_READELF})332    set(llvm_config_path ${LLVM_CONFIG_PATH})333 334    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")335      string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR336             ${PACKAGE_VERSION})337      if(DEFINED CLANG_RESOURCE_DIR AND NOT CLANG_RESOURCE_DIR STREQUAL "")338        set(resource_dir ${LLVM_TOOLS_BINARY_DIR}/${CLANG_RESOURCE_DIR})339      else()340        set(resource_dir "${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION_MAJOR}")341      endif()342      set(flag_types ASM C CXX MODULE_LINKER SHARED_LINKER EXE_LINKER)343      foreach(type ${flag_types})344        set(${type}_flag -DCMAKE_${type}_FLAGS_INIT=-resource-dir=${resource_dir})345      endforeach()346      string(REPLACE ";" "|" flag_string "${flag_types}")347      foreach(arg ${ARG_CMAKE_ARGS})348        if(arg MATCHES "^-DCMAKE_(${flag_string})_FLAGS")349          foreach(type ${flag_types})350            if(arg MATCHES "^-DCMAKE_${type}_FLAGS")351              string(REGEX REPLACE "^-DCMAKE_${type}_FLAGS=(.*)$" "\\1" flag_value "${arg}")352              set(${type}_flag "${${type}_flag} ${flag_value}")353            endif()354          endforeach()355        else()356          list(APPEND cmake_args ${arg})357        endif()358      endforeach()359      foreach(type ${flag_types})360        list(APPEND cmake_args ${${type}_flag})361      endforeach()362    else()363      set(cmake_args ${ARG_CMAKE_ARGS})364    endif()365  else()366    set(llvm_config_path "$<TARGET_FILE:llvm-config>")367    set(cmake_args ${ARG_CMAKE_ARGS})368  endif()369 370  if(ARG_TARGET_TRIPLE)371    list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})372    list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})373    list(APPEND compiler_args -DCMAKE_Fortran_COMPILER_TARGET=${ARG_TARGET_TRIPLE})374    list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})375  endif()376 377  if(CMAKE_VERBOSE_MAKEFILE)378    set(verbose -DCMAKE_VERBOSE_MAKEFILE=ON)379  endif()380 381  ExternalProject_Add(${name}382    DEPENDS ${ARG_DEPENDS} llvm-config383    ${name}-clobber384    PREFIX ${CMAKE_BINARY_DIR}/projects/${name}385    SOURCE_DIR ${source_dir}386    STAMP_DIR ${STAMP_DIR}387    BINARY_DIR ${BINARY_DIR}388    ${exclude}389    CMAKE_ARGS ${${nameCanon}_CMAKE_ARGS}390               --no-warn-unused-cli391               ${compiler_args}392               ${verbose}393               -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}394               ${sysroot_arg}395               -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR}396               -DLLVM_CONFIG_PATH=${llvm_config_path}397               -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR}398               -DLLVM_HOST_TRIPLE=${LLVM_HOST_TRIPLE}399               -DLLVM_HAVE_LINK_VERSION_SCRIPT=${LLVM_HAVE_LINK_VERSION_SCRIPT}400               -DLLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO=${LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO}401               -DLLVM_USE_RELATIVE_PATHS_IN_FILES=${LLVM_USE_RELATIVE_PATHS_IN_FILES}402               -DLLVM_LIT_ARGS=${LLVM_LIT_ARGS}403               -DLLVM_SOURCE_PREFIX=${LLVM_SOURCE_PREFIX}404               -DPACKAGE_VERSION=${PACKAGE_VERSION}405               -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}406               -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}407               -DCMAKE_EXPORT_COMPILE_COMMANDS=1408               ${cmake_args}409               ${PASSTHROUGH_VARIABLES}410    CMAKE_CACHE_DEFAULT_ARGS ${CMAKE_CACHE_DEFAULT_ARGS}411    INSTALL_COMMAND ""412    STEP_TARGETS configure build413    BUILD_ALWAYS 1414    USES_TERMINAL_CONFIGURE 1415    USES_TERMINAL_BUILD 1416    USES_TERMINAL_INSTALL 1417    LIST_SEPARATOR |418    )419  if (ARG_FOLDER)420    set_target_properties(421      ${name} ${name}-clobber ${name}-build ${name}-configure422      PROPERTIES FOLDER "${ARG_FOLDER}"423    )424  endif ()425 426  if(ARG_USE_TOOLCHAIN)427    set(force_deps DEPENDS ${TOOLCHAIN_BINS})428  endif()429 430  llvm_ExternalProject_BuildCmd(run_clean clean ${BINARY_DIR} ${STAMP_DIR})431  ExternalProject_Add_Step(${name} clean432    COMMAND ${run_clean}433    COMMENT "Cleaning ${name}..."434    DEPENDEES configure435    ${force_deps}436    WORKING_DIRECTORY ${BINARY_DIR}437    EXCLUDE_FROM_MAIN 1438    USES_TERMINAL 1439    )440  ExternalProject_Add_StepTargets(${name} clean)441  if (ARG_FOLDER)442    set_target_properties(${name}-clean PROPERTIES FOLDER "${ARG_FOLDER}")443  endif ()444 445  if(ARG_USE_TOOLCHAIN)446    add_dependencies(${name}-clean ${name}-clobber)447    set_target_properties(${name}-clean PROPERTIES448      SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)449  endif()450 451  if(NOT ARG_NO_INSTALL)452    install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_DO_STRIP=\${CMAKE_INSTALL_DO_STRIP} -P ${BINARY_DIR}/cmake_install.cmake\)"453      COMPONENT ${name})454 455    add_llvm_install_targets(install-${name}456                             DEPENDS ${name}457                             COMPONENT ${name})458    if (ARG_FOLDER)459       set_target_properties(install-${name} PROPERTIES FOLDER "${ARG_FOLDER}")460    endif ()461  endif()462 463  # Add top-level targets464  foreach(target ${ARG_EXTRA_TARGETS})465    if(DEFINED ${target})466      set(external_target "${${target}}")467    else()468      set(external_target "${target}")469    endif()470    llvm_ExternalProject_BuildCmd(build_runtime_cmd ${external_target} ${BINARY_DIR} ${STAMP_DIR})471    add_custom_target(${target}472      COMMAND ${build_runtime_cmd}473      DEPENDS ${name}-configure474      WORKING_DIRECTORY ${BINARY_DIR}475      VERBATIM476      USES_TERMINAL)477    if (ARG_FOLDER)478      set_target_properties(${target} PROPERTIES FOLDER "${ARG_FOLDER}")479    endif ()480  endforeach()481endfunction()482