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}" 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 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() 183endmacro() 184 185macro(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() 197endmacro() 198 199function(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() 214endfunction() 215