![Robert Richter](/assets/img/avatar_default.png)
Install targets (install, zinstall, uinstall) on arm have a dependency
to vmlinux. This may cause parts of the kernel to be rebuilt during
installation. We must avoid this since this may run as root. Install
targets "ABSOLUTELY MUST NOT MODIFY THE SOURCE TREE." as Linus
emphasized this in:
http://lkml.org/lkml/2013/7/10/600
So on arm and maybe other archs we need the same as for x86:
1648e4f8
x86, kbuild: make "make install" not depend on vmlinux
This patch fixes this for arm. Dependencies are removed and instead a
check to install.sh is added for the files that are needed.
This issue was uncovered by this build error where the -j option is
used in conjunction with install targets:
$ make <makeflags>
$ make <makeflags> zinstall
...
DEPMOD
Usage: .../scripts/depmod.sh /sbin/depmod <kernelrelease>
(INSTALL_MOD_PATH and INSTALL_PATH variables set, so no root perms
required in this case.)
The problem is that zinstall on arm due to its dependency to vmlinux
does a prepare/prepare3 and finally does a forced rewrite of
kernel.release even if it exists already.
Rebuilding kernel.release removes it first and then recreates it. This
might race with another parallel make job running depmod.
So this patch should fix this one too.
Also quoting $(KERNELRELEASE) arg for install.sh as this messes
argument order in case it is empty (which is the case if the kernel
was not built yet).
Signed-off-by: Robert Richter <robert.richter@linaro.org>
Signed-off-by: Robert Richter <rric@kernel.org>
Acked-by: Michal Marek <mmarek@suse.cz>.
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: Michal Marek <mmarek@suse.cz>
119 lines
3.1 KiB
Makefile
119 lines
3.1 KiB
Makefile
#
|
|
# arch/arm/boot/Makefile
|
|
#
|
|
# This file is included by the global makefile so that you can add your own
|
|
# architecture-specific flags and dependencies.
|
|
#
|
|
# This file is subject to the terms and conditions of the GNU General Public
|
|
# License. See the file "COPYING" in the main directory of this archive
|
|
# for more details.
|
|
#
|
|
# Copyright (C) 1995-2002 Russell King
|
|
#
|
|
|
|
ifneq ($(MACHINE),)
|
|
include $(srctree)/$(MACHINE)/Makefile.boot
|
|
endif
|
|
|
|
# Note: the following conditions must always be true:
|
|
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
|
|
# PARAMS_PHYS must be within 4MB of ZRELADDR
|
|
# INITRD_PHYS must be in RAM
|
|
ZRELADDR := $(zreladdr-y)
|
|
PARAMS_PHYS := $(params_phys-y)
|
|
INITRD_PHYS := $(initrd_phys-y)
|
|
|
|
export ZRELADDR INITRD_PHYS PARAMS_PHYS
|
|
|
|
targets := Image zImage xipImage bootpImage uImage
|
|
|
|
ifeq ($(CONFIG_XIP_KERNEL),y)
|
|
|
|
$(obj)/xipImage: vmlinux FORCE
|
|
$(call if_changed,objcopy)
|
|
@$(kecho) ' Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))'
|
|
|
|
$(obj)/Image $(obj)/zImage: FORCE
|
|
@echo 'Kernel configured for XIP (CONFIG_XIP_KERNEL=y)'
|
|
@echo 'Only the xipImage target is available in this case'
|
|
@false
|
|
|
|
else
|
|
|
|
$(obj)/xipImage: FORCE
|
|
@echo 'Kernel not configured for XIP (CONFIG_XIP_KERNEL!=y)'
|
|
@false
|
|
|
|
$(obj)/Image: vmlinux FORCE
|
|
$(call if_changed,objcopy)
|
|
@$(kecho) ' Kernel: $@ is ready'
|
|
|
|
$(obj)/compressed/vmlinux: $(obj)/Image FORCE
|
|
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
|
|
|
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
|
|
$(call if_changed,objcopy)
|
|
@$(kecho) ' Kernel: $@ is ready'
|
|
|
|
endif
|
|
|
|
ifneq ($(LOADADDR),)
|
|
UIMAGE_LOADADDR=$(LOADADDR)
|
|
else
|
|
ifeq ($(CONFIG_ZBOOT_ROM),y)
|
|
UIMAGE_LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
|
|
else
|
|
UIMAGE_LOADADDR=$(ZRELADDR)
|
|
endif
|
|
endif
|
|
|
|
check_for_multiple_loadaddr = \
|
|
if [ $(words $(UIMAGE_LOADADDR)) -ne 1 ]; then \
|
|
echo 'multiple (or no) load addresses: $(UIMAGE_LOADADDR)'; \
|
|
echo 'This is incompatible with uImages'; \
|
|
echo 'Specify LOADADDR on the commandline to build an uImage'; \
|
|
false; \
|
|
fi
|
|
|
|
$(obj)/uImage: $(obj)/zImage FORCE
|
|
@$(check_for_multiple_loadaddr)
|
|
$(call if_changed,uimage)
|
|
@$(kecho) ' Image $@ is ready'
|
|
|
|
$(obj)/bootp/bootp: $(obj)/zImage initrd FORCE
|
|
$(Q)$(MAKE) $(build)=$(obj)/bootp $@
|
|
@:
|
|
|
|
$(obj)/bootpImage: $(obj)/bootp/bootp FORCE
|
|
$(call if_changed,objcopy)
|
|
@$(kecho) ' Kernel: $@ is ready'
|
|
|
|
PHONY += initrd FORCE
|
|
initrd:
|
|
@test "$(INITRD_PHYS)" != "" || \
|
|
(echo This machine does not support INITRD; exit -1)
|
|
@test "$(INITRD)" != "" || \
|
|
(echo You must specify INITRD; exit -1)
|
|
|
|
install:
|
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" \
|
|
$(obj)/Image System.map "$(INSTALL_PATH)"
|
|
|
|
zinstall:
|
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" \
|
|
$(obj)/zImage System.map "$(INSTALL_PATH)"
|
|
|
|
uinstall:
|
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" \
|
|
$(obj)/uImage System.map "$(INSTALL_PATH)"
|
|
|
|
zi:
|
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" \
|
|
$(obj)/zImage System.map "$(INSTALL_PATH)"
|
|
|
|
i:
|
|
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" \
|
|
$(obj)/Image System.map "$(INSTALL_PATH)"
|
|
|
|
subdir- := bootp compressed dts
|