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