mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
kbuild: rebuild initramfs if content of initramfs changes
initramfs.cpio.gz being build in usr/ and included in the kernel was not rebuild when the included files changed. To fix this the following was done: - let gen_initramfs.sh generate a list of files and directories included in the initramfs - gen_initramfs generate the gzipped cpio archive so we could simplify the kbuild file (Makefile) - utilising the kbuild infrastructure so when uid/gid root mapping changes the initramfs will be rebuild With this change we have a much more robust initramfs generation. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
89
usr/Makefile
89
usr/Makefile
@@ -1,65 +1,48 @@
|
||||
#
|
||||
# kbuild file for usr/ - including initramfs image
|
||||
#
|
||||
|
||||
klibcdirs:;
|
||||
|
||||
# Generate builtin.o based on initramfs_data.o
|
||||
obj-y := initramfs_data.o
|
||||
|
||||
hostprogs-y := gen_init_cpio
|
||||
|
||||
clean-files := initramfs_data.cpio.gz initramfs_list
|
||||
|
||||
# initramfs_data.o contains the initramfs_data.cpio.gz image.
|
||||
# The image is included using .incbin, a dependency which is not
|
||||
# tracked automatically.
|
||||
$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
|
||||
|
||||
ifdef CONFIG_INITRAMFS_ROOT_UID
|
||||
gen_initramfs_args += -u $(CONFIG_INITRAMFS_ROOT_UID)
|
||||
#####
|
||||
# Generate the initramfs cpio archive
|
||||
|
||||
hostprogs-y := gen_init_cpio
|
||||
initramfs := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh
|
||||
ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), \
|
||||
$(CONFIG_INITRAMFS_SOURCE),-d)
|
||||
ramfs-args := \
|
||||
$(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
|
||||
$(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID)) \
|
||||
$(ramfs-input)
|
||||
|
||||
# .initramfs_data.cpio.gz.d is used to identify all files included
|
||||
# in initramfs and to detect if any files are added/removed.
|
||||
# Removed files are identified by directory timestamp being updated
|
||||
# The dependency list is generated by gen_initramfs.sh -l
|
||||
ifneq ($(wildcard $(obj)/.initramfs_data.cpio.gz.d),)
|
||||
include $(obj)/.initramfs_data.cpio.gz.d
|
||||
endif
|
||||
|
||||
ifdef CONFIG_INITRAMFS_ROOT_GID
|
||||
gen_initramfs_args += -g $(CONFIG_INITRAMFS_ROOT_GID)
|
||||
endif
|
||||
quiet_cmd_initfs = GEN $@
|
||||
cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
|
||||
|
||||
# The $(shell echo $(CONFIG_INITRAMFS_SOURCE)) is to remove the
|
||||
# gratuitous begin and end quotes from the Kconfig string type.
|
||||
# Internal, escaped quotes in the Kconfig string will loose the
|
||||
# escape and become active quotes.
|
||||
quotefixed_initramfs_source := $(shell echo $(CONFIG_INITRAMFS_SOURCE))
|
||||
|
||||
filechk_initramfs_list = $(CONFIG_SHELL) \
|
||||
$(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) $(quotefixed_initramfs_source)
|
||||
|
||||
$(obj)/initramfs_list: $(obj)/Makefile FORCE
|
||||
$(call filechk,initramfs_list)
|
||||
|
||||
quiet_cmd_cpio = CPIO $@
|
||||
cmd_cpio = ./$< $(obj)/initramfs_list > $@
|
||||
|
||||
|
||||
# Check if the INITRAMFS_SOURCE is a cpio archive
|
||||
ifneq (,$(findstring .cpio,$(quotefixed_initramfs_source)))
|
||||
|
||||
# INITRAMFS_SOURCE has a cpio archive - verify that it's a single file
|
||||
ifneq (1,$(words $(quotefixed_initramfs_source)))
|
||||
$(error Only a single file may be specified in CONFIG_INITRAMFS_SOURCE (="$(quotefixed_initramfs_source)") when a cpio archive is directly specified.)
|
||||
endif
|
||||
# Now use the cpio archive directly
|
||||
initramfs_data_cpio = $(quotefixed_initramfs_source)
|
||||
targets += $(quotefixed_initramfs_source)
|
||||
|
||||
else
|
||||
|
||||
# INITRAMFS_SOURCE is not a cpio archive - create one
|
||||
$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \
|
||||
$(initramfs-y) $(obj)/initramfs_list FORCE
|
||||
$(call if_changed,cpio)
|
||||
|
||||
targets += initramfs_data.cpio
|
||||
initramfs_data_cpio = $(obj)/initramfs_data.cpio
|
||||
|
||||
endif
|
||||
|
||||
|
||||
$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
targets += initramfs_data.cpio.gz
|
||||
targets := initramfs_data.cpio.gz
|
||||
$(deps_initramfs): klibcdirs
|
||||
# We rebuild initramfs_data.cpio.gz if:
|
||||
# 1) Any included file is newer then initramfs_data.cpio.gz
|
||||
# 2) There are changes in which files are included (added or deleted)
|
||||
# 3) If gen_init_cpio are newer than initramfs_data.cpio.gz
|
||||
# 4) arguments to gen_initramfs.sh changes
|
||||
$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
|
||||
$(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.gz.d
|
||||
$(call if_changed,initfs)
|
||||
|
||||
|
Reference in New Issue
Block a user