Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
include(GNUInstallDirs)
2
include(LLVMDistributionSupport)
3
 
4
function(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_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning")
30
    set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET})
31
  endif()
32
endfunction(clang_tablegen)
33
 
34
macro(set_clang_windows_version_resource_properties name)
35
  if(DEFINED windows_resource_file)
36
    set_windows_version_resource_properties(${name} ${windows_resource_file}
37
      VERSION_MAJOR ${CLANG_VERSION_MAJOR}
38
      VERSION_MINOR ${CLANG_VERSION_MINOR}
39
      VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL}
40
      VERSION_STRING "${CLANG_VERSION}"
41
      PRODUCT_NAME "clang")
42
  endif()
43
endmacro()
44
 
45
macro(add_clang_subdirectory name)
46
  add_llvm_subdirectory(CLANG TOOL ${name})
47
endmacro()
48
 
49
macro(add_clang_library name)
50
  cmake_parse_arguments(ARG
51
    "SHARED;STATIC;INSTALL_WITH_TOOLCHAIN"
52
    ""
53
    "ADDITIONAL_HEADERS"
54
    ${ARGN})
55
  set(srcs)
56
  if(MSVC_IDE OR XCODE)
57
    # Add public headers
58
    file(RELATIVE_PATH lib_path
59
      ${CLANG_SOURCE_DIR}/lib/
60
      ${CMAKE_CURRENT_SOURCE_DIR}
61
    )
62
    if(NOT lib_path MATCHES "^[.][.]")
63
      file( GLOB_RECURSE headers
64
        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h
65
        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def
66
      )
67
      set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
68
 
69
      file( GLOB_RECURSE tds
70
        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td
71
      )
72
      source_group("TableGen descriptions" FILES ${tds})
73
      set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)
74
 
75
      if(headers OR tds)
76
        set(srcs ${headers} ${tds})
77
      endif()
78
    endif()
79
  endif(MSVC_IDE OR XCODE)
80
  if(srcs OR ARG_ADDITIONAL_HEADERS)
81
    set(srcs
82
      ADDITIONAL_HEADERS
83
      ${srcs}
84
      ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args.
85
      )
86
  endif()
87
 
88
  if(ARG_SHARED AND ARG_STATIC)
89
    set(LIBTYPE SHARED STATIC)
90
  elseif(ARG_SHARED)
91
    set(LIBTYPE SHARED)
92
  else()
93
    # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
94
    # so we need to handle it here.
95
    if(BUILD_SHARED_LIBS)
96
      set(LIBTYPE SHARED)
97
    else()
98
      set(LIBTYPE STATIC)
99
    endif()
100
    if(NOT XCODE)
101
      # The Xcode generator doesn't handle object libraries correctly.
102
      list(APPEND LIBTYPE OBJECT)
103
    endif()
104
    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
105
  endif()
106
  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
107
 
108
  set(libs ${name})
109
  if(ARG_SHARED AND ARG_STATIC)
110
    list(APPEND libs ${name}_static)
111
  endif()
112
 
113
  foreach(lib ${libs})
114
    if(TARGET ${lib})
115
      target_link_libraries(${lib} INTERFACE ${LLVM_COMMON_LIBS})
116
 
117
      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
118
        get_target_export_arg(${name} Clang export_to_clangtargets UMBRELLA clang-libraries)
119
        install(TARGETS ${lib}
120
          COMPONENT ${lib}
121
          ${export_to_clangtargets}
122
          LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
123
          ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
124
          RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
125
 
126
        if (NOT LLVM_ENABLE_IDE)
127
          add_llvm_install_targets(install-${lib}
128
                                   DEPENDS ${lib}
129
                                   COMPONENT ${lib})
130
        endif()
131
 
132
        set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${lib})
133
      endif()
134
      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${lib})
135
    else()
136
      # Add empty "phony" target
137
      add_custom_target(${lib})
138
    endif()
139
  endforeach()
140
 
141
  set_target_properties(${name} PROPERTIES FOLDER "Clang libraries")
142
  set_clang_windows_version_resource_properties(${name})
143
endmacro(add_clang_library)
144
 
145
macro(add_clang_executable name)
146
  add_llvm_executable( ${name} ${ARGN} )
147
  set_target_properties(${name} PROPERTIES FOLDER "Clang executables")
148
  set_clang_windows_version_resource_properties(${name})
149
endmacro(add_clang_executable)
150
 
151
macro(add_clang_tool name)
152
  cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})
153
  if (NOT CLANG_BUILD_TOOLS)
154
    set(EXCLUDE_FROM_ALL ON)
155
  endif()
156
  if(ARG_GENERATE_DRIVER
157
     AND LLVM_TOOL_LLVM_DRIVER_BUILD
158
     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
159
    )
160
    set(get_obj_args ${ARGN})
161
    list(FILTER get_obj_args EXCLUDE REGEX "^SUPPORT_PLUGINS$")
162
    generate_llvm_objects(${name} ${get_obj_args})
163
    add_custom_target(${name} DEPENDS llvm-driver clang-resource-headers)
164
  else()
165
    add_clang_executable(${name} ${ARGN})
166
    add_dependencies(${name} clang-resource-headers)
167
 
168
    if (CLANG_BUILD_TOOLS)
169
      get_target_export_arg(${name} Clang export_to_clangtargets)
170
      install(TARGETS ${name}
171
        ${export_to_clangtargets}
172
        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
173
        COMPONENT ${name})
174
 
175
      if(NOT LLVM_ENABLE_IDE)
176
        add_llvm_install_targets(install-${name}
177
                                 DEPENDS ${name}
178
                                 COMPONENT ${name})
179
      endif()
180
      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
181
    endif()
182
  endif()
183
endmacro()
184
 
185
macro(add_clang_symlink name dest)
186
  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
187
  if(LLVM_TOOL_LLVM_DRIVER_BUILD
188
     AND ${dest} IN_LIST LLVM_DRIVER_TOOLS
189
     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${dest} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)
190
    )
191
    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${dest} ${name})
192
  else()
193
    llvm_add_tool_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)
194
    # Always generate install targets
195
    llvm_install_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)
196
  endif()
197
endmacro()
198
 
199
function(clang_target_link_libraries target type)
200
  if (TARGET obj.${target})
201
    target_link_libraries(obj.${target} ${ARGN})
202
  endif()
203
 
204
  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
205
  if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${target} IN_LIST LLVM_DRIVER_TOOLS)
206
    set(target llvm-driver)
207
  endif()
208
 
209
  if (CLANG_LINK_CLANG_DYLIB)
210
    target_link_libraries(${target} ${type} clang-cpp)
211
  else()
212
    target_link_libraries(${target} ${type} ${ARGN})
213
  endif()
214
endfunction()