xref: /openbsd-src/gnu/llvm/clang/cmake/modules/AddClang.cmake (revision 12c855180aad702bbcca06e0398d774beeafb155)
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