xref: /aosp_15_r20/external/clang/cmake/modules/AddClang.cmake (revision 67e74705e28f6214e480b399dd47ea732279e315)
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