10

Linux カーネル ビルド システム (Kbuild、カーネル ≥2.6.28) と、より大きなプロジェクトのディレクトリ構造とビルド システムに直面しています。私たちのプロジェクトには、ツリー外の Linux カーネル モジュールが含まれており、ディレクトリ構造は次のようになります (明らかに単純化されています)。

checkout/src/common/*.c           source files (common to Linux and other platforms)
checkout/src/linux-driver/*.c     source files (for the Linux kernel driver)
checkout/build/linux/Kbuild       Kbuild
tmp/linux-2.6.xx/                 where the Linux kernel is unpacked and configured
output/linux-arm-debug/           where object files must end up

ビルド プロセスでは の下を変更してcheckoutはならず、モジュールのビルドでは の下を変更してはなりませんtmp/linux-2.6.xx。すべての出力ファイルは、最終的にoutput/linux-arm-debug(または、ビルド時に選択されたアーキテクチャおよびデバッグ バリアント) の下にある必要があります。

を読みkbuild/modules.txtKbuildファイルの書き込みを開始しました。

MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)
obj-m += $(MOD_OUTPUT_DIR)/foo_mod.o
$(MOD_OUTPUT_DIR)/our_module-objs := $(MOD_OUTPUT_DIR)/foo_common.o $(MOD_OUTPUT_DIR)/foo_linux.o

これは、オブジェクトファイルを、存在する場所とは別のディレクトリに保存することを処理しますKbuild。からfoo_common.oコンパイルする必要があることをどのように指定できますか?…/checkout/src/common/foo_common.cfoo_linux.o…/checkout/src/linux-driver/foo_linux.c

4

6 に答える 6

9

これは、カーネルツリーモジュール外のソースツリービルドを行うMakefileです(@Markのコメントから適応)...

KDIR ?= /lib/modules/$(shell uname -r)/build
BUILD_DIR ?= $(PWD)/build
BUILD_DIR_MAKEFILE ?= $(PWD)/build/Makefile

default: $(BUILD_DIR_MAKEFILE)
    make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) modules

$(BUILD_DIR):
    mkdir -p "$@"

$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
    touch "$@"

clean:
    make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) clean

注: まだ Kbuild ファイルが必要です...

obj-m += my_driver.o
于 2016-06-16T11:48:51.863 に答える
3

同様の問題がありました。以下のように修正linux_2_6_34/scripts/Makefile.buildしました。

ifdef SRCDIR
src := $(SRCDIR)
else
src := $(obj)
endif

SRCDIRディレクトリソースです。

モジュールをコンパイルするには、次を実行します。

make -c $(KDIR) M=$(Your_output_dir) SRCDIR=$(your source directory)`
于 2013-12-11T04:57:53.170 に答える
2

私の洗練されていないが効果的な解決策は、ソース ファイルを出力ツリーにコピーすることです。

FOO_SOURCES_DIR = $(src)/../../../checkout/src
FOO_MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)

# Specify the object files
obj-m += $(FOO_MOD_OUTPUT_DIR)/foo_mod.o
FOO_MODULE_OBJS := $(FOO_MOD_OUTPUT_DIR)/foo_common.o $(FOO_MOD_OUTPUT_DIR)/foo_linux.o
$(FOO_MOD_OUTPUT_DIR)/foo_mod-objs := $(FOO_MODULE_OBJS)

# Where to find the sources
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_common.c: $(FOO_SOURCES_DIR)/common/foo_common.c
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_linux.c: $(FOO_SOURCES_DIR)/linux-driver/foo_linux.c

# Rules to copy the sources
FOO_COPIED_SOURCES = $(patsubst %.o,$(src)/%.c,$(FOO_MODULE_OBJS))
$(FOO_COPIED_SOURCES):
        $(Q)mkdir -p $(@D)
        cp -f $< $@
clean-files += $(FOO_COPIED_SOURCES)
clean-dirs += $(FOO_MOD_OUTPUT_DIR)
于 2011-04-28T19:49:30.753 に答える
1

これまでに何を試したか (または既に解決策を見つけたかどうか) については触れていませんが、modules.txtファイルを少し下に進み、セクション 4.3まで進む必要があるようです。

--- 4.3 Several Subdirectories

kbuild can handle files that are spread over several directories.
Consider the following example:

.
|__ src
|   |__ complex_main.c
|   |__ hal
|   |__ hardwareif.c
|   |__ include
|       |__ hardwareif.h
|__ include
    |__ complex.h

To build the module complex.ko, we then need the following
kbuild file:

    --> filename: Kbuild
    obj-m := complex.o
    complex-y := src/complex_main.o
    complex-y += src/hal/hardwareif.o

    ccflags-y := -I$(src)/include
    ccflags-y += -I$(src)/src/hal/include

As you can see, kbuild knows how to handle object files located
in other directories. The trick is to specify the directory
relative to the kbuild file's location. That being said, this
is NOT recommended practice.

For the header files, kbuild must be explicitly told where to
look. When kbuild executes, the current directory is always the
root of the kernel tree (the argument to "-C") and therefore an
absolute path is needed. $(src) provides the absolute path by
pointing to the directory where the currently executing kbuild
file is located.
于 2011-04-28T19:36:24.897 に答える
0

少し遅れましたが、O= フラグが必要なようです。

于 2012-05-30T21:57:33.987 に答える
-1

環境変数を設定できますKBUILD_OUTPUTO=これはオプションと同様に機能します。ただし、これは環境変数であるため、O=渡すことができない複数の makefile にまたがったり、ディレクトリ外のモジュールを構築する必要がある場合があります。一連の互換ワイヤレス モジュールをビルドしようとしたときに同じ問題が発生しO=、実際のカーネル イメージのビルドに使用する必要がありました。

于 2012-12-11T00:40:07.407 に答える