gnu: lapack: Build shared libraries
[jackhill/guix/guix.git] / gnu / system.scm
index c6b67a7..96f7213 100644 (file)
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
   #:use-module (guix records)
   #:use-module (guix packages)
   #:use-module (guix derivations)
-  #:use-module (gnu packages linux-initrd)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
-  #:use-module (gnu packages system)
+  #:use-module (gnu packages admin)
   #:use-module (gnu packages package-management)
-  #:use-module (gnu system dmd)
+  #:use-module (gnu services)
+  #:use-module (gnu services dmd)
+  #:use-module (gnu services base)
   #:use-module (gnu system grub)
   #:use-module (gnu system shadow)
   #:use-module (gnu system linux)
+  #:use-module (gnu system linux-initrd)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
             operating-system?
             operating-system-services
             operating-system-packages
+            operating-system-bootloader-entries
+            operating-system-host-name
+            operating-system-kernel
+            operating-system-initrd
+            operating-system-users
+            operating-system-groups
+            operating-system-packages
+            operating-system-timezone
+            operating-system-locale
+            operating-system-services
 
+            operating-system-profile-directory
             operating-system-derivation))
 
 ;;; Commentary:
@@ -58,8 +71,8 @@
               (default grub))
   (bootloader-entries operating-system-bootloader-entries ; list
                       (default '()))
-  (initrd operating-system-initrd
-          (default gnu-system-initrd))
+  (initrd operating-system-initrd                 ; monadic derivation
+          (default (gnu-system-initrd)))
 
   (host-name operating-system-host-name)          ; string
 
                           (members '("guest"))))))
 
   (packages operating-system-packages             ; list of (PACKAGE OUTPUT...)
-            (default `(("coreutils" ,coreutils)
-                       ("grep" ,grep)
-                       ("guile" ,guile)
-                       ("bash" ,bash)
-                       ("dmd" ,(@ (gnu packages dmd) dmd))
-                       ("guix" ,guix))))
+            (default (list coreutils              ; or just PACKAGE
+                           grep
+                           sed
+                           findutils
+                           guile
+                           bash
+                           (@ (gnu packages dmd) dmd)
+                           guix
+                           tzdata)))
 
   (timezone operating-system-timezone)            ; string
   (locale   operating-system-locale)              ; string
 
   (services operating-system-services             ; list of monadic services
-            (default
-              (let ((motd (text-file "motd" "
-This is the GNU operating system, welcome!\n\n")))
-                (list (mingetty-service "tty1" #:motd motd)
-                      (mingetty-service "tty2" #:motd motd)
-                      (mingetty-service "tty3" #:motd motd)
-                      (mingetty-service "tty4" #:motd motd)
-                      (mingetty-service "tty5" #:motd motd)
-                      (mingetty-service "tty6" #:motd motd)
-                      (syslog-service)
-                      (guix-service)
-                      (nscd-service)
-
-                      ;; QEMU networking settings.
-                      (static-networking-service "eth0" "10.0.2.10"
-                                                 #:name-servers '("10.0.2.3")
-                                                 #:gateway "10.0.2.2"))))))
+            (default %base-services)))
 
 
 \f
@@ -134,11 +134,11 @@ input tuples."
   (mlet %store-monad
       ((inputs (sequence %store-monad
                          (map (match-lambda
-                               ((name (? package? p))
+                               ((or ((? package? p)) (? package? p))
                                 (mlet %store-monad
                                     ((drv (package->derivation p system)))
                                   (return `(,name ,drv))))
-                               ((name (? package? p) output)
+                               (((? package? p) output)
                                 (mlet %store-monad
                                     ((drv (package->derivation p system)))
                                   (return `(,name ,drv ,output))))
@@ -149,7 +149,8 @@ input tuples."
                            #:system system
                            #:inputs inputs
                            #:modules '((guix build union))
-                           #:guile-for-build guile)))
+                           #:guile-for-build guile
+                           #:local-build? #t)))
 
 (define* (file-union files
                      #:key (inputs '()) (name "file-union"))
@@ -187,7 +188,8 @@ as an inputs; additional inputs, such as derivations, are taken from INPUTS."
                                          `(symlink ,target ,name)))
                                        files))
 
-                             #:inputs inputs))))
+                             #:inputs inputs
+                             #:local-build? #t))))
 
 (define (links inputs)
   "Return a directory with symbolic links to all of INPUTS.  This is
@@ -209,9 +211,11 @@ directories or regular files."
 
   (mlet %store-monad ((inputs (lower-inputs inputs)))
     (derivation-expression "links" builder
-                           #:inputs inputs)))
+                           #:inputs inputs
+                           #:local-build? #t)))
 
 (define* (etc-directory #:key
+                        (locale "C") (timezone "Europe/Paris")
                         (accounts '())
                         (groups '())
                         (pam-services '())
@@ -226,6 +230,11 @@ directories or regular files."
        (group      (group-file groups))
        (pam.d      (pam-services->directory pam-services))
        (login.defs (text-file "login.defs" "# Empty for now.\n"))
+       (shells     (text-file "shells"            ; used by xterm and others
+                              "\
+/bin/sh
+/run/current-system/bin/sh
+/run/current-system/bin/bash\n"))
        (issue      (text-file "issue" "
 This is an alpha preview of the GNU system.  Welcome.
 
@@ -237,30 +246,52 @@ You can log in as 'guest' or 'root' with no password.
 "))
 
        ;; TODO: Generate bashrc from packages' search-paths.
-       (bashrc    (text-file "bashrc" (string-append "
+       (bashrc    (text-file* "bashrc"  "
 export PS1='\\u@\\h\\$ '
+
+export LC_ALL=\"" locale "\"
+export TZ=\"" timezone "\"
+export TZDIR=\"" tzdata "/share/zoneinfo\"
+
 export PATH=$HOME/.guix-profile/bin:" profile "/bin:" profile "/sbin
 export CPATH=$HOME/.guix-profile/include:" profile "/include
 export LIBRARY_PATH=$HOME/.guix-profile/lib:" profile "/lib
 alias ls='ls -p --color'
 alias ll='ls -l'
-")))
+"))
 
+       (tz-file  (package-file tzdata
+                               (string-append "share/zoneinfo/" timezone)))
        (files -> `(("services" ,services)
                    ("protocols" ,protocols)
                    ("rpc" ,rpc)
                    ("pam.d" ,(derivation->output-path pam.d))
                    ("login.defs" ,login.defs)
                    ("issue" ,issue)
-                   ("profile" ,bashrc)
+                   ("shells" ,shells)
+                   ("profile" ,(derivation->output-path bashrc))
+                   ("localtime" ,tz-file)
                    ("passwd" ,passwd)
                    ("shadow" ,shadow)
                    ("group" ,group))))
     (file-union files
                 #:inputs `(("net" ,net-base)
-                           ("pam.d" ,pam.d))
+                           ("pam.d" ,pam.d)
+                           ("bashrc" ,bashrc)
+                           ("tzdata" ,tzdata))
                 #:name "etc")))
 
+(define (operating-system-profile-derivation os)
+  "Return a derivation that builds the default profile of OS."
+  ;; TODO: Replace with a real profile with a manifest.
+  (union (operating-system-packages os)
+         #:name "default-profile"))
+
+(define (operating-system-profile-directory os)
+  "Return the directory name of the default profile of OS."
+  (mlet %store-monad ((drv (operating-system-profile-derivation os)))
+    (return (derivation->output-path drv))))
+
 (define (operating-system-derivation os)
   "Return a derivation that builds OS."
   (mlet* %store-monad
@@ -275,27 +306,26 @@ alias ll='ls -l'
                             (append-map service-pam-services services))))
 
        (bash-file (package-file bash "bin/bash"))
-       (dmd-file  (package-file (@ (gnu packages system) dmd) "bin/dmd"))
+       (dmd-file  (package-file (@ (gnu packages admin) dmd) "bin/dmd"))
        (accounts -> (cons (user-account
                             (name "root")
                             (password "")
                             (uid 0) (gid 0)
                             (comment "System administrator")
-                            (home-directory "/"))
+                            (home-directory "/root"))
                           (append (operating-system-users os)
                                   (append-map service-user-accounts
                                               services))))
        (groups   -> (append (operating-system-groups os)
                             (append-map service-user-groups services)))
-       (packages -> (operating-system-packages os))
 
-       ;; TODO: Replace with a real profile with a manifest.
-       (profile-drv (union packages
-                           #:name "default-profile"))
+       (profile-drv (operating-system-profile-derivation os))
        (profile ->  (derivation->output-path profile-drv))
        (etc-drv     (etc-directory #:accounts accounts #:groups groups
                                    #:pam-services pam-services
-                                   #:profile profile))
+                                   #:locale (operating-system-locale os)
+                                   #:timezone (operating-system-timezone os)
+                                   #:profile profile-drv))
        (etc     ->  (derivation->output-path etc-drv))
        (dmd-conf  (dmd-configuration-file services etc))
 
@@ -306,17 +336,18 @@ alias ll='ls -l'
                                      "--config" ,dmd-conf))))
        (kernel  ->  (operating-system-kernel os))
        (kernel-dir  (package-file kernel))
-       (initrd  ->  (operating-system-initrd os))
-       (initrd-file (package-file initrd))
+       (initrd      (operating-system-initrd os))
+       (initrd-file -> (string-append (derivation->output-path initrd)
+                                      "/initrd"))
        (entries ->  (list (menu-entry
                            (label (string-append
                                    "GNU system with "
                                    (package-full-name kernel)
                                    " (technology preview)"))
                            (linux kernel)
-                           (linux-arguments `("--root=/dev/vda1"
+                           (linux-arguments `("--root=/dev/sda1"
                                               ,(string-append "--load=" boot)))
-                           (initrd initrd))))
+                           (initrd initrd-file))))
        (grub.cfg (grub-configuration-file entries))
        (extras   (links (delete-duplicates
                          (append (append-map service-inputs services)