将内核模块构建到特定目录

问题描述 投票:0回答:4

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

我想保持我的源目录与构建文件无关。

module makefile kernel
4个回答
4
投票

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)

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

0
投票

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

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

0
投票

我找到了以下答案,它看起来比所有符号链接版本都干净得多。我想我会把它发布在这里。

您基本上将以下变量添加到您的 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
© www.soinside.com 2019 - 2024. All rights reserved.