AddClang.cmake 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. function(clang_tablegen)
  2. # Syntax:
  3. # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file
  4. # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]
  5. #
  6. # Generates a custom command for invoking tblgen as
  7. #
  8. # tblgen source-file -o=output-file tablegen-arg ...
  9. #
  10. # and, if cmake-target-name is provided, creates a custom target for
  11. # executing the custom command depending on output-file. It is
  12. # possible to list more files to depend after DEPENDS.
  13. cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN})
  14. if( NOT CTG_SOURCE )
  15. message(FATAL_ERROR "SOURCE source-file required by clang_tablegen")
  16. endif()
  17. set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} )
  18. tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS})
  19. if(CTG_TARGET)
  20. add_public_tablegen_target(${CTG_TARGET})
  21. set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning")
  22. set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET})
  23. endif()
  24. endfunction(clang_tablegen)
  25. macro(set_clang_windows_version_resource_properties name)
  26. if(DEFINED windows_resource_file)
  27. set_windows_version_resource_properties(${name} ${windows_resource_file}
  28. VERSION_MAJOR ${CLANG_VERSION_MAJOR}
  29. VERSION_MINOR ${CLANG_VERSION_MINOR}
  30. VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL}
  31. VERSION_STRING "${CLANG_VERSION} (${BACKEND_PACKAGE_STRING})"
  32. PRODUCT_NAME "clang")
  33. endif()
  34. endmacro()
  35. macro(add_clang_subdirectory name)
  36. add_llvm_subdirectory(CLANG TOOL ${name})
  37. endmacro()
  38. macro(add_clang_library name)
  39. cmake_parse_arguments(ARG
  40. "SHARED;INSTALL_WITH_TOOLCHAIN"
  41. ""
  42. "ADDITIONAL_HEADERS"
  43. ${ARGN})
  44. set(srcs)
  45. if(MSVC_IDE OR XCODE)
  46. # Add public headers
  47. file(RELATIVE_PATH lib_path
  48. ${CLANG_SOURCE_DIR}/lib/
  49. ${CMAKE_CURRENT_SOURCE_DIR}
  50. )
  51. if(NOT lib_path MATCHES "^[.][.]")
  52. file( GLOB_RECURSE headers
  53. ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h
  54. ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def
  55. )
  56. set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
  57. file( GLOB_RECURSE tds
  58. ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td
  59. )
  60. source_group("TableGen descriptions" FILES ${tds})
  61. set_source_files_properties(${tds}} PROPERTIES HEADER_FILE_ONLY ON)
  62. if(headers OR tds)
  63. set(srcs ${headers} ${tds})
  64. endif()
  65. endif()
  66. endif(MSVC_IDE OR XCODE)
  67. if(srcs OR ARG_ADDITIONAL_HEADERS)
  68. set(srcs
  69. ADDITIONAL_HEADERS
  70. ${srcs}
  71. ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args.
  72. )
  73. endif()
  74. if(ARG_SHARED)
  75. set(LIBTYPE SHARED)
  76. else()
  77. # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
  78. # so we need to handle it here.
  79. if(BUILD_SHARED_LIBS)
  80. set(LIBTYPE SHARED)
  81. else()
  82. set(LIBTYPE STATIC)
  83. endif()
  84. if(NOT XCODE)
  85. # The Xcode generator doesn't handle object libraries correctly.
  86. list(APPEND LIBTYPE OBJECT)
  87. endif()
  88. set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
  89. endif()
  90. llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
  91. if(TARGET ${name})
  92. target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
  93. if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
  94. set(export_to_clangtargets)
  95. if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  96. "clang-libraries" IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  97. NOT LLVM_DISTRIBUTION_COMPONENTS)
  98. set(export_to_clangtargets EXPORT ClangTargets)
  99. set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True)
  100. endif()
  101. install(TARGETS ${name}
  102. COMPONENT ${name}
  103. ${export_to_clangtargets}
  104. LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
  105. ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
  106. RUNTIME DESTINATION bin)
  107. if (NOT LLVM_ENABLE_IDE)
  108. add_llvm_install_targets(install-${name}
  109. DEPENDS ${name}
  110. COMPONENT ${name})
  111. endif()
  112. set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${name})
  113. endif()
  114. set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
  115. else()
  116. # Add empty "phony" target
  117. add_custom_target(${name})
  118. endif()
  119. set_target_properties(${name} PROPERTIES FOLDER "Clang libraries")
  120. set_clang_windows_version_resource_properties(${name})
  121. endmacro(add_clang_library)
  122. macro(add_clang_executable name)
  123. add_llvm_executable( ${name} ${ARGN} )
  124. set_target_properties(${name} PROPERTIES FOLDER "Clang executables")
  125. set_clang_windows_version_resource_properties(${name})
  126. endmacro(add_clang_executable)
  127. macro(add_clang_tool name)
  128. if (NOT CLANG_BUILD_TOOLS)
  129. set(EXCLUDE_FROM_ALL ON)
  130. endif()
  131. add_clang_executable(${name} ${ARGN})
  132. add_dependencies(${name} clang-resource-headers)
  133. if (CLANG_BUILD_TOOLS)
  134. set(export_to_clangtargets)
  135. if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  136. NOT LLVM_DISTRIBUTION_COMPONENTS)
  137. set(export_to_clangtargets EXPORT ClangTargets)
  138. set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True)
  139. endif()
  140. install(TARGETS ${name}
  141. ${export_to_clangtargets}
  142. RUNTIME DESTINATION bin
  143. COMPONENT ${name})
  144. if(NOT LLVM_ENABLE_IDE)
  145. add_llvm_install_targets(install-${name}
  146. DEPENDS ${name}
  147. COMPONENT ${name})
  148. endif()
  149. set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
  150. endif()
  151. endmacro()
  152. macro(add_clang_symlink name dest)
  153. add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
  154. # Always generate install targets
  155. llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
  156. endmacro()
  157. function(clang_target_link_libraries target type)
  158. if (CLANG_LINK_CLANG_DYLIB)
  159. target_link_libraries(${target} ${type} clang-cpp)
  160. else()
  161. target_link_libraries(${target} ${type} ${ARGN})
  162. endif()
  163. endfunction()