3

有没有办法在我的makefile中设置一个输出目录来制作内核模块?

我想从构建文件中保持我的源目录干净。

4

3 回答 3

2

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)
于 2018-12-31T00:12:08.073 回答
0

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

make O=/path/to/mydir

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

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

然后写:

$ make MY_DIR=/path/to/build/directory
于 2012-09-03T16:06:56.070 回答
0

这里也一样,但我使用了一个对我有用的解决方法:

  1. 为每个架构名称创建一个子目录(例如“debug_64”)。
  2. 在“debug_64”下:创建所有 .c 和 .h 文件的符号链接。保持相同的结构。
  3. 将 makefile 复制到“debug_64”并为 64 Debug 构建设置正确的标志,例如
ccflags-y := -DCRONO_DEBUG_ENABLED 
ccflags-y += -I$(src)/../../../lib/include 
KBUILD_AFLAGS += -march=x86_64 
  1. 请记住将相对目录路径设置为下一级,例如../incwill be ../../inc
  2. 对每个拱门/轮廓重复相同的操作。现在我们有了一个源代码、不同的文件夹和不同的 make 文件。顺便说一句,在内核模块构建的 make 文件中创建配置文件并不是一件容易的工作,所以,我更喜欢为每个 arch 创建一个 makefile 的副本。
于 2021-08-23T15:38:03.320 回答