* gnu/packages/cpp.scm (cling): New variable. (llvm-cling): New private variable. (clang-cling): Likewise. * gnu/packages/patches/cling-use-shared-library.patch: New patch. * gnu/local.mk (dist_patch_DATA): Register it.
		
			
				
	
	
		
			329 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			329 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 811f0a575231496318b5e9c9a0ff0ed195b16dc0 Mon Sep 17 00:00:00 2001
 | 
						|
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
 | 
						|
Date: Tue, 7 Sep 2021 16:35:07 -0400
 | 
						|
Subject: [PATCH] build: Allow building Cling using the Clang shared library.
 | 
						|
 | 
						|
The officially supported way to build LLVM/Clang as a shared library
 | 
						|
is via the LLVM_BUILD_LLVM_DYLIB and LLVM_LINK_LLVM_DYLIB CMake
 | 
						|
options (see: https://llvm.org/docs/BuildingADistribution.html).  When
 | 
						|
built this way, the whole of Clang API is exposed as a shared
 | 
						|
library (libclang-cpp.so).
 | 
						|
 | 
						|
* CMakeLists.txt: Query if we're in shared mode via llvm-config, and
 | 
						|
register the result as LLVM_LIB_IS_SHARED.
 | 
						|
[LLVM_LIB_IS_SHARED] <target_link_libraries>: Use the PUBLIC interface of the
 | 
						|
LLVM shared library.
 | 
						|
* lib/Interpreter/CMakeLists.txt [LLVM_LIB_IS_SHARED]: When defined, replace the
 | 
						|
individual Clang components by clang-cpp.
 | 
						|
* lib/MetaProcessor/CMakeLists.txt: Likewise.
 | 
						|
* lib/Utils/CMakeLists.txt: Likewise.
 | 
						|
* tools/Jupyter/CMakeLists.txt: Likewise.
 | 
						|
* tools/driver/CMakeLists.txt: Likewise.
 | 
						|
* tools/libcling/CMakeLists.txt: Likewise.
 | 
						|
---
 | 
						|
 CMakeLists.txt                   | 10 ++++++--
 | 
						|
 lib/Interpreter/CMakeLists.txt   | 40 ++++++++++++++++++--------------
 | 
						|
 lib/MetaProcessor/CMakeLists.txt | 16 +++++++++----
 | 
						|
 lib/Utils/CMakeLists.txt         | 34 +++++++++++++++------------
 | 
						|
 tools/Jupyter/CMakeLists.txt     | 11 ++++++++-
 | 
						|
 tools/driver/CMakeLists.txt      | 16 +++----------
 | 
						|
 tools/libcling/CMakeLists.txt    | 38 +++++++++++++++---------------
 | 
						|
 7 files changed, 93 insertions(+), 72 deletions(-)
 | 
						|
 | 
						|
diff --git a/CMakeLists.txt b/CMakeLists.txt
 | 
						|
index 65b14b27..888f7ee9 100644
 | 
						|
--- a/CMakeLists.txt
 | 
						|
+++ b/CMakeLists.txt
 | 
						|
@@ -23,6 +23,7 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
 | 
						|
       "--libdir"
 | 
						|
       "--includedir"
 | 
						|
       "--prefix"
 | 
						|
+      "--shared-mode"
 | 
						|
       "--src-root")
 | 
						|
     execute_process(
 | 
						|
       COMMAND ${CONFIG_COMMAND}
 | 
						|
@@ -47,7 +48,8 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
 | 
						|
   list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
 | 
						|
   list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
 | 
						|
   list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
 | 
						|
-  list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR)
 | 
						|
+  list(GET CONFIG_OUTPUT 5 LLVM_LIB_IS_SHARED)
 | 
						|
+  list(GET CONFIG_OUTPUT 6 MAIN_SRC_DIR)
 | 
						|
 
 | 
						|
   if(NOT MSVC_IDE)
 | 
						|
     set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
 | 
						|
@@ -427,7 +429,11 @@ macro(add_cling_library name)
 | 
						|
   endif()
 | 
						|
 
 | 
						|
   if(TARGET ${name})
 | 
						|
-    target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
 | 
						|
+      if(LLVM_LIB_IS_SHARED)
 | 
						|
