1include(LLVMDistributionSupport)
2
3function(clang_tablegen)
4  # Syntax:
5  # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file
6  # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]
7  #
8  # Generates a custom command for invoking tblgen as
9  #
10  # tblgen source-file -o=output-file tablegen-arg ...
11  #
12  # and, if cmake-target-name is provided, creates a custom target for
13  # executing the custom command depending on output-file. It is
14  # possible to list more files to depend after DEPENDS.
15
16  cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN})
17
18  if( NOT CTG_SOURCE )
19    message(FATAL_ERROR "SOURCE source-file required by clang_tablegen")
20  endif()
21
22  set( CLANG_TABLEGEN_ARGUMENTS "" )
23  set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} )
24  tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS} ${CLANG_TABLEGEN_ARGUMENTS})
25
26  if(CTG_TARGET)
27    add_public_tablegen_target(${CTG_TARGET})
28    set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning")
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} (${BACKEND_PACKAGE_STRING})"
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)
100      # The Xcode generator doesn't handle object libraries correctly.
101      list(APPEND LIBTYPE OBJECT)
102    endif()
103    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
104  endif()
105  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
106
107  set(libs ${name})
108  if(ARG_SHARED AND ARG_STATIC)
109    list(APPEND libs ${name}_static)
110  endif()
111
112  foreach(lib ${libs})
113    if(TARGET ${lib})
114      target_link_libraries(${lib} INTERFACE ${LLVM_COMMON_LIBS})
115
116      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
117        get_target_export_arg(${name} Clang export_to_clangtargets UMBRELLA clang-libraries)
118        install(TARGETS ${lib}
119          COMPONENT ${lib}
120          ${export_to_clangtargets}
121          LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
122          ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
123          RUNTIME DESTINATION bin)
124
125        if (NOT LLVM_ENABLE_IDE)
126          add_llvm_install_targets(install-${lib}
127                                   DEPENDS ${lib}
128                                   COMPONENT ${lib})
129        endif()
130
131        set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${lib})
132      endif()
133      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${lib})
134    else()
135      # Add empty "phony" target
136      add_custom_target(${lib})
137    endif()
138  endforeach()
139
140  set_target_properties(${name} PROPERTIES FOLDER "Clang libraries")
141  set_clang_windows_version_resource_properties(${name})
142endmacro(add_clang_library)
143
144macro(add_clang_executable name)
145  add_llvm_executable( ${name} ${ARGN} )
146  set_target_properties(${name} PROPERTIES FOLDER "Clang executables")
147  set_clang_windows_version_resource_properties(${name})
148endmacro(add_clang_executable)
149
150macro(add_clang_tool name)
151  if (NOT CLANG_BUILD_TOOLS)
152    set(EXCLUDE_FROM_ALL ON)
153  endif()
154
155  add_clang_executable(${name} ${ARGN})
156  add_dependencies(${name} clang-resource-headers)
157
158  if (CLANG_BUILD_TOOLS)
159    get_target_export_arg(${name} Clang export_to_clangtargets)
160    install(TARGETS ${name}
161      ${export_to_clangtargets}
162      RUNTIME DESTINATION bin
163      COMPONENT ${name})
164
165    if(NOT LLVM_ENABLE_IDE)
166      add_llvm_install_targets(install-${name}
167                               DEPENDS ${name}
168                               COMPONENT ${name})
169    endif()
170    set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
171  endif()
172endmacro()
173
174macro(add_clang_symlink name dest)
175  add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
176  # Always generate install targets
177  llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
178endmacro()
179
180function(clang_target_link_libraries target type)
181  if (CLANG_LINK_CLANG_DYLIB)
182    target_link_libraries(${target} ${type} clang-cpp)
183  else()
184    target_link_libraries(${target} ${type} ${ARGN})
185  endif()
186
187endfunction()
188