CMakeLists.txt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. set(LLVM_LINK_COMPONENTS
  2. Core
  3. ExecutionEngine
  4. MC
  5. MCJIT
  6. Object
  7. OrcJit
  8. Option
  9. RuntimeDyld
  10. Support
  11. native
  12. )
  13. add_clang_executable(clang-interpreter
  14. main.cpp
  15. )
  16. add_dependencies(clang-interpreter
  17. clang-resource-headers
  18. )
  19. clang_target_link_libraries(clang-interpreter
  20. PRIVATE
  21. clangBasic
  22. clangCodeGen
  23. clangDriver
  24. clangFrontend
  25. clangSerialization
  26. )
  27. export_executable_symbols(clang-interpreter)
  28. if (MSVC)
  29. # Is this a CMake bug that even with export_executable_symbols, Windows
  30. # needs to explictly export the type_info vtable
  31. set_property(TARGET clang-interpreter
  32. APPEND_STRING PROPERTY LINK_FLAGS " /EXPORT:??_7type_info@@6B@")
  33. endif()
  34. function(clang_enable_exceptions TARGET)
  35. # Really have to jump through hoops to enable exception handling independent
  36. # of how LLVM is being built.
  37. if (NOT LLVM_REQUIRES_EH AND NOT LLVM_REQUIRES_RTTI)
  38. if (MSVC)
  39. # /EHs to allow throwing from extern "C"
  40. set(excptnExceptions_ON "/D _HAS_EXCEPTIONS=1 /EHs /wd4714")
  41. set(excptnExceptions_OFF "/D _HAS_EXCEPTIONS=0 /EHs-c-")
  42. set(excptnRTTI_ON "/GR")
  43. set(excptnRTTI_OFF "/GR-")
  44. set(excptnEHRTTIRegEx "(/EHs(-c-?)|_HAS_EXCEPTIONS=(0|1))")
  45. else()
  46. set(excptnExceptions_ON "-fexceptions")
  47. set(excptnExceptions_OFF "-fno-exceptions")
  48. set(excptnRTTI_ON "-frtti")
  49. set(excptnRTTI_OFF "-fno-rtti")
  50. set(excptnEHRTTIRegEx "-f(exceptions|no-exceptions)")
  51. endif()
  52. if (LLVM_REQUIRES_EH)
  53. set(excptnExceptions_DFLT ${excptnExceptions_ON})
  54. else()
  55. set(excptnExceptions_DFLT ${excptnExceptions_OFF})
  56. endif()
  57. if (LLVM_REQUIRES_RTTI)
  58. set(excptnRTTI_DFLT ${excptnRTTI_ON})
  59. else()
  60. set(excptnRTTI_DFLT ${excptnRTTI_OFF})
  61. endif()
  62. # Strip the exception & rtti flags from the target
  63. get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_FLAGS)
  64. string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}")
  65. string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}")
  66. set_property(TARGET ${TARGET} PROPERTY COMPILE_FLAGS "${editedFlags}")
  67. get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS)
  68. string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}")
  69. string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}")
  70. set_property(TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS "${editedFlags}")
  71. # Re-add the exception & rtti flags from LLVM
  72. set_property(SOURCE main.cpp APPEND_STRING PROPERTY COMPILE_FLAGS
  73. " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ")
  74. set_property(SOURCE Manager.cpp APPEND_STRING PROPERTY COMPILE_FLAGS
  75. " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ")
  76. # Invoke with exceptions & rtti
  77. set_property(SOURCE Invoke.cpp APPEND_STRING PROPERTY COMPILE_FLAGS
  78. " ${excptnExceptions_ON} ${excptnRTTI_ON} ")
  79. endif()
  80. endfunction(clang_enable_exceptions)
  81. clang_enable_exceptions(clang-interpreter)