]> granicus.if.org Git - clang/commitdiff
Add Clang shared library with C++ exports
authorChris Bieneman <chris.bieneman@me.com>
Thu, 16 May 2019 22:06:07 +0000 (22:06 +0000)
committerChris Bieneman <chris.bieneman@me.com>
Thu, 16 May 2019 22:06:07 +0000 (22:06 +0000)
Summary:
This patch adds a libClang_shared library on *nix systems which exports the entire C++ API. In order to support this on Windows we should really refactor llvm-shlib and share code between the two.

This also uses a slightly different method for generating the shared library, which I should back-port to llvm-shlib. Instead of linking the static archives and passing linker flags to force loading the whole libraries, this patch creates object libraries for every library (which has no cost in the build system), and link the object libraries.

Reviewers: tstellar, winksaville

Subscribers: mgorny, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D61909

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360946 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/modules/AddClang.cmake
tools/CMakeLists.txt
tools/clang-shlib/CMakeLists.txt [new file with mode: 0644]
tools/clang-shlib/clang-shlib.cpp [new file with mode: 0644]

index 18bac7172b229caa5ca37a73fcabe91620dbbf28..b598f13ff6ff487fc63fc18c77067fc164ee706b 100644 (file)
@@ -81,9 +81,12 @@ macro(add_clang_library name)
       )
   endif()
   if(ARG_SHARED)
-    set(ARG_ENABLE_SHARED SHARED)
+    set(LIBTYPE SHARED)
+  else()
+    set(LIBTYPE STATIC OBJECT)
+    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})
   endif()
-  llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
+  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
 
   if(TARGET ${name})
     target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
index 43dfffe1492e7c83896df18f1f902b78c9ae9708..f5c90ba7834d2db13427fa1543fe963948324e33 100644 (file)
@@ -13,6 +13,9 @@ add_clang_subdirectory(c-index-test)
 
 add_clang_subdirectory(clang-rename)
 add_clang_subdirectory(clang-refactor)
+if(UNIX)
+  add_clang_subdirectory(clang-shlib)
+endif()
 
 if(CLANG_ENABLE_ARCMT)
   add_clang_subdirectory(arcmt-test)
diff --git a/tools/clang-shlib/CMakeLists.txt b/tools/clang-shlib/CMakeLists.txt
new file mode 100644 (file)
index 0000000..733ace3
--- /dev/null
@@ -0,0 +1,13 @@
+get_property(clang_libs GLOBAL PROPERTY CLANG_STATIC_LIBS)
+
+foreach (lib ${clang_libs})
+  list(APPEND _OBJECTS $<TARGET_OBJECTS:obj.${lib}>)
+  list(APPEND _DEPS $<TARGET_PROPERTY:${lib},INTERFACE_LINK_LIBRARIES>)
+endforeach ()
+
+add_clang_library(clang_shared
+                  SHARED
+                  clang-shlib.cpp
+                  ${_OBJECTS}
+                  LINK_LIBS
+                  ${_DEPS})
diff --git a/tools/clang-shlib/clang-shlib.cpp b/tools/clang-shlib/clang-shlib.cpp
new file mode 100644 (file)
index 0000000..0093622
--- /dev/null
@@ -0,0 +1 @@
+// Intentionally empty source file to make CMake happy