91 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			CMake
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			CMake
		
	
	
	
# This file handles building LLVM runtime sub-projects.
 | 
						|
 | 
						|
# Runtimes are different from tools or other drop-in projects because runtimes
 | 
						|
# should be built with the LLVM toolchain from the build directory. This file is
 | 
						|
# a first step to formalizing runtime build interfaces.
 | 
						|
 | 
						|
# In the current state this file only works with compiler-rt, other runtimes
 | 
						|
# will work as the runtime build interface standardizes.
 | 
						|
 | 
						|
# Find all subdirectories containing CMake projects
 | 
						|
file(GLOB entries *)
 | 
						|
foreach(entry ${entries})
 | 
						|
  if(IS_DIRECTORY ${entry} AND EXISTS ${entry}/CMakeLists.txt)
 | 
						|
    list(APPEND runtimes ${entry})
 | 
						|
  endif()
 | 
						|
endforeach()
 | 
						|
 | 
						|
# If this file is acting as a top-level CMake invocation, this code path is
 | 
						|
# triggered by the external project call for the runtimes target below.
 | 
						|
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
 | 
						|
 | 
						|
  cmake_minimum_required(VERSION 3.4.3)
 | 
						|
 | 
						|
  # Add the root project's CMake modules, and the LLVM build's modules to the
 | 
						|
  # CMake module path.
 | 
						|
  list(INSERT CMAKE_MODULE_PATH 0
 | 
						|
    "${CMAKE_CURRENT_SOURCE_DIR}/../cmake"
 | 
						|
    "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules"
 | 
						|
    "${LLVM_BINARY_DIR}/lib/cmake/llvm"
 | 
						|
  )
 | 
						|
 | 
						|
  # LLVMConfig.cmake contains a bunch of CMake variables from the LLVM build.
 | 
						|
  # This file is installed as part of LLVM distributions, so this can be used
 | 
						|
  # either from a build directory or an installed LLVM.
 | 
						|
  include(LLVMConfig)
 | 
						|
 | 
						|
  # Setting these variables will allow the sub-build to put their outputs into
 | 
						|
  # the library and bin directories of the top-level build.
 | 
						|
  set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
 | 
						|
  set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_BINARY_DIR})
 | 
						|
 | 
						|
  foreach(entry ${runtimes})
 | 
						|
    get_filename_component(projName ${entry} NAME)
 | 
						|
 | 
						|
    # TODO: Clean this up as part of an interface standardization
 | 
						|
    string(REPLACE "-" "_" canon_name ${projName})
 | 
						|
    string(TOUPPER ${canon_name} canon_name)
 | 
						|
    # The subdirectories need to treat this as standalone builds
 | 
						|
    set(${canon_name}_STANDALONE_BUILD On)
 | 
						|
 | 
						|
    add_subdirectory(${projName})
 | 
						|
  endforeach()
 | 
						|
 | 
						|
else() # if this is included from LLVM's CMake
 | 
						|
  include(LLVMExternalProjectUtils)
 | 
						|
 | 
						|
  # If compiler-rt is present we need to build the builtin libraries first. This
 | 
						|
  # is required because the other runtimes need the builtin libraries present
 | 
						|
  # before the just-built compiler can pass the configuration tests.
 | 
						|
  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt)
 | 
						|
    llvm_ExternalProject_Add(builtins
 | 
						|
                             ${CMAKE_CURRENT_SOURCE_DIR}/compiler-rt/lib/builtins
 | 
						|
                             PASSTHROUGH_PREFIXES COMPILER_RT
 | 
						|
                             USE_TOOLCHAIN)
 | 
						|
    set(deps builtins)
 | 
						|
  endif()
 | 
						|
 | 
						|
  # We create a list the names of all the runtime projects in all uppercase and
 | 
						|
  # with dashes turned to underscores. This gives us the CMake variable prefixes
 | 
						|
  # for all variables that will apply to runtimes.
 | 
						|
  foreach(entry ${runtimes})
 | 
						|
    get_filename_component(projName ${entry} NAME)
 | 
						|
    string(REPLACE "-" "_" canon_name ${projName})
 | 
						|
    string(TOUPPER ${canon_name} canon_name)
 | 
						|
    list(APPEND prefixes ${canon_name})
 | 
						|
  endforeach()
 | 
						|
 | 
						|
  if(runtimes)
 | 
						|
    # Create a runtimes target that uses this file as its top-level CMake file.
 | 
						|
    # The runtimes target is a configuration of all the runtime libraries
 | 
						|
    # together in a single CMake invocaiton.
 | 
						|
    llvm_ExternalProject_Add(runtimes
 | 
						|
                             ${CMAKE_CURRENT_SOURCE_DIR}
 | 
						|
                             DEPENDS ${deps} llvm-config
 | 
						|
                             # Builtins were built separately above
 | 
						|
                             CMAKE_ARGS -DCOMPILER_RT_BUILD_BUILTINS=Off
 | 
						|
                             PASSTHROUGH_PREFIXES ${prefixes}
 | 
						|
                             USE_TOOLCHAIN)
 | 
						|
  endif()
 | 
						|
endif()
 |