我正面对(Kbuild,内核≥2.6.28)的目录结构,并为更大的项目构建系统。我们的项目包含一个树外Linux内核模块,我们的目录结构看起来如下(显然是简化的):
checkout/src/common/*.c source files (common to Linux and other platforms)
checkout/src/linux-driver/*.c source files (for the Linux kernel driver)
checkout/build/linux/Kbuild Kbuild
tmp/linux-2.6.xx/ where the Linux kernel is unpacked and configured
output/linux-arm-debug/ where object files must end up构建过程不能修改checkout下的任何内容,构建模块时也不能修改tmp/linux-2.6.xx下的任何内容。所有输出文件必须在output/linux-arm-debug下结束(或者在构建时选择任何架构和调试变体)。
我读过kbuild/modules.txt,并开始编写Kbuild文件:
MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)
obj-m += $(MOD_OUTPUT_DIR)/foo_mod.o
$(MOD_OUTPUT_DIR)/our_module-objs := $(MOD_OUTPUT_DIR)/foo_common.o $(MOD_OUTPUT_DIR)/foo_linux.o这将处理将对象文件存储在与Kbuild所在的不同目录中的问题。现在我如何指定foo_common.o需要从…/checkout/src/common/foo_common.c编译,foo_linux.o需要从…/checkout/src/linux-driver/foo_linux.c编译
发布于 2016-06-16 11:48:51
下面是一个Makefile,它用源代码树构建出内核-树模块(改编自@Mark的注释).
KDIR ?= /lib/modules/$(shell uname -r)/build
BUILD_DIR ?= $(PWD)/build
BUILD_DIR_MAKEFILE ?= $(PWD)/build/Makefile
default: $(BUILD_DIR_MAKEFILE)
make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) modules
$(BUILD_DIR):
mkdir -p "$@"
$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
touch "$@"
clean:
make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) clean注意:你还需要一个Kbuild文件..。
obj-m += my_driver.o发布于 2013-12-11 04:57:53
我也有过类似的问题。我对linux_2_6_34/scripts/Makefile.build进行了如下修改。
ifdef SRCDIR
src := $(SRCDIR)
else
src := $(obj)
endifSRCDIR是目录源。
要编译模块,请运行
make -c $(KDIR) M=$(Your_output_dir) SRCDIR=$(your source directory)`发布于 2011-04-28 19:49:30
我的不雅但有效的解决方案是将源文件复制到输出树中。
FOO_SOURCES_DIR = $(src)/../../../checkout/src
FOO_MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)
# Specify the object files
obj-m += $(FOO_MOD_OUTPUT_DIR)/foo_mod.o
FOO_MODULE_OBJS := $(FOO_MOD_OUTPUT_DIR)/foo_common.o $(FOO_MOD_OUTPUT_DIR)/foo_linux.o
$(FOO_MOD_OUTPUT_DIR)/foo_mod-objs := $(FOO_MODULE_OBJS)
# Where to find the sources
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_common.c: $(FOO_SOURCES_DIR)/common/foo_common.c
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_linux.c: $(FOO_SOURCES_DIR)/linux-driver/foo_linux.c
# Rules to copy the sources
FOO_COPIED_SOURCES = $(patsubst %.o,$(src)/%.c,$(FOO_MODULE_OBJS))
$(FOO_COPIED_SOURCES):
$(Q)mkdir -p $(@D)
cp -f $< $@
clean-files += $(FOO_COPIED_SOURCES)
clean-dirs += $(FOO_MOD_OUTPUT_DIR)https://stackoverflow.com/questions/5718899
复制相似问题