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() |