Subject: [bug#60358] [PATCH] gnu: Add gnulib.

From: Vivien Kraus <[email-masked]>
Date: Tue, 27 Dec 2022 17:23:30 +0100

* gnu/packages/build-tools.scm (gnulib-latest): New variable. This one always
tracks the latest upstream commit, so don’t use it as an input.
(gnulib): New variable. This is a "recent" snapshot.
---
 gnu/packages/build-tools.scm | 71 ++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)

diff --git a/gnu/packages/build-tools.scm b/gnu/packages/build-tools.scm
index 6c1350c44f..062956f685 100644
--- a/gnu/packages/build-tools.scm
+++ b/gnu/packages/build-tools.scm
@@ -38,6 +38,7 @@ (define-module (gnu packages build-tools)
   #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix git)
   #:use-module (guix build-system cmake)
   #:use-module (gnu packages)
   #:use-module (gnu packages adns)
@@ -48,11 +49,13 @@ (define-module (gnu packages build-tools)
   #:use-module (gnu packages cpp)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages lisp)
   #:use-module (gnu packages logging)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages ninja)
   #:use-module (gnu packages package-management)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages protobuf)
@@ -803,3 +806,71 @@ (define-public genie
 same settings to multiple projects.  It supports generating projects using GNU
 Makefiles, JSON Compilation Database, and experimentally Ninja.")
       (license license:bsd-3))))
+
+;; Gnulib is a source code library. The developers encourage you to develop
+;; your programs with the latest commit of gnulib. However, gnulib is also
+;; used to bootstrap some GNU programs. To avoid rebuilding the world when a
+;; new gnulib commit is pushed, gnulib as a native input must use a known
+;; snapshot of the library.
+
+(define-public gnulib-latest
+  ;; Use this to develop.
+  (package
+    (name "gnulib-latest")
+    (version "latest")
+    (source
+     (git-checkout
+      (url "https://git.savannah.gnu.org/git/gnulib.git")))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)
+          (replace 'install
+            (lambda _
+              (install-file "gnulib-tool"
+                            (string-append #$output "/bin"))
+              (copy-recursively "."
+                                (string-append #$output "/share/gnulib-srcdir")))))
+      #:tests? #f)) ;; Tests are syntax and indentation checks for the
+                    ;; maintainer.
+    (inputs ;; Shebangs for some auxiliary build files.
+     (list python perl clisp))
+    (home-page "https://www.gnu.org/software/gnulib/")
+    (synopsis "GNU portability library")
+    (description
+     "Gnulib is a library that provides common functions from the glibc to your
+programs, in order to enhance portability across operating systems. It also
+provides common maintainer tools for gnu packages. This package always tracks
+the latest commit in gnulib. @strong{For packages dependencies, please use the
+@code{gnulib} package instead.} The latter provides a recent enough snapshot.")
+    (native-search-paths
+     (list
+      (search-path-specification
+       (variable "GNULIB_SRCDIR")
+       (files (list "share/gnulib-srcdir")))))
+    (license
+     (list license:lgpl2.0+ license:gpl3+))))
+
+(define-public gnulib
+  ;; Use this as a native input.
+  (package
+    (inherit gnulib-latest)
+    (name "gnulib")
+    (version "2022-12-27")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://git.savannah.gnu.org/git/gnulib.git")
+             (commit "fde75446490e18d2539817ca418ab8adf73b02d3")))
+       (sha256
+        (base32
+         "0fjbdhwi9025wyq39rwc2j6aazfmagx056kkbvxx6bs97i80dcim"))))
+    (synopsis "GNU portability library")
+    (description
+     "Gnulib is a library that provides common functions from the glibc to your
+programs, in order to enhance portability across operating systems. It also
+provides common maintainer tools for gnu packages. This package provides a
+recent snapshot of gnulib.")))

base-commit: 8f93a1e01a879ae026678dd92c18e2a2a49be540
-- 
2.38.1