From c617f4e04fe05514c08cd483b5e6c56a5eaea55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 26 Jan 2023 17:37:51 +0100 Subject: maint: Add Guix build files. * guix.scm, build-aux/manifest.scm: New files. * Makefile.am (EXTRA_DIST): Add them. * README: Mention it. --- Makefile.am | 3 +- README | 10 ++++ build-aux/manifest.scm | 61 +++++++++++++++++++++ guix.scm | 143 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 build-aux/manifest.scm create mode 100644 guix.scm diff --git a/Makefile.am b/Makefile.am index 57a2d5f7e..850bab352 100644 --- a/Makefile.am +++ b/Makefile.am @@ -81,7 +81,8 @@ EXTRA_DIST = LICENSE HACKING GUILE-VERSION \ gnulib-local/m4/clock_time.m4.diff \ gnulib-local/build-aux/git-version-gen.diff \ libguile/texi-fragments-to-docstrings \ - gdbinit + gdbinit \ + guix.scm build-aux/manifest.scm TESTS = check-guile TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ diff --git a/README b/README index 6c81f14f0..cd2a75f04 100644 --- a/README +++ b/README @@ -128,6 +128,16 @@ When building from a Git checkout, these additional packages are needed: - GNU Texinfo - GNU Gperf +If you use GNU Guix, you can obtain a shell for development with all the +dependencies by running the following command from the top directory of +the checkout: + + guix shell + +You can also build Guile by running: + + guix build -f guix.scm + Special Instructions For Some Systems ===================================== diff --git a/build-aux/manifest.scm b/build-aux/manifest.scm new file mode 100644 index 000000000..6fbe99752 --- /dev/null +++ b/build-aux/manifest.scm @@ -0,0 +1,61 @@ +;;; Copyright © 2023 Free Software Foundation, Inc. +;;; +;;; This file is part of GNU Guile. +;;; +;;; GNU Guile is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guile is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guile. If not, see . + +;; This file defines a Guix manifest for use by Cuirass, the continuous +;; integration service running at . + +(use-modules (guix) + (guix profiles)) + +(define guile + (load "../guix.scm")) + +(define* (package->manifest-entry* package system + #:key target) + "Return a manifest entry for PACKAGE on SYSTEM, optionally cross-compiled to +TARGET." + (manifest-entry + (inherit (package->manifest-entry package)) + (name (string-append (package-name package) "." system + (if target + (string-append "." target) + "'"))) + (item (with-parameters ((%current-system system) + (%current-target-system target)) + package)))) + +(define native-builds + (manifest + (map (lambda (system) + (package->manifest-entry* guile system)) + '("x86_64-linux" "i686-linux" + "aarch64-linux" "armhf-linux" + "powerpc64le-linux")))) + +(define cross-builds + (manifest + (map (lambda (target) + (package->manifest-entry* guile "x86_64-linux" + #:target target)) + '("i586-pc-gnu" + ;; "arm-linux-gnueabihf" + "aarch64-linux-gnu" + "riscv64-linux-gnu" + "i686-w64-mingw32" + "x86_64-linux-gnu")))) + +(concatenate-manifests (list native-builds cross-builds)) diff --git a/guix.scm b/guix.scm new file mode 100644 index 000000000..60a4e2517 --- /dev/null +++ b/guix.scm @@ -0,0 +1,143 @@ +;;; Copyright © 2023 Free Software Foundation, Inc. +;;; +;;; This file is part of GNU Guile. +;;; +;;; GNU Guile is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guile is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guile. If not, see . + +;; This file defines a Guix package. It can be used to spawn an +;; interactive development environment: +;; +;; guix shell +;; +;; Or it can be used to build Guile from a checkout in an isolated +;; environment: +;; +;; guix build -f guix.scm +;; +;; Likewise, you may cross-compile it: +;; +;; guix build -f guix.scm --target=x86_64-w64-mingw32 +;; +;; … or perform a native build for another architecture, assuming +;; either offloading or transparent QEMU emulation is set up: +;; +;; guix build -f guix.scm -s riscv64-linux + +(use-modules (guix) + (guix git-download) + (guix build-system gnu) + ((guix licenses) #:prefix license:) + (gnu packages) + (gnu packages pkg-config)) + +(let ((vcs-file? (or (git-predicate (current-source-directory)) + (const #t))) + (S specification->package)) + (package + (name "guile") + (version "3.0.000-git") + (source (local-file "." "guile-checkout" + #:recursive? #t + #:select? vcs-file?)) + (build-system gnu-build-system) + (arguments + (list #:configure-flags + #~'("--enable-mini-gmp" + #$@(if (target-x86-32?) ; + '("--disable-static" "CFLAGS=-g -O2 -fexcess-precision=standard") + '("--disable-static"))) ;saves 3 MiB + + #:phases + #~(modify-phases %standard-phases + (add-before 'bootstrap 'set-version + (lambda _ + ;; Tell 'git-version-gen' what version this is, or it will + ;; just pick "UNKNOWN", making it unusable as a replacement + ;; for 'guile-3.0'. XXX: This is inaccurate when using + ;; '--with-branch' but using (package-version this-package) + ;; wouldn't give us a valid version string. + (call-with-output-file ".tarball-version" + (lambda (port) + (display #$version port))) + + ;; Set this one as well so 'version.test' passes. + (substitute* "GUILE-VERSION" + (("^GUILE_MICRO_VERSION=.*") + "GUILE_MICRO_VERSION=99\n")))) + (add-before 'configure 'pre-configure + (lambda* (#:key inputs #:allow-other-keys) + ;; Tell (ice-9 popen) the file name of Bash. + (let ((bash (false-if-exception + (search-input-file inputs "/bin/sh")))) + (substitute* "module/ice-9/popen.scm" + ;; If bash is #f allow fallback for user to provide + ;; "bash" in PATH. This happens when cross-building to + ;; MinGW for which we do not have Bash yet. + (("/bin/sh") + (or bash "/bin/sh"))))))))) + + (native-inputs + (append (map S '("autoconf" + "automake" + "libtool" + "gettext" + "flex" + "texinfo" + "texlive-base" ;for "make pdf" + "texlive-epsf" + "gperf" + "git" + "gdb" + "strace" + "readline" + "lzip")) + + ;; Ensure we get a cross-pkg-config when needed. + (list pkg-config) + + ;; When cross-compiling, a native version of Guile itself + ;; is needed. + (if (%current-target-system) + (list this-package) + '()))) + (inputs + (append (list (S "libffi")) + + ;; We need Bash when cross-compiling because some of the + ;; scripts in bin/ refer to it. Use 'bash-minimal' because + ;; we don't need an interactive Bash with Readline and all. + (if (target-mingw?) + (list (S "libiconv")) + (list (S "bash-minimal"))))) + (propagated-inputs + (map S '("libunistring" "libgc"))) + + (outputs '("out" "debug")) + + (native-search-paths + (list (search-path-specification + (variable "GUILE_LOAD_PATH") + (files '("share/guile/site/3.0"))) + (search-path-specification + (variable "GUILE_LOAD_COMPILED_PATH") + (files '("lib/guile/3.0/site-ccache"))))) + (synopsis "Scheme implementation intended especially for extensions") + (description + "Guile is the GNU Ubiquitous Intelligent Language for Extensions, the +official extension language of the GNU system. It is an implementation of +the Scheme language which can be easily embedded in other applications to +provide a convenient means of extending the functionality of the application +without requiring the source code to be rewritten.") + (home-page "https://www.gnu.org/software/guile/") + (license license:lgpl3+))) -- cgit v1.2.1