2012-06-18 44 views
13

外部モジュールのKbuildファイルでCFLAGSが変更された場合、最近のカーネル(2.16.24から始まる?)が気に入らないことがあります。 CFLAGSが変更されている場合は、LinuxカーネルKbuildシステムによって次のようなエラーが発行されます:カーネルモジュールのコンパイルとKBUILD_NOPEDANTIC

scripts/Makefile.build:46: *** CFLAGS was changed in "/some/path". Fix it to use EXTRA_CFLAGS. Stop. 

hereから:

外部モジュールはCFLAGSを変更することで、gccのオプション をmodifedいくつかのケースを持っています。これは決して文書化されておらず、 は悪い習慣でした。

追加email LKMLから。

なぜそれは悪い考えですか?合理的とは何ですか?

答えて

1

Linux makefileは、カーネルに適した方法でCFLAGSをビルドします。
CFLAGSをオーバーライドすると、いくつかのフラグを追加し、いくつかのフラグを削除する可能性があります。削除されたフラグの中には、正しいコンパイルのために重要なものがあります。

+0

私がCFLAGSがフラグであることを理解していれば、カーネル全体がコンパイルされているため、変更しないでください。これは、カーネルKBuildシステムがCFLAGS + EXTRA_CFLAGSで外部モジュールをコンパイルすることを意味します。正しい? – dimba

+0

そうだと思います。 – ugoren

9

まず、EXTRA_CFLAGSはもうすぐ廃止され、ccflags-yに置き換えられました。 ccflags-yの意図については、Documentation/kbuild/makefiles.txtのセクション3.7を参照してください。

基本的に、この変数を使用すると、ファイルのスコープ内でCコンパイルフラグのセットに設定を追加することができます。 は、自分のmakefileを超えてグローバルな影響を及ぼす可能性があるため、グローバルフラグを変更する必要はありません。これは悪い習慣とみなされます。あなたが言及しているチェックでは、実際にグローバルフラグがインクルードされたmakefileによって変更されていないことを確認します。

ccflags-y(以前はEXTRA_CFLAGSとして知られていました)がビルドプロセスでどのように使用されているかを調べることは面白いです。 (それは読者;-)の課題として残されているので、全てではない)、いくつかの関連した点をトレースすると、次を示しています。

EXTRA_CFLAGSを依然として使用することができる

scripts/Makefile.lib

1 # Backward compatibility 
2 asflags-y += $(EXTRA_AFLAGS) 
3 ccflags-y += $(EXTRA_CFLAGS) 

同じファイルに従ってscripts/Makefile.buildに続いて

104 orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \ 
105     $(ccflags-y) $(CFLAGS_$(basetarget).o) 
106 _c_flags  = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) 
... 
133 __c_flags  = $(_c_flags) 
... 
147 c_flags  = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)  \ 
148     $(__c_flags) $(modkern_cflags)       \ 
149     -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) 

、COMP:(CFLAGS_<filename>.oと呼ばれ、また、あなたはあなたの処分で別の変数を持っていることを示している)ccflags-yはCのコンパイルフラグで終わる方法を示していますilationルールが定義されています

234 cmd_cc_o_c = $(CC) $(c_flags) -c -o [email protected] $< 

注これらはあなたがあなた自身のメイクファイルでそれを定義するときccflags-yの独自の値をCフラグに挿入されることを意味し=なく:=を使用して、すべての再帰的に展開変数であることを。

最後に約KBUILD_NOPEDANTICです。タイトルには記載されていますが、実際の質問には記載されていません。CFLAGSの変更された値のためのこのテストはKBUILD_NOPEDANTICに任意の値を与えることによって無効にすることができます - この答えで参照されるファイルはすべて、今日取得されたscripts/Makefile.build

​​

を参照してください。

今、この分野の専門家ではなく、この全体の話を書き留めた後にmakefilesを見ていると、理解できないこともあります。 CFLAGSはビルドシステムでは使用されていませんが(暗黙的にも明示的でもない)、KBUILD_CFLAGSです。だから、CFLAGSの変更のチェックが、実際にはKBUILD_CFLAGSの変更のチェックであるべきかどうか疑問です。

関連する問題