summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/firmware.scm44
1 files changed, 43 insertions, 1 deletions
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 13e33afd35..c2040148c2 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -296,6 +296,8 @@ for platform-specific firmwares executing in M-mode.")
     (arguments
      `(#:tests? #f                      ; no check target
        #:make-flags '("EXTRAVERSION=-guix") ;upstream wants distros to set this
+       #:modules (,@%gnu-build-system-modules
+                  (ice-9 match))
        #:phases
        (modify-phases %standard-phases
          (replace 'configure
@@ -307,12 +309,52 @@ for platform-specific firmwares executing in M-mode.")
                (lambda (port)
                  (format port ,(package-version this-package))))
              (setenv "CC" "gcc")))
+         (add-after 'build 'build-vgabios
+           (lambda* (#:key (make-flags ''()) #:allow-other-keys)
+             (for-each
+              (match-lambda
+                ((target . config)
+                 (let* ((dot-config (string-append (getcwd) "/" target "/.config"))
+                        (flags (append make-flags
+                                      (list (string-append "KCONFIG_CONFIG="
+                                                           dot-config)
+                                            (string-append "OUT=" target "/")))))
+                   (mkdir target)
+                   (call-with-output-file dot-config
+                     (lambda (port)
+                       (for-each (lambda (entry)
+                                   (if (string-suffix? "=n" entry)
+                                       (format port "# CONFIG_~a is not set~%"
+                                               (string-drop-right entry 2))
+                                       (format port "CONFIG_~a~%" entry)))
+                                 (cons "BUILD_VGABIOS=y" config))))
+                   (apply invoke "make" (append flags '("oldnoconfig")))
+                   (apply invoke "make" flags)
+                   (link (string-append target "/bios.bin")
+                         (string-append "out/" target ".bin")))))
+              ;; These tuples are modelled after Debians packaging:
+              ;; https://salsa.debian.org/qemu-team/seabios/-/blob/master/debian/rules
+              '(("ati"    . ("VGA_ATI=y" "VGA_PCI=y"))
+                ("bochs-display" . ("DISPLAY_BOCHS=y" "VGA_PCI=y"))
+                ("cirrus" . ("VGA_CIRRUS=y" "VGA_PCI=y"))
+                ("stdvga" . ("VGA_BOCHS=y" "VGA_PCI=y"))
+                ("virtio" . ("VGA_BOCHS_VIRTIO=y" "VGA_PCI=y"))
+                ("vmware" . ("VGA_BOCHS_VMWARE=y" "VGA_PCI=y"))
+                ("qxl"    . ("VGA_BOCHS_QXL=y" "VGA_PCI=y"))
+                ("isavga" . ("VGA_BOCHS=y" "VGA_PCI=n"))
+                ("ramfb"  . ("VGA_RAMFB=y" "VGA_PCI=n"))))))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
                     (fmw (string-append out "/share/firmware")))
                (mkdir-p fmw)
-               (copy-file "out/bios.bin" (string-append fmw "/bios.bin"))))))))
+               (copy-file "out/bios.bin" (string-append fmw "/bios.bin"))
+               (for-each (lambda (bios)
+                           (install-file bios fmw))
+                         (find-files "out" "\\.bin$"))
+               (with-directory-excursion fmw
+                 ;; QEMU 1.7 and later looks only for the latter.
+                 (symlink "bios.bin" "bios-256k.bin"))))))))
     (home-page "https://www.seabios.org/SeaBIOS")
     (synopsis "x86 BIOS implementation")
     (description "SeaBIOS is an implementation of a 16bit x86 BIOS.  SeaBIOS