Subject: Re: [PATCH v3] gnu: Add iPXE.

From: Vincent Legoll <[email-masked]>
Date: Tue, 14 Apr 2020 17:11:29 +0200

Hello,

On 13/04/2020 01:28, Tobias Geerinckx-Rice wrote:
> The image still isn't reproducible, but it has much fewer dates in it
> now and it actually boots ;-) [citation needed].

I tried it in qemu, got confused by its own ipxe stack, but I

think it then went to isolinux which is from the ipxe.iso image...

> I've silenced some other annoying warnings during the build, and
> applied some of my suggestions from my previous mail (not all though —
> please do send a V3).

This new patch has the following changes:

* used git-file-name

* build everything, as I didn't know what subset to choose

* install everything in ...-ipxe-1.20.1/lib/ipxe with subdirs

for per-arch binaries: bin-i386, etc. You spoke about lib

but put them in share, so I choose to change to the former

* do the install phase in scheme, as it was easier to handle

the above item than to generate a proper makefile target

* only install files with specified extensions, this will get rid

of the .a and other irrelevant files

> Neither mtools nor XZ were ever used.  Why were they there?

I initially added the inputs in bulk from the build instructions

on the website, and forgot to check their usefulness before

sending the patch RFC.

-- 

Vincent Legoll

>From a9313c42e8e07c501f1991ff98001bb3fc908584 Mon Sep 17 00:00:00 2001
From: Vincent Legoll <[email-masked]>
Date: Mon, 13 Apr 2020 01:28:31 +0200
Subject: [PATCH] gnu: Add iPXE.

* gnu/packages/bootloaders.scm (ipxe): New variable.

Co-authored-by Tobias Geerinckx-Rice <[email-masked]>
---
 gnu/packages/bootloaders.scm | 82 +++++++++++++++++++++++++++++++++++-
 1 file changed, 81 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index cadcc937e1..23dda99b2a 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -7,10 +7,11 @@
 ;;; Copyright © 2016, 2017 Danny Milosavljevic <[email-masked]>
 ;;; Copyright © 2016, 2017 David Craven <[email-masked]>
 ;;; Copyright © 2017, 2018 Efraim Flashner <[email-masked]>
-;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <[email-masked]>
+;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <[email-masked]>
 ;;; Copyright © 2019 nee <[email-masked]>
 ;;; Copyright © 2019 Mathieu Othacehe <[email-masked]>
 ;;; Copyright © 2020 Björn Höfling <[email-masked]>
+;;; Copyright © 2020 Vincent Legoll <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -834,6 +835,85 @@ to Novena upstream, does not load u-boot.img from the first partition.")
        `(("firmware" ,arm-trusted-firmware-rk3399)
          ,@(package-native-inputs base))))))
 
+(define-public ipxe
+  (package
+    (name "ipxe")
+    (version "1.20.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/ipxe/ipxe")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0w7h7y97gj9nqvbmsg1zp6zj5mpbbpckqbbx7bpp6k3ahy5fk8zp"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:make-flags
+       (list "ECHO_E_BIN_ECHO=echo"
+             "ECHO_E_BIN_ECHO_E=echo -e"
+
+             ;; cdrtools' mkisofs will silently ignore a missing isolinux.bin!
+             ;; Luckily xorriso is more strict.
+             (string-append "ISOLINUX_BIN=" (assoc-ref %build-inputs "syslinux")
+                            "/share/syslinux/isolinux.bin")
+
+             ;; Build reproducibly.
+             "BUILD_ID_CMD=echo -n 0x78697547"
+             "everything")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'enter-source-directory
+           (lambda _ (chdir "src") #t))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (ipxe (string-append out "/lib/ipxe"))
+                    (exts-re
+                     "\\.(efi|efirom|iso|kkpxe|kpxe|lkrn|mrom|pxe|rom|usb)$")
+                    (dirs '("bin" "bin-i386-linux" "bin-x86_64-pcbios"
+                            "bin-x86_64-efi" "bin-x86_64-linux" "bin-i386-efi"))
+                    (files (apply append
+                                  (map (lambda (dir)
+                                         (find-files dir exts-re)) dirs))))
+               (for-each (lambda (file)
+                           (let* ((subdir (dirname file))
+                                  (fn (basename file))
+                                  (tgtsubdir (cond
+                                              ((string=? "bin" subdir) "")
+                                              ((string-prefix? "bin-" subdir)
+                                               (string-drop subdir 4)))))
+                             (install-file file
+                                           (string-append ipxe "/" tgtsubdir))))
+                         files))
+             #t))
+         (add-before 'configure 'use-xorriso
+           ;; Use xorriso's mkisofs emulation, which is better maintained and
+           ;; respects SOURCE_DATE_EPOCH to create a reproducible image.
+           (lambda _
+             (substitute* "util/geniso"
+               ((" genisoimage ") " \"xorriso -as mkisofs\" "))
+             #t))
+         (delete 'configure)            ; no configure script
+         (add-after 'install 'leave-source-directory
+           (lambda _ (chdir "..") #t)))
+       #:tests? #f))                    ; no test suite
+    (native-inputs
+     `(("perl" ,perl)
+       ("syslinux" ,syslinux)
+       ("xorriso" ,xorriso)))
+    (home-page "https://ipxe.org")
+    (synopsis "PXE-compliant network boot firmware")
+    (description "iPXE is a network boot firmware.  It provides a full PXE
+implementation enhanced with additional features such as booting from: a web
+server via HTTP, an iSCSI SAN, a Fibre Channel SAN via FCoE, an AoE SAN, a
+wireless network, a wide-area network, an Infiniband network.  It allows to
+control the boot process with a script.  You can use iPXE to replace the
+existing PXE ROM on your network card, or you can chainload into iPXE to obtain
+the features of iPXE without the hassle of reflashing.")
+    (license license:gpl2+)))
+
 (define-public vboot-utils
   (package
     (name "vboot-utils")
-- 
2.26.0