+          target_link_libraries(${name} PUBLIC LLVM)
 | 
						|
+      else()
 | 
						|
+          target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
 | 
						|
+      endif()
 | 
						|
 
 | 
						|
     if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libcling")
 | 
						|
       install(TARGETS ${name}
 | 
						|
diff --git a/lib/Interpreter/CMakeLists.txt b/lib/Interpreter/CMakeLists.txt
 | 
						|
index 921c773c..af65c020 100644
 | 
						|
--- a/lib/Interpreter/CMakeLists.txt
 | 
						|
+++ b/lib/Interpreter/CMakeLists.txt
 | 
						|
@@ -6,22 +6,28 @@
 | 
						|
 # LICENSE.TXT for details.
 | 
						|
 #------------------------------------------------------------------------------
 | 
						|
 
 | 
						|
-set(LIBS
 | 
						|
-  clingUtils
 | 
						|
-  clangCodeGen
 | 
						|
-  clangDriver
 | 
						|
-  clangFrontend
 | 
						|
-  clangParse
 | 
						|
-  clangSema
 | 
						|
-  clangAnalysis
 | 
						|
-  clangEdit
 | 
						|
-  clangRewrite
 | 
						|
-  clangRewriteFrontend
 | 
						|
-  clangSerialization
 | 
						|
-  clangAST
 | 
						|
-  clangBasic
 | 
						|
-  clangLex
 | 
						|
-)
 | 
						|
+if (LLVM_LIB_IS_SHARED)
 | 
						|
+    set(LIBS
 | 
						|
+        clang-cpp
 | 
						|
+        clingUtils)
 | 
						|
+else()
 | 
						|
+    set(LIBS
 | 
						|
+        clingUtils
 | 
						|
+        clangCodeGen
 | 
						|
+        clangDriver
 | 
						|
+        clangFrontend
 | 
						|
+        clangParse
 | 
						|
+        clangSema
 | 
						|
+        clangAnalysis
 | 
						|
+        clangEdit
 | 
						|
+        clangRewrite
 | 
						|
+        clangRewriteFrontend
 | 
						|
+        clangSerialization
 | 
						|
+        clangAST
 | 
						|
+        clangBasic
 | 
						|
+        clangLex
 | 
						|
+        )
 | 
						|
+endif()
 | 
						|
 
 | 
						|
 set(LLVM_LINK_COMPONENTS
 | 
						|
   analysis
 | 
						|
@@ -369,4 +375,4 @@ if ((NOT builtin_llvm) AND builtin_clang)
 | 
						|
   get_property(P SOURCE TransactionUnloader.cpp PROPERTY INCLUDE_DIRECTORIES)
 | 
						|
   list(INSERT P 0 ${FixInclude})
 | 
						|
   set_property(SOURCE TransactionUnloader.cpp PROPERTY INCLUDE_DIRECTORIES "${P}")
 | 
						|
-endif()
 | 
						|
\ No newline at end of file
 | 
						|
+endif()
 | 
						|
diff --git a/lib/MetaProcessor/CMakeLists.txt b/lib/MetaProcessor/CMakeLists.txt
 | 
						|
index e753dca3..5f4641bb 100644
 | 
						|
--- a/lib/MetaProcessor/CMakeLists.txt
 | 
						|
+++ b/lib/MetaProcessor/CMakeLists.txt
 | 
						|
@@ -10,7 +10,16 @@ set( LLVM_LINK_COMPONENTS
 | 
						|
   core
 | 
						|
   support
 | 
						|
   binaryformat
 | 
						|
-)
 | 
						|
+  )
 | 
						|
+
 | 
						|
+if (LLVM_LIB_IS_SHARED)
 | 
						|
+    set(LIBS clang-cpp)
 | 
						|
+else()
 | 
						|
+    set(LIBS
 | 
						|
+        clangLex
 | 
						|
+        clangAST
 | 
						|
+        clangBasic)
 | 
						|
+endif()
 | 
						|
 
 | 
						|
 add_cling_library(clingMetaProcessor OBJECT
 | 
						|
   Display.cpp
 | 
						|
@@ -21,10 +30,7 @@ add_cling_library(clingMetaProcessor OBJECT
 | 
						|
   MetaSema.cpp
 | 
						|
 
 | 
						|
   LINK_LIBS
 | 
						|
-  clangLex
 | 
						|
-  clangAST
 | 
						|
-  clangBasic
 | 
						|
-
 | 
						|
+  ${LIBS}
 | 
						|
   clingInterpreter
 | 
						|
   clingUtils
 | 
						|
 )
 | 
						|
diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt
 | 
						|
index 327c9fff..fbe4bd87 100644
 | 
						|
--- a/lib/Utils/CMakeLists.txt
 | 
						|
+++ b/lib/Utils/CMakeLists.txt
 | 
						|
@@ -26,21 +26,25 @@ set(LLVM_LINK_COMPONENTS
 | 
						|
   ${LLVM_TARGETS_TO_BUILD}
 | 
						|
 )
 | 
						|
 
 | 
						|
-set(LIBS
 | 
						|
-  clangCodeGen
 | 
						|
-  clangDriver
 | 
						|
-  clangFrontend
 | 
						|
-  clangParse
 | 
						|
-  clangSema
 | 
						|
-  clangAnalysis
 | 
						|
-  clangEdit
 | 
						|
-  clangRewrite
 | 
						|
-  clangRewriteFrontend
 | 
						|
-  clangSerialization
 | 
						|
-  clangAST
 | 
						|
-  clangBasic
 | 
						|
-  clangLex
 | 
						|
-)
 | 
						|
+if (LLVM_LIB_IS_SHARED)
 | 
						|
+    set(LIBS clang-cpp)
 | 
						|
+else()
 | 
						|
+    set(LIBS
 | 
						|
+        clangCodeGen
 | 
						|
+        clangDriver
 | 
						|
+        clangFrontend
 | 
						|
+        clangParse
 | 
						|
+        clangSema
 | 
						|
+        clangAnalysis
 | 
						|
+        clangEdit
 | 
						|
+        clangRewrite
 | 
						|
+        clangRewriteFrontend
 | 
						|
+        clangSerialization
 | 
						|
+        clangAST
 | 
						|
+        clangBasic
 | 
						|
+        clangLex
 | 
						|
+        )
 | 
						|
+endif()
 | 
						|
 
 | 
						|
 find_library(DL_LIBRARY_PATH dl)
 | 
						|
 if (DL_LIBRARY_PATH)
 | 
						|
diff --git a/tools/Jupyter/CMakeLists.txt b/tools/Jupyter/CMakeLists.txt
 | 
						|
index aad5f3f7..8b4ac36f 100644
 | 
						|
--- a/tools/Jupyter/CMakeLists.txt
 | 
						|
+++ b/tools/Jupyter/CMakeLists.txt
 | 
						|
@@ -39,6 +39,14 @@ else()
 | 
						|
    endif()
 | 
						|
 endif()
 | 
						|
 
 | 
						|
+if (LLVM_LIB_IS_SHARED)
 | 
						|
+    set(LIBS
 | 
						|
+        clang-cpp
 | 
						|
+        clingUserInterface
 | 
						|
+        clingMetaProcessor
 | 
						|
+        ${INTERPRETER}
 | 
						|
+        clingUtils)
 | 
						|
+else()
 | 
						|
 set(LIBS
 | 
						|
         clangAST
 | 
						|
         clangBasic
 | 
						|
@@ -54,7 +62,8 @@ set(LIBS
 | 
						|
         clingMetaProcessor
 | 
						|
         ${INTERPRETER}
 | 
						|
         clingUtils
 | 
						|
-    )
 | 
						|
+        )
 | 
						|
+endif()
 | 
						|
 
 | 
						|
 if( LLVM_ENABLE_PIC )
 | 
						|
     set(ENABLE_SHARED SHARED)
 | 
						|
diff --git a/tools/driver/CMakeLists.txt b/tools/driver/CMakeLists.txt
 | 
						|
index 1968b97f..5ed53fb7 100644
 | 
						|
--- a/tools/driver/CMakeLists.txt
 | 
						|
+++ b/tools/driver/CMakeLists.txt
 | 
						|
@@ -9,23 +9,13 @@
 | 
						|
 # Keep symbols for JIT resolution
 | 
						|
 set(LLVM_NO_DEAD_STRIP 1)
 | 
						|
 
 | 
						|
-if(BUILD_SHARED_LIBS)
 | 
						|
-  set(LIBS
 | 
						|
-    LLVMSupport
 | 
						|
-
 | 
						|
-    clangFrontendTool
 | 
						|
-
 | 
						|
-    clingInterpreter
 | 
						|
-    clingMetaProcessor
 | 
						|
-    clingUserInterface
 | 
						|
-    clingUtils
 | 
						|
-  )
 | 
						|
+if(LLVM_LIB_IS_SHARED)
 | 
						|
+  set(LIBS clang-cpp clingUserInterface)
 | 
						|
   add_cling_executable(cling
 | 
						|
     cling.cpp
 | 
						|
   )
 | 
						|
 else()
 | 
						|
   set(LIBS
 | 
						|
-    LLVMSupport
 | 
						|
 
 | 
						|
     clangASTMatchers
 | 
						|
     clangFrontendTool
 | 
						|
@@ -38,7 +28,7 @@ else()
 | 
						|
     $<TARGET_OBJECTS:obj.clingMetaProcessor>
 | 
						|
     $<TARGET_OBJECTS:obj.clingUtils>
 | 
						|
   )
 | 
						|
-endif(BUILD_SHARED_LIBS)
 | 
						|
+endif(LLVM_LIB_IS_SHARED)
 | 
						|
 
 | 
						|
 set_target_properties(cling
 | 
						|
   PROPERTIES ENABLE_EXPORTS 1)
 | 
						|
diff --git a/tools/libcling/CMakeLists.txt b/tools/libcling/CMakeLists.txt
 | 
						|
index 143d3bdb..ba000d44 100644
 | 
						|
--- a/tools/libcling/CMakeLists.txt
 | 
						|
+++ b/tools/libcling/CMakeLists.txt
 | 
						|
@@ -10,21 +10,25 @@ set(SOURCES
 | 
						|
   ADDITIONAL_HEADERS
 | 
						|
   )
 | 
						|
 
 | 
						|
-set(LIBS
 | 
						|
-  clangAnalysis
 | 
						|
-  clangDriver
 | 
						|
-  clangFrontend
 | 
						|
-  clangParse
 | 
						|
-  clangSema
 | 
						|
-  clangAST
 | 
						|
-  clangLex
 | 
						|
-  clangSerialization
 | 
						|
-  clangCodeGen
 | 
						|
-  clangBasic
 | 
						|
-  clangEdit
 | 
						|
-
 | 
						|
-  clingUtils
 | 
						|
-)
 | 
						|
+if (LLVM_LIB_IS_SHARED)
 | 
						|
+    set(LIBS clang-cpp)
 | 
						|
+else()
 | 
						|
+    set(LIBS
 | 
						|
+        clangAnalysis
 | 
						|
+        clangDriver
 | 
						|
+        clangFrontend
 | 
						|
+        clangParse
 | 
						|
+        clangSema
 | 
						|
+        clangAST
 | 
						|
+        clangLex
 | 
						|
+        clangSerialization
 | 
						|
+        clangCodeGen
 | 
						|
+        clangBasic
 | 
						|
+        clangEdit
 | 
						|
+
 | 
						|
+        clingUtils
 | 
						|
+        )
 | 
						|
+endif()
 | 
						|
 
 | 
						|
 set( LLVM_LINK_COMPONENTS
 | 
						|
   analysis
 | 
						|
@@ -63,10 +67,6 @@ option(LIBCLING_BUILD_STATIC
 | 
						|
 #  set(LLVM_EXPORTED_SYMBOL_FILE)
 | 
						|
 #endif()
 | 
						|
 
 | 
						|
-if( LLVM_ENABLE_PIC )
 | 
						|
-  set(ENABLE_SHARED SHARED)
 | 
						|
-endif()
 | 
						|
-
 | 
						|
 if((NOT LLVM_ENABLE_PIC OR LIBCLING_BUILD_STATIC) AND NOT WIN32)
 | 
						|
   set(ENABLE_STATIC STATIC)
 | 
						|
 endif()
 | 
						|
-- 
 | 
						|
2.33.0
 | 
						|
 |