有没有办法在我的makefile中设置一个输出目录来制作内核模块?
我想从构建文件中保持我的源目录干净。
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)
如果您在内核树中构建,则可以使用该O
变量:
make O=/path/to/mydir
如果您在内核树(模块或任何其他类型的程序)之外进行编译,则需要将您Makefile
的输出更改为不同的目录。这是一个在MY_DIR
目录中输出的 Makefile 规则的小例子:
$(MY_DIR)/test: test.c
gcc -o $@ $<
然后写:
$ make MY_DIR=/path/to/build/directory
这里也一样,但我使用了一个对我有用的解决方法:
ccflags-y := -DCRONO_DEBUG_ENABLED
ccflags-y += -I$(src)/../../../lib/include
KBUILD_AFLAGS += -march=x86_64
../inc
will be ../../inc
。