• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1include(GNUInstallDirs)
2include(LLVMDistributionSupport)
3
4function(clang_tablegen)
5  # Syntax:
6  # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file
7  # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]
8  #
9  # Generates a custom command for invoking tblgen as
10  #
11  # tblgen source-file -o=output-file tablegen-arg ...
12  #
13  # and, if cmake-target-name is provided, creates a custom target for
14  # executing the custom command depending on output-file. It is
15  # possible to list more files to depend after DEPENDS.
16
17  cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN})
18
19  if( NOT CTG_SOURCE )
20    message(FATAL_ERROR "SOURCE source-file required by clang_tablegen")
21  endif()
22
23  set( CLANG_TABLEGEN_ARGUMENTS "" )
24  set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} )
25  tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS} ${CLANG_TABLEGEN_ARGUMENTS})
26
27  if(CTG_TARGET)
28    add_public_tablegen_target(${CTG_TARGET})
29    set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET})
30  endif()
31endfunction(clang_tablegen)
32
33macro(set_clang_windows_version_resource_properties name)
34  if(DEFINED windows_resource_file)
35    set_windows_version_resource_properties(${name} ${windows_resource_file}
36      VERSION_MAJOR ${CLANG_VERSION_MAJOR}
37      VERSION_MINOR ${CLANG_VERSION_MINOR}
38      VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL}
39      VERSION_STRING "${CLANG_VERSION}"
40      PRODUCT_NAME "clang")
41  endif()
42endmacro()
43
44macro(add_clang_subdirectory name)
45  add_llvm_subdirectory(CLANG TOOL ${name})
46endmacro()
47
48macro(add_clang_library name)
49  cmake_parse_arguments(ARG
50    "SHARED;STATIC;INSTALL_WITH_TOOLCHAIN"
51    ""
52    "ADDITIONAL_HEADERS"
53    ${ARGN})
54  set(srcs)
55  if(MSVC_IDE OR XCODE)
56    # Add public headers
57    file(RELATIVE_PATH lib_path
58      ${CLANG_SOURCE_DIR}/lib/
59      ${CMAKE_CURRENT_SOURCE_DIR}
60    )
61    if(NOT lib_path MATCHES "^[.][.]")
62      file( GLOB_RECURSE headers
63        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h
64        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def
65      )
66      set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
67
68      file( GLOB_RECURSE tds
69        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td
70      )
71      source_group("TableGen descriptions" FILES ${tds})
72      set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)
73
74      if(headers OR tds)
75        set(srcs ${headers} ${tds})
76      endif()
77    endif()
78  endif(MSVC_IDE OR XCODE)
79  if(srcs OR ARG_ADDITIONAL_HEADERS)
80    set(srcs
81      ADDITIONAL_HEADERS
82      ${srcs}
83      ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args.
84      )
85  endif()
86
87  if(ARG_SHARED AND ARG_STATIC)
88    set(LIBTYPE SHARED STATIC)
89  elseif(ARG_SHARED)
90    set(LIBTYPE SHARED)
91  else()
92    # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
93    # so we need to handle it here.
94    if(BUILD_SHARED_LIBS)
95      set(LIBTYPE SHARED)
96    else()
97      set(LIBTYPE STATIC)
98    endif()
99    if(NOT XCODE AND NOT MSVC_IDE)
100      # The Xcode generator doesn't handle object libraries correctly.
101      # The Visual Studio CMake generator does handle object libraries
102      # correctly, but it is preferable to list the libraries with their
103      # source files (instead of the object files and the source files in
104      # a separate target in the "Object Libraries" folder)
105      list(APPEND LIBTYPE OBJECT)
106    endif()
107    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
108  endif()
109  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
110
111  set(libs ${name})
112  if(ARG_SHARED AND ARG_STATIC)
113    list(APPEND libs ${name}_static)
114  endif()
115
116  foreach(lib ${libs})
117    if(TARGET ${lib})
118      target_link_libraries(${lib} INTERFACE ${LLVM_COMMON_LIBS})
119
120      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
121        get_target_export_arg(${name} Clang export_to_clangtargets UMBRELLA clang-libraries)
122        install(TARGETS ${lib}
123          COMPONENT ${lib}
124          ${export_to_clangtargets}
125          LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
126          ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
127          RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
128
129        if (NOT LLVM_ENABLE_IDE)
130          add_llvm_install_targets(install-${lib}
131                                   DEPENDS ${lib}
132                                   COMPONENT ${lib})
133        endif()
134
135        set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${lib})
136      endif()
137      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${lib})
138    else()
139      # Add empty "phony" target
140      add_custom_target(${lib})
141    endif()
142  endforeach()
143
144  set_clang_windows_version_resource_properties(${name})
145endmacro(add_clang_library)
146
147macro(add_clang_executable name)
148  add_llvm_executable( ${name} ${ARGN} )
149  set_clang_windows_version_resource_properties(${name})
150  set_target_properties(${name} PROPERTIES XCODE_GENERATE_SCHEME ON)
151endmacro(add_clang_executable)
152
153macro(add_clang_tool name)
154  cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})
155  if (NOT CLANG_BUILD_TOOLS)
156    set(EXCLUDE_FROM_ALL ON)
157  endif()
158  if(ARG_GENERATE_DRIVER
159     AND LLVM_TOOL_LLVM_DRIVER_BUILD
160     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
161    )
162    set(get_obj_args ${ARGN})
163    list(FILTER get_obj_args EXCLUDE REGEX "^SUPPORT_PLUGINS$")
164    generate_llvm_objects(${name} ${get_obj_args})
165    add_custom_target(${name} DEPENDS llvm-driver clang-resource-headers)
166  else()
167    add_clang_executable(${name} ${ARGN})
168    add_dependencies(${name} clang-resource-headers)
169
170    if (CLANG_BUILD_TOOLS)
171      get_target_export_arg(${name} Clang export_to_clangtargets)
172      install(TARGETS ${name}
173        ${export_to_clangtargets}
174        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
175        COMPONENT ${name})
176
177      if(NOT LLVM_ENABLE_IDE)
178        add_llvm_install_targets(install-${name}
179                                 DEPENDS ${name}
180                                 COMPONENT ${name})
181      endif()
182      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
183    endif()
184  endif()
185  set_target_properties(${name} PROPERTIES XCODE_GENERATE_SCHEME ON)
186endmacro()
187
188macro(add_clang_symlink name dest)
189  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
190  if(LLVM_TOOL_LLVM_DRIVER_BUILD
191     AND ${dest} IN_LIST LLVM_DRIVER_TOOLS
192     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${dest} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
193    )
194    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${dest} ${name})
195  else()
196    llvm_add_tool_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)
197    # Always generate install targets
198    llvm_install_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)
199  endif()
200endmacro()
201
202function(clang_target_link_libraries target type)
203  if (TARGET obj.${target})
204    target_link_libraries(obj.${target} ${ARGN})
205  endif()
206
207  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
208  if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${target} IN_LIST LLVM_DRIVER_TOOLS)
209    set(target llvm-driver)
210  endif()
211
212  if (CLANG_LINK_CLANG_DYLIB)
213    target_link_libraries(${target} ${type} clang-cpp)
214  else()
215    target_link_libraries(${target} ${type} ${ARGN})
216  endif()
217endfunction()
218