有没有办法在我的 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
将是 ../../inc
。我找到了以下答案,它看起来比所有符号链接版本都干净得多。我想我会把它发布在这里。
您基本上将以下变量添加到您的 makefile 中:
BUILD_DIR := $(PWD)/build #replace with desired target directory
BUILD_DIR_MAKEFILE := $(BUILD_DIR)/Makefile
那么你的 make 规则应该如下所示:
all: $(BUILD_DIR_MAKEFILE)
make -C /lib/modules/$(shell uname -r)/build M=$(BUILD_DIR) src=$(PWD) modules
并且您应该添加以下两条规则:
$(BUILD_DIR):
mkdir -p "$@"
$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
touch "$@"
完整的 makefile 示例:
obj-m += ppmgenerator.o
ppmgenerator-y := ppm_generator.o channel.o
ccflags-y := -std=gnu11
BUILD_DIR := $(PWD)/build
BUILD_DIR_MAKEFILE := $(BUILD_DIR)/Makefile
all: $(BUILD_DIR_MAKEFILE)
make -C /lib/modules/$(shell uname -r)/build M=$(BUILD_DIR) src=$(PWD) modules
$(BUILD_DIR):
mkdir -p "$@"
$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
touch "$@"
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(BUILD_DIR) src=$(PWD) clean