diff options
Diffstat (limited to 'gnu/packages/bootloaders.scm')
-rw-r--r-- | gnu/packages/bootloaders.scm | 1561 |
1 files changed, 1056 insertions, 505 deletions
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm index 210bc30536..0db2021910 100644 --- a/gnu/packages/bootloaders.scm +++ b/gnu/packages/bootloaders.scm @@ -3,7 +3,7 @@ ;;; Copyright © 2015, 2018 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Leo Famulari <leo@famulari.name> ;;; Copyright © 2016, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> -;;; Copyright © 2016, 2017, 2018, 2021 Marius Bakke <marius@gnu.org> +;;; Copyright © 2016-2018, 2021-2023 Marius Bakke <marius@gnu.org> ;;; Copyright © 2016, 2017 Danny Milosavljevic <dannym@scratchpost.org> ;;; Copyright © 2016, 2017 David Craven <david@craven.ch> ;;; Copyright © 2017, 2018, 2020, 2021, 2022 Efraim Flashner <efraim@flashner.co.il> @@ -16,6 +16,8 @@ ;;; Copyright © 2021 Vincent Legoll <vincent.legoll@gmail.com> ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re> ;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> +;;; Copyright © 2021 Stefan <stefan-guix@vodafonemail.de> +;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -61,19 +63,27 @@ #:use-module (gnu packages texinfo) #:use-module (gnu packages tls) #:use-module (gnu packages sdl) + #:use-module (gnu packages sphinx) #:use-module (gnu packages serialization) #:use-module (gnu packages swig) #:use-module (gnu packages valgrind) #:use-module (gnu packages virtualization) #:use-module (gnu packages xorg) + #:use-module (gnu packages python-web) + #:use-module (gnu packages python-xyz) #:use-module (guix build-system gnu) + #:use-module (guix build-system pyproject) + #:use-module (guix build-system trivial) #:use-module (guix download) + #:use-module (guix gexp) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) + #:use-module (ice-9 optargs) + #:use-module (ice-9 match) #:use-module (ice-9 regex)) (define unifont @@ -92,22 +102,22 @@ (name "grub") (version "2.06") (source (origin - (method url-fetch) - (uri (string-append "mirror://gnu/grub/grub-" version ".tar.xz")) - (sha256 - (base32 - "1qbycnxkx07arj9f2nlsi9kp0dyldspbv07ysdyd34qvz55a97mp")) - (patches (search-patches - "grub-efi-fat-serial-number.patch" - "grub-setup-root.patch")) - (modules '((guix build utils))) - (snippet - '(begin - ;; Adjust QEMU invocation to not use a deprecated device - ;; name that was removed in QEMU 6.0. Remove for >2.06. - (substitute* "tests/ahci_test.in" - (("ide-drive") - "ide-hd")))))) + (method url-fetch) + (uri (string-append "mirror://gnu/grub/grub-" version ".tar.xz")) + (sha256 + (base32 + "1qbycnxkx07arj9f2nlsi9kp0dyldspbv07ysdyd34qvz55a97mp")) + (patches (search-patches + "grub-efi-fat-serial-number.patch" + "grub-setup-root.patch")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Adjust QEMU invocation to not use a deprecated device + ;; name that was removed in QEMU 6.0. Remove for >2.06. + (substitute* "tests/ahci_test.in" + (("ide-drive") + "ide-hd")))))) (build-system gnu-build-system) (arguments `(#:configure-flags @@ -117,65 +127,62 @@ (list "PYTHON=true") ;; Grub fails to load modules stripped with --strip-unneeded. #:strip-flags '("--strip-debug" "--enable-deterministic-archives") - #:phases (modify-phases %standard-phases - (add-after 'unpack 'patch-stuff - (lambda* (#:key native-inputs inputs #:allow-other-keys) - (substitute* "grub-core/Makefile.in" - (("/bin/sh") (which "sh"))) - - ;; Give the absolute file name of 'mdadm', used to - ;; determine the root file system when it's a RAID - ;; device. Failing to do that, 'grub-probe' silently - ;; fails if 'mdadm' is not in $PATH. - (when (assoc-ref inputs "mdadm") - (substitute* "grub-core/osdep/linux/getroot.c" - (("argv\\[0\\] = \"mdadm\"") - (string-append "argv[0] = \"" - (assoc-ref inputs "mdadm") - "/sbin/mdadm\"")))) - - ;; Make the font visible. - (copy-file (assoc-ref (or native-inputs inputs) - "unifont") - "unifont.bdf.gz") - (system* "gunzip" "unifont.bdf.gz") - - ;; Give the absolute file name of 'ckbcomp'. - (substitute* "util/grub-kbdcomp.in" - (("^ckbcomp ") - (string-append - (search-input-file inputs "/bin/ckbcomp") - " "))))) - (add-after 'unpack 'set-freetype-variables - ;; These variables need to be set to the native versions - ;; of the dependencies because they are used to build - ;; programs which are executed during build time. - (lambda* (#:key native-inputs #:allow-other-keys) - (when (assoc-ref native-inputs "freetype") - (let ((freetype (assoc-ref native-inputs "freetype"))) - (setenv "BUILD_FREETYPE_LIBS" - (string-append "-L" freetype - "/lib -lfreetype")) - (setenv "BUILD_FREETYPE_CFLAGS" - (string-append "-I" freetype - "/include/freetype2")))) - #t)) - (add-before 'check 'disable-flaky-test - (lambda _ - ;; This test is unreliable. For more information, see: - ;; <https://bugs.gnu.org/26936>. - (substitute* "Makefile.in" - (("grub_cmd_date grub_cmd_set_date grub_cmd_sleep") - "grub_cmd_date grub_cmd_sleep")) - #t)) - (add-before 'check 'disable-pixel-perfect-test - (lambda _ - ;; This test compares many screenshots rendered with an - ;; older Unifont (9.0.06) than that packaged in Guix. - (substitute* "Makefile.in" - (("test_unset grub_func_test") - "test_unset")) - #t))) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-stuff + (lambda* (#:key native-inputs inputs #:allow-other-keys) + (substitute* "grub-core/Makefile.in" + (("/bin/sh") (which "sh"))) + + ;; Give the absolute file name of 'mdadm', used to determine the + ;; root file system when it's a RAID device. Failing to do that, + ;; 'grub-probe' silently fails if 'mdadm' is not in $PATH. + (when (assoc-ref inputs "mdadm") + (substitute* "grub-core/osdep/linux/getroot.c" + (("argv\\[0\\] = \"mdadm\"") + (string-append "argv[0] = \"" + (assoc-ref inputs "mdadm") + "/sbin/mdadm\"")))) + + ;; Make the font visible. + (copy-file (assoc-ref (or native-inputs inputs) + "unifont") + "unifont.bdf.gz") + (system* "gunzip" "unifont.bdf.gz") + + ;; Give the absolute file name of 'ckbcomp'. + (substitute* "util/grub-kbdcomp.in" + (("^ckbcomp ") + (string-append + (search-input-file inputs "/bin/ckbcomp") + " "))))) + (add-after 'unpack 'set-freetype-variables + ;; These variables need to be set to the native versions of the + ;; dependencies because they are used to build programs which are + ;; executed during build time. + (lambda* (#:key native-inputs #:allow-other-keys) + (when (assoc-ref native-inputs "freetype") + (let ((freetype (assoc-ref native-inputs "freetype"))) + (setenv "BUILD_FREETYPE_LIBS" + (string-append "-L" freetype + "/lib -lfreetype")) + (setenv "BUILD_FREETYPE_CFLAGS" + (string-append "-I" freetype + "/include/freetype2")))))) + (add-before 'check 'disable-flaky-test + (lambda _ + ;; This test is unreliable. For more information, see: + ;; <https://bugs.gnu.org/26936>. + (substitute* "Makefile.in" + (("grub_cmd_date grub_cmd_set_date grub_cmd_sleep") + "grub_cmd_date grub_cmd_sleep")))) + (add-before 'check 'disable-pixel-perfect-test + (lambda _ + ;; This test compares many screenshots rendered with an older + ;; Unifont (9.0.06) than that packaged in Guix. + (substitute* "Makefile.in" + (("test_unset grub_func_test") + "test_unset"))))) ;; Disable tests on ARM and AARCH64 platforms or when cross-compiling. #:tests? ,(not (or (any (cute string-prefix? <> (or (%current-target-system) (%current-system))) @@ -222,19 +229,19 @@ ("flex" ,flex) ("texinfo" ,texinfo) ("help2man" ,help2man) - ("freetype" ,freetype) ; native version needed for build-grub-mkfont + ("freetype" ,freetype) ;native version needed for build-grub-mkfont ;; XXX: When building GRUB 2.02 on 32-bit x86, we need a binutils ;; capable of assembling 64-bit instructions. However, our default ;; binutils on 32-bit x86 is not 64-bit capable. ,@(if (string-match "^i[3456]86-" (%current-system)) (let ((binutils (package/inherit - binutils - (name "binutils-i386") - (arguments - (substitute-keyword-arguments (package-arguments binutils) - ((#:configure-flags flags ''()) - `(cons "--enable-64-bit-bfd" ,flags))))))) + binutils + (name "binutils-i386") + (arguments + (substitute-keyword-arguments (package-arguments binutils) + ((#:configure-flags flags ''()) + `(cons "--enable-64-bit-bfd" ,flags))))))) `(("ld-wrapper" ,(make-ld-wrapper "ld-wrapper-i386" #:binutils binutils)) ("binutils" ,binutils))) @@ -342,21 +349,21 @@ menu to select one of the installed operating systems.") `(,@(substitute-keyword-arguments (package-arguments grub-efi) ((#:configure-flags flags ''()) `(cons* - ,@(cond ((target-x86?) '("--target=i386")) - ((target-aarch64?) - (list "--target=arm" - (string-append "TARGET_CC=" - (cc-for-target "arm-linux-gnueabihf")))) - ((target-arm?) '("--target=arm")) - (else '())) - ,flags))))) + ,@(cond ((target-x86?) '("--target=i386")) + ((target-aarch64?) + (list "--target=arm" + (string-append "TARGET_CC=" + (cc-for-target "arm-linux-gnueabihf")))) + ((target-arm?) '("--target=arm")) + (else '())) + ,flags))))) (native-inputs (if (target-aarch64?) - (modify-inputs (package-native-inputs grub-efi) - (prepend - (cross-gcc "arm-linux-gnueabihf") - (cross-binutils "arm-linux-gnueabihf"))) - (package-native-inputs grub-efi))))) + (modify-inputs (package-native-inputs grub-efi) + (prepend + (cross-gcc "arm-linux-gnueabihf") + (cross-binutils "arm-linux-gnueabihf"))) + (package-native-inputs grub-efi))))) ;; Because grub searches hardcoded paths it's easiest to just build grub ;; again to make it find both grub-pc and grub-efi. There is a command @@ -392,6 +399,92 @@ menu to select one of the installed operating systems.") (scandir input-dir)) #t))))))))) +(define-public (make-grub-efi-netboot name subdir) + "Make a grub-efi-netboot package named NAME, which will be able to boot over +network via TFTP by accessing its files in the SUBDIR of a TFTP root directory. +This package is also able to boot from local storage devices. + +A bootloader-installer basically needs to copy the package content into the +bootloader-target directory, which will usually be the TFTP root, as +'grub-mknetdir' will be invoked already during the package creation. + +Alternatively the bootloader-target directory can be a mounted EFI System +Partition (ESP), or a similar partition with a FAT file system, for booting +from local storage devices. + +The name of the GRUB EFI binary will conform to the UEFI specification for +removable media. Depending on the system it will be e.g. bootx64.efi or +bootaa64.efi below SUBDIR. + +The SUBDIR argument needs to be set to \"efi/boot\" to create a package which +conforms to the UEFI specification for removable media. + +The SUBDIR argument defaults to \"efi/Guix\", as it is also the case for +'grub-efi-bootloader'." + (package + (name name) + (version (package-version grub-efi)) + ;; Source is not needed, but it cannot be omitted. + (source #f) + (build-system trivial-build-system) + (arguments + (let* ((system (string-split (nix-system->gnu-triplet + (or (%current-target-system) + (%current-system))) + #\-)) + (arch (first system)) + (boot-efi + (match system + ;; These are the supportend systems and the names defined by + ;; the UEFI standard for removable media. + (("i686" _ ...) "/bootia32.efi") + (("x86_64" _ ...) "/bootx64.efi") + (("arm" _ ...) "/bootarm.efi") + (("aarch64" _ ...) "/bootaa64.efi") + (("riscv" _ ...) "/bootriscv32.efi") + (("riscv64" _ ...) "/bootriscv64.efi") + ;; Other systems are not supported, although defined. + ;; (("riscv128" _ ...) "/bootriscv128.efi") + ;; (("ia64" _ ...) "/bootia64.efi") + ((_ ...) #f))) + (core-efi (string-append + ;; This is the arch dependent file name of GRUB, e.g. + ;; i368-efi/core.efi or arm64-efi/core.efi. + (match arch + ("i686" "i386") + ("aarch64" "arm64") + ("riscv" "riscv32") + (_ arch)) + "-efi/core.efi"))) + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((bootloader #$(this-package-input "grub-efi")) + (net-dir #$output) + (sub-dir (string-append net-dir "/" #$subdir "/")) + (boot-efi (string-append sub-dir #$boot-efi)) + (core-efi (string-append sub-dir #$core-efi))) + ;; Install GRUB, which refers to the grub.cfg, with support for + ;; encrypted partitions, + (setenv "GRUB_ENABLE_CRYPTODISK" "y") + (invoke/quiet (string-append bootloader "/bin/grub-mknetdir") + (string-append "--net-directory=" net-dir) + (string-append "--subdir=" #$subdir) + ;; These modules must be pre-loaded to allow booting + ;; from an ESP or a similar partition with a FAT + ;; file system. + (string-append "--modules=part_msdos part_gpt fat")) + ;; Move GRUB's core.efi to the removable media name. + (false-if-exception (delete-file boot-efi)) + (rename-file core-efi boot-efi)))))) + (inputs (list grub-efi)) + (synopsis (package-synopsis grub-efi)) + (description (package-description grub-efi)) + (home-page (package-home-page grub-efi)) + (license (package-license grub-efi)))) + (define-public syslinux (let ((commit "bb41e935cc83c6242de24d2271e067d76af3585c")) (package @@ -449,12 +542,13 @@ menu to select one of the installed operating systems.") (lambda _ (invoke "chmod" "a+w" "utils/isohybrid.in"))) (replace 'check - (lambda _ - (setenv "CC" "gcc") - (substitute* "tests/unittest/include/unittest/unittest.h" - ;; Don't look up headers under /usr. - (("/usr/include/") "")) - (invoke "make" "unittest")))))) + (lambda* (#:key tests? #:allow-other-keys) + (when tests? + (setenv "CC" "gcc") + (substitute* "tests/unittest/include/unittest/unittest.h" + ;; Don't look up headers under /usr. + (("/usr/include/") "")) + (invoke "make" "unittest"))))))) (home-page "https://www.syslinux.org") (synopsis "Lightweight Linux bootloader") (description "Syslinux is a lightweight Linux bootloader.") @@ -479,38 +573,45 @@ menu to select one of the installed operating systems.") (base32 "0xm38h31jb29xfh2sfyk48d8wdfq4b8lmb412zx9vjr35izjb9iq")))) (build-system gnu-build-system) + (arguments + (list + #:modules `(,@%gnu-build-system-modules (srfi srfi-26)) + #:make-flags + #~(list (string-append "CC=" #$(cc-for-target)) + ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1. + (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib") + (string-append "PREFIX=" #$output) + (string-append "SETUP_PREFIX=" #$output) + "INSTALL=install") + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'patch-pkg-config + (lambda _ + (substitute* '("Makefile" + "tests/run_tests.sh") + (("pkg-config") + #$(pkg-config-for-target))))) + (delete 'configure) ;no configure script + (add-before 'build 'install-doc + (lambda _ + (with-directory-excursion "Documentation" + (for-each (cut install-file <> (string-append + #$output "/share/doc/dtc/")) + '("dts-format.txt" + "dt-object-internal.txt" + "manual.txt")))))))) (native-inputs (append - (list bison - flex - libyaml - pkg-config - swig) - (if (member (%current-system) (package-supported-systems valgrind)) - (list valgrind) - '()))) + (list bison + flex + libyaml + pkg-config + swig) + (if (member (%current-system) (package-supported-systems valgrind)) + (list valgrind) + '()))) (inputs (list python)) - (arguments - `(#:make-flags - (list (string-append "CC=" ,(cc-for-target)) - - ;; /bin/fdt{get,overlay,put} need help finding libfdt.so.1. - (string-append "LDFLAGS=-Wl,-rpath=" - (assoc-ref %outputs "out") "/lib") - - (string-append "PREFIX=" (assoc-ref %outputs "out")) - (string-append "SETUP_PREFIX=" (assoc-ref %outputs "out")) - "INSTALL=install") - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'patch-pkg-config - (lambda _ - (substitute* '("Makefile" - "tests/run_tests.sh") - (("pkg-config") - ,(pkg-config-for-target))))) - (delete 'configure)))) ; no configure script (home-page "https://www.devicetree.org") (synopsis "Compiles device tree source files") (description "@command{dtc} compiles @@ -543,49 +644,84 @@ tree binary files. These are board description files used by Linux and BSD.") (define u-boot (package (name "u-boot") - (version "2022.04") + (version "2022.10") (source (origin - (patches + (patches (list %u-boot-rockchip-inno-usb-patch %u-boot-allow-disabling-openssl-patch %u-boot-sifive-prevent-relocating-initrd-fdt - %u-boot-rk3399-enable-emmc-phy-patch)) + %u-boot-rk3399-enable-emmc-phy-patch + (search-patch "u-boot-infodocs-target.patch") + (search-patch "u-boot-patman-guix-integration.patch"))) (method url-fetch) (uri (string-append "https://ftp.denx.de/pub/u-boot/" "u-boot-" version ".tar.bz2")) (sha256 (base32 - "1l5w13dznj0z1ibqv2d6ljx2ma1gnf5x5ay3dqkqwxr6750nbq38")))) - (native-inputs - `(("bc" ,bc) - ("bison" ,bison) - ("dtc" ,dtc) - ("gnutls" ,gnutls) - ("flex" ,flex) - ("lz4" ,lz4) - ("tinfo" ,ncurses/tinfo) - ("perl" ,perl) - ("python" ,python) - ("python-coverage" ,python-coverage) - ("python-pycryptodomex" ,python-pycryptodomex) - ("python-pytest" ,python-pytest) - ("swig" ,swig) - ("libuuid" ,util-linux "lib"))) + "1y5x8vxdgsqdqlsvq01mn8lmw53fqairkhvhhjx83hjva0m4id2h")))) (build-system gnu-build-system) + (native-inputs + (list bison + dtc + gnutls + flex + lz4 + ncurses/tinfo + perl + pkg-config ;for 'make menuconfig' + python + swig + (list util-linux "lib"))) (home-page "https://www.denx.de/wiki/U-Boot/") (synopsis "ARM bootloader") (description "U-Boot is a bootloader used mostly for ARM boards. It also initializes the boards (RAM etc).") (license license:gpl2+))) +;;; This is very similar to the linux-libre-documentation package, since it +;;; reuses the same Makefile-based build system. +(define-public u-boot-documentation + (package + (inherit u-boot) + (name "u-boot-documentation") + (arguments + (list + #:make-flags #~(list "HOSTCC=gcc" + ;; Avoid treating Sphinx warnings as errors. + "SPHINXOPTS=") + #:tests? #f + #:phases #~(modify-phases %standard-phases + (delete 'configure) + (replace 'build + (lambda* (#:key make-flags #:allow-other-keys) + (apply invoke "make" "infodocs" make-flags))) + (replace 'install + (lambda* (#:key make-flags #:allow-other-keys) + (let* ((info-dir (string-append #$output "/share/info")) + (info (string-append info-dir + "/DasUBoot.info.gz"))) + (with-directory-excursion "doc/output" + (apply invoke "make" "-C" "texinfo" "install-info" + (string-append "infodir=" info-dir) + make-flags)))))))) + (native-inputs + (modify-inputs (package-native-inputs u-boot) + (append fontconfig + python-sphinx + texinfo + which))) + (synopsis "U-Boot documentation") + (description "This package provides the documentation for U-Boot, as an +Info manual."))) + (define-public u-boot-tools (package (inherit u-boot) (name "u-boot-tools") (native-inputs (modify-inputs (package-native-inputs u-boot) - (prepend sdl2))) + (prepend python-coverage python-pycryptodomex python-pytest sdl2))) (arguments `(#:make-flags '("HOSTCC=gcc") #:test-target "tcheck" @@ -594,12 +730,12 @@ also initializes the boards (RAM etc).") (add-after 'unpack 'patch (lambda* (#:key inputs #:allow-other-keys) (substitute* "Makefile" - (("/bin/pwd") (which "pwd")) - (("/bin/false") (which "false"))) + (("/bin/pwd") (which "pwd")) + (("/bin/false") (which "false"))) (substitute* "tools/dtoc/fdt_util.py" - (("'cc'") "'gcc'")) + (("'cc'") "'gcc'")) (substitute* "tools/patman/test_util.py" - ;; python3-coverage is simply called coverage in guix. + ;; python3-coverage is simply called coverage in guix. (("python3-coverage") "coverage") ;; Don't require 100% coverage since it's brittle and can @@ -607,41 +743,40 @@ also initializes the boards (RAM etc).") (("raise ValueError\\('Test coverage failure'\\)") "print('Continuing anyway since Guix does not care :O')")) (substitute* "test/run" - ;; Make it easier to find test failures. - (("#!/bin/bash") "#!/bin/bash -x") - ;; This test would require git. - (("\\./tools/patman/patman") (which "true")) - ;; FIXME: test fails, needs further investiation - (("run_test \"binman\"") "# run_test \"binman\"") - ;; FIXME: test_spl fails, needs further investiation - (("test_ofplatdata or test_handoff or test_spl") + ;; Make it easier to find test failures. + (("#!/bin/bash") "#!/bin/bash -x") + ;; This test would require git. + (("\\./tools/patman/patman") (which "true")) + ;; FIXME: test fails, needs further investiation + (("run_test \"binman\"") "# run_test \"binman\"") + ;; FIXME: test_spl fails, needs further investiation + (("test_ofplatdata or test_handoff or test_spl") "test_ofplatdata or test_handoff") - ;; FIXME: code coverage not working - (("run_test \"binman code coverage\"") - "# run_test \"binman code coverage\"") - ;; This test would require internet access. - (("\\./tools/buildman/buildman") (which "true"))) + ;; FIXME: code coverage not working + (("run_test \"binman code coverage\"") + "# run_test \"binman code coverage\"") + ;; This test would require internet access. + (("\\./tools/buildman/buildman") (which "true"))) (substitute* "test/py/tests/test_sandbox_exit.py" - (("def test_ctrl_c") - "@pytest.mark.skip(reason='Guix has problems with SIGINT') + (("def test_ctrl_c") + "@pytest.mark.skip(reason='Guix has problems with SIGINT') def test_ctrl_c")) ;; Test against the tools being installed rather than tools built ;; for "sandbox" target. (substitute* "test/image/test-imagetools.sh" (("BASEDIR=sandbox") "BASEDIR=.")) (for-each (lambda (file) - (substitute* file - ;; Disable features that require OpenSSL due - ;; to GPL/Openssl license incompatibilities. - ;; See https://bugs.gnu.org/34717 for - ;; details. - (("CONFIG_FIT_SIGNATURE=y") - "CONFIG_FIT_SIGNATURE=n\nCONFIG_UT_LIB_ASN1=n\nCONFIG_TOOLS_LIBCRYPTO=n") - ;; This test requires a sound system, which is un-used - ;; in u-boot-tools. - (("CONFIG_SOUND=y") "CONFIG_SOUND=n"))) - (find-files "configs" "sandbox_.*defconfig$|tools-only_defconfig")) - #t)) + (substitute* file + ;; Disable features that require OpenSSL due + ;; to GPL/Openssl license incompatibilities. + ;; See https://bugs.gnu.org/34717 for + ;; details. + (("CONFIG_FIT_SIGNATURE=y") + "CONFIG_FIT_SIGNATURE=n\nCONFIG_UT_LIB_ASN1=n\nCONFIG_TOOLS_LIBCRYPTO=n") + ;; This test requires a sound system, which is un-used + ;; in u-boot-tools. + (("CONFIG_SOUND=y") "CONFIG_SOUND=n"))) + (find-files "configs" "sandbox_.*defconfig$|tools-only_defconfig")))) (replace 'configure (lambda* (#:key make-flags #:allow-other-keys) (apply invoke "make" "tools-only_defconfig" make-flags))) @@ -666,164 +801,213 @@ def test_ctrl_c")) "tools/proftool" "tools/fdtgrep" "tools/env/fw_printenv" - "tools/sunxi-spl-image-builder")) - #t))) - (delete 'check) - (add-after 'install 'check - (lambda* (#:key make-flags test-target #:allow-other-keys) - (invoke "test/image/test-imagetools.sh"))) - ;; Only run full test suite on x86_64 systems, as many tests - ;; assume x86_64. - ,@(if (string-match "^x86_64-linux" - (or (%current-target-system) - (%current-system))) - '((add-after 'check 'check-x86 - (lambda* (#:key make-flags test-target #:allow-other-keys) - (apply invoke "make" "mrproper" make-flags) - (setenv "SDL_VIDEODRIVER" "dummy") - (setenv "PAGER" "cat") - (apply invoke "make" test-target make-flags)))) - '())))) - (description "U-Boot is a bootloader used mostly for ARM boards. It -also initializes the boards (RAM etc). This package provides its -board-independent tools."))) - -(define-public (make-u-boot-package board triplet) - "Returns a u-boot package for BOARD cross-compiled for TRIPLET." - (let ((same-arch? (lambda () - (string=? (%current-system) - (gnu-triplet->nix-system triplet))))) + "tools/sunxi-spl-image-builder"))))) + (delete 'check) + (add-after 'install 'check + (lambda* (#:key make-flags test-target #:allow-other-keys) + (invoke "test/image/test-imagetools.sh"))) + ;; Only run full test suite on x86_64 systems, as many tests + ;; assume x86_64. + ,@(if (string-match "^x86_64-linux" + (or (%current-target-system) + (%current-system))) + '((add-after 'check 'check-x86 + (lambda* (#:key make-flags test-target #:allow-other-keys) + (apply invoke "make" "mrproper" make-flags) + (setenv "SDL_VIDEODRIVER" "dummy") + (setenv "PAGER" "cat") + (apply invoke "make" test-target make-flags)))) + '())))) + (description (string-append + (package-description u-boot) + " This package provides board-independent tools " + "of U-Boot.")))) + +;;; This is packaged separately, as it can be used in other contexts than for +;;; U-Boot development. +(define-public patman + (package + (inherit u-boot) + (name "patman") + (build-system pyproject-build-system) + (arguments + ;; The test suite strongly relies on the git metadata being available (23 + ;; failed, 14 passed). + (list + #:tests? #f + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'chdir + (lambda _ + (chdir "tools/patman")))))) + (inputs (list python-pygit2 python-requests)) + (synopsis "Patch automation tool") + (description "Patman is a patch automation script which: +@itemize +@item Creates patches directly from your branch +@item Cleans them up by removing unwanted tags +@item Inserts a cover letter with change lists +@item Runs the patches through automated checks +@item Optionally emails them out to selected people. +@end itemize"))) + +(define*-public (make-u-boot-package board triplet + #:key + defconfig + configs + name-suffix + append-description + (u-boot u-boot)) + "Return a U-Boot package for BOARD cross-compiled for TRIPLET with the +optional DEFCONFIG file and optional configuration changes from CONFIGS. +TRIPLET may also be set to #f to disable cross-compilation. NAME-SUFFIX is +appended to the package name, while APPEND-DESCRIPTION is appended to the +package description. U-BOOT can be used when a fork or a different version of +U-Boot must be used." + (let ((native-build? (lambda () + (or (not triplet) ;disable cross-compilation + (string=? (%current-system) + (gnu-triplet->nix-system triplet)))))) (package (inherit u-boot) (name (string-append "u-boot-" (string-replace-substring (string-downcase board) - "_" "-"))) - (native-inputs - `(,@(if (not (same-arch?)) - `(("cross-gcc" ,(cross-gcc triplet)) - ("cross-binutils" ,(cross-binutils triplet))) - `()) - ,@(package-native-inputs u-boot))) + "_" "-") + (or name-suffix ""))) + (description (if append-description + (string-append (package-description u-boot) + "\n\n" append-description) + (package-description u-boot))) + (build-system gnu-build-system) (arguments - `(#:modules ((ice-9 ftw) - (srfi srfi-1) - (guix build utils) - (guix build gnu-build-system)) - #:test-target "test" - #:make-flags - (list "HOSTCC=gcc" - ,@(if (not (same-arch?)) - `((string-append "CROSS_COMPILE=" ,triplet "-")) - '())) - #:phases - (modify-phases %standard-phases - (replace 'configure - (lambda* (#:key outputs make-flags #:allow-other-keys) - (let ((config-name (string-append ,board "_defconfig"))) - (if (file-exists? (string-append "configs/" config-name)) - (apply invoke "make" `(,@make-flags ,config-name)) - (begin - (display "Invalid board name. Valid board names are:" - (current-error-port)) - (let ((suffix-len (string-length "_defconfig")) - (entries (scandir "configs"))) - (for-each (lambda (file-name) - (when (string-suffix? "_defconfig" file-name) - (format (current-error-port) - "- ~A\n" - (string-drop-right file-name - suffix-len)))) - (sort entries string-ci<))) - (error "Invalid boardname ~s." ,board)))))) - (add-after 'configure 'disable-tools-libcrypto - ;; Disable libcrypto due to GPL and OpenSSL license - ;; incompatibilities - (lambda _ - (substitute* ".config" - (("CONFIG_TOOLS_LIBCRYPTO=.*$") "CONFIG_TOOLS_LIBCRYPTO=n")))) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (libexec (string-append out "/libexec")) - (uboot-files (append - (remove - ;; Those would not be reproducible - ;; because of the randomness used - ;; to produce them. - ;; It's expected that the user will - ;; use u-boot-tools to generate them - ;; instead. - (lambda (name) - (string-suffix? - "sunxi-spl-with-ecc.bin" - name)) - (find-files "." ".*\\.(bin|efi|img|spl|itb|dtb|rksd)$")) - (find-files "." "^(MLO|SPL)$")))) - (mkdir-p libexec) - (install-file ".config" libexec) - ;; Useful for "qemu -kernel". - (install-file "u-boot" libexec) - (for-each - (lambda (file) - (let ((target-file (string-append libexec "/" file))) - (mkdir-p (dirname target-file)) - (copy-file file target-file))) - uboot-files) - #t))))))))) - -(define-public u-boot-malta - (make-u-boot-package "malta" "mips64el-linux-gnuabi64")) + (substitute-keyword-arguments (package-arguments u-boot) + ((#:target _ #f) + (and (not (native-build?)) triplet)) + ((#:modules modules '()) + `((ice-9 ftw) + (srfi srfi-1) + (guix build gnu-build-system) + (guix build kconfig) + (guix build utils) + ,@modules)) + ((#:imported-modules imported-modules '()) + `((guix build kconfig) + ,@%gnu-build-system-modules + ,@imported-modules)) + ((#:test-target _ "test") + "test") + ((#:make-flags make-flags '()) + #~(list "HOSTCC=gcc" + "KBUILD_VERBOSE=1" + #$@(if (not (native-build?)) + (list (string-append "CROSS_COMPILE=" triplet "-")) + '()) + #$@make-flags)) + ((#:phases phases '%standard-phases) + #~(modify-phases #$phases + (replace 'configure + (lambda* (#:key make-flags #:allow-other-keys) + (let* ((config-name (string-append #$board "_defconfig")) + (config-file (string-append "configs/" config-name)) + (defconfig #$defconfig) + (configs '#$configs)) + (when defconfig + ;; Replace the board-specific defconfig with the given + ;; one. + (copy-file defconfig config-file)) + (if (file-exists? config-file) + (begin + (when configs + (modify-defconfig config-file configs)) + (apply invoke "make" `(,@make-flags ,config-name)) + (verify-config ".config" config-file)) + (begin + (display "invalid board name; valid board names are:" + (current-error-port)) + (let ((suffix-len (string-length "_defconfig")) + (entries (scandir "configs"))) + (for-each (lambda (file-name) + (when (string-suffix? "_defconfig" + file-name) + (format (current-error-port) + "- ~A\n" + (string-drop-right + file-name suffix-len)))) + (sort entries string-ci<))) + (error "invalid boardname ~s" #$board)))))) + (add-after 'configure 'disable-tools-libcrypto + ;; Disable libcrypto due to GPL and OpenSSL license + ;; incompatibilities + (lambda _ + (substitute* ".config" + (("CONFIG_TOOLS_LIBCRYPTO=.*$") + "CONFIG_TOOLS_LIBCRYPTO=n")))) + (replace 'install + (lambda _ + (let ((libexec (string-append #$output "/libexec")) + (uboot-files + (append + (remove + ;; Those would not be reproducible + ;; because of the randomness used to + ;; produce them. It's expected that the + ;; user will use u-boot-tools to generate + ;; them instead. + (lambda (name) + (string-suffix? + "sunxi-spl-with-ecc.bin" + name)) + (find-files "." + ".*\\.(bin|efi|img|imx|spl|itb|dtb|rksd)$")) + (find-files "." "^(MLO|SPL)$")))) + (mkdir-p libexec) + (install-file ".config" libexec) + ;; Useful for "qemu -kernel". + (install-file "u-boot" libexec) + (for-each + (lambda (file) + (let ((target-file (string-append libexec "/" file))) + (mkdir-p (dirname target-file)) + (copy-file file target-file))) + uboot-files))))))))))) (define-public u-boot-am335x-boneblack - (let ((base (make-u-boot-package "am335x_evm" "arm-linux-gnueabihf"))) + (let ((base (make-u-boot-package + "am335x_evm" "arm-linux-gnueabihf" + ;; Patch out other device trees to build an image small enough + ;; to fit within typical partitioning schemes where the first + ;; partition begins at sector 2048. + #:configs '("CONFIG_OF_LIST=\"am335x-evm am335x-boneblack\"") + #:append-description + "This U-Boot is built for the BeagleBone Black, which was +removed upstream, adjusted from the am335x_evm build with several device trees +removed so that it fits within common partitioning schemes."))) (package (inherit base) - (name "u-boot-am335x-boneblack") - (description "U-Boot is a bootloader used mostly for ARM boards. It -also initializes the boards (RAM etc). - -This U-Boot is built for the BeagleBone Black, which was removed upstream, -adjusted from the am335x_evm build with several device trees removed so that -it fits within common partitioning schemes.") - (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'patch-defconfig - ;; Patch out other devicetrees to build image small enough to - ;; fit within typical partitioning schemes where the first - ;; partition begins at sector 2048. - (lambda _ - (substitute* "configs/am335x_evm_defconfig" - (("CONFIG_OF_LIST=.*$") "CONFIG_OF_LIST=\"am335x-evm am335x-boneblack\"\n")) - #t))))))))) + ;; The name is not derived from the board name on purpose, as the config + ;; is modified per the comment above, parting from the default + ;; am335x_evm configuration. + (name "u-boot-am335x-boneblack")))) (define-public u-boot-am335x-evm (make-u-boot-package "am335x_evm" "arm-linux-gnueabihf")) -(define-public (make-u-boot-sunxi64-package board triplet) - (let ((base (make-u-boot-package board triplet))) +(define*-public (make-u-boot-sunxi64-package board triplet + #:key defconfig configs) + (let ((base (make-u-boot-package + board triplet #:defconfig defconfig #:configs configs))) (package (inherit base) (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + #~(modify-phases #$phases (add-after 'unpack 'set-environment (lambda* (#:key native-inputs inputs #:allow-other-keys) - (let ((bl31 - (string-append - (assoc-ref (or native-inputs inputs) "firmware") - "/bl31.bin"))) - (setenv "BL31" bl31) - ;; This is necessary when we're using the bundled dtc. - ;(setenv "PATH" (string-append (getenv "PATH") ":" - ; "scripts/dtc")) - ) - #t)))))) - (native-inputs - `(("firmware" ,arm-trusted-firmware-sun50i-a64) - ,@(package-native-inputs base)))))) + (setenv "BL31" (search-input-file inputs "bl31.bin")))))))) + (inputs + (modify-inputs (package-inputs base) + (append arm-trusted-firmware-sun50i-a64)))))) (define-public u-boot-pine64-plus (make-u-boot-sunxi64-package "pine64_plus" "aarch64-linux-gnu")) @@ -832,20 +1016,11 @@ it fits within common partitioning schemes.") (make-u-boot-sunxi64-package "pine64-lts" "aarch64-linux-gnu")) (define-public u-boot-pinebook - (let ((base (make-u-boot-sunxi64-package "pinebook" "aarch64-linux-gnu"))) - (package - (inherit base) - (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'patch-pinebook-config - ;; Fix regression with LCD video output introduced in 2020.01 - ;; https://patchwork.ozlabs.org/patch/1225130/ - (lambda _ - (substitute* "configs/pinebook_defconfig" - (("CONFIG_VIDEO_BRIDGE_ANALOGIX_ANX6345=y") "CONFIG_VIDEO_BRIDGE_ANALOGIX_ANX6345=y\nCONFIG_VIDEO_BPP32=y")) - #t))))))))) + (make-u-boot-sunxi64-package + "pinebook" "aarch64-linux-gnu" + ;; Fix regression with LCD video output introduced in 2020.01 + ;; https://patchwork.ozlabs.org/patch/1225130/ + #:configs '("CONFIG_VIDEO_BPP32=y"))) (define-public u-boot-bananapi-m2-ultra (make-u-boot-package "Bananapi_M2_Ultra" "arm-linux-gnueabihf")) @@ -861,7 +1036,14 @@ it fits within common partitioning schemes.") (define-public u-boot-nintendo-nes-classic-edition (let ((base (make-u-boot-package "Nintendo_NES_Classic_Edition" - "arm-linux-gnueabihf"))) + "arm-linux-gnueabihf" + #:append-description "This version is for +the Nintendo NES Classic Edition. It is assumed that you have added a serial +port to pins PB0 and PB1 as described on +@url{https://linux-sunxi.org/Nintendo_NES_Classic_Edition}. + +In order to use FEL mode on the device, hold the Reset button on the +device while it's being turned on (and a while longer)."))) (package (inherit base) ;; Starting with 2019.01, FEL doesn't work anymore on A33. @@ -875,16 +1057,7 @@ it fits within common partitioning schemes.") (base32 "0znkwljfwwn4y7j20pzz4ilqw8znphrfxns0x1lwdzh3xbr96z3k")) (patches (search-patches - "u-boot-nintendo-nes-serial.patch")))) - (description "U-Boot is a bootloader used mostly for ARM boards. It -also initializes the boards (RAM etc). - -This version is for the Nintendo NES Classic Edition. It is assumed that -you have added a serial port to pins PB0 and PB1 as described on -@url{https://linux-sunxi.org/Nintendo_NES_Classic_Edition}. - -In order to use FEL mode on the device, hold the Reset button on the -device while it's being turned on (and a while longer).") + "u-boot-nintendo-nes-serial.patch")))) (native-inputs `(("python" ,python-2) ,@(package-native-inputs base)))))) @@ -896,25 +1069,14 @@ device while it's being turned on (and a while longer).") (make-u-boot-package "mx6cuboxi" "arm-linux-gnueabihf")) (define-public u-boot-novena - (let ((base (make-u-boot-package "novena" "arm-linux-gnueabihf"))) - (package - (inherit base) - (description "U-Boot is a bootloader used mostly for ARM boards. It -also initializes the boards (RAM etc). - -This U-Boot is built for Novena. Be advised that this version, contrary -to Novena upstream, does not load u-boot.img from the first partition.") - (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'patch-novena-defconfig - ;; Patch configuration to disable loading u-boot.img from FAT partition, - ;; allowing it to be installed at a device offset. - (lambda _ - (substitute* "configs/novena_defconfig" - (("CONFIG_SPL_FS_FAT=y") "# CONFIG_SPL_FS_FAT is not set")) - #t))))))))) + (make-u-boot-package + "novena" "arm-linux-gnueabihf" + ;; Patch configuration to disable loading u-boot.img from FAT partition, + ;; allowing it to be installed at a device offset. + #:configs '("# CONFIG_SPL_FS_FAT is not set") + #:append-description "This U-Boot is built for Novena. Be advised that this +version, contrary to Novena upstream, does not load u-boot.img from the first +partition.")) (define-public u-boot-cubieboard (make-u-boot-package "Cubieboard" "arm-linux-gnueabihf")) @@ -927,19 +1089,18 @@ to Novena upstream, does not load u-boot.img from the first partition.") (package (inherit base) (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + #~(modify-phases #$phases (add-after 'unpack 'set-environment (lambda* (#:key inputs #:allow-other-keys) - (setenv "BL31" - (search-input-file inputs "/bl31.elf")))) + (setenv "BL31" (search-input-file inputs "/bl31.elf")))) ;; Phases do not succeed on the bl31 ELF. (delete 'strip) (delete 'validate-runpath))))) - (native-inputs - `(("firmware" ,arm-trusted-firmware-rk3399) - ,@(package-native-inputs base)))))) + (inputs + (modify-inputs (package-native-inputs base) + (append arm-trusted-firmware-rk3399)))))) (define-public u-boot-qemu-riscv64 (make-u-boot-package "qemu-riscv64" "riscv64-linux-gnu")) @@ -947,6 +1108,46 @@ to Novena upstream, does not load u-boot.img from the first partition.") (define-public u-boot-qemu-riscv64-smode (make-u-boot-package "qemu-riscv64_smode" "riscv64-linux-gnu")) +(define-public u-boot-sandbox + (let ((base (make-u-boot-package + "sandbox" #f ;build for the native system + ;; Disable CONFIG_TOOLS_LIBCRYPTO, CONFIG_FIT_SIGNATURE and + ;; CONFIG_FIT_CIPHER and their selectors as these features + ;; require OpenSSL, which is incompatible with the GPLv2-only + ;; parts of U-boot. The options below replicate the changes + ;; that disabling the above features in 'make menuconfig' then + ;; refreshing the defconfig with 'make savedefconfig' would do. + #:configs (list "# CONFIG_FIT_RSASSA_PSS is not set" + "# CONFIG_FIT_CIPHER is not set" + "# CONFIG_LEGACY_IMAGE_FORMAT is not set" + "# CONFIG_IMAGE_PRE_LOAD is not set" + "# CONFIG_IMAGE_PRE_LOAD_SIG is not set" + "# CONFIG_CMD_BOOTM_PRE_LOAD is not set" + "CONFIG_RSA=y" + "# CONFIG_EFI_SECURE_BOOT is not set" + "# CONFIG_TOOLS_LIBCRYPTO is not set") + #:append-description + "The sandbox configuration of U-Boot provides a +@command{u-boot} command that runs as a normal user space application. It can +be used to test the functionality of U-Boot interactively without having to +deploy to an actual target device. @xref{Sandbox<6>,,,u-boot, The U-Boot +Documentation} for more information (for example by running @samp{info +\"(u-boot) Sandbox<6>\"})."))) + (package + (inherit base) + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases '%standard-phases) + #~(modify-phases #$phases + (add-after 'install 'symlink-u-boot-command + (lambda* (#:key outputs #:allow-other-keys) + ;; For ease of discovery. + (mkdir (string-append #$output "/bin")) + (symlink (search-input-file outputs "libexec/u-boot") + (string-append #$output "/bin/u-boot")))))))) + (inputs (modify-inputs (package-inputs base) + (append sdl2)))))) + (define-public u-boot-sifive-unleashed (make-u-boot-package "sifive_unleashed" "riscv64-linux-gnu")) @@ -957,15 +1158,14 @@ to Novena upstream, does not load u-boot.img from the first partition.") (arguments (substitute-keyword-arguments (package-arguments base) ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'set-environment - (lambda* (#:key inputs #:allow-other-keys) - (let ((opensbi (string-append (assoc-ref inputs "firmware") - "/fw_dynamic.bin"))) - (setenv "OPENSBI" opensbi)))))))) + #~(modify-phases #$phases + (add-after 'unpack 'set-environment + (lambda* (#:key inputs #:allow-other-keys) + (setenv "OPENSBI" (search-input-file inputs + "fw_dynamic.bin")))))))) (inputs - `(("firmware" ,opensbi-generic) - ,@(package-inputs base)))))) + (modify-inputs (package-inputs base) + (append opensbi-generic)))))) (define-public u-boot-rock64-rk3328 (let ((base (make-u-boot-package "rock64-rk3328" "aarch64-linux-gnu"))) @@ -974,58 +1174,53 @@ to Novena upstream, does not load u-boot.img from the first partition.") (arguments (substitute-keyword-arguments (package-arguments base) ((#:phases phases) - `(modify-phases ,phases - (add-after 'unpack 'set-environment - (lambda* (#:key inputs #:allow-other-keys) - (let ((bl31 (search-input-file inputs "/bl31.elf"))) - (setenv "BL31" bl31)))))))) - (native-inputs - `(("firmware" ,arm-trusted-firmware-rk3328) - ,@(package-native-inputs base)))))) + #~(modify-phases #$phases + (add-after 'unpack 'set-environment + (lambda* (#:key native-inputs inputs #:allow-other-keys) + (setenv "BL31 "(search-input-file inputs "bl31.elf")))))))) + (inputs + (modify-inputs (package-inputs base) + (append arm-trusted-firmware-rk3328)))))) (define-public u-boot-firefly-rk3399 (let ((base (make-u-boot-package "firefly-rk3399" "aarch64-linux-gnu"))) (package (inherit base) (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + #~(modify-phases #$phases (add-after 'unpack 'set-environment - (lambda* (#:key inputs #:allow-other-keys) - (setenv "BL31" (search-input-file inputs "/bl31.elf")))) + (lambda* (#:key native-inputs inputs #:allow-other-keys) + (setenv "BL31" (search-input-file inputs "bl31.elf")))) ;; Phases do not succeed on the bl31 ELF. (delete 'strip) (delete 'validate-runpath))))) - (native-inputs - `(("firmware" ,arm-trusted-firmware-rk3399) - ,@(package-native-inputs base)))))) + (inputs + (modify-inputs (package-inputs base) + (append arm-trusted-firmware-rk3399)))))) (define-public u-boot-rockpro64-rk3399 - (let ((base (make-u-boot-package "rockpro64-rk3399" "aarch64-linux-gnu"))) + (let ((base (make-u-boot-package "rockpro64-rk3399" "aarch64-linux-gnu" + #:configs '("CONFIG_USB=y" + "CONFIG_AHCI=y" + "CONFIG_AHCI_PCI=y" + "CONFIG_SATA=y" + "CONFIG_SATA_SIL=y" + "CONFIG_SCSI=y" + "CONFIG_SCSI_AHCI=y" + "CONFIG_DM_SCSI=y")))) (package (inherit base) (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + #~(modify-phases #$phases (add-after 'unpack 'set-environment (lambda* (#:key inputs #:allow-other-keys) - (setenv "BL31" - (search-input-file inputs "/bl31.elf")))) - (add-after 'unpack 'patch-config + (setenv "BL31" (search-input-file inputs "/bl31.elf")))) + (add-after 'unpack 'patch-header (lambda _ - (substitute* "configs/rockpro64-rk3399_defconfig" - (("CONFIG_USB=y") "\ -CONFIG_USB=y -CONFIG_AHCI=y -CONFIG_AHCI_PCI=y -CONFIG_SATA=y -CONFIG_SATA_SIL=y -CONFIG_SCSI=y -CONFIG_SCSI_AHCI=y -CONFIG_DM_SCSI=y -")) (substitute* "include/config_distro_bootcmd.h" (("\"scsi_need_init=false") "\"setenv scsi_need_init false") @@ -1047,28 +1242,291 @@ BOOT_TARGET_NVME(func) \\ ;; Phases do not succeed on the bl31 ELF. (delete 'strip) (delete 'validate-runpath))))) - (native-inputs - `(("firmware" ,arm-trusted-firmware-rk3399) - ,@(package-native-inputs base)))))) + (inputs + (modify-inputs (package-inputs base) + (append arm-trusted-firmware-rk3399)))))) (define-public u-boot-pinebook-pro-rk3399 (let ((base (make-u-boot-package "pinebook-pro-rk3399" "aarch64-linux-gnu"))) (package (inherit base) (arguments - (substitute-keyword-arguments (package-arguments base) - ((#:phases phases) - `(modify-phases ,phases + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases) + #~(modify-phases #$phases (add-after 'unpack 'set-environment - (lambda* (#:key inputs #:allow-other-keys) - (setenv "BL31" - (search-input-file inputs "/bl31.elf")))) + (lambda* (#:key native-inputs inputs #:allow-other-keys) + (setenv "BL31" (search-input-file inputs "bl31.elf")))) ;; Phases do not succeed on the bl31 ELF. (delete 'strip) (delete 'validate-runpath))))) + (inputs + (modify-inputs (package-inputs base) + (append arm-trusted-firmware-rk3399)))))) + +(define*-public (make-u-boot-bin-package u-boot-package + #:key + (u-boot-bin "u-boot.bin")) + "Return a package with a single U-BOOT-BIN file from the U-BOOT-PACKAGE. +The package name will be that of the U-BOOT package suffixed with \"-bin\"." + (package + (name (string-append (package-name u-boot-package) "-bin")) + (version (package-version u-boot-package)) + (source #f) + (build-system trivial-build-system) + (arguments + (list + #:builder + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + (mkdir #$output) + (symlink (search-input-file %build-inputs + (string-append "libexec/" #$u-boot-bin)) + (string-append #$output "/" #$u-boot-bin)))))) + (inputs (list u-boot-package)) + (home-page (package-home-page u-boot-package)) + (synopsis (package-synopsis u-boot-package)) + (description (string-append + (package-description u-boot-package) + "\n\n" + (format #f + "This package only contains the file ~a." + u-boot-bin))) + (license (package-license u-boot-package)))) + +(define-public %u-boot-rpi-efi-configs + '("CONFIG_OF_EMBED" + "CONFIG_OF_BOARD=y")) + +(define %u-boot-rpi-description-32-bit + "This is a 32-bit build of U-Boot.") + +(define %u-boot-rpi-description-64-bit + "This is a common 64-bit build of U-Boot for all 64-bit capable Raspberry Pi +variants.") + +(define %u-boot-rpi-efi-description + "It allows network booting and uses the device-tree from the firmware, +allowing the usage of overlays. It can act as an EFI firmware for the +grub-efi-netboot-removable-bootloader.") + +(define %u-boot-rpi-efi-description-32-bit + (string-append %u-boot-rpi-efi-description " " + %u-boot-rpi-description-32-bit)) + +(define-public u-boot-rpi-2 + (make-u-boot-package "rpi_2" "arm-linux-gnueabihf" + #:append-description %u-boot-rpi-description-32-bit)) + +(define-public u-boot-rpi-3-32b + (make-u-boot-package "rpi_3_32b" "arm-linux-gnueabihf" + #:append-description %u-boot-rpi-description-32-bit)) + +(define-public u-boot-rpi-4-32b + (make-u-boot-package "rpi_4_32b" "arm-linux-gnueabihf" + #:append-description %u-boot-rpi-description-32-bit)) + +(define-public u-boot-rpi-arm64 + (make-u-boot-package "rpi_arm64" "aarch64-linux-gnu" + #:append-description %u-boot-rpi-description-64-bit)) + +(define-public u-boot-rpi-2-efi + (make-u-boot-package "rpi_2" "arm-linux-gnueabihf" + #:name-suffix "-efi" + #:configs %u-boot-rpi-efi-configs + #:append-description %u-boot-rpi-efi-description-32-bit)) + +(define-public u-boot-rpi-3-32b-efi + (make-u-boot-package "rpi_3_32b" "arm-linux-gnueabihf" + #:name-suffix "-efi" + #:configs %u-boot-rpi-efi-configs + #:append-description %u-boot-rpi-efi-description-32-bit)) + +(define-public u-boot-rpi-4-32b-efi + (make-u-boot-package "rpi_4_32b" "arm-linux-gnueabihf" + #:name-suffix "-efi" + #:configs %u-boot-rpi-efi-configs + #:append-description %u-boot-rpi-efi-description-32-bit)) + +(define-public u-boot-rpi-arm64-efi + (make-u-boot-package "rpi_arm64""aarch64-linux-gnu" + #:name-suffix "-efi" + #:configs %u-boot-rpi-efi-configs + #:append-description (string-append + %u-boot-rpi-efi-description " " + %u-boot-rpi-description-64-bit))) + +(define-public u-boot-rpi-2-bin (make-u-boot-bin-package u-boot-rpi-2)) + +(define-public u-boot-rpi-3_32b-bin (make-u-boot-bin-package u-boot-rpi-3-32b)) + +(define-public u-boot-rpi-4_32b-bin (make-u-boot-bin-package u-boot-rpi-4-32b)) + +(define-public u-boot-rpi-arm64-bin (make-u-boot-bin-package u-boot-rpi-arm64)) + +(define-public u-boot-rpi-2-efi-bin (make-u-boot-bin-package u-boot-rpi-2-efi)) + +(define-public u-boot-rpi-3-32b-efi-bin + (make-u-boot-bin-package u-boot-rpi-3-32b-efi)) + +(define-public u-boot-rpi-4-32b-efi-bin + (make-u-boot-bin-package u-boot-rpi-4-32b-efi)) + +(define-public u-boot-rpi-arm64-efi-bin + (make-u-boot-bin-package u-boot-rpi-arm64-efi)) + +(define u-boot-ts-mx6 + ;; There is no release; use the latest commit of the + ;; 'imx_v2015.04_3.14.52_1.1.0_ga' branch. + (let ((revision "0") + (commit "08809160fbc60d6e949fa9d37d9a41aab8fef742")) + (package + (inherit u-boot) + (name "u-boot-ts-mx6") + (version (git-version "2015.04_3" revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/embeddedTS/u-boot-imx") + (commit commit))) + (file-name (git-file-name "u-boot-imx-ts" version)) + (sha256 + (base32 + "01mja33351hkcs59rmfvppqlxqw4rh9gng7a7hx2cfspqwh2y6kr")))) + (arguments + (substitute-keyword-arguments (package-arguments u-boot) + ((#:phases phases '%standard-phases) + #~(modify-phases #$phases + (add-after 'unpack 'patch-u-boot + (lambda _ + (substitute* (find-files "include/configs" "^ts[0-9]{4}\\.h$") + ;; Default to boot a standard zImage instead of a uImage. + (("/boot/uImage") + "/boot/zImage") + (("uimage") + "zimage") + (("bootm \\$\\{loadaddr}") + "bootz ${loadaddr}") + ;; This reference DTB is not available in mainline. + (("ts7970-revf.dtb") + "ts7970.dtb") + ;; Enable support for DISTRO_DEFAULTS, which enables to + ;; use 'sysboot' to boot Guix System. Also enable + ;; "standard" boot commands for dealing with discovery and + ;; booting of syslinux configurations (extlinux.conf). + + ;; Disable the stock CONFIG_BOOTCOMMAND to avoid a + ;; redefinition error. + (("CONFIG_BOOTCOMMAND") + "CONFIG_BOOTCOMMAND_DISABLED") + (("CONFIG_BOOTDELAY") + "CONFIG_BOOTDELAY_DISABLED") + ;; Inspired by include/configs/embestmx6boards.h + (("#define CONFIG_EXTRA_ENV_SETTINGS.*" anchor) + (string-append "\ +#include <config_distro_defaults.h> + +#define MEM_LAYOUT_ENV_SETTINGS \\ +\t\"bootm_size=0x10000000\\0\" \\ +\t\"kernel_addr_r=0x10800000\\0\" \\ +\t\"fdt_addr_r=0x18000000\\0\" \\ +\t\"scriptaddr=0x18100000\\0\" \\ +\t\"pxefile_addr_r=0x18200000\\0\" \\ +\t\"ramdisk_addr_r=0x18300000\\0\" + +#define BOOT_TARGET_DEVICES(func) \\ +\tfunc(MMC, mmc, 0) \\ +\tfunc(MMC, mmc, 1) \\ +\tfunc(SATA, sata, 0) \\ +\tfunc(USB, usb, 0) \\ +\tfunc(PXE, pxe, na) \\ +\tfunc(DHCP, dhcp, na) + +#include <config_distro_bootcmd.h> + +" anchor + +;; Sadly, the user config CONFIG_DEFAULT_FDT_FILE did not exist in that older +;; U-Boot. A placeholder is added here, to be substituted in each TS U-Boot +;; board package. +"\ +\t\"fdtfile=DEFAULT_FDT_FILE\\0\" \\ +\tMEM_LAYOUT_ENV_SETTINGS \\ +\tBOOTENV \\\n"))))) + (add-after 'unpack 'patch-for-reproducibility + (lambda _ + ;; Substitute dynamically computed timestamps with static + ;; ones. + (substitute* "Makefile" + (("U_BOOT_DATE \"%b %d %C%y\"") + "U_BOOT_DATE \"Jan 01 1969\"") + (("U_BOOT_TIME \"%T\"") + "U_BOOT_TIME \"00:00:00\"")))) + (add-before 'build 'adjust-for-gcc10 + (lambda _ + (copy-file "include/linux/compiler-gcc6.h" + "include/linux/compiler-gcc10.h") + (substitute* "arch/arm/Makefile" + (("march=armv5") + "march=armv5te")))) + (add-after 'install 'build+install-tools + (lambda* (#:key make-flags #:allow-other-keys) + (apply invoke "make" "tools-all" make-flags) + (install-file "tools/env/fw_printenv" + (string-append #$output "/bin")) + (symlink (string-append #$output "/bin/fw_printenv") + (string-append #$output "/bin/fw_setenv")))))))) (native-inputs - `(("firmware" ,arm-trusted-firmware-rk3399) - ,@(package-native-inputs base)))))) + (modify-inputs (package-native-inputs u-boot) + (delete "dtc")))))) ;otherwise the build fails + +;;; Note: the default cross-build of this package is currently broken on +;;; master; the fix exists as commit 6454208222d6e7760daa964b590f35ea75ffe0e5 +;;; ("build: gnu-build-system: Remove source from native inputs.") on +;;; core-updates. +(define-public u-boot-ts7970-q-2g-1000mhz-c + (let ((base + (make-u-boot-package "ts7970-q-2g-1000mhz-c" "arm-linux-gnueabihf" + #:u-boot u-boot-ts-mx6 + #:append-description + "This U-Boot variant is for the Technologic +Systems TS-7970 revision C board, which includes a quad core Freescale i.MX6 +CPU and 2 GiB of RAM clocked at 1000MHz. The binary U-Boot image to flash is +the @file{libexec/u-boot.imx} file. It can be used with the @file{zImage} and +the @file{imx6q-ts7970.dtb} files provided by the +@code{linux-libre-arm-generic} image. + +To flash this bootloader, write it to an SD card, then using the U-Boot serial +console: +@example +mmc dev 0 +load mmc 0:1 ${loadaddr} /u-boot.imx +sf probe +sf erase 0 0x80000 +sf write ${loadaddr} 0x400 $filesize +@end example + +The factory values of U-Boot must also be reset so that it boots using a +zImage instead of the default uImage: +@example +run clearenv +reset +@end example + +For more information, refer to +@url{https://docs.embeddedts.com/TS-7970#Update_U-Boot}."))) + (package + (inherit base) + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases '%standard-phases) + #~(modify-phases #$phases + (add-after 'patch-u-boot 'set-default-fdt-file + (lambda _ + (substitute* "include/configs/ts7970.h" + (("DEFAULT_FDT_FILE") + "imx6q-ts7970.dtb"))))))))))) (define-public vboot-utils (package @@ -1232,7 +1690,7 @@ order to add a suitable bootloader menu entry.") ;; ;; TODO: Bump this timestamp at each modifications of the package (not only ;; for updates) by running: date +%s. - (let ((timestamp "1591706427")) + (let ((timestamp "1671715380")) (package (name "ipxe") (version "1.21.1") @@ -1248,91 +1706,102 @@ order to add a suitable bootloader menu entry.") "1pkf1n1c0rdlzfls8fvjvi1sd9xjd9ijqlyz3wigr70ijcv6x8i9")))) (build-system gnu-build-system) (arguments - `(#:modules ((guix build utils) + (list + #:modules `((guix build utils) (guix build gnu-build-system) (guix base32) (ice-9 string-fun) (ice-9 regex) (rnrs bytevectors)) - #:imported-modules ((guix base32) + #:imported-modules `((guix base32) ,@%gnu-build-system-modules) - #:make-flags - ;; XXX: 'BUILD_ID' is used to determine when another ROM in the - ;; system contains identical code in order to save space within the - ;; legacy BIOS option ROM area, which is extremely limited in size. - ;; It is supposed to be collision-free across all ROMs, to do so we - ;; use the truncated output hash of the package. - (let ((build-id - (lambda (out) - (let* ((nix-store (string-append - (or (getenv "NIX_STORE") "/gnu/store") - "/")) - (filename - (string-replace-substring out nix-store "")) - (hash (match:substring (string-match "[0-9a-z]{32}" - filename))) - (bv (nix-base32-string->bytevector hash))) - (format #f "0x~x" - (bytevector-u32-ref bv 0 (endianness big)))))) - (out (assoc-ref %outputs "out")) - (syslinux (assoc-ref %build-inputs "syslinux"))) - (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=" syslinux - "/share/syslinux/isolinux.bin") - (string-append "SYSLINUX_MBR_DISK_PATH=" syslinux - "/share/syslinux/isohdpfx.bin") - - ;; Build reproducibly. - (string-append "BUILD_ID_CMD=echo -n " (build-id out)) - (string-append "BUILD_TIMESTAMP=" ,timestamp) - "everything")) - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'enter-source-directory - (lambda _ (chdir "src") #t)) - (add-after 'enter-source-directory 'set-options - (lambda _ - (substitute* "config/general.h" - (("^//(#define PING_CMD.*)" _ uncommented) uncommented) - (("^//(#define IMAGE_TRUST_CMD.*)" _ uncommented) - uncommented) - (("^#undef.*(DOWNLOAD_PROTO_HTTPS.*)" _ option) - (string-append "#define " option)) - (("^#undef.*(DOWNLOAD_PROTO_NFS.*)" _ option) - (string-append "#define " option))) - #t)) - (delete 'configure) ; no configure script - (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-after 'install 'leave-source-directory - (lambda _ (chdir "..") #t))) - #:tests? #f)) ; no test suite + #:make-flags + ;; XXX: 'BUILD_ID' is used to determine when another ROM in the + ;; system contains identical code in order to save space within the + ;; legacy BIOS option ROM area, which is extremely limited in size. + ;; It is supposed to be collision-free across all ROMs, to do so we + ;; use the truncated output hash of the package. + #~(let ((build-id + (lambda (out) + (let* ((nix-store (string-append + (or (getenv "NIX_STORE") "/gnu/store") + "/")) + (filename + (string-replace-substring out nix-store "")) + (hash (match:substring (string-match "[0-9a-z]{32}" + filename))) + (bv (nix-base32-string->bytevector hash))) + (format #f "0x~x" + (bytevector-u32-ref bv 0 (endianness big)))))) + (syslinux #$(this-package-native-input "syslinux"))) + (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. + #$@(if (or (target-x86-64?) (target-x86?)) + '((string-append "ISOLINUX_BIN=" syslinux + "/share/syslinux/isolinux.bin") + (string-append "SYSLINUX_MBR_DISK_PATH=" syslinux + "/share/syslinux/isohdpfx.bin")) + '()) + + ;; Build reproducibly. + (string-append "BUILD_ID_CMD=echo -n " (build-id #$output)) + (string-append "BUILD_TIMESTAMP=" #$timestamp) + "everything")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'enter-source-directory + (lambda _ (chdir "src"))) + (add-after 'enter-source-directory 'set-version + (lambda _ + ;; When not building from a git checkout, iPXE encodes the + ;; version as "1.0.0+". Use the package version instead. + (substitute* "Makefile" + (("^VERSION[[:blank:]]+=.*") + (string-append "VERSION = " #$(package-version this-package) + "-guix\n"))))) + (add-after 'enter-source-directory 'set-options + (lambda _ + (substitute* "config/general.h" + (("^//(#define PING_CMD.*)" _ uncommented) uncommented) + (("^//(#define IMAGE_TRUST_CMD.*)" _ uncommented) + uncommented) + (("^#undef.*(DOWNLOAD_PROTO_HTTPS.*)" _ option) + (string-append "#define " option)) + (("^#undef.*(DOWNLOAD_PROTO_NFS.*)" _ option) + (string-append "#define " option))))) + (delete 'configure) ; no configure script + (replace 'install + (lambda _ + (let* ((ipxe (string-append #$output "/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)))) + (add-after 'install 'leave-source-directory + (lambda _ (chdir "..")))) + #:tests? #f)) ; no test suite (native-inputs - (list perl syslinux xorriso)) + (append (if (or (target-x86-64?) (target-x86?)) + ;; Syslinux only supports i686 and x86_64. + (list syslinux) + '()) + (list perl xorriso))) (home-page "https://ipxe.org") (synopsis "PXE-compliant network boot firmware") (description "iPXE is a network boot firmware. It provides a full PXE @@ -1344,3 +1813,85 @@ 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 ipxe-qemu + (package/inherit ipxe + (name "ipxe-qemu") + (native-inputs + ;; QEMU uses a 64-bit UEFI firmware. + (if (target-x86-64?) + (modify-inputs (package-native-inputs ipxe) + (prepend edk2-tools)) + (if (target-64bit?) + (modify-inputs (package-native-inputs ipxe) + (prepend edk2-tools + (cross-gcc "x86_64-linux-gnu") + (cross-binutils "x86_64-linux-gnu"))) + ;; Our default 32-bit binutils is not 64-bit capable. + (let ((binutils-64-bit-bfd + (package/inherit + binutils + (name "binutils-64-bit-bfd") + (arguments + (substitute-keyword-arguments (package-arguments binutils) + ((#:configure-flags flags ''()) + `(cons "--enable-64-bit-bfd" ,flags))))))) + (modify-inputs (package-native-inputs ipxe) + (prepend edk2-tools + (make-ld-wrapper "ld-wrapper-64-bit-bfd" + #:binutils binutils) + binutils-64-bit-bfd + (cross-gcc "x86_64-linux-gnu") + (cross-binutils "x86_64-linux-gnu"))))))) + (arguments + (let ((roms + ;; Alist of ROM -> (VID . DID) entries. This list and below + ;; build steps are taken from QEMUs roms/Makefile. + '(("e1000" . ("8086" . "100e")) + ("e1000e" . ("8086" . "10d3")) + ("eepro100" . ("8086" . "1209")) + ("ne2k_pci" . ("1050" . "0940")) + ("pcnet" . ("1022" . "2000")) + ("rtl8139" . ("10ec" . "8139")) + ("virtio" . ("1af4" . "1000")) + ("vmxnet3" . ("15ad" . "07b0"))))) + (substitute-keyword-arguments (package-arguments ipxe) + ((#:modules modules) + `((ice-9 match) ,@modules)) + ((#:make-flags flags) + #~(append (delete "everything" #$flags) + '("CONFIG=qemu" + #$@(if (target-x86-64?) + '() + '("CROSS_COMPILE=x86_64-linux-gnu-"))) + (map (match-lambda + ((_ . (vid . did)) + (string-append "bin/" vid did ".rom"))) + '#$roms) + (map (match-lambda + ((_ . (vid . did)) + (string-append "bin-x86_64-efi/" + vid did ".efidrv"))) + '#$roms))) + ((#:phases phases) + #~(modify-phases #$phases + (replace 'install + (lambda _ + (let ((firmware (string-append #$output "/share/qemu"))) + (mkdir-p firmware) + (for-each + (match-lambda + ((name . (vid . did)) + (let ((rom (string-append "bin/" vid did ".rom"))) + (copy-file rom + (string-append firmware + "/pxe-" name ".rom")) + (invoke "EfiRom" + "-b" rom + "-l" "0x02" + "-f" (string-append "0x" vid) + "-i" (string-append "0x" did) + "-ec" (string-append "bin-x86_64-efi/" + vid did ".efidrv") + "-o" (string-append firmware + "/efi-" name ".rom"))))) + '#$roms))))))))))) |