diff mbox series

[bug#71045,v2] gnu: cling: Update to 1.0.

Message ID 3ef47212eb3ca09bc447110fee7fd726986aa74a.1716747526.git.maxim.cournoyer@gmail.com
State New
Headers show
Series [bug#71045,v2] gnu: cling: Update to 1.0. | expand

Commit Message

Maxim Cournoyer May 26, 2024, 6:20 p.m. UTC
* gnu/packages/llvm.scm (%cling-version): Delete variable.
(llvm-cling): Inherit from llvm-15 and update to version 13-20240318-01.
[source]: Update source URL.  Remove obsolete snippet.  Add patches field.
[outputs]: Delete field.
[arguments]: Likewise.
(clang-cling-runtime): Update to 13-20240318-01.  Inherit from
clang-runtime-13.  Use llvm-cling source.
[phases]: Use gexps.  Add change-directory phase.
(clang-cling): Update to 13-20240318-01.  Inherit from
clang-13.  Use llvm-cling source.
[arguments]: Use gexps.  Add change-directory phase.
(cling): Update to 1.0.
[source]: Update URL.
[phases] {patch-paths}: Adjust patching of the 'getResourceDir' variable.
* gnu/packages/patches/cling-use-shared-library.patch: Rebase patch.
* gnu/packages/patches/clang-cling-13-libc-search-path.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.

Change-Id: I5d1f2c4d36ca226116bc74c2578154f86413f9e9
---
v2:
 - reworked 'cling-use-shared-library.patch' per upstream discussions

 gnu/local.mk                                  |   1 +
 gnu/packages/llvm.scm                         | 268 +++++------
 .../clang-cling-13-libc-search-path.patch     |  96 ++++
 .../patches/cling-use-shared-library.patch    | 418 ++++--------------
 4 files changed, 316 insertions(+), 467 deletions(-)
 create mode 100644 gnu/packages/patches/clang-cling-13-libc-search-path.patch


base-commit: dc8fb5672464b6386f6b4b94723f9b36edc4e625

Comments

Maxim Cournoyer May 30, 2024, 2:06 a.m. UTC | #1
Hi,

Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:

> * gnu/packages/llvm.scm (%cling-version): Delete variable.
> (llvm-cling): Inherit from llvm-15 and update to version 13-20240318-01.
> [source]: Update source URL.  Remove obsolete snippet.  Add patches field.
> [outputs]: Delete field.
> [arguments]: Likewise.
> (clang-cling-runtime): Update to 13-20240318-01.  Inherit from
> clang-runtime-13.  Use llvm-cling source.
> [phases]: Use gexps.  Add change-directory phase.
> (clang-cling): Update to 13-20240318-01.  Inherit from
> clang-13.  Use llvm-cling source.
> [arguments]: Use gexps.  Add change-directory phase.
> (cling): Update to 1.0.
> [source]: Update URL.
> [phases] {patch-paths}: Adjust patching of the 'getResourceDir' variable.
> * gnu/packages/patches/cling-use-shared-library.patch: Rebase patch.
> * gnu/packages/patches/clang-cling-13-libc-search-path.patch: New patch.
> * gnu/local.mk (dist_patch_DATA): Register it.
>
> Change-Id: I5d1f2c4d36ca226116bc74c2578154f86413f9e9

Merged with 29a4514a347cf23abf65b7abe03d0d14551ebf56.
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 502e97ecd5..d6dd9e3679 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1053,6 +1053,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/clang-17.0-libc-search-path.patch	\
   %D%/packages/patches/clang-17.0-link-dsymutil-latomic.patch	\
   %D%/packages/patches/clang-18.0-libc-search-path.patch	\
+  %D%/packages/patches/clang-cling-13-libc-search-path.patch	\
   %D%/packages/patches/clang-runtime-asan-build-fixes.patch	\
   %D%/packages/patches/clang-runtime-esan-build-fixes.patch	\
   %D%/packages/patches/clang-runtime-9-libsanitizer-mode-field.patch	\
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 55acb8f87b..dc04905992 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -17,11 +17,10 @@ 
 ;;; Copyright © 2020 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
 ;;; Copyright © 2021, 2022 Maxime Devos <maximedevos@telenet.be>
-;;; Copyright © 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020, 2021, 2022, 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2021 Lars-Dominik Braun <lars@6xq.net>
 ;;; Copyright © 2021, 2022 Guillaume Le Vaillant <glv@posteo.net>
-;;; Copyright © 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022, 2024 Greg Hogan <code@greghogan.com>
 ;;; Copyright © 2022 John Kehayias <john.kehayias@protonmail.com>
 ;;; Copyright © 2022 Clément Lassieur <clement@lassieur.org>
@@ -2236,180 +2235,155 @@  (define-public llvm-julia
     (properties `((hidden? . #t)
                   ,@(package-properties llvm-13)))))
 
-(define %cling-version "0.9")
-
-(define llvm-cling             ;LLVM 9 with approximately 10 patches for cling
-  (let ((base llvm-9))
+(define llvm-cling
+  ;; To determine which version of LLVM a given release of Cling should use,
+  ;; consult the
+  ;; https://raw.githubusercontent.com/root-project/cling/master/LastKnownGoodLLVMSVNRevision.txt
+  ;; file.
+  (let ((base llvm-15))                 ;for a DYLIB build
     (package/inherit base
       (name "llvm-cling")
+      (version "13-20240318-01")
       (source
        (origin
          (inherit (package-source base))
          (method git-fetch)
          (uri (git-reference
-               (url "http://root.cern/git/llvm.git")
-               (commit (string-append "cling-v" %cling-version))))
-         (file-name (git-file-name "llvm-cling" %cling-version))
+               (url "https://github.com/root-project/llvm-project")
+               (commit (string-append "cling-llvm" version))))
+         (file-name (git-file-name "llvm-cling" version))
          (sha256
           (base32
-           "0y3iwv3c9152kybmdrwvadggjs163r25h7rmlxzr3hfpr463pnwf"))
-         (modules '((guix build utils)))
-         (snippet
-          ;; The source is missing an include directive (see:
-          ;; https://github.com/vgvassilev/cling/issues/219).
-          '(substitute* "utils/benchmark/src/benchmark_register.h"
-             (("^#include <vector>.*" all)
-              (string-append all "#include <limits>\n"))))))
-      (outputs '("out"))
-      (arguments
-       (substitute-keyword-arguments (package-arguments base)
-         ((#:configure-flags _ ''())
-          '(list "-DLLVM_PARALLEL_LINK_JOBS=1" ;cater to smaller build machines
-                 ;; Only enable compiler support for the host architecture to
-                 ;; save on build time.
-                 "-DLLVM_TARGETS_TO_BUILD=host;NVPTX"
-                 "-DLLVM_INSTALL_UTILS=ON"
-                 "-DLLVM_ENABLE_RTTI=ON"
-                 "-DLLVM_ENABLE_FFI=ON"
-                 "-DLLVM_BUILD_LLVM_DYLIB=ON"
-                 "-DLLVM_LINK_LLVM_DYLIB=ON"))
-         ((#:phases phases '%standard-phases)
-          #~(modify-phases #$phases
-              (delete 'shared-lib-workaround)
-              (delete 'install-opt-viewer))))))))
+           "1zh6yp8px9hla7v9i67a6anbph140f8ixxbsz65aj7fizksjs1h3"))
+         (patches (search-patches "clang-cling-13-libc-search-path.patch")))))))
 
 (define clang-cling-runtime
-  (let ((base clang-runtime-9))
+  (let ((base clang-runtime-13))
     (package/inherit base
       (name "clang-cling-runtime")
+      (version (package-version llvm-cling))
+      (source (package-source llvm-cling))
       (arguments
        (substitute-keyword-arguments (package-arguments base)
          ((#:phases phases '%standard-phases)
-          `(modify-phases ,phases
-             (add-after 'install 'delete-static-libraries
-               ;; This reduces the size from 22 MiB to 4 MiB.
-               (lambda* (#:key outputs #:allow-other-keys)
-                 (let ((out (assoc-ref outputs "out")))
-                   (for-each delete-file (find-files out "\\.a$")))))))))
+          #~(modify-phases #$phases
+              (add-after 'unpack 'change-directory
+                (lambda _
+                  (chdir "compiler-rt")))
+              (add-after 'install 'delete-static-libraries
+                ;; This reduces the size from 22 MiB to 4 MiB.
+                (lambda _
+                  (for-each delete-file (find-files #$output "\\.a$"))))))))
       (inputs (modify-inputs (package-inputs base)
                 (replace "llvm" llvm-cling))))))
 
-(define clang-cling              ;modified clang 9 with ~ 60 patches for cling
-  (let ((base clang-9))
+(define clang-cling
+  (let ((base clang-13))
     (package/inherit base
       (name "clang-cling")
-      (source
-       (origin
-         (inherit (package-source base))
-         (method git-fetch)
-         (uri (git-reference
-               (url "http://root.cern/git/clang.git")
-               (commit (string-append "cling-v" %cling-version))))
-         (file-name (git-file-name "clang-cling" %cling-version))
-         (sha256
-          (base32
-           "128mxkwghss6589wvm6amzv183aq88rdrnfxjiyjcji5hx84vpby"))))
+      (version (package-version llvm-cling))
+      (source (package-source llvm-cling))
       (arguments
        (substitute-keyword-arguments (package-arguments base)
          ((#:phases phases '%standard-phases)
-          `(modify-phases ,phases
-             (add-after 'install 'delete-static-libraries
-               ;; This reduces the size by half, from 220 MiB to 112 MiB.
-               (lambda* (#:key outputs #:allow-other-keys)
-                 (let ((out (assoc-ref outputs "out")))
-                   (for-each delete-file (find-files out "\\.a$")))))))))
+          #~(modify-phases #$phases
+              (add-after 'unpack 'change-directory
+                (lambda _
+                  (chdir "clang")))
+              (add-after 'install 'delete-static-libraries
+                ;; This reduces the size by half, from 220 MiB to 112 MiB.
+                (lambda _
+                  (for-each delete-file (find-files #$output "\\.a$"))))))))
       (propagated-inputs
        (modify-inputs (package-propagated-inputs base)
          (replace "llvm" llvm-cling)
          (replace "clang-runtime" clang-cling-runtime))))))
 
 (define-public cling
-  ;; The tagged v0.9 release doesn't build, so use the latest commit.
-  (let ((commit "d78d1a03fedfd2bf6d2b6ff295aca576d98940df")
-        (revision "1")
-        (version* "0.9"))
-    (package
-      (name "cling")
-      (version (git-version version* revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "http://root.cern/git/cling.git")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "0lsbxv21b4qw11xkw9iipdpca64jjwwqxm0qf5v2cgdlibf8m8n9"))
-                ;; Patch submitted upstream here:
-                ;; https://github.com/root-project/cling/pull/433.
-                (patches (search-patches "cling-use-shared-library.patch"))))
-      (build-system cmake-build-system)
-      (arguments
-       (list
-        #:build-type "Release"          ;keep the build as lean as possible
-        #:tests? #f                     ;FIXME: 78 tests fail (out of ~200)
-        #:test-target "check-cling"
-        #:configure-flags
-        #~(list (string-append "-DCLING_CXX_PATH="
-                               (search-input-file %build-inputs "bin/g++"))
-                ;; XXX: The AddLLVM.cmake module expects LLVM_EXTERNAL_LIT to
-                ;; be a Python script, not a shell executable.
-                (string-append "-DLLVM_EXTERNAL_LIT="
-                               (search-input-file %build-inputs "bin/.lit-real")))
-        #:phases
-        #~(modify-phases %standard-phases
-            (add-after 'unpack 'set-version
-              (lambda _
-                (make-file-writable "VERSION")
-                (call-with-output-file "VERSION"
-                  (lambda (port)
-                    (format port "~a~%" #$version)))))
-            (add-after 'unpack 'patch-paths
-              (lambda* (#:key inputs #:allow-other-keys)
-                (substitute* "lib/Interpreter/CIFactory.cpp"
-                  (("\\bsed\\b")
-                   (which "sed"))
-                  ;; This ensures that the default C++ library used by Cling is
-                  ;; that of the compiler that was used to build it, rather
-                  ;; than that of whatever g++ happens to be on PATH.
-                  (("ReadCompilerIncludePaths\\(CLING_CXX_RLTV")
-                   (format #f "ReadCompilerIncludePaths(~s"
-                           (search-input-file inputs "bin/g++")))
-                  ;; Cling uses libclang's CompilerInvocation::GetResourcesPath
-                  ;; to resolve Clang's library prefix, but this fails on Guix
-                  ;; because it is relative to the output of cling rather than
-                  ;; clang (see:
-                  ;; https://github.com/root-project/cling/issues/434).  Fully
-                  ;; shortcut the logic in this method to return the correct
-                  ;; static location.
-                  (("static std::string getResourceDir.*" all)
-                   (string-append all
-                                  "    return std::string(\""
-                                  #$(this-package-input "clang-cling")
-                                  "/lib/clang/" #$(package-version clang-cling)
-                                  "\");")))
-                ;; Check for the 'lit' command for the tests, not 'lit.py'
-                ;; (see: https://github.com/root-project/cling/issues/432).
-                (substitute* "CMakeLists.txt"
-                  (("lit.py")
-                   "lit"))))
-            (add-after 'unpack 'adjust-lit.cfg
-              ;; See: https://github.com/root-project/cling/issues/435.
-              (lambda _
-                (substitute* "test/lit.cfg"
-                  (("config.llvm_tools_dir \\+ '")
-                   "config.cling_obj_root + '/bin"))))
-            (add-after 'install 'delete-static-libraries
-              ;; This reduces the size from 17 MiB to 5.4 MiB.
-              (lambda _
-                (for-each delete-file (find-files #$output "\\.a$")))))))
-      (native-inputs
-       (list python python-lit))
-      (inputs
-       (list clang-cling llvm-cling))
-      (home-page "https://root.cern/cling/")
-      (synopsis "Interactive C++ interpreter")
-      (description "Cling is an interactive C++17 standard compliant
+  (package
+    (name "cling")
+    (version "1.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/root-project/cling")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "17n66wf5yg1xjc94d6yb8g2gydjz0b8cj4a2pn6xrygdvhh09vv1"))
+              ;; Patch submitted upstream here:
+              ;; https://github.com/root-project/cling/pull/433.
+              (patches (search-patches "cling-use-shared-library.patch"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      #:build-type "Release"            ;keep the build as lean as possible
+      #:tests? #f                       ;FIXME: 78 tests fail (out of ~200)
+      #:test-target "check-cling"
+      #:configure-flags
+      #~(list (string-append "-DCLING_CXX_PATH="
+                             (search-input-file %build-inputs "bin/g++"))
+              ;; XXX: The AddLLVM.cmake module expects LLVM_EXTERNAL_LIT to
+              ;; be a Python script, not a shell executable.
+              (string-append "-DLLVM_EXTERNAL_LIT="
+                             (search-input-file %build-inputs "bin/.lit-real")))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'set-version
+            (lambda _
+              (make-file-writable "VERSION")
+              (call-with-output-file "VERSION"
+                (lambda (port)
+                  (format port "~a~%" #$version)))))
+          (add-after 'unpack 'patch-paths
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "lib/Interpreter/CIFactory.cpp"
+                (("\\bsed\\b")
+                 (which "sed"))
+                ;; This ensures that the default C++ library used by Cling is
+                ;; that of the compiler that was used to build it, rather
+                ;; than that of whatever g++ happens to be on PATH.
+                (("ReadCompilerIncludePaths\\(CLING_CXX_RLTV")
+                 (format #f "ReadCompilerIncludePaths(~s"
+                         (search-input-file inputs "bin/g++")))
+                ;; Cling uses libclang's CompilerInvocation::GetResourcesPath
+                ;; to resolve Clang's library prefix, but this fails on Guix
+                ;; because it is relative to the output of cling rather than
+                ;; clang (see:
+                ;; https://github.com/root-project/cling/issues/434).  Fully
+                ;; shortcut the logic in this method to return the correct
+                ;; static location.
+                (("static std::string getResourceDir.*" all)
+                 (string-append all
+                                "    return std::string(\""
+                                #$(this-package-input "clang-cling")
+                                "/lib/clang/"
+                                #$(first
+                                   (take (string-split
+                                          (package-version clang-cling) #\-)
+                                         1)) ".0.0" ;e.g. 13.0.0
+                                "\");")))
+              ;; Check for the 'lit' command for the tests, not 'lit.py'
+              ;; (see: https://github.com/root-project/cling/issues/432).
+              (substitute* "CMakeLists.txt"
+                (("lit.py")
+                 "lit"))))
+          (add-after 'unpack 'adjust-lit.cfg
+            ;; See: https://github.com/root-project/cling/issues/435.
+            (lambda _
+              (substitute* "test/lit.cfg"
+                (("config.llvm_tools_dir \\+ '")
+                 "config.cling_obj_root + '/bin"))))
+          (add-after 'install 'delete-static-libraries
+            ;; This reduces the size from 17 MiB to 5.4 MiB.
+            (lambda _
+              (for-each delete-file (find-files #$output "\\.a$")))))))
+    (native-inputs (list python python-lit))
+    (inputs (list clang-cling llvm-cling))
+    (home-page "https://root.cern/cling/")
+    (synopsis "Interactive C++ interpreter")
+    (description "Cling is an interactive C++17 standard compliant
 interpreter, built on top of LLVM and Clang.  Cling can be used as a
 read-eval-print loop (REPL) to assist with rapid application development.
 Here's how to print @samp{\"Hello World!\"} using @command{cling}:
@@ -2417,4 +2391,4 @@  (define-public cling
 @example
 cling '#include <stdio.h>' 'printf(\"Hello World!\\n\");'
 @end example")
-      (license license:lgpl2.1+))))     ;for the combined work
+    (license license:lgpl2.1+)))     ;for the combined work
diff --git a/gnu/packages/patches/clang-cling-13-libc-search-path.patch b/gnu/packages/patches/clang-cling-13-libc-search-path.patch
new file mode 100644
index 0000000000..c7d22eaaa3
--- /dev/null
+++ b/gnu/packages/patches/clang-cling-13-libc-search-path.patch
@@ -0,0 +1,96 @@ 
+Clang attempts to guess file names based on the OS and distro (yes!),
+but unfortunately, that doesn't work for us.
+
+This patch makes it easy to insert libc's $libdir so that Clang passes the
+correct absolute file name of crt1.o etc. to 'ld'.  It also disables all
+the distro-specific stuff and removes the hard-coded FHS directory names
+to make sure Clang also works on foreign distros.
+
+diff --git a/clang/lib/Driver/Distro.cpp b/clang/lib/Driver/Distro.cpp
+index ee4fe841..f0313bbe 100644
+--- a/clang/lib/Driver/Distro.cpp
++++ b/clang/lib/Driver/Distro.cpp
+@@ -93,6 +93,10 @@ static Distro::DistroType DetectLsbRelease(llvm::vfs::FileSystem &VFS) {
+ }
+ 
+ static Distro::DistroType DetectDistro(llvm::vfs::FileSystem &VFS) {
++  // The compiler should always behave the same, even when used via Guix on a
++  // foreign distro.
++  return Distro::UnknownDistro;
++
+   Distro::DistroType Version = Distro::UnknownDistro;
+ 
+   // Newer freedesktop.org's compilant systemd-based systems
+diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp
+index d14776c5..88bc3ccd 100644
+--- a/clang/lib/Driver/ToolChains/Cuda.cpp
++++ b/clang/lib/Driver/ToolChains/Cuda.cpp
+@@ -119,6 +119,9 @@ CudaInstallationDetector::CudaInstallationDetector(
+     const Driver &D, const llvm::Triple &HostTriple,
+     const llvm::opt::ArgList &Args)
+     : D(D) {
++  // Don't look for CUDA in /usr.
++  return;
++
+   struct Candidate {
+     std::string Path;
+     bool StrictChecking;
+diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
+--- a/clang/lib/Driver/ToolChains/Linux.cpp
++++ b/clang/lib/Driver/ToolChains/Linux.cpp
+@@ -186,6 +186,10 @@
+ 
+   Generic_GCC::PushPPaths(PPaths);
+ 
++  // Comment out the distro-specific tweaks so that they don't bite when
++  // using Guix on a foreign distro.
++#if 0
++
+   Distro Distro(D.getVFS(), Triple);
+ 
+   if (Distro.IsAlpineLinux() || Triple.isAndroid()) {
+@@ -251,6 +255,7 @@
+ 
+   if (IsAndroid || Distro.IsOpenSUSE())
+     ExtraOpts.push_back("--enable-new-dtags");
++#endif
+ 
+   // The selection of paths to try here is designed to match the patterns which
+   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
+@@ -264,6 +269,7 @@
+ 
+   Generic_GCC::AddMultilibPaths(D, SysRoot, OSLibDir, MultiarchTriple, Paths);
+ 
++#if 0
+   addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
+   addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
+ 
+@@ -295,9 +301,11 @@
+     addPathIfExists(D, SysRoot + "/" + OSLibDir + "/" + ABIName, Paths);
+     addPathIfExists(D, SysRoot + "/usr/" + OSLibDir + "/" + ABIName, Paths);
+   }
++#endif
+ 
+   Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths);
+ 
++#if 0
+   // Similar to the logic for GCC above, if we are currently running Clang
+   // inside of the requested system root, add its parent library path to those
+   // searched.
+@@ -305,9 +313,14 @@
+   // directory ('Dir' below) or the ResourceDir.
+   if (StringRef(D.Dir).startswith(SysRoot))
+     addPathIfExists(D, D.Dir + "/../lib", Paths);
++#endif
++
++  // Add libc's lib/ directory to the search path, so that crt1.o, crti.o,
++  // and friends can be found.
++  addPathIfExists(D, "@GLIBC_LIBDIR@", Paths);
+ 
+-  addPathIfExists(D, SysRoot + "/lib", Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib", Paths);
++  // Add GCC's lib/ directory so libstdc++.so can be found.
++  addPathIfExists(D, GCCInstallation.getParentLibPath(), Paths);
+ }
+ 
+ ToolChain::RuntimeLibType Linux::GetDefaultRuntimeLibType() const {
diff --git a/gnu/packages/patches/cling-use-shared-library.patch b/gnu/packages/patches/cling-use-shared-library.patch
index 6385b307b3..415f542add 100644
--- a/gnu/packages/patches/cling-use-shared-library.patch
+++ b/gnu/packages/patches/cling-use-shared-library.patch
@@ -1,329 +1,107 @@ 
-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.
+Upstream status: https://github.com/root-project/root/pull/15563
 
-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
+diff --git a/interpreter/cling/CMakeLists.txt b/interpreter/cling/CMakeLists.txt
+index 9775b07f10..7028042096 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
+@@ -13,81 +13,22 @@ endif(WIN32)
+ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
+   project(Cling)
+ 
+-  # Rely on llvm-config.
+-  set(CONFIG_OUTPUT)
+-  find_program(LLVM_CONFIG "llvm-config")
+-  if(LLVM_CONFIG)
+-    message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
+-    set(CONFIG_COMMAND ${LLVM_CONFIG}
+-      "--assertion-mode"
+-      "--bindir"
+-      "--libdir"
+-      "--includedir"
+-      "--prefix")
+-    execute_process(
+-      COMMAND ${CONFIG_COMMAND}
+-      RESULT_VARIABLE HAD_ERROR
+-      OUTPUT_VARIABLE CONFIG_OUTPUT
 -    )
-+        )
-+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
+-    if(NOT HAD_ERROR)
+-      string(REGEX REPLACE
+-        "[ \t]*[\r\n]+[ \t]*" ";"
+-        CONFIG_OUTPUT ${CONFIG_OUTPUT})
+-    else()
+-      string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
+-      message(STATUS "${CONFIG_COMMAND_STR}")
+-      message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
+-    endif()
+-  else()
+-    message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}")
+-  endif()
++  # See <https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project>.
++  find_package(LLVM REQUIRED CONFIG)
++  message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
++  message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
+ 
+-  list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS)
+-  list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
+-  list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
+-  list(GET CONFIG_OUTPUT 3 INCLUDE_DIR)
+-  list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT)
 -
--    clangFrontendTool
+-  if(NOT MSVC_IDE)
+-    set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
+-      CACHE BOOL "Enable assertions")
+-    # Assertions should follow llvm-config's.
+-    mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
+-  endif()
++  separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
++  add_definitions(${LLVM_DEFINITIONS_LIST})
+ 
+-  set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")
+-  set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")
+-  set(LLVM_MAIN_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
+-  set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
++  find_package(Clang REQUIRED CONFIG)
++  message(STATUS "Found supported version: Clang ${CLANG_PACKAGE_VERSION}")
++  message(STATUS "Using ClangConfig.cmake in: ${Clang_DIR}")
+ 
+   find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
+     NO_DEFAULT_PATH)
+ 
+-  set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
+-  set(LLVMCONFIG_FILE "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
+-  if(EXISTS ${LLVMCONFIG_FILE})
+-    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
+-    include(${LLVMCONFIG_FILE})
+-  else()
+-    message(FATAL_ERROR "Not found: ${LLVMCONFIG_FILE}")
+-  endif()
 -
--    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
+-  # They are used as destination of target generators.
+-  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
+-  set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
+-  if(WIN32 OR CYGWIN)
+-    # DLL platform -- put DLLs into bin.
+-    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
+-  else()
+-    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
+-  endif()
+-
+-  option(LLVM_INSTALL_TOOLCHAIN_ONLY
+-    "Only include toolchain files in the 'install' target." OFF)
+-
+-  option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
+-    "Set to ON to force using an old, unsupported host toolchain." OFF)
 -
--  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()
++  list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
+   include(AddLLVM)
+   include(TableGen)
+   include(HandleLLVMOptions)
+@@ -99,7 +40,7 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
+     set(LLVM_INCLUDE_TESTS ON)
+   endif()
  
- set( LLVM_LINK_COMPONENTS
-   analysis
-@@ -63,10 +67,6 @@ option(LIBCLING_BUILD_STATIC
- #  set(LLVM_EXPORTED_SYMBOL_FILE)
- #endif()
+-  include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}")
++  include_directories("${LLVM_INCLUDE_DIRS}")
+   link_directories("${LLVM_LIBRARY_DIR}")
  
--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
-
+   set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )