156 lines · plain
1include(AddLLVM)2include(LLVMExternalProjectUtils)3 4 5function(llvm_create_cross_target project_name target_name toolchain buildtype)6 7 if(NOT DEFINED ${project_name}_${target_name}_BUILD)8 set(${project_name}_${target_name}_BUILD9 "${CMAKE_CURRENT_BINARY_DIR}/${target_name}")10 set(${project_name}_${target_name}_BUILD11 ${${project_name}_${target_name}_BUILD} PARENT_SCOPE)12 message(STATUS "Setting native build dir to " ${${project_name}_${target_name}_BUILD})13 endif(NOT DEFINED ${project_name}_${target_name}_BUILD)14 15 if(NOT DEFINED ${project_name}_${target_name}_STAMP)16 set(${project_name}_${target_name}_STAMP17 "${CMAKE_CURRENT_BINARY_DIR}/${target_name}-stamps")18 set(${project_name}_${target_name}_STAMP19 ${${project_name}_${target_name}_STAMP} PARENT_SCOPE)20 message(STATUS "Setting native stamp dir to " ${${project_name}_${target_name}_STAMP})21 endif(NOT DEFINED ${project_name}_${target_name}_STAMP)22 23 if (EXISTS ${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake)24 set(CROSS_TOOLCHAIN_FLAGS_INIT25 -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\")26 elseif (NOT CMAKE_CROSSCOMPILING)27 set(CROSS_TOOLCHAIN_FLAGS_INIT28 -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}29 -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}30 )31 endif()32 set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT}33 CACHE STRING "Toolchain configuration for ${target_name}")34 35 # project specific version of the flags up above36 set(CROSS_TOOLCHAIN_FLAGS_${project_name}_${target_name} ""37 CACHE STRING "Toolchain configuration for ${project_name}_${target_name}")38 39 if (buildtype)40 set(build_type_flags "-DCMAKE_BUILD_TYPE=${buildtype}")41 endif()42 if (LLVM_USE_LINKER AND NOT CMAKE_CROSSCOMPILING)43 set(linker_flag "-DLLVM_USE_LINKER=${LLVM_USE_LINKER}")44 endif()45 if (LLVM_EXTERNAL_CLANG_SOURCE_DIR)46 # Propagate LLVM_EXTERNAL_CLANG_SOURCE_DIR so that clang-tblgen can be built47 set(external_clang_dir "-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=${LLVM_EXTERNAL_CLANG_SOURCE_DIR}")48 endif()49 50 add_custom_command(OUTPUT ${${project_name}_${target_name}_BUILD}51 COMMAND ${CMAKE_COMMAND} -E make_directory ${${project_name}_${target_name}_BUILD}52 COMMENT "Creating ${${project_name}_${target_name}_BUILD}...")53 54 add_custom_target(CREATE_${project_name}_${target_name}55 DEPENDS ${${project_name}_${target_name}_BUILD})56 get_subproject_title(subproject_title)57 set_target_properties(CREATE_${project_name}_${target_name} PROPERTIES FOLDER "${subproject_title}/Native")58 59 # Escape semicolons in the targets list so that cmake doesn't expand60 # them to spaces.61 string(REPLACE ";" "$<SEMICOLON>" targets_to_build_arg62 "${LLVM_TARGETS_TO_BUILD}")63 string(REPLACE ";" "$<SEMICOLON>" experimental_targets_to_build_arg64 "${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}")65 66 string(REPLACE ";" "$<SEMICOLON>" llvm_enable_projects_arg67 "${LLVM_ENABLE_PROJECTS}")68 string(REPLACE ";" "$<SEMICOLON>" llvm_external_projects_arg69 "${LLVM_EXTERNAL_PROJECTS}")70 string(REPLACE ";" "$<SEMICOLON>" llvm_enable_runtimes_arg71 "${LLVM_ENABLE_RUNTIMES}")72 73 set(external_project_source_dirs)74 foreach(project ${LLVM_EXTERNAL_PROJECTS})75 canonicalize_tool_name(${project} name)76 list(APPEND external_project_source_dirs77 "-DLLVM_EXTERNAL_${name}_SOURCE_DIR=${LLVM_EXTERNAL_${name}_SOURCE_DIR}")78 endforeach()79 80 if(LLVM_LIBC_GPU_BUILD)81 set(libc_flags -DLLVM_LIBC_GPU_BUILD=ON)82 endif()83 84 add_custom_command(OUTPUT ${${project_name}_${target_name}_BUILD}/CMakeCache.txt85 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"86 "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}"87 "-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}"88 "-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}"89 ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_CURRENT_SOURCE_DIR}90 ${CROSS_TOOLCHAIN_FLAGS_${project_name}_${target_name}}91 -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE92 -DLLVM_TARGETS_TO_BUILD="${targets_to_build_arg}"93 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${experimental_targets_to_build_arg}"94 -DLLVM_DEFAULT_TARGET_TRIPLE="${LLVM_TARGET_TRIPLE}"95 -DLLVM_TARGET_ARCH="${LLVM_TARGET_ARCH}"96 -DLLVM_ENABLE_PROJECTS="${llvm_enable_projects_arg}"97 -DLLVM_EXTERNAL_PROJECTS="${llvm_external_projects_arg}"98 -DLLVM_ENABLE_RUNTIMES="${llvm_enable_runtimes_arg}"99 ${external_project_source_dirs}100 -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN="${LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN}"101 -DLLVM_INCLUDE_BENCHMARKS=OFF102 -DLLVM_INCLUDE_TESTS=OFF103 -DLLVM_TABLEGEN_FLAGS="${LLVM_TABLEGEN_FLAGS}"104 -DPYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}"105 ${build_type_flags} ${linker_flag} ${external_clang_dir} ${libc_flags}106 ${ARGN}107 WORKING_DIRECTORY ${${project_name}_${target_name}_BUILD}108 DEPENDS CREATE_${project_name}_${target_name}109 COMMENT "Configuring ${target_name} ${project_name}...")110 111 add_custom_target(CONFIGURE_${project_name}_${target_name}112 DEPENDS ${${project_name}_${target_name}_BUILD}/CMakeCache.txt)113 get_subproject_title(subproject_title)114 set_target_properties(CONFIGURE_${project_name}_${target_name} PROPERTIES FOLDER "${subproject_title}/Native")115 116endfunction()117 118function(get_native_tool_path target output_path_var)119 if(CMAKE_CONFIGURATION_TYPES)120 set(output_path "${${PROJECT_NAME}_NATIVE_BUILD}/Release/bin/${target}")121 else()122 set(output_path "${${PROJECT_NAME}_NATIVE_BUILD}/bin/${target}")123 endif()124 set(${output_path_var} ${output_path}${LLVM_HOST_EXECUTABLE_SUFFIX} PARENT_SCOPE)125endfunction()126 127# Sets up a native build for a tool, used e.g. for cross-compilation and128# LLVM_OPTIMIZED_TABLEGEN. Always builds in Release.129# - target: The target to build natively130# - output_path_var: A variable name which receives the path to the built target131# - DEPENDS: Any additional dependencies for the target132function(build_native_tool target output_path_var)133 cmake_parse_arguments(ARG "" "" "DEPENDS" ${ARGN})134 135 get_native_tool_path(${target} output_path)136 137 # Make chain of preceding actions138 if(CMAKE_GENERATOR MATCHES "Visual Studio")139 get_property(host_targets GLOBAL PROPERTY ${PROJECT_NAME}_HOST_TARGETS)140 set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME}_HOST_TARGETS ${output_path})141 endif()142 143 llvm_ExternalProject_BuildCmd(build_cmd ${target}144 ${${PROJECT_NAME}_NATIVE_BUILD}145 ${${PROJECT_NAME}_NATIVE_STAMP}146 CONFIGURATION Release)147 add_custom_command(OUTPUT "${output_path}"148 COMMAND ${build_cmd}149 DEPENDS CONFIGURE_${PROJECT_NAME}_NATIVE ${ARG_DEPENDS} ${host_targets}150 WORKING_DIRECTORY "${${PROJECT_NAME}_NATIVE_BUILD}"151 COMMENT "Building native ${target}..."152 USES_TERMINAL153 VERBATIM)154 set(${output_path_var} "${output_path}" PARENT_SCOPE)155endfunction()156