summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-01-26 17:37:51 +0100
committerLudovic Courtès <ludo@gnu.org>2023-02-06 16:51:00 +0100
commitc617f4e04fe05514c08cd483b5e6c56a5eaea55a (patch)
tree89ebfb15a46215f17b90e940e5fe90651190a8c0
parent5b42f8c154906584455a4989038406c88b723cb0 (diff)
downloadguile-c617f4e04fe05514c08cd483b5e6c56a5eaea55a.tar.gz
maint: Add Guix build files.
* guix.scm, build-aux/manifest.scm: New files. * Makefile.am (EXTRA_DIST): Add them. * README: Mention it.
-rw-r--r--Makefile.am3
-rw-r--r--README10
-rw-r--r--build-aux/manifest.scm61
-rw-r--r--guix.scm143
4 files changed, 216 insertions, 1 deletions
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 <http://www.gnu.org/licenses/>.
+
+;; This file defines a Guix manifest for use by Cuirass, the continuous
+;; integration service running at <https://ci.guix.gnu.org>.
+
+(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 <http://www.gnu.org/licenses/>.
+
+;; 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?) ;<https://issues.guix.gnu.org/49368>
+ '("--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+)))