mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
4f1933620f
The kbuild system takes advantage of an incorrect behavior in GNU make. Once this behavior is fixed, all files in the kernel rebuild every time, even if nothing has changed. This patch ensures kbuild works with both the incorrect and correct behaviors of GNU make. For more details on the incorrect behavior, see: http://lists.gnu.org/archive/html/bug-make/2006-03/msg00003.html Changes in this patch: - Keep all targets that are to be marked .PHONY in a variable, PHONY. - Add .PHONY: $(PHONY) to mark them properly. - Remove any $(PHONY) files from the $? list when determining whether targets are up-to-date or not. Signed-off-by: Paul Smith <psmith@gnu.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
103 lines
3.2 KiB
Makefile
103 lines
3.2 KiB
Makefile
# ==========================================================================
|
|
# Cleaning up
|
|
# ==========================================================================
|
|
|
|
src := $(obj)
|
|
|
|
PHONY := __clean
|
|
__clean:
|
|
|
|
# Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir
|
|
# Usage:
|
|
# $(Q)$(MAKE) $(clean)=dir
|
|
clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
|
|
|
|
# The filename Kbuild has precedence over Makefile
|
|
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
|
|
include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
|
|
|
|
# Figure out what we need to build from the various variables
|
|
# ==========================================================================
|
|
|
|
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
|
|
subdir-y += $(__subdir-y)
|
|
__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m)))
|
|
subdir-m += $(__subdir-m)
|
|
__subdir-n := $(patsubst %/,%,$(filter %/, $(obj-n)))
|
|
subdir-n += $(__subdir-n)
|
|
__subdir- := $(patsubst %/,%,$(filter %/, $(obj-)))
|
|
subdir- += $(__subdir-)
|
|
|
|
# Subdirectories we need to descend into
|
|
|
|
subdir-ym := $(sort $(subdir-y) $(subdir-m))
|
|
subdir-ymn := $(sort $(subdir-ym) $(subdir-n) $(subdir-))
|
|
|
|
# Add subdir path
|
|
|
|
subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
|
|
|
|
# build a list of files to remove, usually releative to the current
|
|
# directory
|
|
|
|
__clean-files := $(extra-y) $(EXTRA_TARGETS) $(always) \
|
|
$(targets) $(clean-files) \
|
|
$(host-progs) \
|
|
$(hostprogs-y) $(hostprogs-m) $(hostprogs-)
|
|
|
|
# as clean-files is given relative to the current directory, this adds
|
|
# a $(obj) prefix, except for absolute paths
|
|
|
|
__clean-files := $(wildcard \
|
|
$(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \
|
|
$(filter /%, $(__clean-files)))
|
|
|
|
# as clean-dirs is given relative to the current directory, this adds
|
|
# a $(obj) prefix, except for absolute paths
|
|
|
|
__clean-dirs := $(wildcard \
|
|
$(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \
|
|
$(filter /%, $(clean-dirs)))
|
|
|
|
# ==========================================================================
|
|
|
|
quiet_cmd_clean = CLEAN $(obj)
|
|
cmd_clean = rm -f $(__clean-files)
|
|
quiet_cmd_cleandir = CLEAN $(__clean-dirs)
|
|
cmd_cleandir = rm -rf $(__clean-dirs)
|
|
|
|
|
|
__clean: $(subdir-ymn)
|
|
ifneq ($(strip $(__clean-files)),)
|
|
+$(call cmd,clean)
|
|
endif
|
|
ifneq ($(strip $(__clean-dirs)),)
|
|
+$(call cmd,cleandir)
|
|
endif
|
|
ifneq ($(strip $(clean-rule)),)
|
|
+$(clean-rule)
|
|
endif
|
|
@:
|
|
|
|
|
|
# ===========================================================================
|
|
# Generic stuff
|
|
# ===========================================================================
|
|
|
|
# Descending
|
|
# ---------------------------------------------------------------------------
|
|
|
|
PHONY += $(subdir-ymn)
|
|
$(subdir-ymn):
|
|
$(Q)$(MAKE) $(clean)=$@
|
|
|
|
# If quiet is set, only print short version of command
|
|
|
|
cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1))
|
|
|
|
|
|
# Declare the contents of the .PHONY variable as phony. We keep that
|
|
# information in a variable se we can use it in if_changed and friends.
|
|
|
|
.PHONY: $(PHONY)
|