nns779 / px4_drv

Unofficial Linux driver for PLEX PX4/PX5/PX-MLT series ISDB-T/S receivers (not V4L-DVB)
GNU General Public License v2.0
305 stars 48 forks source link

Rocky Linux 9.4 でビルドが失敗する #28

Open P-Kichi opened 4 months ago

P-Kichi commented 4 months ago

当方、Rocky Linux 9 で利用させて頂いております。 カーネルのバージョンが上がっても dkmsで自動ビルドする様にしていたのですが、先日 9.3 から 9.4 に バージョンアップして以降、ビルドに失敗する様になりました。

[root@rocky9 driver]# cat /etc/rocky-release
Rocky Linux release 9.4 (Blue Onyx)

[root@rocky9 driver]# uname -a
Linux rocky9 5.14.0-427.16.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed May 8 17:48:14 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

手動でmakeしてみたところ、以下の通りエラーが発生します。

[[root@rocky9 driver]# pwd
/usr/src/px4_drv/driver

[root@rocky9 driver]# make
'revision.h' was updated.
make[1]: ディレクトリ '/usr/src/kernels/5.14.0-427.16.1.el9_4.x86_64' に入ります
  CC [M]  /usr/src/px4_drv/driver/driver_module.o
  CC [M]  /usr/src/px4_drv/driver/ptx_chrdev.o
次のファイルから読み込み:  ./include/linux/linkage.h:7,
         次から読み込み:  ./include/linux/preempt.h:10,
         次から読み込み:  ./include/linux/spinlock.h:56,
         次から読み込み:  ./include/linux/kref.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:13,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
/usr/src/px4_drv/driver/ptx_chrdev.c: 関数 ‘ptx_chrdev_context_create’ 内:
./include/linux/export.h:17:22: エラー: 互換性のないポインタ型から 1 番目の ‘class_create’ の引数に渡しています [-Werror=incompatible-pointer-types]
   17 | #define THIS_MODULE (&__this_module)
      |                     ~^~~~~~~~~~~~~~~
      |                      |
      |                      struct module *
/usr/src/px4_drv/driver/ptx_chrdev.c:573:35: 備考: in expansion of macro ‘THIS_MODULE’
  573 |         ctx->class = class_create(THIS_MODULE, name);
      |                                   ^~~~~~~~~~~
次のファイルから読み込み:  ./include/linux/device.h:31,
         次から読み込み:  ./include/linux/cdev.h:8,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
./include/linux/device/class.h:230:54: 備考: expected ‘const char *’ but argument is of type ‘struct module *’
  230 | struct class * __must_check class_create(const char *name);
      |                                          ~~~~~~~~~~~~^~~~
/usr/src/px4_drv/driver/ptx_chrdev.c:573:22: エラー: 関数 ‘class_create’ への引数が多すぎます
  573 |         ctx->class = class_create(THIS_MODULE, name);
      |                      ^~~~~~~~~~~~
次のファイルから読み込み:  ./include/linux/device.h:31,
         次から読み込み:  ./include/linux/cdev.h:8,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.h:16,
         次から読み込み:  /usr/src/px4_drv/driver/ptx_chrdev.c:9:
./include/linux/device/class.h:230:29: 備考: ここで宣言されています
  230 | struct class * __must_check class_create(const char *name);
      |                             ^~~~~~~~~~~~
cc1: いくつかの警告はエラーとして取り扱われます
make[2]: *** [scripts/Makefile.build:299: /usr/src/px4_drv/driver/ptx_chrdev.o] エラー 1
make[1]: *** [Makefile:1934: /usr/src/px4_drv/driver] エラー 2
make[1]: ディレクトリ '/usr/src/kernels/5.14.0-427.16.1.el9_4.x86_64' から出ます
make: *** [Makefile:19: px4_drv.ko] エラー 2
[[root@rocky9 driver]#

尚、もう一台 Rocky Linux 8 で録画サーバーを稼働させていますが、こちらは問題ありません。

[root@rocky8 ~]# cat /etc/rocky-release
Rocky Linux release 8.9 (Green Obsidian)

[root@rocky8 ~]# uname -a
Linux rocky8 4.18.0-513.24.1.el8_9.x86_64 #1 SMP Thu Apr 4 18:13:02 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

この問題を解決するにはどうすれば良いでしょうか?

shirow-github commented 3 months ago

https://github.com/tsukumijima/px4_drv/commit/76408cade28543794b80010a30a02b7562f3bfdf

P-Kichi commented 3 months ago

早速のご回答ありがとうございます。 結論から申し上げますと最終的にはビルドに成功しましたが、ご提示頂いた コードそのままでは同じエラーが発生しました。

#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0)
    ctx->class = class_create(name);
#else
    ctx->class = class_create(THIS_MODULE, name);
#endif

で、カーネルバージョンが6.4以上かどうかでclass_create() の呼び方を変えていますが、Rocky Linux 9.4 のカーネルバージョンは

[root@rocky9 ~]# uname -r
5.14.0-427.16.1.el9_4.x86_64

の通り 5.14 ですので else 以降の処理に分岐し、結果として古い(?)呼び出し方が選択されます。 (因みにそれまでビルドに成功していた Rocky Linux 9.3 のカーネルバージョンは 5.14.0-362.24.1 です)。

そこでこの分岐処理をカットし、単純に

ctx->class = class_create(THIS_MODULE, name);

ctx->class = class_create(name);

に変更してみたところ、ビルドに成功しました。

当方で発生した問題はこれで解決しましたが、この方法では Rocky Linux 8 や 9.3 以前では逆にエラーになると思いますので、可能でしたら汎用性を持たせて頂きたく、お願い致します。