2016-08-30 12 views
5

generate_testapi.pyを私のLinuxカーネルモジュールのソースツリーのスクリプトにして、mymod_test.hを取り込み、userland(ioctl、debugfs、あなたの名前)に向けてインターフェイスソースファイルを生成し、これを$(obj)/mymod_test_interfaces.gen.cという名前にします。 KbuildのmakefileでKbuildで生成されたソースファイルに依存関係を追加するには?

mymod-y、すなわち

オブジェクトファイルを追加しますKbuildっぽいルールの外観等は、のように生成したソースからコンパイルしない方法、モジュールを構成するオブジェクトファイルのリストを含む変数でみましょうmymodの依存関係と生成プロセスについて説明します。

次のように、このようなルールセットに対する私の最初の単純な試みは機能しません。

obj-m := mymod.o 

mymod-y := \ 
    mymod_kmod.o \ 
    $(obj)/mymod_test_interfaces.gen.o 

$(obj)/mymod_test_interfaces.gen.o: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > $< 

はそれでmakeしようとすると、結果の誤差があり、mymod_test_interfaces.gen.oを作るために何ルールが存在しないこと。 (アレクサンドルBelloniはによってコメントによる)

更新

はい、私はまた、それが動作しないことである同じ結果とフォーム

$(obj)/mymod_test_interfaces.gen.c: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > $< 

の生成ルールを試し。

+0

Shouldn」 2番目のmymod_test_interfaces.gen.oはmymod_test_interfaces.gen.cですか? –

+0

@AlexandreBelloni:それは私が見つけようとしているものです。いいコメントですが、もちろん私もそれを試しましたが、いい結果を得られませんでした。 – datenwolf

答えて

2

複数のファイルモジュールをビルドしようとしたときに、モジュールと同じ名前のCファイルを持つことはできません。 mymod.c次に、以下は動作するはず

mymod-core.cに名前を変更します。

obj-m := mymod.o 

mymod-objs := mymod-core.o mymod_test_interfaces.gen.o 

$(obj)/mymod_test_interfaces.gen.c: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > [email protected] 

私は実際に次のことをテストしてみた:

diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile 
index 4387ccb79e64..47fdc3a73c75 100644 
--- a/drivers/misc/Makefile 
+++ b/drivers/misc/Makefile 
@@ -71,3 +71,8 @@ OBJCOPYFLAGS_lkdtm_rodata_objcopy.o := \ 
         --rename-section .text=.rodata 
$(obj)/lkdtm_rodata_objcopy.o: $(obj)/lkdtm_rodata.o 
     $(call if_changed,objcopy) 
+ 
+obj-m := mymod.o 
+mymod-objs := mymod-core.o mymod_test_interfaces.gen.o 
+$(obj)/mymod_test_interfaces.gen.c: 
+  echo "int variable;" > [email protected] 
diff --git a/drivers/misc/mymod-core.c b/drivers/misc/mymod-core.c 
new file mode 100644 
index 000000000000..b39aa4b9ae8d 
--- /dev/null 
+++ b/drivers/misc/mymod-core.c 
@@ -0,0 +1,19 @@ 
+#include <linux/module.h> 
+#include <linux/platform_device.h> 
+ 
+extern int mymod_variable; 
+ 
+static int mymod_probe(struct platform_device *pdev) 
+{ 
+  mymod_variable = 2; 
+ 
+  return 0; 
+} 
+ 
+static struct platform_driver mymod_driver = { 
+  .driver = { 
+    .name = "mymod", 
+  }, 
+  .probe = mymod_probe, 
+}; 
+module_platform_driver(mymod_driver); 

それが適切で結果:

$ make 
    CHK  include/config/kernel.release 
    CHK  include/generated/uapi/linux/version.h 
    CHK  include/generated/utsrelease.h 
    CHK  include/generated/bounds.h 
    CHK  include/generated/timeconst.h 
    CHK  include/generated/asm-offsets.h 
    CALL scripts/checksyscalls.sh 
    CHK  include/generated/compile.h 
    CC [M] drivers/misc/mymod-core.o 
echo "int variable;" > drivers/misc/mymod_test_interfaces.gen.c 
    CC [M] drivers/misc/mymod_test_interfaces.gen.o 
    LD [M] drivers/misc/mymod.o 
    LD  arch/x86/boot/compressed/vmlinux 
    ZOFFSET arch/x86/boot/zoffset.h 
    AS  arch/x86/boot/header.o 
    LD  arch/x86/boot/setup.elf 
    OBJCOPY arch/x86/boot/setup.bin 
    OBJCOPY arch/x86/boot/vmlinux.bin 
    BUILD arch/x86/boot/bzImage 
関連する問題