有没有办法设置一个输出目录来在makefile中创建内核模块?
我想保持source-direcory从build-files中保持干净。
答案 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_OUTPUT
和O=
对我不起作用,并且在外部构建时找不到内核标头。
我的解决方案是将源文件符号链接到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)