# This file will recurse into all subdirectories that contain CMakeLists.txt
# Setting variables that match the pattern LLVM_TOOL_{NAME}_BUILD to Off will
# prevent traversing into a directory.
#
# The only tools that need to be explicitly added are ones that have explicit
# ordering requirements.

# Iterates all the subdirectories to create CMake options to enable/disable
# traversing each directory.
create_llvm_tool_options()

# Build polly before the tools: the tools link against polly when
# LINK_POLLY_INTO_TOOLS is set.
if(WITH_POLLY)
  add_llvm_external_project(polly)
else()
  set(LLVM_TOOL_POLLY_BUILD Off)
endif()

if(NOT LLVM_BUILD_LLVM_DYLIB )
  set(LLVM_TOOL_LLVM_SHLIB_BUILD Off)
endif()

if(NOT LLVM_USE_INTEL_JITEVENTS )
  set(LLVM_TOOL_LLVM_JITLISTENER_BUILD Off)
endif()

if(CYGWIN OR NOT LLVM_ENABLE_PIC)
  set(LLVM_TOOL_LTO_BUILD Off)
  set(LLVM_TOOL_LLVM_LTO_BUILD Off)
endif()

# Add LTO, llvm-ar, llvm-config, and llvm-profdata before clang, ExternalProject
# requires targets specified in DEPENDS to exist before the call to
# ExternalProject_Add.
add_llvm_tool_subdirectory(lto)
add_llvm_tool_subdirectory(gold)
add_llvm_tool_subdirectory(llvm-ar)
add_llvm_tool_subdirectory(llvm-config)
add_llvm_tool_subdirectory(llvm-lto)
add_llvm_tool_subdirectory(llvm-profdata)

# Projects supported via LLVM_EXTERNAL_*_SOURCE_DIR need to be explicitly
# specified.
add_llvm_external_project(clang)
add_llvm_external_project(llgo)
add_llvm_external_project(lld)
add_llvm_external_project(lldb)

# Automatically add remaining sub-directories containing a 'CMakeLists.txt'
# file as external projects.
add_llvm_implicit_projects()

# Add subprojects specified using LLVM_EXTERNAL_PROJECTS
foreach(p ${LLVM_EXTERNAL_PROJECTS})
  add_llvm_external_project(${p})
endforeach(p)

set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
