mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
![Sam Ravnborg](/assets/img/avatar_default.png)
kbuild failed to locate Makefile for external modules. This brought to my attention how the variables for directories have different values in different usage scenarios. Different kbuild usage scenarios: make - plain make in same directory where kernel source lives make O= - kbuild is told to store output files in another directory make M= - building an external module make O= M= - building an external module with kernel output seperate from src Value assigned to the different variables: |$(src) |$(obj) |$(srctree) |$(objtree) make |reldir to k src |as src |abs path to k src |abs path to k src make O= |reldir to k src |as src |abs path to k src |abs path to output dir make M= |abs path to src |as src |abs path to k src |abs path to k src make O= M= |abs path to src |as src |abs path to k src |abs path to k output path to kbuild file: make | $(srctree)/$(src), $(src) make O= | $(srctree)/$(src) make M= | $(src) make O= M= | $(src) From the table above it can be seen that the only good way to find the home directory of the kbuild file is to locate the one of the two variants that is an absolute path. If $(src) is an absolute path (starts with /) then use it, otherwise prefix $(src) with $(srctree). Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
96 lines
3 KiB
Makefile
96 lines
3 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))
|