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_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning") 30 set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET}) 31 endif() 32endfunction(clang_tablegen) 33 34macro(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} (${BACKEND_PACKAGE_STRING})" 41 PRODUCT_NAME "clang") 42 endif() 43endmacro() 44 45macro(add_clang_subdirectory name) 46 add_llvm_subdirectory(CLANG TOOL ${name}) 47endmacro() 48 49macro(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}) 143endmacro(add_clang_library) 144 145macro(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}) 149endmacro(add_clang_executable) 150 151macro(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 AND LLVM_TOOL_LLVM_DRIVER_BUILD) 157 set(get_obj_args ${ARGN}) 158 list(FILTER get_obj_args EXCLUDE REGEX "^SUPPORT_PLUGINS$") 159 generate_llvm_objects(${name} ${get_obj_args}) 160 add_custom_target(${name} DEPENDS llvm-driver clang-resource-headers) 161 else() 162 add_clang_executable(${name} ${ARGN}) 163 add_dependencies(${name} clang-resource-headers) 164 165 if (CLANG_BUILD_TOOLS) 166 get_target_export_arg(${name} Clang export_to_clangtargets) 167 install(TARGETS ${name} 168 ${export_to_clangtargets} 169 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 170 COMPONENT ${name}) 171 172 if(NOT LLVM_ENABLE_IDE) 173 add_llvm_install_targets(install-${name} 174 DEPENDS ${name} 175 COMPONENT ${name}) 176 endif() 177 set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) 178 endif() 179 endif() 180endmacro() 181 182macro(add_clang_symlink name dest) 183 get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) 184 if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${dest} IN_LIST LLVM_DRIVER_TOOLS) 185 set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_SYMLINKS ${name}) 186 else() 187 llvm_add_tool_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE) 188 # Always generate install targets 189 llvm_install_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE) 190 endif() 191endmacro() 192 193function(clang_target_link_libraries target type) 194 if (TARGET obj.${target}) 195 target_link_libraries(obj.${target} ${ARGN}) 196 endif() 197 198 get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) 199 if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${target} IN_LIST LLVM_DRIVER_TOOLS) 200 set(target llvm-driver) 201 endif() 202 203 if (CLANG_LINK_CLANG_DYLIB) 204 target_link_libraries(${target} ${type} clang-cpp) 205 else() 206 target_link_libraries(${target} ${type} ${ARGN}) 207 endif() 208endfunction() 209