CrossCompile.cmake 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. include(AddLLVM)
  2. include(LLVMExternalProjectUtils)
  3. function(llvm_create_cross_target project_name target_name toolchain buildtype)
  4. if(NOT DEFINED ${project_name}_${target_name}_BUILD)
  5. set(${project_name}_${target_name}_BUILD
  6. "${CMAKE_BINARY_DIR}/${target_name}")
  7. set(${project_name}_${target_name}_BUILD
  8. ${${project_name}_${target_name}_BUILD} PARENT_SCOPE)
  9. message(STATUS "Setting native build dir to " ${${project_name}_${target_name}_BUILD})
  10. endif(NOT DEFINED ${project_name}_${target_name}_BUILD)
  11. if (EXISTS ${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake)
  12. set(CROSS_TOOLCHAIN_FLAGS_INIT
  13. -DCMAKE_TOOLCHAIN_FILE=\"${LLVM_MAIN_SRC_DIR}/cmake/platforms/${toolchain}.cmake\")
  14. else()
  15. set(CROSS_TOOLCHAIN_FLAGS_INIT
  16. -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
  17. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
  18. )
  19. endif()
  20. set(CROSS_TOOLCHAIN_FLAGS_${target_name} ${CROSS_TOOLCHAIN_FLAGS_INIT}
  21. CACHE STRING "Toolchain configuration for ${target_name}")
  22. # project specific version of the flags up above
  23. set(CROSS_TOOLCHAIN_FLAGS_${project_name}_${target_name} ""
  24. CACHE STRING "Toolchain configuration for ${Pproject_name}_${target_name}")
  25. if (buildtype)
  26. set(build_type_flags "-DCMAKE_BUILD_TYPE=${buildtype}")
  27. endif()
  28. if (LLVM_USE_LINKER AND NOT CMAKE_CROSSCOMPILING)
  29. set(linker_flag "-DLLVM_USE_LINKER=${LLVM_USE_LINKER}")
  30. endif()
  31. if (LLVM_EXTERNAL_CLANG_SOURCE_DIR)
  32. # Propagate LLVM_EXTERNAL_CLANG_SOURCE_DIR so that clang-tblgen can be built
  33. set(external_clang_dir "-DLLVM_EXTERNAL_CLANG_SOURCE_DIR=${LLVM_EXTERNAL_CLANG_SOURCE_DIR}")
  34. endif()
  35. add_custom_command(OUTPUT ${${project_name}_${target_name}_BUILD}
  36. COMMAND ${CMAKE_COMMAND} -E make_directory ${${project_name}_${target_name}_BUILD}
  37. COMMENT "Creating ${${project_name}_${target_name}_BUILD}...")
  38. add_custom_target(CREATE_${project_name}_${target_name}
  39. DEPENDS ${${project_name}_${target_name}_BUILD})
  40. # Escape semicolons in the targets list so that cmake doesn't expand
  41. # them to spaces.
  42. string(REPLACE ";" "$<SEMICOLON>" targets_to_build_arg
  43. "${LLVM_TARGETS_TO_BUILD}")
  44. string(REPLACE ";" "$<SEMICOLON>" experimental_targets_to_build_arg
  45. "${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}")
  46. string(REPLACE ";" "$<SEMICOLON>" llvm_enable_projects_arg
  47. "${LLVM_ENABLE_PROJECTS}")
  48. string(REPLACE ";" "$<SEMICOLON>" llvm_external_projects_arg
  49. "${LLVM_EXTERNAL_PROJECTS}")
  50. set(external_project_source_dirs)
  51. foreach(project ${LLVM_EXTERNAL_PROJECTS})
  52. canonicalize_tool_name(${project} name)
  53. list(APPEND external_project_source_dirs
  54. "-DLLVM_EXTERNAL_${name}_SOURCE_DIR=${LLVM_EXTERNAL_${name}_SOURCE_DIR}")
  55. endforeach()
  56. add_custom_command(OUTPUT ${${project_name}_${target_name}_BUILD}/CMakeCache.txt
  57. COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
  58. -DCMAKE_MAKE_PROGRAM="${CMAKE_MAKE_PROGRAM}"
  59. ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_SOURCE_DIR}
  60. ${CROSS_TOOLCHAIN_FLAGS_${project_name}_${target_name}}
  61. -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE
  62. -DLLVM_TARGETS_TO_BUILD="${targets_to_build_arg}"
  63. -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${experimental_targets_to_build_arg}"
  64. -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET_TRIPLE}"
  65. -DLLVM_TARGET_ARCH="${LLVM_TARGET_ARCH}"
  66. -DLLVM_ENABLE_PROJECTS="${llvm_enable_projects_arg}"
  67. -DLLVM_EXTERNAL_PROJECTS="${llvm_external_projects_arg}"
  68. ${external_project_source_dirs}
  69. -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN="${LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN}"
  70. ${build_type_flags} ${linker_flag} ${external_clang_dir}
  71. ${ARGN}
  72. WORKING_DIRECTORY ${${project_name}_${target_name}_BUILD}
  73. DEPENDS CREATE_${project_name}_${target_name}
  74. COMMENT "Configuring ${target_name} ${project_name}...")
  75. add_custom_target(CONFIGURE_${project_name}_${target_name}
  76. DEPENDS ${${project_name}_${target_name}_BUILD}/CMakeCache.txt)
  77. endfunction()
  78. # Sets up a native build for a tool, used e.g. for cross-compilation and
  79. # LLVM_OPTIMIZED_TABLEGEN. Always builds in Release.
  80. # - target: The target to build natively
  81. # - output_path_var: A variable name which receives the path to the built target
  82. # - DEPENDS: Any additional dependencies for the target
  83. function(build_native_tool target output_path_var)
  84. cmake_parse_arguments(ARG "" "" "DEPENDS" ${ARGN})
  85. if(CMAKE_CONFIGURATION_TYPES)
  86. set(output_path "${${CMAKE_PROJECT_NAME}_NATIVE_BUILD}/Release/bin/${target}")
  87. else()
  88. set(output_path "${${CMAKE_PROJECT_NAME}_NATIVE_BUILD}/bin/${target}")
  89. endif()
  90. llvm_ExternalProject_BuildCmd(build_cmd ${target} ${${CMAKE_PROJECT_NAME}_NATIVE_BUILD}
  91. CONFIGURATION Release)
  92. add_custom_command(OUTPUT "${output_path}"
  93. COMMAND ${build_cmd}
  94. DEPENDS CONFIGURE_${CMAKE_PROJECT_NAME}_NATIVE ${ARG_DEPENDS}
  95. WORKING_DIRECTORY "${${CMAKE_PROJECT_NAME}_NATIVE_BUILD}"
  96. COMMENT "Building native ${target}..."
  97. USES_TERMINAL)
  98. set(${output_path_var} "${output_path}" PARENT_SCOPE)
  99. endfunction()