mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
kbuild: support building individual files for external modules
Support building individual files when dealing with separate modules. So say you have a module named "foo" which consist of two .o files bar.o and fun.o. You can then do: make -C $KERNELSRC M=`pwd` bar.o make -C $KERNELSRC M=`pwd` bar.lst make -C $KERNELSRC M=`pwd` bar.i make -C $KERNELSRC M=`pwd` / <= will build all .o files and link foo.o make -C $KERNELSRC M=`pwd` foo.ko <= will build the module and do the modpost step to create foo.ko The above will also work if the external module is placed in a subdirectory using a hirachy of kbuild files. Thanks to Andreas Gruenbacher <agruen@suse.de> for initial feature request / bug report. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
parent
bd71c2b174
commit
06300b21f4
@ -13,6 +13,7 @@ In this document you will find information about:
|
|||||||
--- 2.2 Available targets
|
--- 2.2 Available targets
|
||||||
--- 2.3 Available options
|
--- 2.3 Available options
|
||||||
--- 2.4 Preparing the kernel tree for module build
|
--- 2.4 Preparing the kernel tree for module build
|
||||||
|
--- 2.5 Building separate files for a module
|
||||||
=== 3. Example commands
|
=== 3. Example commands
|
||||||
=== 4. Creating a kbuild file for an external module
|
=== 4. Creating a kbuild file for an external module
|
||||||
=== 5. Include files
|
=== 5. Include files
|
||||||
@ -131,6 +132,16 @@ when building an external module.
|
|||||||
Therefore a full kernel build needs to be executed to make
|
Therefore a full kernel build needs to be executed to make
|
||||||
module versioning work.
|
module versioning work.
|
||||||
|
|
||||||
|
--- 2.5 Building separate files for a module
|
||||||
|
It is possible to build single files which is part of a module.
|
||||||
|
This works equal for the kernel, a module and even for external
|
||||||
|
modules.
|
||||||
|
Examples (module foo.ko, consist of bar.o, baz.o):
|
||||||
|
make -C $KDIR M=`pwd` bar.lst
|
||||||
|
make -C $KDIR M=`pwd` bar.o
|
||||||
|
make -C $KDIR M=`pwd` foo.ko
|
||||||
|
make -C $KDIR M=`pwd` /
|
||||||
|
|
||||||
|
|
||||||
=== 3. Example commands
|
=== 3. Example commands
|
||||||
|
|
||||||
|
66
Makefile
66
Makefile
@ -137,7 +137,7 @@ objtree := $(CURDIR)
|
|||||||
src := $(srctree)
|
src := $(srctree)
|
||||||
obj := $(objtree)
|
obj := $(objtree)
|
||||||
|
|
||||||
VPATH := $(srctree)
|
VPATH := $(srctree):$(KBUILD_EXTMOD)
|
||||||
|
|
||||||
export srctree objtree VPATH TOPDIR
|
export srctree objtree VPATH TOPDIR
|
||||||
|
|
||||||
@ -849,27 +849,6 @@ prepare prepare-all: prepare0
|
|||||||
|
|
||||||
export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
|
export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Single targets
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
%.s: %.c scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
%.i: %.c scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
%.o: %.c scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
%.ko: scripts FORCE
|
|
||||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) $(@:.ko=.o)
|
|
||||||
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
|
|
||||||
%/: scripts prepare FORCE
|
|
||||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D)
|
|
||||||
%.lst: %.c scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
%.s: %.S scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
%.o: %.S scripts FORCE
|
|
||||||
$(Q)$(MAKE) $(build)=$(@D) $@
|
|
||||||
|
|
||||||
# FIXME: The asm symlink changes when $(ARCH) changes. That's
|
# FIXME: The asm symlink changes when $(ARCH) changes. That's
|
||||||
# hard to detect, but I suppose "make mrproper" is a good idea
|
# hard to detect, but I suppose "make mrproper" is a good idea
|
||||||
# before switching between archs anyway.
|
# before switching between archs anyway.
|
||||||
@ -1192,6 +1171,11 @@ help:
|
|||||||
@echo ' modules_install - install the module'
|
@echo ' modules_install - install the module'
|
||||||
@echo ' clean - remove generated files in module directory only'
|
@echo ' clean - remove generated files in module directory only'
|
||||||
@echo ''
|
@echo ''
|
||||||
|
|
||||||
|
# Dummies...
|
||||||
|
.PHONY: prepare scripts
|
||||||
|
prepare: ;
|
||||||
|
scripts: ;
|
||||||
endif # KBUILD_EXTMOD
|
endif # KBUILD_EXTMOD
|
||||||
|
|
||||||
# Generate tags for editors
|
# Generate tags for editors
|
||||||
@ -1313,6 +1297,44 @@ kernelrelease:
|
|||||||
kernelversion:
|
kernelversion:
|
||||||
@echo $(KERNELVERSION)
|
@echo $(KERNELVERSION)
|
||||||
|
|
||||||
|
# Single targets
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# The directory part is taken from first prerequisite, so this
|
||||||
|
# works even with external modules
|
||||||
|
%.s: %.c scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
%.i: %.c scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
%.o: %.c scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
%.lst: %.c scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
%.s: %.S scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
%.o: %.S scripts FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@)
|
||||||
|
|
||||||
|
# For external modules we shall include any directory of the target,
|
||||||
|
# but usual case there is no directory part.
|
||||||
|
# make M=`pwd` module.o => $(dir $@)=./
|
||||||
|
# make M=`pwd` foo/module.o => $(dir $@)=foo/
|
||||||
|
# make M=`pwd` / => $(dir $@)=/
|
||||||
|
|
||||||
|
ifeq ($(KBUILD_EXTMOD),)
|
||||||
|
target-dir = $(@D)
|
||||||
|
else
|
||||||
|
zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
|
||||||
|
target-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
|
||||||
|
endif
|
||||||
|
|
||||||
|
/ %/: scripts prepare FORCE
|
||||||
|
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||||
|
$(build)=$(target-dir)
|
||||||
|
%.ko: scripts FORCE
|
||||||
|
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||||
|
$(build)=$(target-dir) $(@:.ko=.o)
|
||||||
|
$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
# FIXME Should go into a make.lib or something
|
# FIXME Should go into a make.lib or something
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user