gnu: clang: Move version conditionals out of the builder.

* gnu/packages/llvm.scm (clang-from-llvm)[arguments]: Rewrite phase
'set-glibc-file-names' to use VERSION>=? from (guix utils) and splice in the
relevant build code, instead of doing the comparison at build time.
This commit is contained in:
Marius Bakke 2020-02-26 21:06:01 +01:00
parent f5cc5de8b6
commit 5041cc28cb
No known key found for this signature in database
GPG key ID: A2A06DF2A33A54FA

View file

@ -226,64 +226,59 @@ (define* (clang-from-llvm llvm clang-runtime hash
(string-append "\"i686-unknown-linux-gnu\", " (string-append "\"i686-unknown-linux-gnu\", "
all))) all)))
#t)) #t))
(add-after (add-after 'unpack 'set-glibc-file-names
'unpack 'set-glibc-file-names (lambda* (#:key inputs #:allow-other-keys)
(lambda* (#:key inputs #:allow-other-keys) (let ((libc (assoc-ref inputs "libc"))
(let ((libc (assoc-ref inputs "libc")) (compiler-rt (assoc-ref inputs "clang-runtime"))
(compiler-rt (assoc-ref inputs "clang-runtime")) (gcc (assoc-ref inputs "gcc")))
(gcc (assoc-ref inputs "gcc")) ,@(cond
(version ((version>=? version "6.0")
(string->number `(;; Link to libclang_rt files from clang-runtime.
,(version-major (package-version clang-runtime)))))
(cond
((> version 3)
;; Link to libclang_rt files from clang-runtime.
(substitute* "lib/Driver/ToolChain.cpp"
(("getDriver\\(\\)\\.ResourceDir")
(string-append "\"" compiler-rt "\"")))
;; Make "LibDir" refer to <glibc>/lib so that it
;; uses the right dynamic linker file name.
(substitute* "lib/Driver/ToolChains/Linux.cpp"
(("(^[[:blank:]]+LibDir = ).*" _ declaration)
(string-append declaration "\"" libc "/lib\";\n"))
;; Make clang look for libstdc++ in the right
;; location.
(("LibStdCXXIncludePathCandidates\\[\\] = \\{")
(string-append
"LibStdCXXIncludePathCandidates[] = { \"" gcc "/include/c++\","))
;; Make sure libc's libdir is on the search path, to
;; allow crt1.o & co. to be found.
(("@GLIBC_LIBDIR@")
(string-append libc "/lib"))))
(else
(substitute* "lib/Driver/Tools.cpp"
;; Patch the 'getLinuxDynamicLinker' function so that
;; it uses the right dynamic linker file name.
(("/lib64/ld-linux-x86-64.so.2")
(string-append libc
,(glibc-dynamic-linker))))
;; Link to libclang_rt files from clang-runtime.
;; This substitution needed slight adjustment in 3.8.
(if (< 3.8 (string->number ,(version-major+minor
(package-version
clang-runtime))))
(substitute* "lib/Driver/Tools.cpp"
(("TC\\.getDriver\\(\\)\\.ResourceDir")
(string-append "\"" compiler-rt "\"")))
(substitute* "lib/Driver/ToolChain.cpp" (substitute* "lib/Driver/ToolChain.cpp"
(("getDriver\\(\\)\\.ResourceDir") (("getDriver\\(\\)\\.ResourceDir")
(string-append "\"" compiler-rt "\"")))) (string-append "\"" compiler-rt "\"")))
;; Make sure libc's libdir is on the search path, to ;; Make "LibDir" refer to <glibc>/lib so that it
;; allow crt1.o & co. to be found. ;; uses the right dynamic linker file name.
(substitute* "lib/Driver/ToolChains.cpp" (substitute* "lib/Driver/ToolChains/Linux.cpp"
(("@GLIBC_LIBDIR@") (("(^[[:blank:]]+LibDir = ).*" _ declaration)
(string-append libc "/lib"))))) (string-append declaration "\"" libc "/lib\";\n"))
#t)))
;; Make clang look for libstdc++ in the right
;; location.
(("LibStdCXXIncludePathCandidates\\[\\] = \\{")
(string-append
"LibStdCXXIncludePathCandidates[] = { \"" gcc
"/include/c++\","))
;; Make sure libc's libdir is on the search path, to
;; allow crt1.o & co. to be found.
(("@GLIBC_LIBDIR@")
(string-append libc "/lib")))))
(else
`((substitute* "lib/Driver/Tools.cpp"
;; Patch the 'getLinuxDynamicLinker' function so that
;; it uses the right dynamic linker file name.
(("/lib64/ld-linux-x86-64.so.2")
(string-append libc
,(glibc-dynamic-linker))))
;; Link to libclang_rt files from clang-runtime.
;; This substitution needed slight adjustment in 3.8.
,@(if (version>=? version "3.8")
'((substitute* "lib/Driver/Tools.cpp"
(("TC\\.getDriver\\(\\)\\.ResourceDir")
(string-append "\"" compiler-rt "\""))))
'((substitute* "lib/Driver/ToolChain.cpp"
(("getDriver\\(\\)\\.ResourceDir")
(string-append "\"" compiler-rt "\"")))))
;; Make sure libc's libdir is on the search path, to
;; allow crt1.o & co. to be found.
(substitute* "lib/Driver/ToolChains.cpp"
(("@GLIBC_LIBDIR@")
(string-append libc "/lib"))))))
#t)))
(add-after 'install 'install-clean-up-/share/clang (add-after 'install 'install-clean-up-/share/clang
(lambda* (#:key outputs #:allow-other-keys) (lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out")) (let* ((out (assoc-ref outputs "out"))