1set( LLVM_LINK_COMPONENTS
2  ${LLVM_TARGETS_TO_BUILD}
3  Analysis
4  CodeGen
5  Core
6  IPO
7  AggressiveInstCombine
8  InstCombine
9  Instrumentation
10  MC
11  MCParser
12  ObjCARCOpts
13  Option
14  ScalarOpts
15  Support
16  TargetParser
17  TransformUtils
18  Vectorize
19  )
20
21# Support plugins.
22if(CLANG_PLUGIN_SUPPORT)
23  set(support_plugins SUPPORT_PLUGINS)
24endif()
25
26add_clang_tool(clang
27  driver.cpp
28  cc1_main.cpp
29  cc1as_main.cpp
30  cc1gen_reproducer_main.cpp
31
32  DEPENDS
33  intrinsics_gen
34  ${support_plugins}
35  GENERATE_DRIVER
36  )
37
38clang_target_link_libraries(clang
39  PRIVATE
40  clangBasic
41  clangCodeGen
42  clangDriver
43  clangFrontend
44  clangFrontendTool
45  clangSerialization
46  )
47
48if(WIN32 AND NOT CYGWIN)
49  # Prevent versioning if the buildhost is targeting for Win32.
50else()
51  set_target_properties(clang PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})
52endif()
53
54# Support plugins.
55if(CLANG_PLUGIN_SUPPORT)
56  export_executable_symbols_for_plugins(clang)
57endif()
58
59add_dependencies(clang clang-resource-headers)
60
61if(NOT CLANG_LINKS_TO_CREATE)
62  set(CLANG_LINKS_TO_CREATE clang++ clang-cl clang-cpp)
63endif()
64
65if (CLANG_ENABLE_HLSL)
66  set(HLSL_LINK clang-dxc)
67endif()
68
69foreach(link ${CLANG_LINKS_TO_CREATE} ${HLSL_LINK})
70  add_clang_symlink(${link} clang)
71endforeach()
72
73# Configure plist creation for OS X.
74set (TOOL_INFO_PLIST "Info.plist" CACHE STRING "Plist name")
75if (APPLE)
76  if (CLANG_VENDOR)
77    set(TOOL_INFO_NAME "${CLANG_VENDOR} clang")
78  else()
79    set(TOOL_INFO_NAME "clang")
80  endif()
81
82  set(TOOL_INFO_UTI "${CLANG_VENDOR_UTI}")
83  set(TOOL_INFO_VERSION "${CLANG_VERSION}")
84  set(TOOL_INFO_BUILD_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
85
86  set(TOOL_INFO_PLIST_OUT "${CMAKE_CURRENT_BINARY_DIR}/${TOOL_INFO_PLIST}")
87  target_link_libraries(clang
88    PRIVATE
89    "-Wl,-sectcreate,__TEXT,__info_plist,\"${TOOL_INFO_PLIST_OUT}\"")
90  configure_file("${TOOL_INFO_PLIST}.in" "${TOOL_INFO_PLIST_OUT}" @ONLY)
91
92  set(TOOL_INFO_UTI)
93  set(TOOL_INFO_NAME)
94  set(TOOL_INFO_VERSION)
95  set(TOOL_INFO_BUILD_VERSION)
96endif()
97
98if(CLANG_ORDER_FILE AND
99    (LLVM_LINKER_IS_LD64 OR LLVM_LINKER_IS_GOLD OR LLVM_LINKER_IS_LLD))
100  include(LLVMCheckLinkerFlag)
101
102  if (LLVM_LINKER_IS_LD64 OR (LLVM_LINKER_IS_LLD AND APPLE))
103    set(LINKER_ORDER_FILE_OPTION "-Wl,-order_file,${CLANG_ORDER_FILE}")
104  elseif (LLVM_LINKER_IS_GOLD)
105    set(LINKER_ORDER_FILE_OPTION "-Wl,--section-ordering-file,${CLANG_ORDER_FILE}")
106  elseif (LLVM_LINKER_IS_LLD)
107    set(LINKER_ORDER_FILE_OPTION "-Wl,--symbol-ordering-file,${CLANG_ORDER_FILE}")
108  endif()
109
110  # This is a test to ensure the actual order file works with the linker.
111  llvm_check_linker_flag(CXX ${LINKER_ORDER_FILE_OPTION} LINKER_ORDER_FILE_WORKS)
112
113  # Passing an empty order file disables some linker layout optimizations.
114  # To work around this and enable workflows for re-linking when the order file
115  # changes we check during configuration if the file is empty, and make it a
116  # configuration dependency.
117  file(READ ${CLANG_ORDER_FILE} ORDER_FILE LIMIT 20)
118  if("${ORDER_FILE}" STREQUAL "\n")
119    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CLANG_ORDER_FILE})
120  elseif(LINKER_ORDER_FILE_WORKS)
121    target_link_libraries(clang PRIVATE ${LINKER_ORDER_FILE_OPTION})
122    set_target_properties(clang PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})
123  endif()
124endif()
125