1function(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() 28endfunction(clang_tablegen) 29 30macro(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() 39endmacro() 40 41macro(add_clang_subdirectory name) 42 add_llvm_subdirectory(CLANG TOOL ${name}) 43endmacro() 44 45macro(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 93 if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR 94 NOT LLVM_DISTRIBUTION_COMPONENTS) 95 set(export_to_clangtargets EXPORT ClangTargets) 96 set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True) 97 endif() 98 99 install(TARGETS ${name} 100 COMPONENT ${name} 101 ${export_to_clangtargets} 102 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 103 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} 104 RUNTIME DESTINATION bin) 105 106 if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) 107 add_llvm_install_targets(install-${name} 108 DEPENDS ${name} 109 COMPONENT ${name}) 110 endif() 111 endif() 112 set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) 113 else() 114 # Add empty "phony" target 115 add_custom_target(${name}) 116 endif() 117 118 set_target_properties(${name} PROPERTIES FOLDER "Clang libraries") 119 set_clang_windows_version_resource_properties(${name}) 120endmacro(add_clang_library) 121 122macro(add_clang_executable name) 123 add_llvm_executable( ${name} ${ARGN} ) 124 set_target_properties(${name} PROPERTIES FOLDER "Clang executables") 125 set_clang_windows_version_resource_properties(${name}) 126endmacro(add_clang_executable) 127 128macro(add_clang_tool name) 129 if (NOT CLANG_BUILD_TOOLS) 130 set(EXCLUDE_FROM_ALL ON) 131 endif() 132 133 add_clang_executable(${name} ${ARGN}) 134 135 if (CLANG_BUILD_TOOLS) 136 if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR 137 NOT LLVM_DISTRIBUTION_COMPONENTS) 138 set(export_to_clangtargets EXPORT ClangTargets) 139 set_property(GLOBAL PROPERTY CLANG_HAS_EXPORTS True) 140 endif() 141 142 install(TARGETS ${name} 143 ${export_to_clangtargets} 144 RUNTIME DESTINATION bin 145 COMPONENT ${name}) 146 147 if(NOT CMAKE_CONFIGURATION_TYPES) 148 add_llvm_install_targets(install-${name} 149 DEPENDS ${name} 150 COMPONENT ${name}) 151 endif() 152 set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) 153 endif() 154endmacro() 155 156macro(add_clang_symlink name dest) 157 add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) 158 # Always generate install targets 159 llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) 160endmacro() 161