1 | function(clang_tablegen) |
2 | # Syntax: |
3 | # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file |
4 | # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]] |
5 | # |
6 | # Generates a custom command for invoking tblgen as |
7 | # |
8 | # tblgen source-file -o=output-file tablegen-arg ... |
9 | # |
10 | # and, if cmake-target-name is provided, creates a custom target for |
11 | # executing the custom command depending on output-file. It is |
12 | # possible to list more files to depend after DEPENDS. |
13 | |
14 | cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN}) |
15 | |
16 | if( NOT CTG_SOURCE ) |
17 | message(FATAL_ERROR "SOURCE source-file required by clang_tablegen") |
18 | endif() |
19 | |
20 | set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} ) |
21 | tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS}) |
22 | |
23 | if(CTG_TARGET) |
24 | add_public_tablegen_target(${CTG_TARGET}) |
25 | set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning") |
26 | set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET}) |
27 | endif() |
28 | endfunction(clang_tablegen) |
29 | |
30 | macro(set_clang_windows_version_resource_properties name) |
31 | if(DEFINED windows_resource_file) |
32 | set_windows_version_resource_properties(${name} ${windows_resource_file} |
33 | VERSION_MAJOR ${CLANG_VERSION_MAJOR} |
34 | VERSION_MINOR ${CLANG_VERSION_MINOR} |
35 | VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL} |
36 | VERSION_STRING "${CLANG_VERSION} (${BACKEND_PACKAGE_STRING})" |
37 | PRODUCT_NAME "clang") |
38 | endif() |
39 | endmacro() |
40 | |
41 | macro(add_clang_subdirectory name) |
42 | add_llvm_subdirectory(CLANG TOOL ${name}) |
43 | endmacro() |
44 | |
45 | macro(add_clang_library name) |
46 | cmake_parse_arguments(ARG |
47 | "SHARED" |
48 | "" |
49 | "ADDITIONAL_HEADERS" |
50 | ${ARGN}) |
51 | set(srcs) |
52 | if(MSVC_IDE OR XCODE) |
53 | # Add public headers |
54 | file(RELATIVE_PATH lib_path |
55 | ${CLANG_SOURCE_DIR}/lib/ |
56 | ${CMAKE_CURRENT_SOURCE_DIR} |
57 | ) |
58 | if(NOT lib_path MATCHES "^[.][.]") |
59 | file( GLOB_RECURSE headers |
60 | ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h |
61 | ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def |
62 | ) |
63 | set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) |
64 | |
65 | file( GLOB_RECURSE tds |
66 | ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td |
67 | ) |
68 | source_group("TableGen descriptions" FILES ${tds}) |
69 | set_source_files_properties(${tds}} PROPERTIES HEADER_FILE_ONLY ON) |
70 | |
71 | if(headers OR tds) |
72 | set(srcs ${headers} ${tds}) |
73 | endif() |
74 | endif() |
75 | endif(MSVC_IDE OR XCODE) |
76 | if(srcs OR ARG_ADDITIONAL_HEADERS) |
77 | set(srcs |
78 | ADDITIONAL_HEADERS |
79 | ${srcs} |
80 | ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args. |
81 | ) |
82 | endif() |
83 | if(ARG_SHARED) |
84 | set(ARG_ENABLE_SHARED SHARED) |
85 | endif() |
86 | llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) |
87 | |
88 | if(TARGET ${name}) |
89 | target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS}) |
90 | |
91 | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libclang") |
92 | set(export_to_clangtargets) |
93 | if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR |
94 | "clang-libraries" IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR |
95 | NOT LLVM_DISTRIBUTION_COMPONENTS) |
96 | set(export_to_clangtargets EXPORT ClangTargets) |
97 | set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True) |
98 | endif() |
99 | |
100 | install(TARGETS ${name} |
101 | COMPONENT ${name} |
102 | ${export_to_clangtargets} |
103 | LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
104 | ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
105 | RUNTIME DESTINATION bin) |
106 | |
107 | if (NOT LLVM_ENABLE_IDE) |
108 | add_llvm_install_targets(install-${name} |
109 | DEPENDS ${name} |
110 | COMPONENT ${name}) |
111 | endif() |
112 | |
113 | set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${name}) |
114 | endif() |
115 | set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) |
116 | else() |
117 | # Add empty "phony" target |
118 | add_custom_target(${name}) |
119 | endif() |
120 | |
121 | set_target_properties(${name} PROPERTIES FOLDER "Clang libraries") |
122 | set_clang_windows_version_resource_properties(${name}) |
123 | endmacro(add_clang_library) |
124 | |
125 | macro(add_clang_executable name) |
126 | add_llvm_executable( ${name} ${ARGN} ) |
127 | set_target_properties(${name} PROPERTIES FOLDER "Clang executables") |
128 | set_clang_windows_version_resource_properties(${name}) |
129 | endmacro(add_clang_executable) |
130 | |
131 | macro(add_clang_tool name) |
132 | if (NOT CLANG_BUILD_TOOLS) |
133 | set(EXCLUDE_FROM_ALL ON) |
134 | endif() |
135 | |
136 | add_clang_executable(${name} ${ARGN}) |
137 | add_dependencies(${name} clang-resource-headers) |
138 | |
139 | if (CLANG_BUILD_TOOLS) |
140 | set(export_to_clangtargets) |
141 | if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR |
142 | NOT LLVM_DISTRIBUTION_COMPONENTS) |
143 | set(export_to_clangtargets EXPORT ClangTargets) |
144 | set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True) |
145 | endif() |
146 | |
147 | install(TARGETS ${name} |
148 | ${export_to_clangtargets} |
149 | RUNTIME DESTINATION bin |
150 | COMPONENT ${name}) |
151 | |
152 | if(NOT LLVM_ENABLE_IDE) |
153 | add_llvm_install_targets(install-${name} |
154 | DEPENDS ${name} |
155 | COMPONENT ${name}) |
156 | endif() |
157 | set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) |
158 | endif() |
159 | endmacro() |
160 | |
161 | macro(add_clang_symlink name dest) |
162 | add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) |
163 | # Always generate install targets |
164 | llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) |
165 | endmacro() |
166 | |