1*67e74705SXin Lifunction(clang_tablegen) 2*67e74705SXin Li # Syntax: 3*67e74705SXin Li # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file 4*67e74705SXin Li # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]] 5*67e74705SXin Li # 6*67e74705SXin Li # Generates a custom command for invoking tblgen as 7*67e74705SXin Li # 8*67e74705SXin Li # tblgen source-file -o=output-file tablegen-arg ... 9*67e74705SXin Li # 10*67e74705SXin Li # and, if cmake-target-name is provided, creates a custom target for 11*67e74705SXin Li # executing the custom command depending on output-file. It is 12*67e74705SXin Li # possible to list more files to depend after DEPENDS. 13*67e74705SXin Li 14*67e74705SXin Li cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN}) 15*67e74705SXin Li 16*67e74705SXin Li if( NOT CTG_SOURCE ) 17*67e74705SXin Li message(FATAL_ERROR "SOURCE source-file required by clang_tablegen") 18*67e74705SXin Li endif() 19*67e74705SXin Li 20*67e74705SXin Li set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} ) 21*67e74705SXin Li tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS}) 22*67e74705SXin Li 23*67e74705SXin Li if(CTG_TARGET) 24*67e74705SXin Li add_public_tablegen_target(${CTG_TARGET}) 25*67e74705SXin Li set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning") 26*67e74705SXin Li set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET}) 27*67e74705SXin Li endif() 28*67e74705SXin Liendfunction(clang_tablegen) 29*67e74705SXin Li 30*67e74705SXin Limacro(set_clang_windows_version_resource_properties name) 31*67e74705SXin Li if(DEFINED windows_resource_file) 32*67e74705SXin Li set_windows_version_resource_properties(${name} ${windows_resource_file} 33*67e74705SXin Li VERSION_MAJOR ${CLANG_VERSION_MAJOR} 34*67e74705SXin Li VERSION_MINOR ${CLANG_VERSION_MINOR} 35*67e74705SXin Li VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL} 36*67e74705SXin Li VERSION_STRING "${CLANG_VERSION} (${BACKEND_PACKAGE_STRING})" 37*67e74705SXin Li PRODUCT_NAME "clang") 38*67e74705SXin Li endif() 39*67e74705SXin Liendmacro() 40*67e74705SXin Li 41*67e74705SXin Limacro(add_clang_subdirectory name) 42*67e74705SXin Li add_llvm_subdirectory(CLANG TOOL ${name}) 43*67e74705SXin Liendmacro() 44*67e74705SXin Li 45*67e74705SXin Limacro(add_clang_library name) 46*67e74705SXin Li cmake_parse_arguments(ARG 47*67e74705SXin Li "SHARED" 48*67e74705SXin Li "" 49*67e74705SXin Li "ADDITIONAL_HEADERS" 50*67e74705SXin Li ${ARGN}) 51*67e74705SXin Li set(srcs) 52*67e74705SXin Li if(MSVC_IDE OR XCODE) 53*67e74705SXin Li # Add public headers 54*67e74705SXin Li file(RELATIVE_PATH lib_path 55*67e74705SXin Li ${CLANG_SOURCE_DIR}/lib/ 56*67e74705SXin Li ${CMAKE_CURRENT_SOURCE_DIR} 57*67e74705SXin Li ) 58*67e74705SXin Li if(NOT lib_path MATCHES "^[.][.]") 59*67e74705SXin Li file( GLOB_RECURSE headers 60*67e74705SXin Li ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h 61*67e74705SXin Li ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def 62*67e74705SXin Li ) 63*67e74705SXin Li set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) 64*67e74705SXin Li 65*67e74705SXin Li file( GLOB_RECURSE tds 66*67e74705SXin Li ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td 67*67e74705SXin Li ) 68*67e74705SXin Li source_group("TableGen descriptions" FILES ${tds}) 69*67e74705SXin Li set_source_files_properties(${tds}} PROPERTIES HEADER_FILE_ONLY ON) 70*67e74705SXin Li 71*67e74705SXin Li if(headers OR tds) 72*67e74705SXin Li set(srcs ${headers} ${tds}) 73*67e74705SXin Li endif() 74*67e74705SXin Li endif() 75*67e74705SXin Li endif(MSVC_IDE OR XCODE) 76*67e74705SXin Li if(srcs OR ARG_ADDITIONAL_HEADERS) 77*67e74705SXin Li set(srcs 78*67e74705SXin Li ADDITIONAL_HEADERS 79*67e74705SXin Li ${srcs} 80*67e74705SXin Li ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args. 81*67e74705SXin Li ) 82*67e74705SXin Li endif() 83*67e74705SXin Li if(ARG_SHARED) 84*67e74705SXin Li set(ARG_ENABLE_SHARED SHARED) 85*67e74705SXin Li endif() 86*67e74705SXin Li llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) 87*67e74705SXin Li 88*67e74705SXin Li if(TARGET ${name}) 89*67e74705SXin Li target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS}) 90*67e74705SXin Li 91*67e74705SXin Li if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libclang") 92*67e74705SXin Li install(TARGETS ${name} 93*67e74705SXin Li COMPONENT ${name} 94*67e74705SXin Li EXPORT ClangTargets 95*67e74705SXin Li LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 96*67e74705SXin Li ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} 97*67e74705SXin Li RUNTIME DESTINATION bin) 98*67e74705SXin Li 99*67e74705SXin Li if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) 100*67e74705SXin Li add_custom_target(install-${name} 101*67e74705SXin Li DEPENDS ${name} 102*67e74705SXin Li COMMAND "${CMAKE_COMMAND}" 103*67e74705SXin Li -DCMAKE_INSTALL_COMPONENT=${name} 104*67e74705SXin Li -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 105*67e74705SXin Li endif() 106*67e74705SXin Li endif() 107*67e74705SXin Li set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) 108*67e74705SXin Li else() 109*67e74705SXin Li # Add empty "phony" target 110*67e74705SXin Li add_custom_target(${name}) 111*67e74705SXin Li endif() 112*67e74705SXin Li 113*67e74705SXin Li set_target_properties(${name} PROPERTIES FOLDER "Clang libraries") 114*67e74705SXin Li set_clang_windows_version_resource_properties(${name}) 115*67e74705SXin Liendmacro(add_clang_library) 116*67e74705SXin Li 117*67e74705SXin Limacro(add_clang_executable name) 118*67e74705SXin Li add_llvm_executable( ${name} ${ARGN} ) 119*67e74705SXin Li set_target_properties(${name} PROPERTIES FOLDER "Clang executables") 120*67e74705SXin Li set_clang_windows_version_resource_properties(${name}) 121*67e74705SXin Liendmacro(add_clang_executable) 122*67e74705SXin Li 123*67e74705SXin Limacro(add_clang_tool name) 124*67e74705SXin Li if (NOT CLANG_BUILD_TOOLS) 125*67e74705SXin Li set(EXCLUDE_FROM_ALL ON) 126*67e74705SXin Li endif() 127*67e74705SXin Li 128*67e74705SXin Li add_clang_executable(${name} ${ARGN}) 129*67e74705SXin Li 130*67e74705SXin Li if (CLANG_BUILD_TOOLS) 131*67e74705SXin Li install(TARGETS ${name} 132*67e74705SXin Li RUNTIME DESTINATION bin 133*67e74705SXin Li COMPONENT ${name}) 134*67e74705SXin Li 135*67e74705SXin Li if(NOT CMAKE_CONFIGURATION_TYPES) 136*67e74705SXin Li add_custom_target(install-${name} 137*67e74705SXin Li DEPENDS ${name} 138*67e74705SXin Li COMMAND "${CMAKE_COMMAND}" 139*67e74705SXin Li -DCMAKE_INSTALL_COMPONENT=${name} 140*67e74705SXin Li -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 141*67e74705SXin Li endif() 142*67e74705SXin Li endif() 143*67e74705SXin Liendmacro() 144*67e74705SXin Li 145*67e74705SXin Limacro(add_clang_symlink name dest) 146*67e74705SXin Li add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) 147*67e74705SXin Li # Always generate install targets 148*67e74705SXin Li llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) 149*67e74705SXin Liendmacro() 150