Next: Level 1: Building with Guix, Up: Software Development [Contents][Index]
How do we go about “Guixifying” a repository? The first step, as we’ve
seen, will be to add a guix.scm at the root of the repository in
question. We’ll take Guile as
an example in this chapter: it’s written in Scheme (mostly) and C, and
has a number of dependencies—a C compilation tool chain, C libraries,
Autoconf and its friends, LaTeX, and so on. The resulting
guix.scm looks like the usual package definition (see Defining
Packages in GNU Guix Reference Manual), just without the
define-public
bit:
;; The ‘guix.scm’ file for Guile, for use by ‘guix shell’. (use-modules (guix) (guix build-system gnu) ((guix licenses) #:prefix license:) (gnu packages autotools) (gnu packages base) (gnu packages bash) (gnu packages bdw-gc) (gnu packages compression) (gnu packages flex) (gnu packages gdb) (gnu packages gettext) (gnu packages gperf) (gnu packages libffi) (gnu packages libunistring) (gnu packages linux) (gnu packages pkg-config) (gnu packages readline) (gnu packages tex) (gnu packages texinfo) (gnu packages version-control)) (package (name "guile") (version "3.0.99-git") ;funky version number (source #f) ;no source (build-system gnu-build-system) (native-inputs (append (list autoconf automake libtool gnu-gettext flex texinfo texlive-base ;for "make pdf" texlive-epsf gperf git gdb strace readline lzip pkg-config) ;; When cross-compiling, a native version of Guile itself is ;; needed. (if (%current-target-system) (list this-package) '()))) (inputs (list libffi bash-minimal)) (propagated-inputs (list libunistring libgc)) (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, and it's actually a full-blown Scheme implementation!") (home-page "https://www.gnu.org/software/guile/") (license license:lgpl3+))
Quite a bit of boilerplate, but now someone who’d like to hack on Guile now only needs to run:
guix shell
That gives them a shell containing all the dependencies of Guile: those
listed above, but also implicit dependencies such as the GCC tool
chain, GNU Make, sed, grep, and so on. See Invoking guix shell in GNU Guix Reference Manual, for more info on guix shell
.
The chef’s recommendation: Our suggestion is to create development environments like this:
guix shell --container --link-profile... or, for short:
guix shell -CPThat gives a shell in an isolated container, and all the dependencies show up in
$HOME/.guix-profile
, which plays well with caches such as config.cache (see Cache Files in Autoconf) and absolute file names recorded in generatedMakefile
s and the likes. The fact that the shell runs in a container brings peace of mind: nothing but the current directory and Guile’s dependencies is visible inside the container; nothing from the system can possibly interfere with your development.
Next: Level 1: Building with Guix, Up: Software Development [Contents][Index]