[Buildroot] [PATCH 2/2] boot/systemd-boot: new package
Yann E. MORIN
yann.morin.1998 at free.fr
Mon Dec 24 21:26:55 UTC 2018
James, All,
On 2018-12-19 07:41 +0800, james.hilliard1 at gmail.com spake thusly:
> From: James Hilliard <james.hilliard1 at gmail.com>
>
> This is essentially the successor to gummiboot.
>
> This package will use the existing systemd-boot binaries when systemd
> init is selected.
I find this commit log a bit terse...
When the packaging is non trivial, like this one, it is important to
write in the commit log all the tricks that are used in the package.
For example, you could start with something simple:
systemd-boot is part of the systemd source tree.
Then, add a quick blurb about the patches:
To avoid duplication, we just symlink the patches from systemd.
Then you should probably explain how you solved the dependency against
systemd:
When systemd is enabled (as the init system), enabling the
systemd-boot package will simply select the corresponding
option in the systemd package. In this case, the systemd-boot
package is a generic-package, that builds nothing and isntall
othing, delegating everything to the systemd package.
When system is disabled, enabling the systemd-boot package will
actually build and install the boot blobs. To avoid building a
complete systemd, we explicitly request the build of each
individual blobs, and manually copy them at install time.
And now, with this explanations, I will be able to properly question
that design! ;-)
See below...
> Signed-off-by: James Hilliard <james.hilliard1 at gmail.com>
> ---
[--SNIP--]
> diff --git a/boot/systemd-boot/Config.in b/boot/systemd-boot/Config.in
> new file mode 100644
> index 0000000..922bb07
> --- /dev/null
> +++ b/boot/systemd-boot/Config.in
> @@ -0,0 +1,24 @@
> +config BR2_TARGET_SYSTEMD_BOOT
> + bool "systemd-boot"
> + depends on BR2_i386 || BR2_x86_64
You'll need to get this architecture list in sync with the one in
systemd. I would suggest that you limit yourself to what you can test
and are interested in.
> + select BR2_PACKAGE_SYSTEMD_BOOT if BR2_INIT_SYSTEMD
I think it is much more simple if you just do:
depends on !BR2_PACKAGE_SYSTEMD
and then add a comment (at the end of this Config.in)::
comment "systemd-boot is provided by systemd"
depends on BR2_PACKAGE_SYSTEMD
That way, you don't have to need to be schizophrenic about being a
generic-package or a meson-package. Just be a meson-package.
> + select BR2_PACKAGE_UTIL_LINUX
> + select BR2_PACKAGE_UTIL_LINUX_LIBBLKID
Beware, that libblkid uses fork(), so needs an MMU, so you need to
propagate that dependency with (the comment is to indicate that it's an
inherited dependency):
depends on BR2_USE_MMU # util-linux' libblkid
But since we're only building the boot blobs, can we do away without
util-linux?
Looking at an impothetical situation (e.g. recovery system, or a
first-stage initramfs...):
minimalist system with just busybox,
- systemd-boot as bootloader
this would force having util-linux library, even though nothing would
use them...
[--SNIP--]
> diff --git a/boot/systemd-boot/buildroot.conf b/boot/systemd-boot/buildroot.conf
> new file mode 100644
> index 0000000..16d4d85
> --- /dev/null
> +++ b/boot/systemd-boot/buildroot.conf
> @@ -0,0 +1,3 @@
> +title Buildroot
> +linux /bzImage
> +options root=/dev/sda2 rootwait console=tty1
> diff --git a/boot/systemd-boot/loader.conf b/boot/systemd-boot/loader.conf
> new file mode 100644
> index 0000000..93b77b8
> --- /dev/null
> +++ b/boot/systemd-boot/loader.conf
> @@ -0,0 +1,2 @@
> +timeout 3
> +default buildroot
I see that your previous patch in systemd did not provide thoose two
files.
Note: we'd need a way to also share those two files (buildroot.conf and
loader.conf) between systemd-boot and systemd.
> diff --git a/boot/systemd-boot/systemd-boot.mk b/boot/systemd-boot/systemd-boot.mk
> new file mode 100644
> index 0000000..7f97ef0
> --- /dev/null
> +++ b/boot/systemd-boot/systemd-boot.mk
> @@ -0,0 +1,126 @@
> +################################################################################
> +#
> +# systemd-boot
> +#
> +################################################################################
> +
> +SYSTEMD_BOOT_VERSION = 239
You'll need to add a comment here and in systemd, to keep the versions
in sync (like you've seen in mesa3d and mesa3d-headers).
> +SYSTEMD_BOOT_SITE = $(call github,systemd,systemd,v$(SYSTEMD_BOOT_VERSION))
> +SYSTEMD_BOOT_DL_SUBDIR = systemd
Yes! :-)
> +SYSTEMD_BOOT_LICENSE = LGPL-2.1+, GPL-2.0+ (udev), Public Domain (few source files, see README)
> +SYSTEMD_BOOT_LICENSE_FILES = LICENSE.GPL2 LICENSE.LGPL2.1 README
> +SYSTEMD_BOOT_INSTALL_STAGING = NO
> +SYSTEMD_BOOT_INSTALL_TARGET = NO
> +SYSTEMD_BOOT_INSTALL_IMAGES = YES
> +SYSTEMD_BOOT_DEPENDENCIES = \
> + gnu-efi \
> + util-linux
> +ifeq ($(BR2_PACKAGE_SYSTEMD_BOOT),y)
> +SYSTEMD_BOOT_DEPENDENCIES += systemd
> +endif
You can get rid of this dependency, once you switch to a depends on
!SYSTEMD in the Config.in.
> +ifeq ($(BR2_i386),y)
> +SYSTEMD_BOOT_IMGARCH = ia32
> +else ifeq ($(BR2_x86_64),y)
> +SYSTEMD_BOOT_IMGARCH = x64
> +endif
> +
> +ifneq ($(BR2_PACKAGE_SYSTEMD_BOOT),y)
> +SYSTEMD_BOOT_CONF_OPTS += \
> + -Drootlibdir='/usr/lib' \
> + -Dblkid=true \
Can we get rid of libblkid here?
> + -Dman=false \
> + -Dima=false \
> + -Dlibcryptsetup=false \
> + -Defi=true \
> + -Defi-cc=$(TARGET_CC) \
> + -Defi-ld=$(TARGET_LD) \
> + -Defi-libdir=$(STAGING_DIR)/usr/lib \
> + -Defi-ldsdir=$(STAGING_DIR)/usr/lib \
> + -Defi-includedir=$(STAGING_DIR)/usr/include/efi \
As far as I could see from the code, those 5 last options already
default to the proper values. Why did you need to force them?
> + -Dgnu-efi=true \
> + -Dldconfig=false \
> + -Ddefault-dnssec=no \
> + -Dtests=false \
> + -Dnobody-group=nogroup \
> + -Didn=true \
> + -Dnss-systemd=true \
Since we're only building the boot blobs, why do we need to have those
two set to 'true', when all the rest is set to false?
> + -Dacl=false \
> + -Daudit=false \
> + -Delfutils=false \
> + -Dlibidn=false \
> + -Dlibidn2=false \
> + -Dseccomp=false \
> + -Dxkbcommon=false \
> + -Dbzip2=false \
> + -Dlz4=false \
> + -Dpam=false \
> + -Dxz=false \
> + -Dzlib=false \
> + -Dlibcurl=false \
> + -Dgcrypt=false \
> + -Dpcre2=false \
> + -Dmicrohttpd=false \
> + -Dqrencode=false \
> + -Dselinux=false \
> + -Dhwdb=false \
> + -Dbinfmt=false \
> + -Dvconsole=false \
> + -Dquotacheck=false \
> + -Dtmpfiles=false \
> + -Dsysusers=false \
> + -Dfirstboot=false \
> + -Drandomseed=false \
> + -Dbacklight=false \
> + -Drfkill=false \
> + -Dlogind=false \
> + -Dmachined=false \
> + -Dimportd=false \
> + -Dhostnamed=false \
> + -Dmyhostname=false \
> + -Dtimedated=false \
> + -Dlocaled=false \
> + -Dcoredump=false \
> + -Dpolkit=false \
> + -Dnetworkd=false \
> + -Dresolve=false \
> + -Dtimesyncd=false \
> + -Dsmack=false \
> + -Dhibernate=false
> +endif
> +
> +SYSTEMD_BOOT_CONF_ENV = $(HOST_UTF8_LOCALE_ENV)
> +SYSTEMD_BOOT_NINJA_ENV = $(HOST_UTF8_LOCALE_ENV)
> +
> +ifeq ($(BR2_PACKAGE_SYSTEMD_BOOT),y)
> +define SYSTEMD_BOOT_BUILD_CMDS
> + mkdir -p $(@D)/build/src/boot/efi
> + cp $(TARGET_DIR)/usr/lib/systemd/boot/efi/systemd-boot$(SYSTEMD_BOOT_IMGARCH).efi \
> + $(@D)/build/src/boot/efi/systemd-boot$(SYSTEMD_BOOT_IMGARCH).efi
> + cp $(TARGET_DIR)/usr/lib/systemd/boot/efi/linux$(SYSTEMD_BOOT_IMGARCH).efi.stub \
> + $(@D)/build/src/boot/efi/linux$(SYSTEMD_BOOT_IMGARCH).efi.stub
> +endef
You can now also get rid of this trick.
> +else
> +define SYSTEMD_BOOT_BUILD_CMDS
> + $(TARGET_MAKE_ENV) $(SYSTEMD_BOOT_NINJA_ENV) \
> + $(NINJA) $(NINJA_OPTS) -C $(@D)/build \
> + src/boot/efi/{systemd-boot$(SYSTEMD_BOOT_IMGARCH).efi,linux$(SYSTEMD_BOOT_IMGARCH).efi.stub}
> +endef
> +endif
> +
> +define SYSTEMD_BOOT_INSTALL_IMAGES_CMDS
> + $(INSTALL) -D -m 0644 $(@D)/build/src/boot/efi/systemd-boot$(SYSTEMD_BOOT_IMGARCH).efi \
> + $(BINARIES_DIR)/efi-part/EFI/BOOT/boot$(SYSTEMD_BOOT_IMGARCH).efi
> + echo "boot$(SYSTEMD_BOOT_IMGARCH).efi" > \
> + $(BINARIES_DIR)/efi-part/startup.nsh
> + $(INSTALL) -D -m 0644 $(SYSTEMD_BOOT_PKGDIR)/loader.conf \
> + $(BINARIES_DIR)/efi-part/loader/loader.conf
> + $(INSTALL) -D -m 0644 $(SYSTEMD_BOOT_PKGDIR)/buildroot.conf \
> + $(BINARIES_DIR)/efi-part/loader/entries/buildroot.conf
Should you not be doing the same in the systemd case?
Regards,
Yann E. MORIN.
> +endef
> +
> +ifeq ($(BR2_PACKAGE_SYSTEMD_BOOT),y)
> +$(eval $(generic-package))
> +else
> +$(eval $(meson-package))
> +endif
> diff --git a/boot/systemd-boot/systemd.hash b/boot/systemd-boot/systemd.hash
> new file mode 120000
> index 0000000..4259f40
> --- /dev/null
> +++ b/boot/systemd-boot/systemd.hash
> @@ -0,0 +1 @@
> +../../package/systemd/systemd.hash
> \ No newline at end of file
> --
> 2.7.4
>
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
More information about the buildroot
mailing list