【发布时间】:2012-08-28 00:30:01
【问题描述】:
有没有办法在我的 makefile 中设置一个输出目录来制作内核模块?
我想从构建文件中保持我的源目录干净。
【问题讨论】:
有没有办法在我的 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
【讨论】:
~/sample),其中包含一个简单内核模块的源代码以及它的 Kbuild 和 Makefile。我将其设为只读并创建了一个构建目录~/sample_build。从后者,我执行了make -C ~/sample O=$(pwd)。构建失败是因为构建系统仍然试图创建~/sample/.tmp_versions 目录以及~/sample 中的.tmp*.o 文件。或许,还需要其他的东西才能让它发挥作用?
make ... O=<build_dir> 似乎适用于 in-tree 内核模块。
O 标志不能完成这项工作。内核 v5.x 及更高版本是否有更好的解决方案?
这里也一样,但我使用了一种对我有用的解决方法:
ccflags-y := -DCRONO_DEBUG_ENABLED
ccflags-y += -I$(src)/../../../lib/include
KBUILD_AFLAGS += -march=x86_64
../inc 将是 ../../inc。【讨论】: