~ruther/guix-local

29a4514a347cf23abf65b7abe03d0d14551ebf56 — Maxim Cournoyer 1 year, 10 months ago 412d99a
gnu: cling: Update to 1.0.

* 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
M gnu/local.mk => gnu/local.mk +1 -0
@@ 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	\

M gnu/packages/llvm.scm => gnu/packages/llvm.scm +121 -147
@@ 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 @@ LLVM bitcode files.")
    (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 @@ Here's how to print @samp{\"Hello World!\"} using @command{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

A gnu/packages/patches/clang-cling-13-libc-search-path.patch => gnu/packages/patches/clang-cling-13-libc-search-path.patch +96 -0
@@ 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 {

M gnu/packages/patches/cling-use-shared-library.patch => gnu/packages/patches/cling-use-shared-library.patch +98 -320
@@ 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 )