Autor Thema: Makefile geteilter Source Code  (Gelesen 12287 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 02. April 2017, 22:55 »
Hallo zusammen.
Ich verwende seitdem ich angefangen habe meinen Kernel zu Programmieren Eclipse, das für mich automatisch die Makefiles erzeugt und dann alles kompiliert. Ich möchte jetzt umsteigen auf ein eigenes Makefile. Das kann man ja dann in Eclipse verwenden um den Code zu kompilieren. Der Grund für den Umstieg ist, dass man den Kernel auch oihne Eclipse kompilieren können soll.
Das Problem, das ich jetzt aber habe ist, dass ich grosse Teile meiner Standard C Library auch im Kernel verwende (z.B. die Heapverwaltung, printf, usw.). D.h. das Makefile muss den Kernel und die Library kompilieren und dafür entsprechende Macros an den Compiler übergeben. Nur wie geht das in einem Makefile? Geht das überhaupt?
Also das Ziel ist, dass make all das Kernelbinary und die Library erstellt.
Es wäre schön, wenn ich Make verwenden könnte, denn ich denke es ist einfacher zu portieren als CMake oder?
« Letzte Änderung: 02. April 2017, 23:09 von OsDevNewbie »
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. April 2017, 11:16 »
Make baut Dateien nach gewissen Regeln zusammen. Deine C-Bibliothek ist auch nur eine Datei (klibc.a oder sowas), also kannst du dafür die passenden Regeln definieren. Deine Regel für das Kernel-Binary muss dann nur von dieser Datei abhängen und make wird im Zweifelsfall die libc neu bauen, wenn du den Kernel zusammenbaust.

Du kannst auch abstrakte Ziele (phony targets) definieren, die nicht auf Dateien basieren, in deinem Fall z.B. "libc" und "kernel", wobei der Kernel von der Libc abhängt und "all" vom Kernel (oder von beiden, ist in dem Fall eher egal).

Zu CMake kann ich nichts sagen.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 03. April 2017, 14:12 »
Das Problem ist, dass im C-Code je nach Target, also Kernel oder libc, verschiedene Funktionen aufgerufen werden müssen (z.B. im Kernel die Funktion zum Öffnen einer Datei, wobei in der libc den entsprechenden Syscall). Dazu definiere ich bei einem Kernel-Build ein Macro (BUILD_KERNEL). Also muss ich den Source Code der Libc doppelt kompilieren. Ist das auch möglich mit Make?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. April 2017, 09:34 »
Was du da in Wirklichkeit hast, sind zwei verschiedene Bibliotheken, die dasselbe Interface anbieten. Die eine ist eine Abhängigkeit vom Kernel, die andere eine Abhängigkeit von allen Userspace-Programmen. Ich würde nicht empfehlen, dass du das beides aus der gleichen Sourcedatei baust, aber wenn du das willst, geht das natürlich auch.

kernellib.o: lib.c
    $(CC) -c -DKERNELLIB=1 -o $@ $^
userlib.o: lib.c
    $(CC) -c -o $@ $^

Irgendwie sowas, und dann hättest du #ifdef KERNELLIB im Sourcecode. Wie gesagt, ich würde den Code lieber gleich auf zwei verschiedene Sourcedateien verteilen, aber wenn man unbedingt will, geht es auch so.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #4 am: 04. April 2017, 11:03 »
Ok danke für deine Antwort.

Wie gesagt, das einzige was sich ändert ist halt, dass bei der normalen libc Syscalls verwendet werden und bei der "kernellib" halt direkt die Funktion, die ansonsten vom Syscall aufgerufen wird. Ich finde das kein gutes Software Engineering, wenn man den genau gleichen Code mehrmals in verschiedenen Dateien hat.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. April 2017, 13:21 »
Das ist nicht genau der gleiche Code. Bis auf die Prototypen ist das komplett unterschiedlicher Code.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen