aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020, 2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix 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 Guix 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
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu installer newt welcome)
  #:use-module ((gnu build linux-modules)
                #:select (modules-loaded
                          pci-devices))
  #:use-module (gnu installer dump)
  #:use-module (gnu installer hardware)
  #:use-module (gnu installer steps)
  #:use-module (gnu installer utils)
  #:use-module (gnu installer newt page)
  #:use-module (gnu installer newt utils)
  #:use-module (guix build syscalls)
  #:use-module (guix i18n)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (srfi srfi-71)
  #:use-module (ice-9 format)
  #:use-module (ice-9 match)
  #:use-module (ice-9 receive)
  #:use-module (newt)
  #:export (run-welcome-page))

;; Expected width and height for the logo.
(define logo-width (make-parameter 43))
(define logo-height (make-parameter 19))

(define info-textbox-width (make-parameter 70))
(define options-listbox-height (make-parameter 5))

(define (display-logo?)
  (> (screen-rows) 35))

(define* (run-menu-page title info-text logo
                        #:key
                        listbox-items
                        listbox-item->text)
  "Run a page with the given TITLE, to ask the user to choose between
LISTBOX-ITEMS displayed in a listbox. The listbox items are converted to text
using LISTBOX-ITEM->TEXT procedure. Display the textual LOGO in the center of
the page. Contrary to other pages, we cannot resort to grid layouts, because
we want this page to occupy all the screen space available."
  (define (fill-listbox listbox items)
    (map (lambda (item)
           (let* ((text (listbox-item->text item))
                  (key (append-entry-to-listbox listbox text)))
             (cons key item)))
         items))

  (let* ((logo-textbox
          (make-textbox -1 -1
                        (if (display-logo?) (logo-width) 0)
                        (if (display-logo?) (logo-height) 0)
                        0))
         (info-textbox
          (make-reflowed-textbox -1 -1
                                 info-text
                                 (info-textbox-width)))
         (options-listbox
          (make-listbox -1 -1
                        (options-listbox-height)
                        (logior FLAG-BORDER FLAG-RETURNEXIT)))
         (keys (fill-listbox options-listbox listbox-items))
         (grid (vertically-stacked-grid
                GRID-ELEMENT-COMPONENT logo-textbox
                GRID-ELEMENT-COMPONENT info-textbox
                GRID-ELEMENT-COMPONENT options-listbox))
         (form (make-form)))

    (define (choice->item str)
      ;; Return the item that corresponds to STR.
      (match (find (match-lambda
                     ((key . item)
                      (string=? str (listbox-item->text item))))
                   keys)
        ((key . item) item)
        (#f (abort-to-prompt 'installer-step 'abort))))

    (set-textbox-text logo-textbox (read-all logo))

    (add-form-to-grid grid form #t)
    (make-wrapped-grid-window grid title)

    (receive (exit-reason argument)
        (run-form-with-clients form
                               `(menu (title ,title)
                                      (text ,info-text)
                                      (items
                                       ,(map listbox-item->text
                                             listbox-items))))
      (dynamic-wind
        (const #t)
        (lambda ()
          (match exit-reason
            ('exit-component
             (let* ((entry (current-listbox-entry options-listbox))
                    (item (assoc-ref keys entry)))
               (match item
                 ((text . proc)
                  (proc)))))
            ('exit-fd-ready
             (let* ((choice argument)
                    (item   (choice->item choice)))
               (match item
                 ((text . proc)
                  (proc)))))))
        (lambda ()
          (destroy-form-and-pop form))))))

(define (check-hardware-support pci-database)
  "Warn about unsupported devices."
  (when (member "uvesafb" (modules-loaded))
    (run-error-page (G_ "\
This may be a false alarm, but possibly your graphics hardware does not
work well with only free software.  Expect trouble.  If after installation,
the system does not boot, perhaps you will need to add nomodeset to the
kernel arguments and need to configure the uvesafb kernel module.")
                    (G_ "Pre-install warning")))

  (let ((devices (pci-devices)))
    (match (filter unsupported-pci-device? devices)
      (()                                         ;no unsupported device
       #t)
      (unsupported
       (run-error-page (format #f (G_ "\
Devices not supported by free software were found on your computer:

~{  - ~a~%~}
Unfortunately, it means those devices will not be usable.

To address it, we recommend choosing hardware that respects your freedom as a \
user--hardware for which free drivers and firmware exist.  See \"Hardware \
Considerations\" in the manual for more information.")
                               (map (pci-device-description pci-database)
                                    unsupported))
                       (G_ "Hardware support warning")
                       #:width 76)))))

(define* (run-welcome-page logo #:key pci-database)
  "Run a welcome page with the given textual LOGO displayed at the center of
the page. Ask the user to choose between manual installation, graphical
installation and reboot."
  (when (file-exists? %core-dump)
    (match (choice-window
            (G_ "Previous installation failed")
            (G_ "Continue")
            (G_ "Report the failure")
            (G_ "It seems that the previous installation exited unexpectedly \
and generated a core dump.  Do you want to continue or to report the failure \
first?"))
      (1 #t)
      (2 (raise
          (condition
           (&user-abort-error))))))

  (run-menu-page
   (G_ "GNU Guix install")
   (G_ "Welcome to GNU Guix system installer!

You will be guided through a graphical installation program.

If you are familiar with GNU/Linux and you want tight control over \
the installation process, you can instead choose manual installation.  \
Documentation is accessible at any time by pressing Ctrl-Alt-F2.")
   logo
   #:listbox-items
   `((,(G_ "Graphical install using a terminal based interface")
      .
      ,(lambda ()
         (check-hardware-support pci-database)))
     (,(G_ "Install using the shell based process")
      .
      ,(lambda ()
         (check-hardware-support pci-database)
         ;; Switch to TTY3, where a root shell is available for shell based
         ;; install. The other root TTY's would have been ok too.
         (system* "chvt" "3")
         (run-welcome-page logo #:pci-database pci-database)))
     (,(G_ "Reboot")
      .
      ,(lambda ()
         (newt-finish)
         (reboot))))
   #:listbox-item->text car))
scm?id=b54523ad32c9c61108c6c099e22ce017feb78934'>ci: Raise max-silent-time to 3600....* gnu/ci.scm (image-jobs, system-test-jobs): Raise max-silent-time to 3600 seconds. Mathieu Othacehe 2020-12-03ci: Build novena-barebones-raw-image....* gnu/ci.scm (%guix-system-images): Add novena-barebones-raw-image. Danny Milosavljevic 2020-12-01Revert "ci: Temporarily disable image-jobs."...This reverts commit a79041f0b583ef3399bb46ac2a6c03a4db636573. The issue has been fixed with 07a33b1d21e240781072352f93206cfdc765f907. Mathieu Othacehe 2020-11-29ci: Temporarily disable image-jobs....* gnu/ci.scm (hydra-jobs): Temporarily disable image-jobs. Mathieu Othacehe 2020-11-25ci: Limit image and system tests jobs periodicity....System tests and images jobs are extremely expensive in I/O operations and storage size, pass a "period" argument to Cuirass to limit their periodicity. * gnu/ci.scm (hours): New procedure, (image-jobs, system-test-jobs, tarball-jobs): set a period argument. Mathieu Othacehe 2020-11-20image: Add pinebook-pro support....* gnu/system/images/pinebook-pro.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. * gnu/ci.scm (%guix-system-images): Add pinebook-pro-barebones-raw-image. Mathieu Othacehe 2020-11-02ci: Restore license handling....This is a follow-up of 7c02eb6c and 44daec7f. Restore the initial behaviour. * gnu/ci.scm (package->alist): Restore license handling. Mathieu Othacehe 2020-11-02ci: Convert license to text....This is a follow-up of 7c02eb6c8d7d050ecb8f3082c4a754ad32211403. * gnu/ci.scm (package->alist): Convert license to text. Mathieu Othacehe 2020-11-02ci: Ignore package license....Fixes: <https://issues.guix.gnu.org/44370>. * gnu/ci.scm (package->alist): Ignore package license. Mathieu Othacehe 2020-10-06images: Add pine64-barebones-raw-image....* gnu/system/images/pine64.scm (pine64-barebones-raw-image): New variable. * gnu/ci.scm (%guix-system-images): Add it. Mathieu Othacehe 2020-10-01ci: Add log and outputs keys....Add 'log and 'outputs properties to hydra objects. This way Cuirass won't have to go through every derivation to add those properties. * gnu/ci.scm (package->alist, image-jobs, system-test-jobs, tarball-jobs): Add 'log and 'outputs properties. * build-aux/hydra/guix-modular.scm (build-job): Ditto. Mathieu Othacehe 2020-10-01ci: Add nix-name and system keys....Add 'nix-name and 'system properties to hydra objects. This way Cuirass won't have to go through every derivation to add those properties. * gnu/ci.scm (package->alist, image-jobs, system-test-jobs, tarball-jobs): Add 'nix-name and 'system properties. * build-aux/hydra/guix-modular.scm (build-job): Ditto. Mathieu Othacehe 2020-09-29ci: Build hurd-barebones-qcow2-image....Build hurd-barebones-qcow2-image instead of hurd-barebones-disk-image to speed downloads. * gnu/ci.scm (%guix-system-images): Build 'hurd-barebones-qcow2-image instead of 'hurd-barebones-disk-image. Mathieu Othacehe 2020-09-25ci: Remove native-system restriction from "hello" and "list" jobsets....* gnu/ci.scm (hydra-jobs): Remove restriction for system to equal (%current-system). Co-authored-by: Ludovic Courtès <ludo@gnu.org> Jan (janneke) Nieuwenhuizen 2020-09-03ci: In the 'core' subset, build GCC >= 7....Suggested by Jan Nieuwenhuizen <janneke@gnu.org>. * gnu/ci.scm (%core-packages): Keep only GCC >= 7. Ludovic Courtès 2020-09-03gnu: ci: Truncate git commit in ISO label....* gnu/ci.scm (image-jobs): Keep only 7 characters from git commit in ISO label. Julien Lepiller 2020-08-31gnu: ci: Set label in iso9660 jobs....* gnu/ci.scm (image-jobs): Set label of generated ISOs. Julien Lepiller 2020-06-29ci: Do not limit disk-image size....Installation tests are already checking the disk-image size. Do not set another limit here. * gnu/ci.scm (image-jobs): Do not limit disk-image size. Mathieu Othacehe 2020-06-25ci: Build Guix System images....Build a list of Guix System images. For now, this list only contains the Hurd barebones Guix System image. * gnu/ci.scm (%guixsd-supported-systems): Remove "armhf-linux", (%u-boot-systems): remove unused variable, (%guix-system-images): new variable (qemu-jobs): rename to "image-jobs" and build the Guix Systems listed in the new "%guix-system-images" variable, (system-test-jobs): adapt accordingly, (hydra-jobs): ditto. Mathieu Othacehe 2020-06-25Revert "ci: Build Guix System images."...This reverts commit eda3fcfb46586710fff876ce6254b300795ef543. This change broke evaluations on CI: @ build-succeeded /gnu/store/991738x97ff1f8181a7p1pflqwkgagm8-profile.drv - ERROR: In procedure read: In procedure scm_lreadr: #<unknown port>:16:144: Unknown # object: #\< Ludovic Courtès 2020-06-24ci: Build Guix System images.Mathieu Othacehe 2020-05-29image: Do not use VM to create disk-images....Now that installing Grub on raw disk-images is supported, we do not need to rely on (gnu system vm) module. * gnu/system/image.scm (make-system-image): Rename to ... (system-image): ... this, and remove the compatibility wrapper. (find-image): Turn to a monadic procedure. This will become useful when introducing Hurd support, to be able to detect the target system. * gnu/ci.scm (qemu-jobs): Use lower-object now that system-image returns a file-like object. * gnu/tests/install.scm (run-install): Ditto. * guix/scripts/system.scm (system-derivation-for-action): Add a 'base-image' argument, (perform-action): adapt accordingly. Mathieu Othacehe 2020-05-05Merge branch 'master' into core-updatesMarius Bakke 2020-05-05image: Add a new API....Raw disk-images and ISO9660 images are created in a Qemu virtual machine. This is quite fragile, very slow, and almost unusable without KVM. For all these reasons, add support for host image generation. This implies the use new image generation mechanisms. - Raw disk images: images of partitions are created using tools such as mke2fs and mkdosfs depending on the partition file-system type. The partition images are then assembled into a final image using genimage. - ISO9660 images: the ISO root directory is populated within the store. GNU xorriso is then called on that directory, in the exact same way as this is done in (gnu build vm) module. Those mechanisms are built upon the new (gnu image) module. * gnu/image.scm: New file. * gnu/system/image.scm: New file. * gnu/build/image: New file. * gnu/local.mk: Add them. * gnu/system/vm.scm (system-disk-image): Rename to system-disk-image-in-vm. * gnu/ci.scm (qemu-jobs): Adapt to new API. * gnu/tests/install.scm (run-install): Ditto. * guix/scripts/system.scm (system-derivation-for-action): Ditto. Mathieu Othacehe 2020-04-08Merge branch 'master' into core-updates... Conflicts: etc/news.scm gnu/local.mk gnu/packages/check.scm gnu/packages/cross-base.scm gnu/packages/gimp.scm gnu/packages/java.scm gnu/packages/mail.scm gnu/packages/sdl.scm gnu/packages/texinfo.scm gnu/packages/tls.scm gnu/packages/version-control.scm Marius Bakke 2020-04-07ci: Remove "mips64el-linux-gnuabi64" from '%cross-targets'....The N64 ABI has always been a niche, it seems. * gnu/ci.scm (%cross-targets): Remove "mips64el-linux-gnuabi64". Ludovic Courtès 2020-03-14Merge branch 'master' into core-updatesMarius Bakke 2020-03-13maint: Add 'etc/release-manifest.scm'....* etc/release-manifest.scm: New file. * gnu/ci.scm (%cross-targets): Export. * build-aux/check-available-binaries.scm: Remove. * Makefile.am (EXTRA_DIST): Add 'etc/release-manifest.scm' and remove 'build-aux/check-available-binaries.scm'. (assert-binaries-available): Rewrite using 'guix weather -m'. Ludovic Courtès 2020-03-10Merge branch 'master' into core-updatesMarius Bakke 2020-03-05ci: Adjust 'channel-build-system' for when the source is a file name....Fixes an evaluation error introduced in dd1ee160be8ba4e211432c08e161c24901cd670e: when invoked via 'build-aux/cuirass/gnu-system.scm', SOURCE is a store file name, not a <local-file> as it is when invoked via 'etc/system-tests.scm'. * gnu/ci.scm (channel-build-system)[build]: Call 'lower-object' only when SOURCE is not a string. Ludovic Courtès 2020-03-05tests: "make check-system" no longer interns source upfront....* gnu/ci.scm (channel-build-system)[build, lower]: Honor #:source. (channel-source->package): New procedure. (system-test-jobs): Remove 'instance' and call to 'checkout->channel-instance'. Use 'channel-source->package'. * build-aux/run-system-tests.scm (tests-for-channel-instance): Rename to... (tests-for-current-guix): ... this. Change 'instance' to 'source'. (run-system-tests): Use 'local-file' instead of 'interned-file' for SOURCE. Ludovic Courtès 2020-03-05ci: Move 'cross-jobs' procedure to the top level....* gnu/ci.scm (cross-jobs): New procedure. Moved from... (hydra-jobs): ... here. Ludovic Courtès 2020-02-24ci: Don't cross build bootstrap tarballs to MinGW....This makes little sense and it broke in commit 8bd2b15b06f6306e37cc72995b76a7f0754cf1a6 since the mingw libc doesn't have a "static" output. * gnu/ci.scm (%packages-to-cross-build): Remove. (packages-to-cross-build): New procedure. (hydra-jobs)[cross-jobs]: Use it. Ludovic Courtès 2020-01-31ci: Cross-build for riscv64-linux-gnu....* gnu/ci.scm (%cross-targets): Add "riscv64-linux-gnu". Ludovic Courtès