Subject: [PATCH v2 3/5] gnu: Add clang-15.

From: Maxim Cournoyer <[email-masked]>
Date: Wed, 16 Nov 2022 09:18:28 -0500

* gnu/packages/llvm.scm (clang-from-llvm): Add LEGACY-BUILD-SHARED-LIBS?
argument and update doc.
[configure-flags]: Conditionally add -DCLANG_LINK_CLANG_DYLIB=ON.
[phases]{change-directory}: Conditionally add phase.
{add-tools-extra}: Conditionally patch AddClang.cmake file.
(clang-15): New variable.
(clang-14): Streamline.
(clang-13, clang-12, clang-11, clang-10, clang-9, clang-8, clang-7, clang-6)
(clang-3.9.1, clang-3.8, clang-3.7, clang-3.5): Set LEGACY-BUILD-SHARED-LIBS?
argument to #t.
---
 gnu/packages/llvm.scm | 96 +++++++++++++++++++++++++++++--------------
 1 file changed, 65 insertions(+), 31 deletions(-)

diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 9f4f64e0d0..2b958b060e 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -176,11 +176,14 @@ (define* (clang-from-llvm llvm clang-runtime
                           (properties
                            (append `((release-monitoring-url
                                       . ,%llvm-release-monitoring-url))
-                                   (clang-properties (package-version llvm)))))
+                                   (clang-properties (package-version llvm))))
+                          (legacy-build-shared-libs? #f))
   "Produce Clang with dependencies on LLVM and CLANG-RUNTIME, and applying the
 given PATCHES.  When TOOLS-EXTRA is given, it must point to the
 'clang-tools-extra' tarball, which contains code for 'clang-tidy', 'pp-trace',
-'modularize', and other tools."
+'modularize', and other tools.  LEGACY-BUILD-SHARED-LIBS? is used to configure
+the package to use the legacy BUILD_SHARED_LIBS CMake option, which was used
+until LLVM/Clang 14."
   (package
     (name "clang")
     (version (package-version llvm))
@@ -221,14 +224,17 @@ (define* (clang-from-llvm llvm clang-runtime
              (string-append "-DC_INCLUDE_DIRS="
                             (assoc-ref %build-inputs "libc")
                             "/include")
-       ,@(if (target-riscv64?)
-           (list "-DLIBOMP_LIBFLAGS=-latomic"
-                 "-DCMAKE_SHARED_LINKER_FLAGS=-latomic")
-           `()))
+             ,@(if (target-riscv64?)
+                   (list "-DLIBOMP_LIBFLAGS=-latomic"
+                         "-DCMAKE_SHARED_LINKER_FLAGS=-latomic")
+                   `())
+             ,@(if legacy-build-shared-libs?
+                   '()
+                   (list "-DCLANG_LINK_CLANG_DYLIB=ON")))
 
        ,@(if (target-riscv64?)
-           `(#:make-flags '("LDFLAGS=-latomic"))
-           '())
+             `(#:make-flags '("LDFLAGS=-latomic"))
+             '())
 
        ;; Don't use '-g' during the build to save space.
        #:build-type "Release"
@@ -247,9 +253,11 @@ (define* (clang-from-llvm llvm clang-runtime
                                                (string-delete #\- (package-version llvm))
                                                ".src")
                                              "tools/extra")
-                                ;; Build and link to shared libraries.
-                                (substitute* "cmake/modules/AddClang.cmake"
-                                  (("BUILD_SHARED_LIBS") "True"))
+                                ,@(if legacy-build-shared-libs?
+                                      ;; Build and link to shared libraries.
+                                      '((substitute* "cmake/modules/AddClang.cmake"
+                                          (("BUILD_SHARED_LIBS") "True")))
+                                      '())
                                 #t))))
                         '())
                   (add-after 'unpack 'add-missing-triplets
@@ -323,6 +331,15 @@ (define* (clang-from-llvm llvm clang-runtime
                                 (("@GLIBC_LIBDIR@")
                                  (string-append libc "/lib"))))))
                         #t)))
+                  ;; Awkwardly, multiple phases added after the same phase,
+                  ;; e.g. unpack, get applied in the reverse order.  In other
+                  ;; words, adding 'change-directory last means it occurs
+                  ;; first after the unpack phase.
+                  ,@(if (version>=? version "14")
+                        '((add-after 'unpack 'change-directory
+                            (lambda _
+                              (chdir "clang"))))
+                        '())
                   ,@(if (version>=? version "10")
                         `((add-after 'install 'adjust-cmake-file
                             (lambda* (#:key outputs #:allow-other-keys)
@@ -713,26 +730,31 @@ (define-public clang-runtime-14
          ("gcc" ,gcc-11)
          ,@(package-native-inputs template))))))
 
+(define-public clang-15
+  (clang-from-llvm
+   llvm-15 clang-runtime-15
+   #:tools-extra
+   (origin
+     (method url-fetch)
+     (uri (llvm-uri "clang-tools-extra"
+                    (package-version llvm-15)))
+     (sha256
+      (base32
+       "03adxlh84if9p53m6izjsql500rjza9rng8akab2pdqibgrg73rh")))))
+
 (define-public clang-14
-  (let ((template
-         (clang-from-llvm llvm-14 clang-runtime-14
-                          #:tools-extra
-                          (origin
-                            (method url-fetch)
-                            (uri (llvm-uri "clang-tools-extra"
-                                           (package-version llvm-14)))
-                            (sha256
-                             (base32
-                              "0rhq4wkmvr369nkk059skzzw7jx6qhzqhmiwmqg4sp66avzviwvw"))))))
-    (package
-      (inherit template)
-      (arguments
-       (substitute-keyword-arguments (package-arguments template)
-         ((#:phases phases '(@ (guix build cmake-build-system) %standard-phases))
-          #~(modify-phases #$phases
-              (add-after 'unpack 'change-directory
-                (lambda _
-                  (chdir "clang"))))))))))
+  (clang-from-llvm
+   llvm-14 clang-runtime-14
+   #:legacy-build-shared-libs? #t
+   #:tools-extra
+   (origin
+     (method url-fetch)
+     (uri (llvm-uri "clang-tools-extra"
+                    (package-version llvm-14)))
+     (sha256
+      (base32
+       "0rhq4wkmvr369nkk059skzzw7jx6qhzqhmiwmqg4sp66avzviwvw")))))
+
 
 (define-public libomp-14
   (package
@@ -805,6 +827,7 @@ (define-public clang-runtime-13
 (define-public clang-13
   (clang-from-llvm llvm-13 clang-runtime-13
                    "1j8pr5kk8iqyb4jds3yl7c6x672617h4ngkpl4575j7mk4nrwykq"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-13.0-libc-search-path.patch")
                    #:tools-extra
                    (origin
@@ -919,6 +942,7 @@ (define-public clang-runtime-12
 (define-public clang-12
   (clang-from-llvm llvm-12 clang-runtime-12
                    "0px4gl27az6cdz6adds89qzdwb1cqpjsfvrldbz9qvpmphrj34bf"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-12.0-libc-search-path.patch")
                    #:tools-extra
                    (origin
@@ -973,6 +997,7 @@ (define-public clang-runtime-11
 (define-public clang-11
   (clang-from-llvm llvm-11 clang-runtime-11
                    "02ajkij85966vd150iy246mv16dsaph1kfi0y8wnncp8w6nar5hg"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-11.0-libc-search-path.patch")
                    #:tools-extra
                    (origin
@@ -1029,12 +1054,13 @@ (define-public clang-runtime-10
 (define-public clang-10
   (clang-from-llvm llvm-10 clang-runtime-10
                    "091bvcny2lh32zy8f3m9viayyhb2zannrndni7325rl85cwgr6pr"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-10.0-libc-search-path.patch")
                    #:tools-extra
                    (origin
                      (method url-fetch)
                      (uri (llvm-uri "clang-tools-extra"
-                                             (package-version llvm-10)))
+                                    (package-version llvm-10)))
                      (sha256
                       (base32
                        "06n1yp638rh24xdxv9v2df0qajxbjz4w59b7dd4ky36drwmpi4yh")))))
@@ -1098,6 +1124,7 @@ (define-public clang-runtime-9
 (define-public clang-9
   (clang-from-llvm llvm-9 clang-runtime-9
                    "0ls2h3iv4finqyflyhry21qhc9cm9ga7g1zq21020p065qmm2y2p"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-9.0-libc-search-path.patch")))
 
 (define-public libomp-9
@@ -1141,6 +1168,7 @@ (define-public clang-runtime-8
 (define-public clang-8
   (clang-from-llvm llvm-8 clang-runtime-8
                    "0ihnbdl058gvl2wdy45p5am55bq8ifx8m9mhcsgj9ax8yxlzvvvh"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-8.0-libc-search-path.patch")))
 
 (define-public libomp-8
@@ -1183,6 +1211,7 @@ (define-public clang-runtime-7
 (define-public clang-7
   (clang-from-llvm llvm-7 clang-runtime-7
                    "0vc4i87qwxnw9lci4ayws9spakg0z6w5w670snj9f8g5m9rc8zg9"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-7.0-libc-search-path.patch")))
 
 (define-public libomp-7
@@ -1224,6 +1253,7 @@ (define-public clang-runtime-6
 (define-public clang-6
   (clang-from-llvm llvm-6 clang-runtime-6
                    "0rxn4rh7rrnsqbdgp4gzc8ishbkryhpl1kd3mpnxzpxxhla3y93w"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-6.0-libc-search-path.patch")))
 
 (define-public libomp-6
@@ -1285,6 +1315,7 @@ (define-public clang-runtime-3.9.1
 (define-public clang-3.9.1
   (clang-from-llvm llvm-3.9.1 clang-runtime-3.9.1
                    "0qsyyb40iwifhhlx9a3drf8z6ni6zwyk3bvh0kx2gs6yjsxwxi76"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-3.8-libc-search-path.patch")))
 
 (define-public llvm-3.8
@@ -1311,6 +1342,7 @@ (define-public clang-runtime-3.8
 (define-public clang-3.8
   (clang-from-llvm llvm-3.8 clang-runtime-3.8
                    "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-3.8-libc-search-path.patch")))
 
 (define-public llvm-3.7
@@ -1337,6 +1369,7 @@ (define-public clang-runtime-3.7
 (define-public clang-3.7
   (clang-from-llvm llvm-3.7 clang-runtime-3.7
                    "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.6
@@ -1396,6 +1429,7 @@ (define-public clang-runtime-3.5
 (define-public clang-3.5
   (clang-from-llvm llvm-3.5 clang-runtime-3.5
                    "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"
+                   #:legacy-build-shared-libs? #t
                    #:patches '("clang-3.5-libc-search-path.patch")))
 
 ;; Default LLVM and Clang version.
-- 
2.38.1