Kernelmodul-Kompilierung und KBUILD_NOPEDANTIC

Ich habe bemerkt, dass neuere Kernel (ab 2.16.24?) Nicht mögen, wenn CFLAGS in der externen Kbuild-Datei geändert wird. Wenn CFLAGS geändert wird, wird vom Linux-Kernel-Kbuild-System der folgende Fehler ausgegeben:

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

Von hier :

Externe Module haben in einigen Fällen die gcc-Option modifiziert       durch Änderung von CFLAGS. Dies wurde nie dokumentiert und       war eine schlechte Übung.

Zusätzliche email von LKML.

Warum ist es eine schlechte Idee? Was ist vernünftig?

13
hinzugefügt bearbeitet
Ansichten: 1

2 Antworten

Zunächst sollte erwähnt werden, dass EXTRA_CFLAGS vor einiger Zeit veraltet war und durch ccflags-y ersetzt wurde. Sie können über die Absicht von ccflags-y in Dokumentation/kbuild/makefiles.txt , Abschnitt 3.7 nachlesen.

Im Grunde erlaubt diese Variable das Anhängen von Einstellungen an den Satz von C-Kompilierungsflags innerhalb des Bereichs der Datei, in dem sie nur zugewiesen ist. Sie sollten die globalen Flags nicht ändern, da diese möglicherweise globale Auswirkungen haben, die über Ihr eigenes Makefile hinausgehen, was als schlechte Praxis angesehen wird. Die Überprüfung, die Sie erwähnen, überprüft, dass die globalen Flags tatsächlich nicht von den enthaltenen Makefiles geändert wurden.

Es ist interessant, herauszufinden, wie ccflags-y , früher bekannt als EXTRA_CFLAGS , im Build-Prozess verwendet wird. Die Verfolgung einiger relevanter Punkte (aber nicht alle, weil das dem Leser als Übung überlassen wird ;-)) zeigt folgendes:

EXTRA_CFLAGS can still be used, according to scripts/Makefile.lib

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

The same file shows how ccflags-y ends up in the C compilation flags (and also shows you that you have another variable at your disposal, called CFLAGS_.o):

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)

Dann ist in scripts/Makefile.build die Kompilierungsregel definiert:

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

Beachten Sie, dass dies alles rekursiv expandierte Variablen sind, verwenden Sie = und nicht : = , was bedeutet, dass Ihr eigener Wert von ccflags-y eingefügt wird die C-Flags, wenn Sie es in Ihrem eigenen Makefile definieren.

Finally about KBUILD_NOPEDANTIC, which you mention in the title but not in the actual question. This test for changed value of CFLAGS can be disabled by giving KBUILD_NOPEDANTIC any value -- see scripts/Makefile.build

47 ifeq ($(KBUILD_NOPEDANTIC),)
48         ifneq ("$(save-cflags)","$(CFLAGS)")
49                 $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
50         endif
51 endif

Die Dateien, auf die in dieser Antwort verwiesen wird, wurden alle heute abgerufen.

Nun ... da ich kein Experte in diesem Bereich bin und nach dem Schreiben der ganzen Geschichte weiter in die Makefiles schaue, gibt es etwas, das ich auch nicht verstehe. Es scheint mir, dass CFLAGS nicht im Build-System verwendet wird (nicht implizit oder explizit), aber KBUILD_CFLAGS ist. Ich frage mich also, ob diese Prüfung auf Änderungen in CFLAGS eigentlich eine Überprüfung auf Änderungen in KBUILD_CFLAGS sein sollte.

9
hinzugefügt

Linux-Makefiles bauen CFLAGS passend zum Kernel auf.
Das Überschreiben von CFLAGS bedeutet, dass Sie einige Flags hinzufügen und möglicherweise einige Flags entfernen. Einige der entfernten Flags können für die korrekte Kompilierung wichtig sein.

1
hinzugefügt
Wenn ich CFLAGS verstehe, sind Flags, mit denen der ganze Kernel kompiliert wird und die daher nicht geändert werden sollten. Dies bedeutet, dass das Kernel-KBuild-System mein externes Modul mit CFLAGS + EXTRA_CFLAGS kompiliert. Richtig?
hinzugefügt der Autor dimba, Quelle
Ich denke, das tut es.
hinzugefügt der Autor ugoren, Quelle