blob: b239816c8253928446e2d4bcf9fe205433211dd5 [file] [log] [blame]
Chris Bieneman120bdf82016-06-08 21:22:03 +00001function(llvm_create_cross_target_internal target_name toolchain buildtype)
Chris Bieneman50077412014-09-03 23:21:18 +00002
Chris Bieneman46a65b82015-03-12 17:33:34 +00003 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)
Chris Bieneman50077412014-09-03 23:21:18 +00008
Chris Bieneman46a65b82015-03-12 17:33:34 +00009 if (EXISTS ${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake)
Pavel Labathf5f0fff2017-12-08 09:59:48 +000010 set(CROSS_TOOLCHAIN_FLAGS_INIT
11 -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\")
12 else()
13 set(CROSS_TOOLCHAIN_FLAGS_INIT
14 -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
15 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
16 )
Chris Bieneman46a65b82015-03-12 17:33:34 +000017 endif()
Pavel Labathf5f0fff2017-12-08 09:59:48 +000018 set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT}
19 CACHE STRING "Toolchain configuration for ${target_name}")
Chris Bieneman50077412014-09-03 23:21:18 +000020
Don Hintonaa7d6db2017-12-02 19:12:38 +000021 if (buildtype)
22 set(build_type_flags "-DCMAKE_BUILD_TYPE=${buildtype}")
23 endif()
24 if (LLVM_USE_LINKER AND NOT CMAKE_CROSSCOMPILING)
25 set(linker_flag "-DLLVM_USE_LINKER=${LLVM_USE_LINKER}")
26 endif()
27 if (LLVM_EXTERNAL_CLANG_SOURCE_DIR)
28 # Propagate LLVM_EXTERNAL_CLANG_SOURCE_DIR so that clang-tblgen can be built
29 set(external_clang_dir "-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=${LLVM_EXTERNAL_CLANG_SOURCE_DIR}")
30 endif()
31
Chris Bieneman46a65b82015-03-12 17:33:34 +000032 add_custom_command(OUTPUT ${LLVM_${target_name}_BUILD}
33 COMMAND ${CMAKE_COMMAND} -E make_directory ${LLVM_${target_name}_BUILD}
34 COMMENT "Creating ${LLVM_${target_name}_BUILD}...")
Chris Bieneman50077412014-09-03 23:21:18 +000035
Jonas Hahnfeld5db0ae42017-11-08 14:31:51 +000036 add_custom_target(CREATE_LLVM_${target_name}
37 DEPENDS ${LLVM_${target_name}_BUILD})
38
Justin Bognerb6080762017-12-11 19:53:23 +000039 # Escape semicolons in the targets list so that cmake doesn't expand
40 # them to spaces.
41 string(REPLACE ";" "$<SEMICOLON>" targets_to_build_arg
42 "${LLVM_TARGETS_TO_BUILD}")
Alex Bradburyc35aae32017-12-13 09:02:13 +000043 string(REPLACE ";" "$<SEMICOLON>" experimental_targets_to_build_arg
44 "${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}")
Justin Bognerb6080762017-12-11 19:53:23 +000045
Chris Bieneman46a65b82015-03-12 17:33:34 +000046 add_custom_command(OUTPUT ${LLVM_${target_name}_BUILD}/CMakeCache.txt
47 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
Shoaib Meenai8b1378a2018-01-08 21:52:58 +000048 -DCMAKE_MAKE_PROGRAM="${CMAKE_MAKE_PROGRAM}"
Don Hinton2e004b32017-12-06 15:25:14 +000049 ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_SOURCE_DIR}
50 -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE
Justin Bognerb6080762017-12-11 19:53:23 +000051 -DLLVM_TARGETS_TO_BUILD="${targets_to_build_arg}"
Alex Bradburyc35aae32017-12-13 09:02:13 +000052 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${experimental_targets_to_build_arg}"
Petr Hosekc046a042018-01-08 23:50:59 +000053 -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET_TRIPLE}"
54 -DLLVM_TARGET_ARCH="${LLVM_TARGET_ARCH}"
Don Hintonaa7d6db2017-12-02 19:12:38 +000055 ${build_type_flags} ${linker_flag} ${external_clang_dir}
Chris Bieneman46a65b82015-03-12 17:33:34 +000056 WORKING_DIRECTORY ${LLVM_${target_name}_BUILD}
Jonas Hahnfeld5db0ae42017-11-08 14:31:51 +000057 DEPENDS CREATE_LLVM_${target_name}
Chris Bieneman46a65b82015-03-12 17:33:34 +000058 COMMENT "Configuring ${target_name} LLVM...")
Chris Bieneman50077412014-09-03 23:21:18 +000059
Chris Bieneman46a65b82015-03-12 17:33:34 +000060 add_custom_target(CONFIGURE_LLVM_${target_name}
61 DEPENDS ${LLVM_${target_name}_BUILD}/CMakeCache.txt)
Chris Bieneman50077412014-09-03 23:21:18 +000062
Chris Bieneman46a65b82015-03-12 17:33:34 +000063endfunction()
64
65function(llvm_create_cross_target target_name sysroot)
66 llvm_create_cross_target_internal(${target_name} ${sysroot} ${CMAKE_BUILD_TYPE})
67endfunction()
68
69llvm_create_cross_target_internal(NATIVE "" Release)