1function(llvm_create_cross_target_internal target_name toolchain buildtype)
2
3  if(NOT DEFINED LLVM_${target_name}_BUILD)
4    set(LLVM_${target_name}_BUILD "${CMAKE_BINARY_DIR}/${target_name}")
5    set(LLVM_${target_name}_BUILD ${LLVM_${target_name}_BUILD} PARENT_SCOPE)
6    message(STATUS "Setting native build dir to " ${LLVM_${target_name}_BUILD})
7  endif(NOT DEFINED LLVM_${target_name}_BUILD)
8
9  if (EXISTS ${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake)
10    set(CROSS_TOOLCHAIN_FLAGS_${target_name}
11        -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\"
12        CACHE STRING "Toolchain file for ${target_name}")
13  endif()
14
15  add_custom_command(OUTPUT ${LLVM_${target_name}_BUILD}
16    COMMAND ${CMAKE_COMMAND} -E make_directory ${LLVM_${target_name}_BUILD}
17    COMMENT "Creating ${LLVM_${target_name}_BUILD}...")
18
19  add_custom_target(CREATE_LLVM_${target_name}
20                    DEPENDS ${LLVM_${target_name}_BUILD})
21
22  add_custom_command(OUTPUT ${LLVM_${target_name}_BUILD}/CMakeCache.txt
23    COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
24        ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_SOURCE_DIR}
25        -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE
26    WORKING_DIRECTORY ${LLVM_${target_name}_BUILD}
27    DEPENDS CREATE_LLVM_${target_name}
28    COMMENT "Configuring ${target_name} LLVM...")
29
30  add_custom_target(CONFIGURE_LLVM_${target_name}
31                    DEPENDS ${LLVM_${target_name}_BUILD}/CMakeCache.txt)
32
33  set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
34                                      ${LLVM_${target_name}_BUILD})
35
36  if(NOT IS_DIRECTORY ${LLVM_${target_name}_BUILD})
37
38
39    message(STATUS "Configuring ${target_name} build...")
40    execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
41      ${LLVM_${target_name}_BUILD} )
42
43    message(STATUS "Configuring ${target_name} targets...")
44    if (buildtype)
45      set(build_type_flags "-DCMAKE_BUILD_TYPE=${buildtype}")
46    endif()
47	if (LLVM_EXTERNAL_CLANG_SOURCE_DIR)
48	  # Propagate LLVM_EXTERNAL_CLANG_SOURCE_DIR so that clang-tblgen can be built
49	  set(external_clang_dir "-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=${LLVM_EXTERNAL_CLANG_SOURCE_DIR}")
50	endif()
51    execute_process(COMMAND ${CMAKE_COMMAND} ${build_type_flags}
52        -G "${CMAKE_GENERATOR}" -DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS_TO_BUILD}
53        ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_SOURCE_DIR}
54        -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE
55        ${external_clang_dir}
56      WORKING_DIRECTORY ${LLVM_${target_name}_BUILD} )
57  endif(NOT IS_DIRECTORY ${LLVM_${target_name}_BUILD})
58
59endfunction()
60
61function(llvm_create_cross_target target_name sysroot)
62  llvm_create_cross_target_internal(${target_name} ${sysroot} ${CMAKE_BUILD_TYPE})
63endfunction()
64
65llvm_create_cross_target_internal(NATIVE "" Release)
66