xref: /openbsd-src/gnu/llvm/clang/tools/clang-shlib/CMakeLists.txt (revision 7a9b00ce7716f522d49aa36666c74a71cd12203a)
1e5dd7070Spatrick# Building libclang-cpp.so fails if LLVM_ENABLE_PIC=Off
2e5dd7070Spatrickif (NOT LLVM_ENABLE_PIC)
3e5dd7070Spatrick  return()
4e5dd7070Spatrickendif()
5e5dd7070Spatrick
6e5dd7070Spatrickget_property(clang_libs GLOBAL PROPERTY CLANG_STATIC_LIBS)
7e5dd7070Spatrick
8e5dd7070Spatrickforeach (lib ${clang_libs})
9e5dd7070Spatrick  if(XCODE)
10e5dd7070Spatrick    # Xcode doesn't support object libraries, so we have to trick it into
11e5dd7070Spatrick    # linking the static libraries instead.
12e5dd7070Spatrick    list(APPEND _DEPS "-force_load" ${lib})
13e5dd7070Spatrick  else()
14e5dd7070Spatrick    list(APPEND _OBJECTS $<TARGET_OBJECTS:obj.${lib}>)
15e5dd7070Spatrick  endif()
16ec727ea7Spatrick  if (BUILD_SHARED_LIBS)
17ec727ea7Spatrick    # If we are building static libraries, then we don't need to add the static
1812c85518Srobert    # libraries as a dependency, because we are already linking against the
19ec727ea7Spatrick    # individual object files.
20e5dd7070Spatrick    list(APPEND _DEPS $<TARGET_PROPERTY:${lib},INTERFACE_LINK_LIBRARIES>)
21ec727ea7Spatrick  endif()
22e5dd7070Spatrick
23e5dd7070Spatrick  # clang libraries are redundant since we are linking all the individual
24e5dd7070Spatrick  # object files into libclang-cpp.so, so filter them out from _DEPS.
25e5dd7070Spatrick  # This avoids problems with LLVM global data when building with
26e5dd7070Spatrick  # BUILD_SHARED_LIBS=ON
27e5dd7070Spatrick  # FIXME: We could use list(FILTER) with cmake >= 3.6
28e5dd7070Spatrick  # FIXME: With cmake >= 3.15 we could use the generator expression
29e5dd7070Spatrick  # $<FILTER:list,INCLUDE|EXCLUDE,regex>
30e5dd7070Spatrick  get_target_property(interface ${lib} LINK_LIBRARIES)
31e5dd7070Spatrick  if (interface)
32e5dd7070Spatrick    foreach(lib ${interface})
33e5dd7070Spatrick      if (NOT ${lib} MATCHES "^clang")
34e5dd7070Spatrick        list(APPEND _DEPS ${lib})
35e5dd7070Spatrick      endif()
36e5dd7070Spatrick    endforeach()
37e5dd7070Spatrick  endif()
38e5dd7070Spatrickendforeach ()
39e5dd7070Spatrick
40e5dd7070Spatrickif (CLANG_LINK_CLANG_DYLIB)
41e5dd7070Spatrick  set(INSTALL_WITH_TOOLCHAIN INSTALL_WITH_TOOLCHAIN)
42e5dd7070Spatrickendif()
43e5dd7070Spatrick
44e5dd7070Spatrickadd_clang_library(clang-cpp
45e5dd7070Spatrick                  SHARED
46e5dd7070Spatrick                  ${INSTALL_WITH_TOOLCHAIN}
47e5dd7070Spatrick                  clang-shlib.cpp
48e5dd7070Spatrick                  ${_OBJECTS}
49e5dd7070Spatrick                  LINK_LIBS
50e5dd7070Spatrick                  ${_DEPS})
51a9ac8606Spatrick# Optimize function calls for default visibility definitions to avoid PLT and
52a9ac8606Spatrick# reduce dynamic relocations.
53*7a9b00ceSrobertif (NOT APPLE AND NOT MINGW AND ${OPENBSD_LD_IS_LLD})
54a9ac8606Spatrick  target_link_options(clang-cpp PRIVATE LINKER:-Bsymbolic-functions)
55a9ac8606Spatrickendif()
56