2013-08-22 5 views
5

Ich baue eine Reihe von Linux-Kernel-Modulen mit geteilten Quellcode. Von dem, was ich verstehe, muss das Makefile "Makefile" genannt werden, also muss ich das gleiche Makefile benutzen, um zwei verschiedene Module zu bauen. Wie kann ich zwei verschiedene Module innerhalb desselben Makefile mit demselben Quellcode, aber mit zwei verschiedenen Build-Optionen erstellen?Aus Baumkern-Modulen: Mehrere Module, ein einzelnes Makefile, dieselbe Quelldatei, verschiedene Build-Optionen

Zum Beispiel werden meine Module Modul1 und Modul2 genannt. So habe ich die folgende Zeile, sie zu definieren:

obj-m := module1.o module2.o 

unter anderen Dateien, sowohl module1 und Module2 die gleiche Quelldatei code.c, verwenden muß, aber mit unterschiedlichen Build-Optionen gebaut. So sagt zum Beispiel der Makefile enthält die folgenden Zeilen:

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

Ich mag module1_code.o und module2_code.o von code.c gebaut werden, aber mit unterschiedlichen Optionen. Insbesondere möchte ich eine mit einem Makro -DPREPROCEFFOR_FLAG=1 definiert und ohne das Makro erstellt.

Aus dem, was ich verstehe, schließt das System von Makefiles in Linux implizit, dass für eine Objektdatei namens "code.o" die Quelldatei "code.c" heißt, also wie würde ich das erreichen? Ist das möglich? Gibt es einen besseren Weg, dies zu tun?

+0

Sie können Ihrem Makefile alles geben, was Sie wollen. make wird jedoch nur nach [bestimmten Dateinamen] (http://www.gnu.org/software/make/manual/make.html#Makefile-Arguments) suchen. Für alle anderen Namen müssen Sie das Argument '-f' verwenden. –

+0

Wenn Sie eine spezifische Regel für Ihre Objektdatei mit einer Vorraussetzung für die relevante Quelldatei und Regeln zum Erstellen des Ziels erstellen, wird make diese anstelle der von Ihnen erwähnten Standardregel verwenden. Also 'module1_code.o: code.c; '. –

Antwort

5

Sie haben hier ein Problem, weil man offensichtlich code.c haben anders zusammengestellt werden, wenn -DPREPROCEFFOR_FLAG=1 definiert ist, aber sobald es in code.o kompiliert, machen etwa Präprozessor Flags egal oder was auch immer, weil code.o bereits auf dem neuesten Stand sein.

Sie benötigen eine Möglichkeit, code.c zu verschiedenen Objektdateien mit verschiedenen C-Flags zu erstellen. Wahrscheinlich gibt es eine saubere Möglichkeit, dies (keine Chance mit O= für aus Baum Module hatte) zu tun, aber hier ist mein innelegant aber effektive Lösung für den Moment:

my_modules: 
    cp code.c code_noflags.c 
    cp code.c code_withflags.c 
    make -C $$KDIR M=$$PWD modules 
    rm code_noflags.c code_withflags.c 

# module objects 
obj-m := module1.o module2.o 

# module1 specifics 
module1-y := code_withflags.o 
CFLAGS_code_withflags.o := -DPREPROCEFFOR_FLAG=1 

# module2 specifics 
module2-y := code_noflags.o 

Rufen Sie einfach:

$ make KDIR=/path/to/kernel 

Sie

$ make KDIR=/path/to/kernel V=1 | grep PREPRO 

Sie könnten auch für jedes Modul zwei separate Verzeichnisse haben, wenn diese Mög ist: kann überprüfen, ob die Präprozessor-Flag mit für die richtige Objekt an der Quelldatei übergeben ble, und haben einen symbolischen Link code.c in jedem auf den gemeinsamen realen code.c. Dies ist jedoch immer noch hackisch und fühlt sich nicht richtig an.

+1

Eine (möglicherweise ebenso unelegante) Lösung wäre es, eine Sim-Verbindung zu code.c, d. H. Code-link.c, zu erstellen und dann die Verbindungsdatei mit dem alternativen Flag zu kompilieren. –

2

Eine einfache Lösung ist, weiterhin von Ihrem Makefile

obj-m := module1.o module2.o 

module1-objs = module1_code.o other_code.o 
module2-objs = module2_code.o other_code.o 

zwei Dateien mehr Quelle, module1_code.c und module2_code.c hinzuzufügen.

Dann sieht module1_code.c wie:

#define PREPROCEFFOR_FLAG 1 
#include "code.c" 

und module2_code.c:

#include "code.c" 

Oder, wenn Sie möchten, ändern Sie die Namen in der Datei Makefile und Quelldateien, so dass der zweite umfassen, ohne eine nicht notwendig ist, definieren. Sie können auch die beiden Quelldateien zu nichts anderem als einem Include machen und die Variable CFLAGS_module1_code.o verwenden, um die Option -D... dem Compiler hinzuzufügen, wenn Sie dies bevorzugen.

#include "../../boot/video-vesa.c" 

und der Video-vesa.c Code landet kompilierte immer zweimal mit unterschiedlich: nur enthält

Dies ist ähnlich zu dem, was mit arch/x86/boot/video-vesa.c im Upstream-Kernel passiert und arch/x86/realmode/rm/video-vesa.c usw., wo die Datei Realmode Compiler-Flags.

Dies scheint vorzuziehen, die Quelldateien zu kopieren, da Sie dort eine Unordnung haben, wenn Sie die Option O=... für den Kernel-Build verwenden möchten, um einen sauberen Quellbaum zu behalten und einen separaten Objektbaum zu erstellen.

Verwandte Themen