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