Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Hi, Ludovic Courtès skribis: > The patch below produces a ‘clang’ package that contains > ‘clang-tools-extra’ commands¹. > > The problem is the size. Before: > > $ guix size /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 |tail -1 > total: 995.2 MiB > $ guix size /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 |head -2 > store item totalself > /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 995.2 > 456.5 45.9% > > > After: > > $ guix size /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 |tail -1 > total: 1525.4 MiB > $ guix size /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 |head -2 > store item totalself > /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 1525.4 > 986.8 64.7% > > (How they manage to fill that much disk space, I wonder.) > > Any idea how to best package it? > > We could of course have a ‘clang-full’ package, but it seems wasteful. > We could also have a separate output for the extra commands, but it’s > inconvenient. It would be ideal to have a ‘clang-tools-extra’ package > that depends on ‘clang’, but building them separately appears to be > impossible. After spending an unreasonable amount of time trying to build ‘clang-tools-extra’ as a separate package, I gave up and went for the multiple output solution in commit 77a87ad4aceed9d89d615540e0fd147e3a8b2f64. One can now get ‘clang-tidy’ and its friends with: guix install clang:extra Ludo’.
Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Hello! Clang-tools-extra is really meant to built within the Clang tree. Attach is an attempt to build it out-of-tree but so far it fails with undefined references for Clang libraries and the obvious solution of adding ‘-l’ flags until it’s happy doesn’t work. In my original attempt, the ‘clang-tidy’ binary is 40 MiB, and 32 MiB are text. This prolly comes from the fact that many Clang libraries (libclang[A-Z]*.a) are statically linked in each of these programs. Ideas welcome! Ludo’. diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index 33d863ae11..896b7afb47 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -382,6 +382,52 @@ output), and Binutils.") (define-public clang-toolchain-10 (make-clang-toolchain clang-10)) +(define (make-clang-tools-extra clang) + ;; XXX: An attempt to build clang-tools-extra outside the Clang tree. + (package +(inherit clang) +(name "clang-tools-extra") +(source (origin + (method url-fetch) + (uri (llvm-download-uri "clang-tools-extra" + (package-version llvm-10))) + (sha256 + (base32 +"074ija5s2jsdn0k035r2dzmryjmqxdnyg4xwvaqych2bazv8rpxc")) + (patches (search-patches "clang-tools-extra-cmake.patch" +(arguments + '(#:build-type "Release" + #:phases (modify-phases %standard-phases + (add-before 'configure 'copy-clang-cmake-module +(lambda* (#:key inputs #:allow-other-keys) + (let ((clang-source (assoc-ref inputs "clang-source"))) +(mkdir "../clang-source") +(with-directory-excursion "../clang-source" + (invoke "tar" "xf" clang-source)) + +;; 'cmake/modules' is in the search path of the +;; top-level 'CMakeLists.txt', so copy it there. +(install-file (car (find-files "../clang-source" + "^AddClang\\.cmake$")) + "cmake/modules") +#t))) + (add-before 'build 'augment-header-path +(lambda _ + (let ((context-h (car (find-files "../clang-source" +"^Context\\.h$" +(setenv "CPATH" +(string-append (dirname +(canonicalize-path context-h)) + ":" (getenv "CPATH"))) +#t)) +(inputs + `(("clang" ,clang) + ("clang-source", (package-source clang)) + ,@(package-inputs clang) + +(define-public clang-tools-extra-10 + (make-clang-tools-extra clang-10)) + (define-public llvm-9 (package (inherit llvm-10) diff --git a/gnu/packages/patches/clang-tools-extra-cmake.patch b/gnu/packages/patches/clang-tools-extra-cmake.patch new file mode 100644 index 00..96672bb2dd --- /dev/null +++ b/gnu/packages/patches/clang-tools-extra-cmake.patch @@ -0,0 +1,38 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 57bb970..6e5de7c 100644 +--- a/CMakeLists.txt b/CMakeLists.txt +@@ -1,3 +1,33 @@ ++cmake_minimum_required(VERSION 3.4.3) ++ ++project(Clang-Tools-Extra) ++ ++find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}") ++list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR}) ++ ++# This is the place where we put Clang's 'AddClang.cmake'. ++list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") ++ ++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") ++set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree") ++ ++set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") ++ ++include(AddClang) ++include(AddLLVM) ++include(TableGen) ++include(HandleLLVMOptions) ++include(VersionFromVCS) ++include(LLVMDistributionSupport) ++ ++# Dummy targets to appease CMake. These are normally found in the ++# Clang tree. ++add_custom_target(clang-resource-headers) ++add_custom_target(ClangSACheckers) ++ + include(CMakeDependentOption) + + add_subdirectory(clang-apply-replacements)
Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Hi, Efraim Flashner transcribed 1.9K bytes: > On Mon, Apr 27, 2020 at 09:31:01AM +0200, Ludovic Courtès wrote: > > Hi! > > > > Nikita Gillmann skribis: > > > > > Is it? The way we build clang and clang-tools-extra in pkgsrc is to > > > have them separate. > > > Refer to lang/clang-tools-extra and lang/clang to see how. > > > The gist is, BUILD_TARGET for clang-tools-extra gets overridden > > > and appended with targets to build. > > > > Nice. Do you have the URL of the build recipe? > > > > Thanks, > > Ludo’. > > > > Here's a link to the Github mirror of pkgsrc for clang-tools-extra > https://github.com/NetBSD/pkgsrc/blob/trunk/lang/clang-tools-extra/Makefile http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/lang/clang-tools-extra/#dirlist http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/lang/clang/ or navigating the (improve worthy) http://pkgsrc.se But yeah github mirror should work out, or https://anonhg.netbsd.org/pkgsrc/file/tip/lang/clang https://anonhg.netbsd.org/pkgsrc/file/tip/lang/clang-tools-extra > -- > Efraim Flashner אפרים פלשנר > GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 > Confidentiality cannot be guaranteed on emails sent or received unencrypted
Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
On Mon, Apr 27, 2020 at 09:31:01AM +0200, Ludovic Courtès wrote: > Hi! > > Nikita Gillmann skribis: > > > Is it? The way we build clang and clang-tools-extra in pkgsrc is to > > have them separate. > > Refer to lang/clang-tools-extra and lang/clang to see how. > > The gist is, BUILD_TARGET for clang-tools-extra gets overridden > > and appended with targets to build. > > Nice. Do you have the URL of the build recipe? > > Thanks, > Ludo’. > Here's a link to the Github mirror of pkgsrc for clang-tools-extra https://github.com/NetBSD/pkgsrc/blob/trunk/lang/clang-tools-extra/Makefile -- Efraim Flashner אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted signature.asc Description: PGP signature
Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Hi! Nikita Gillmann skribis: > Is it? The way we build clang and clang-tools-extra in pkgsrc is to > have them separate. > Refer to lang/clang-tools-extra and lang/clang to see how. > The gist is, BUILD_TARGET for clang-tools-extra gets overridden > and appended with targets to build. Nice. Do you have the URL of the build recipe? Thanks, Ludo’.
Re: Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Ludovic Courtès transcribed 4.9K bytes: > Hello! > > The patch below produces a ‘clang’ package that contains > ‘clang-tools-extra’ commands¹. > [...] > Any idea how to best package it? > > We could of course have a ‘clang-full’ package, but it seems wasteful. > We could also have a separate output for the extra commands, but it’s > inconvenient. It would be ideal to have a ‘clang-tools-extra’ package > that depends on ‘clang’, but building them separately appears to be > impossible. Is it? The way we build clang and clang-tools-extra in pkgsrc is to have them separate. Refer to lang/clang-tools-extra and lang/clang to see how. The gist is, BUILD_TARGET for clang-tools-extra gets overridden and appended with targets to build. That'S just after skipping through the clang-tools-extra package for a minute. I'm not sure if this is applicable to guix in any way. > Thanks in advance! :-) > > Ludo’. > > ¹ https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/index.html > > diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm > index d6c519bcbd..a3bcd75190 100644 > --- a/gnu/packages/llvm.scm > +++ b/gnu/packages/llvm.scm > @@ -166,7 +166,11 @@ compiler. In LLVM this library is called > \"compiler-rt\".") > (supported-systems (delete "mips64el-linux" %supported-systems > > (define* (clang-from-llvm llvm clang-runtime hash > - #:key (patches '())) > + #:key (patches '()) tools-extra) > + "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." >(package > (name "clang") > (version (package-version llvm)) > @@ -187,7 +191,10 @@ compiler. In LLVM this library is called > \"compiler-rt\".") > (inputs > `(("libxml2" ,libxml2) > ("gcc-lib" ,gcc "lib") > - ,@(package-inputs llvm))) > + ,@(package-inputs llvm) > + ,@(if tools-extra > + `(("clang-tools-extra" ,tools-extra)) > + '( > (propagated-inputs > `(("llvm" ,llvm) > ("clang-runtime" ,clang-runtime))) > @@ -208,6 +215,19 @@ compiler. In LLVM this library is called > \"compiler-rt\".") > #:build-type "Release" > > #:phases (modify-phases %standard-phases > + ,@(if tools-extra > +`((add-after 'unpack 'add-tools-extra > +(lambda* (#:key inputs #:allow-other-keys) > + (let ((extra (assoc-ref inputs > + "clang-tools-extra"))) > +(invoke "tar" "xf" extra) > +(rename-file ,(string-append > + "clang-tools-extra-" > + (package-version llvm) > + ".src") > + "tools/extra") > +#t > +'()) >(add-after 'unpack 'add-missing-triplets > (lambda _ >;; Clang iterates through known triplets to search for > @@ -376,7 +396,16 @@ output), and Binutils.") > (define-public clang-10 >(clang-from-llvm llvm-10 clang-runtime-10 > "08fbxa2a0kr3ni35ckppj0kyvlcyaywrhpqwcdrdy0z900mhcnw8" > - #:patches '("clang-10.0-libc-search-path.patch"))) > + #:patches '("clang-10.0-libc-search-path.patch") > + #:tools-extra > + #f > + #;(origin > + (method url-fetch) > + (uri (llvm-download-uri "clang-tools-extra" > + (package-version llvm-10))) > + (sha256 > + (base32 > + > "074ija5s2jsdn0k035r2dzmryjmqxdnyg4xwvaqych2bazv8rpxc") > > (define-public clang-toolchain-10 >(make-clang-toolchain clang-10))
Packaging ‘clang-tools-extra’ (‘clang-tidy’, etc.)
Hello! The patch below produces a ‘clang’ package that contains ‘clang-tools-extra’ commands¹. The problem is the size. Before: --8<---cut here---start->8--- $ guix size /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 |tail -1 total: 995.2 MiB $ guix size /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 |head -2 store item totalself /gnu/store/qxdpxbvfdxfy5dnz4haql4xlxpmb5r6b-clang-10.0.0 995.2 456.5 45.9% --8<---cut here---end--->8--- After: --8<---cut here---start->8--- $ guix size /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 |tail -1 total: 1525.4 MiB $ guix size /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 |head -2 store item totalself /gnu/store/5h3xgpg33wip2b8ccri690jp6ikbq16s-clang-10.0.0 1525.4 986.8 64.7% --8<---cut here---end--->8--- (How they manage to fill that much disk space, I wonder.) Any idea how to best package it? We could of course have a ‘clang-full’ package, but it seems wasteful. We could also have a separate output for the extra commands, but it’s inconvenient. It would be ideal to have a ‘clang-tools-extra’ package that depends on ‘clang’, but building them separately appears to be impossible. Thanks in advance! :-) Ludo’. ¹ https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/index.html diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index d6c519bcbd..a3bcd75190 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -166,7 +166,11 @@ compiler. In LLVM this library is called \"compiler-rt\".") (supported-systems (delete "mips64el-linux" %supported-systems (define* (clang-from-llvm llvm clang-runtime hash - #:key (patches '())) + #:key (patches '()) tools-extra) + "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." (package (name "clang") (version (package-version llvm)) @@ -187,7 +191,10 @@ compiler. In LLVM this library is called \"compiler-rt\".") (inputs `(("libxml2" ,libxml2) ("gcc-lib" ,gcc "lib") - ,@(package-inputs llvm))) + ,@(package-inputs llvm) + ,@(if tools-extra + `(("clang-tools-extra" ,tools-extra)) + '( (propagated-inputs `(("llvm" ,llvm) ("clang-runtime" ,clang-runtime))) @@ -208,6 +215,19 @@ compiler. In LLVM this library is called \"compiler-rt\".") #:build-type "Release" #:phases (modify-phases %standard-phases + ,@(if tools-extra +`((add-after 'unpack 'add-tools-extra +(lambda* (#:key inputs #:allow-other-keys) + (let ((extra (assoc-ref inputs + "clang-tools-extra"))) +(invoke "tar" "xf" extra) +(rename-file ,(string-append + "clang-tools-extra-" + (package-version llvm) + ".src") + "tools/extra") +#t +'()) (add-after 'unpack 'add-missing-triplets (lambda _ ;; Clang iterates through known triplets to search for @@ -376,7 +396,16 @@ output), and Binutils.") (define-public clang-10 (clang-from-llvm llvm-10 clang-runtime-10 "08fbxa2a0kr3ni35ckppj0kyvlcyaywrhpqwcdrdy0z900mhcnw8" - #:patches '("clang-10.0-libc-search-path.patch"))) + #:patches '("clang-10.0-libc-search-path.patch") + #:tools-extra + #f + #;(origin + (method url-fetch) + (uri (llvm-download-uri "clang-tools-extra" + (package-version llvm-10))) + (sha256 + (base32 + "074ija5s2jsdn0k035r2dzmryjmqxdnyg4xwvaqych2bazv8rpxc") (define-public clang-toolchain-10 (make-clang-toolchain clang-10))