将内核模块构建到特定目录中

时间:2012-09-03 09:12:45

标签: module makefile kernel

有没有办法设置一个输出目录来在makefile中创建内核模块?

我想保持source-direcory从build-files中保持干净。

2 个答案:

答案 0 :(得分:1)

如果要在内核树中构建,可以使用O变量:

make O=/path/to/mydir

如果要在内核树(模块或任何其他类型的程序)之外进行编译,则需要将Makefile更改为输出到其他目录中。这里是在MY_DIR目录中输出的Makefile规则的一个小例子:

$(MY_DIR)/test: test.c
    gcc -o $@ $<

然后写:

$ make MY_DIR=/path/to/build/directory

答案 1 :(得分:1)

KBUILD_OUTPUTO=对我不起作用,并且在外部构建时找不到内核标头。 我的解决方案是将源文件符号链接到bin目录中,并在bin目录中动态生成一个新的MakeFile。由于可以随时重新创建动态Makefile,因此可以轻松清除所有构建文件。

INCLUDE=include
SOURCE=src
TARGET=mymodule
OUTPUT=bin
EXPORT=package

SOURCES=$(wildcard $(SOURCE)/*.c)

# Depends on bin/include bin/*.c and bin/Makefile
all: $(OUTPUT)/$(INCLUDE) $(subst $(SOURCE),$(OUTPUT),$(SOURCES)) $(OUTPUT)/Makefile
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD)/$(OUTPUT) modules

# Create a symlink from src to bin
$(OUTPUT)/%: $(SOURCE)/%
    ln -s ../$< $@

# Generate a Makefile with the needed obj-m and mymodule-objs set
$(OUTPUT)/Makefile:
    echo "obj-m += $(TARGET).o\n$(TARGET)-objs := $(subst $(TARGET).o,, $(subst .c,.o,$(subst $(SOURCE)/,,$(SOURCES))))" > $@

clean:
    rm -rf $(OUTPUT)
    mkdir $(OUTPUT)