llvm-tools.cmake 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  2. set(CLANGPLUSPLUS ${CMAKE_CXX_COMPILER})
  3. message(STATUS "Using ${CLANGPLUSPLUS} for c++ to LLVM IR translation")
  4. else()
  5. find_program(CLANGPLUSPLUS NAMES clang++-12 clang++-14 clang++)
  6. if (CLANGPLUSPLUS MATCHES "CLANGPLUSPLUS-NOTFOUND")
  7. message(SEND_ERROR "clang++ not found")
  8. else()
  9. message(STATUS "Using ${CLANGPLUSPLUS} for c++ to LLVM IR translation")
  10. endif()
  11. endif()
  12. if (CMAKE_C_COMPILER_ID MATCHES "Clang")
  13. set(CLANGC ${CMAKE_C_COMPILER})
  14. message(STATUS "Using ${CLANGC} for c++ to LLVM IR translation")
  15. else()
  16. find_program(CLANGC NAMES clang-12 clang-14 clang)
  17. if (CLANGC MATCHES "CLANGC-NOTFOUND")
  18. message(SEND_ERROR "clang not found")
  19. else()
  20. message(STATUS "Using ${CLANGC} for c to LLVM IR translation")
  21. endif()
  22. endif()
  23. find_program(LLVMLINK NAMES llvm-link-12 llvm-link-14 llvm-link)
  24. if (LLVMLINK MATCHES "LLVMLINK-NOTFOUND")
  25. message(SEND_ERROR "llvm-link not found")
  26. else()
  27. message(STATUS "Using ${LLVMLINK} for LLVM IR linking")
  28. endif()
  29. find_program(LLVMOPT NAMES opt-12 opt-14 opt)
  30. if (LLVMOPT MATCHES "LLVMOPT-NOTFOUND")
  31. message(SEND_ERROR "llvm opt tool not found")
  32. else()
  33. message(STATUS "Using ${LLVMOPT} for LLVM IR optimization")
  34. endif()
  35. find_program(LLVMLLC NAMES llc-12 llc-14 llc)
  36. if (LLVMLLC MATCHES "LLVMLLC-NOTFOUND")
  37. message(SEND_ERROR "llvm llc tool not found")
  38. else()
  39. message(STATUS "Using ${LLVMLLC} for LLVM IR to binary code compilation")
  40. endif()
  41. function(llvm_compile_cxx Tgt Inpt Out Tool UseC)
  42. list(APPEND TARGET_INCLUDES "-I$<JOIN:$<TARGET_PROPERTY:${Tgt},INCLUDE_DIRECTORIES>,$<SEMICOLON>-I>")
  43. list(APPEND TARGET_COMPILE_OPTIONS "'$<JOIN:$<TARGET_GENEX_EVAL:${Tgt},$<TARGET_PROPERTY:${Tgt},COMPILE_OPTIONS>>,'$<SEMICOLON>'>'")
  44. list(APPEND TARGET_COMPILE_DEFINITIONS "'-D$<JOIN:$<TARGET_GENEX_EVAL:${Tgt},$<TARGET_PROPERTY:${Tgt},COMPILE_DEFINITIONS>>,'$<SEMICOLON>'-D>'")
  45. if (${UseC})
  46. set(STD_FLAG "")
  47. separate_arguments(LANG_FLAGS NATIVE_COMMAND ${CMAKE_C_FLAGS})
  48. separate_arguments(FLAGSLIST_DEBUG NATIVE_COMMAND ${CMAKE_C_FLAGS_DEBUG})
  49. separate_arguments(FLAGSLIST_RELEASE NATIVE_COMMAND ${CMAKE_C_FLAGS_RELEASE})
  50. separate_arguments(FLAGSLIST_MINSIZEREL NATIVE_COMMAND ${CMAKE_C_FLAGS_MINSIZEREL})
  51. separate_arguments(FLAGSLIST_RELWITHDEBINFO NATIVE_COMMAND ${CMAKE_C_FLAGS_RELWITHDEBINFO})
  52. else()
  53. get_target_property(TARGET_STANDARD ${Tgt} CXX_STANDARD)
  54. set(STD_FLAG "-std=c++${TARGET_STANDARD}")
  55. separate_arguments(LANG_FLAGS NATIVE_COMMAND ${CMAKE_CXX_FLAGS})
  56. separate_arguments(FLAGSLIST_DEBUG NATIVE_COMMAND ${CMAKE_CXX_FLAGS_DEBUG})
  57. separate_arguments(FLAGSLIST_RELEASE NATIVE_COMMAND ${CMAKE_CXX_FLAGS_RELEASE})
  58. separate_arguments(FLAGSLIST_MINSIZEREL NATIVE_COMMAND ${CMAKE_CXX_FLAGS_MINSIZEREL})
  59. separate_arguments(FLAGSLIST_RELWITHDEBINFO NATIVE_COMMAND ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
  60. endif()
  61. add_custom_command(
  62. OUTPUT ${Out}
  63. COMMAND
  64. ${Tool}
  65. ${TARGET_INCLUDES}
  66. ${LANG_FLAGS}
  67. "$<$<CONFIG:DEBUG>:${FLAGSLIST_DEBUG}>"
  68. "$<$<CONFIG:RELEASE>:${FLAGSLIST_RELEASE}>"
  69. "$<$<CONFIG:MINSIZEREL>:${FLAGSLIST_MINSIZEREL}>"
  70. "$<$<CONFIG:RELWITHDEBINFO>:${FLAGSLIST_RELWITHDEBINFO}>"
  71. ${TARGET_COMPILE_DEFINITIONS}
  72. ${STD_FLAG}
  73. ${TARGET_COMPILE_OPTIONS}
  74. -Wno-unknown-warning-option
  75. -fno-lto
  76. -emit-llvm
  77. -c
  78. ${Inpt}
  79. -o
  80. ${Out}
  81. COMMAND_EXPAND_LISTS
  82. DEPENDS ${Inpt} ${Tool}
  83. )
  84. endfunction()
  85. function(llvm_compile_c Tgt Inpt Out Tool)
  86. llvm_compile_cxx(${Tgt} ${Inpt} ${Out} ${Tool} TRUE)
  87. endfunction()