Compilieren/Linken von PrettyOS


  • Mod

    drittens hast du dich eben im IRC selbst dagegen gesträubt eine fremde .exe-Datei auszuführen

    Ja, das ist richtig und ein gewichtiges Argument.

    Wir können das gerne ändern, aber Einsteiger müssen wissen, woher sie das richtige Tool erhalten. Das ist nicht trivial.

    Bisher muss man eine direkte Floppy-Anbindung haben und ...
    a)Cross-Tools installieren / Pfade einrichten (Cuervo hat dazu eine Anleitung geschrieben)
    b)SVN-tarball downloaden
    c)auf BUILD_ALL_WITH_FLOPPY.bat doppelklicken

    That's it. 🙂



  • Konkreter Vorschlag:

    Makefile ins Wurzelverzeichnis. Inhalt wäre sowas:

    all: image
    
    # erstellt ein image
    image: boot1 boot2 kernel programs
        # image erstellen/zusammenkopieren mit dd etc
    
    boot1: _stage1_bootloader/boot.bin (+korrekte abhängigkeiten ggf. in weiteren regeln)
    
    boot2: _stage2_bootloader/boot.bin (+korrekte abhängigkeiten ggf. in weiteren regeln)
    
    kernel: kernel.bin (+korrekte abhängigkeiten in weiteren regeln)
    
    programs: ähnlich wie kernel
    
    # weitere regeln für asm -> o, c -> o und natürlich die binärdateien
    

    Vorteile:
    * funktioniert unter Windows und Linux ohne Anpassungen (außer vielleicht eine Variable weil der Compiler mal gcc und mal i586-elf-gcc heißt)
    * einheitlich für alle Komponenten (bootloader, programme, shell) -> erweiterbar
    * es werden nur die notwendigen Dateien gebaut
    * unabhängig von shell/cmd
    * aus den letzten beiden Punkten folgt: schnell



  • Wie im IRC gerade erwähnt finde ich diese Batch Datei, die in jeden Unterordner geht und dort Batchdateien aufruft, unschön und überflüssig. Immerhin kann make das auch und wir brauchen für Linux eh ein Makefile das genau das gleiche tut. Im jetztigen Standpunkt müsste man bei Änderungen das Makefile und die Batchdateien anpassen.

    Daher wäre mein Vorschlag am anfang 2 Makefiles zu erstellen, eine für Linux und eine für Windows. In diesen Makefiles werden nur Variablen gesetzt, unter anderem sämtliche Befehle wie Compileraufrufe, Kopierbefehle etc.

    Danach können beide Makefiles ein Makefile aufrufen oder includieren das nicht mehr Betriebsystemspezifisch ist. Dieses Makefile kann dann in die Unterordner gehen und dort wiederrum Makefiles aufrufen. Wenn sich nun etwas ändert braucht man nur noch die Betriebsystemunabhängigen Makefiles abändern.



  • Diesers Programm funktioniert mit den aktuellen PrettyOS Versionen nicht mehr, es war nur ale Test gedacht und ist hiermit als "obsolete" und unbrauchbar markiert.

    Cuervo schrieb:

    So, ich stelle nochmal den aktuellen Code und eine EXE-Datei rein, Code ist in BlitzPlus geschrieben (http://www.blitzbasic.com).
    Programm läuft auf EIGENE GEFAHR.

    Download: LINK ENTFERNT
    Dieses Archiv bitte in den Source Ordner exrtrahieren, so dass die build.exe darin liegt.

    Global win
    AppTitle "Compiler"
    win=CreateWindow("Kompilieren...",100,100,640,480,0,1+32)
    Global e,es,ed
    Global tarea=CreateTextArea(10,10,620,460,win)
    SetTextAreaColor tarea,0,0,0,1
    SetTextAreaColor tarea,0,255,0,0
    Global font=LoadFont("Arial",30)
    SetTextAreaFont tarea,font
    
    Global d$=CurrentDir()
    
    ChangeDir "_stage1_bootloader"
    RunCommand "Build.bat"
    ChangeDir d$
    ChangeDir "_stage2_bootloader"
    RunCommand "Build.bat"
    ChangeDir d$
    ChangeDir "user"
    ChangeDir "user_program_c"
    CopyFile d$+"_nasm\nasmw.exe","nasmw.exe"
    RunCommand d$+"_mingw32-make\mingw32-make.exe --makefile=Windows_makefile"
    ChangeDir d$+"user"
    CopyFile "user_program_c\program.elf","init_rd_img\program.elf"
    ChangeDir "init_rd_img"
    RunCommand d$+"_mingw32-make\mingw32-make.exe --makefile=Windows_makefile"
    ChangeDir d$
    ChangeDir "kernel"
    RunCommand d$+"_mingw32-make\mingw32-make.exe --makefile=Windows_makefile"
    ChangeDir d$
    
    Notify "BUILDVORGANG ABGESCHLOSSEN!",1
    AddTextAreaText tarea,Chr(13)+Chr(10)+Chr(13)+Chr(10)+"FERTIG!!!"
    Repeat
    	e=WaitEvent()
    	If e=$803 Then
    		Exit
    	EndIf
    	es=EventSource()
    	ed=EventData()
    	
    Forever
    
    FreeGadget win
    End
    
    Function RunCommand(s$)
    	Local p=CreateProcess(s$)
    	If p=0 Then
    		AddTextAreaText tarea,"BEFEHL "+s$+" nicht gefunden!"+Chr(13)+Chr(10)
    		Return 0
    	EndIf
    	
    	While Not Eof(p)
    		AddTextAreaText tarea,ReadLine(p)+Chr(13)+Chr(10)
    		WaitEvent(1)
    	Wend
    	
    	
    End Function
    

  • Mod

    Badestrand hat in der neuesten Version (auf SVN) einen FloppyImage-Generator, in C++ geschrieben, mitgeliefert.



  • Nach einer nächtlichen Diskussion in #PrettyOS habe ich da mal eine Idee für euch und euer (im Moment ziemlich verhunztes ;-)) Buildsystem:

    - Schreibt euch ein kleines Script in Perl oder Python, welches prüft, auf welchem OS gebaut wird und ob etwaige weitere Konfigurationen vorhanden sind (Floppy etc.). Dann könnt ihr die Makefiles entsprechend durch das Script auf das jeweilige System abändern. Ihr könnt zwar auch alles in Makefiles packen falls das geht, aber so ein Script ist im Endeffekt sauberer.



  • Hab herumgespielt, bitte mal testen!
    Globales Makefile sieht so aus:

    STAGE1DIR= stage1_bootloader
    STAGE2DIR= stage2_bootloader
    KERNELDIR= kernel
    USERRDDIR= user/init_rd_img
    USERDIR= user/user_program_c
    
    ifeq ($(OS),WINDOWS)
        NASM= nasmw
        CC= i586-elf-gcc
        LD= i586-elf-ld
        #NASM= tools/nasmw
        #CC= tools/i586-elf/bin/i586-elf-gcc
        #LD= tools/i586-elf/bin/i586-elf-ld
    else
        NASM=nasm
        CC=gcc
        LD=ld
    endif
    
    all: boot1 boot2 ckernel
    
    boot1: $(wildcard $(STAGE1DIR)/*.asm $(STAGE1DIR)/*.inc)
    	$(NASM) -f bin $(STAGE1DIR)/boot.asm -I$(STAGE1DIR)/ -o $(STAGE1DIR)/boot.bin
    
    boot2: $(wildcard $(STAGE2DIR)/*.asm $(STAGE2DIR)/*.inc)
    	$(NASM) -f bin $(STAGE2DIR)/boot2.asm -I$(STAGE2DIR)/ -o $(STAGE1DIR)/boot2.bin
    
    ckernel: $(wildcard $(KERNELDIR)/* $(KERNELDIR)/include/*) initrd
    	rm *.o -f
    	$(CC) $(KERNELDIR)/*.c -c -I$(KERNELDIR)/include -std=c99 -march=i386 -mtune=i386 -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude
    	$(NASM) -O32 -f elf $(KERNELDIR)/data.asm -I$(KERNELDIR)/ -o data.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/flush.asm -I$(KERNELDIR)/ -o flush.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/interrupts.asm -I$(KERNELDIR)/ -o interrupts.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/kernel.asm -I$(KERNELDIR)/ -o kernel.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/process.asm -I$(KERNELDIR)/ -o process.o
    	$(LD) *.o -T $(KERNELDIR)/kernel.ld -Map $(KERNELDIR)/kernel.map -nostdinc -o $(KERNELDIR)/kernel.bin
    	rm *.o -f
    	tools/CreateFloppyImage2 PrettyOS FloppyImage.bin $(STAGE1DIR)/boot.bin $(STAGE2DIR)/boot2.bin $(KERNELDIR)/kernel.bin
    
    initrd: $(wildcard $(USERDIR)/*)
    	rm *.o -f
    	$(CC) $(USERDIR)/*.c -c -I$(USERDIR) -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
    	$(LD) *.o -T $(USERDIR)/user.ld -Map $(USERDIR)/kernel.map -nostdinc -o $(USERDIR)/program.elf
    	rm *.o -f
    	tools/make_initrd $(USERRDDIR)/test1.txt file1 $(USERRDDIR)/test2.txt file2 $(USERRDDIR)/test3.txt file3 $(USERDIR)/program.elf shell
    	mv initrd.dat $(KERNELDIR)/initrd.dat
    

    Ist aber noch suboptimal. Schön wäre es, die ganzen .asm-Dateien des Kernel-Codes in einem Rutsch oder einer Schleife aufrufen zu können. Oder andere makefiles aufzurufen. Bin aber kein Experte, da muss mir jemand helfen.

    Zugehörige Batch-Datei sieht so aus:

    cls
    tools\mingw32-make OS=WINDOWS
    
    @echo off
    :Loop
    IF [%1]==[] GOTO Continue
    	IF [%1]==[bochs] (
    		cmd /c tools\bochs.bxrc
    	)
    	IF [%1]==[qemu] (
    		echo "dummy.."
    	)
    	IF [%1]==[disc] (
    		tools\dd if=stage1_bootloader/boot.bin of=\\.\A: bs=512 count=1 --progress
    		copy stage2_bootloader\boot2.bin A:\boot2.bin
    		copy kernel\kernel.bin A:\kernel.bin
    	)
    SHIFT
    GOTO Loop
    :Continue
    

    Kann mit einem oder mehreren Parametern aufgerufen werden:
    - "bochs" startet Bochs mit dem Image
    - "qemu" soll in Zukunft Qemu starten
    - "disc" soll auf Diskette schreiben: Bitte mal testen, hab kein D-Laufwerk



  • Badestrand schrieb:

    Ist aber noch suboptimal.Schön wäre es, die ganzen .asm-Dateien des Kernel-Codes in einem Rutsch oder einer Schleife aufrufen zu können. Oder andere makefiles aufzurufen. Bin aber kein Experte, da muss mir jemand helfen.

    Du benutzt recht wenig der Funktionalität von Make. Zurzeit ähnelt das eher einer Batchdatei. Man kann die Abhängigkeiten besser nutzen und feinere Targets erstellen.

    Mal ein Beispiel aus einer Makefile von mir:

    %.o: %.c
    	$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $(BINDIR)/$@
    
    %.o: %.asm
    	$(NASM) $(NASMFLAG) $< -o $(BINDIR)/$@
    

    Mit diesen beide Regeln kann man eine .o erstellen, egal ob es sich bei der Quelldatei um eine .c oder .asm handelt. $< ist dabei die Eingabedatei, also xy.c oder xy.asm und $@ ist das target, also xy.o

    Nun könnte man ckernel ganz einfach als Abhängigkeit schreiben:

    ckernel: xy.o test.o
        # Hier xy.o und test.o zusammen linken
    

    Das kann man natürlich noch automatisieren:

    OBJ = $(patsubst %.asm, %.o, $(patsubst %.c, %.o, $(wildcard *.c *.asm)))
    

    Diese Zeile wählt alle .c und .asm aus und setzt .o als Endung. Nun kann man das in das ckernel Target einsetzen:

    ckernel: $(OBJ)
        # Hier zusammen linken z.B. "$(LD) $(LDFLAGS) $(OBJ) -o $(BINDIR)/kernel.bin"
    

    Letztendlich umfasst das Makefile dann nur noch ein paar Zeilen und man braucht in den meisten Fällen keinerlei Dateien per Hand eintragen.



  • Das "Problem" ist aber, dass alle vier Teile zusammen in einem Makefile gebaut werden und u.U. andere Flags haben. Oder kann man auch Regeln differenzierter anwenden (kann's grad nicht ausprobieren)?

    kernel/%.o:kernel/ %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $(BINDIR)/$@
    

    Und an sich ist es ja schon recht kompakt, die ganzen C-Sourcen des Kernels werden ja z.B. mit einer einzigen Zeile kompiliert. Nur der Assembler-Kram nicht 😕



  • Badestrand schrieb:

    Das "Problem" ist aber, dass alle vier Teile zusammen in einem Makefile gebaut werden und u.U. andere Flags haben. Oder kann man auch Regeln differenzierter anwenden (kann's grad nicht ausprobieren)?

    Eine elegante Möglichkeit fällt mir da nicht ein wenn man verschiedene Flags in einer Makefile haben will.

    Aber die Targets der User Programme umbenennen. Also statt .o heißen die Targets dann z.B. .uo und im Target selber muss wieder .uo in .o gewandelt werden.

    Also ungefähr so (nicht getestet)

    # Liste der .uo
    USEROBJ = $(patsubst %.asm, %.uo, $(patsubst %.c, %.uo, $(wildcard *.c *.asm)))
    
    %.uo: %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $(patsubst %.uo, %o, $(BINDIR)/$@)
    

  • Mod

    siehe Rev. 53



  • Hallo!

    Besteht die Möglichkeit - das die Makefiles etwas "übertrimmt" sind? Zumindest kann ich das OS nicht unter Windows kompilieren. Die Fehlermeldung besagt das er dem Befehl "rm" sowie "mv" nicht finden kann. Mit meiner Laienhaftigkeit habe ich schon versucht das Problem durch eine Äquivalent mittels Batch-Datei zu ersetzen, leider gelingt mir das nur mit "rm". "mv" ist scheinbar beharrlicher...

    Habt ihr vielleicht ein Idee?

    NACHTRAG: mit installierter Cygwin - Umgebung und entsprechenden anpassen des Pfades läuft nun die build.bat komplett durch - bis... bis folgende Fehlermeldung erschein:

    syscall.o:(.rodata+0x20): undefined reference to `_flpydsk_read_directory'
    mingw32-make: *** [ckernel] Error 1

    Erhard Henkes hat zwar zur Version 56 http://www.c-plusplus.net/forum/viewtopic-var-t-is-254893-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html geschrieben, dass die funktion nach fat12.c ausgelagert wurde, nur leider lässt sich diese Datei in den zur Verfügung stehenden Repositorys nicht finden... 😞



  • anubis2k5 schrieb:

    Hallo!

    Besteht die Möglichkeit - das die Makefiles etwas "übertrimmt" sind? Zumindest kann ich das OS nicht unter Windows kompilieren. Die Fehlermeldung besagt das er dem Befehl "rm" sowie "mv" nicht finden kann. Mit meiner Laienhaftigkeit habe ich schon versucht das Problem durch eine Äquivalent mittels Batch-Datei zu ersetzen, leider gelingt mir das nur mit "rm". "mv" ist scheinbar beharrlicher...

    Die Befehle "rm" und "mv" sind Linux/ Unix Befehle. Du brauchst Windows typische Befehle...

    anubis2k5 schrieb:

    Habt ihr vielleicht ein Idee?

    Kompiliere das OS einfach unter ein Linux Derivat.

    anubis2k5 schrieb:

    NACHTRAG: mit installierter Cygwin - Umgebung und entsprechenden anpassen des Pfades läuft nun die build.bat komplett durch

    Cygwin macht Linux/ Unix Befehle unter Windows Nutzbar. Daher klappt das Kompilieren mit der Linux Makefile

    anubis2k5 schrieb:

    - bis... bis folgende Fehlermeldung erschein:

    syscall.o:(.rodata+0x20): undefined reference to `_flpydsk_read_directory'
    mingw32-make: *** [ckernel] Error 1

    Erhard Henkes hat zwar zur Version 56 http://www.c-plusplus.net/forum/viewtopic-var-t-is-254893-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html geschrieben, dass die funktion nach fat12.c ausgelagert wurde, nur leider lässt sich diese Datei in den zur Verfügung stehenden Repositorys nicht finden... 😞

    Lade Dir mal von hier das komplette Archiv (Tar Archiv) herunter. Anschliessend patcht Du mit diesen Dateien Deine Sourcecodes. Die Datei "fat12.inc" gehört in den Ordner "stage2_bootloader".

    Anschliessend alles neu kompilieren und sich über ein laufendes OS freuen 🙂


  • Mod

    Die Befehle "rm" und "mv" sind Linux/ Unix Befehle. Du brauchst Windows typische Befehle...

    Du kannst Dein Windows auch "linuxieren":
    http://www.chrysocome.net/dd (dd anstelle partcopy)
    https://olex.openlogic.com/packages/msys (cp, rm, ...)
    Das hilft bestimmt.

    Hier findest Du alle wichtigen Links zu PrettyOS:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-252232.html (siehe Abschnitt "Tools")



  • Vielen Dank für die schnelle Hilfe!

    Die Tools hatte ich mir schon vorher besorgt - am Pfad hatte es gelegen 😉
    Allerdings besteht mein Fehler im Make-Prozess immernoch...

    Ich habe mir den aktuellen Trunk (56) aus dem SVN Repository gezogen - auch nach der Anleitung von Gamepower funktioniert es nicht... Ich erhalte weiterhin folgende Fehlermeldung:

    E:\MyOS>tools\mingw32-make OS=WINDOWS
    nasmw -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloade
    r/boot.bin
    nasmw -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootload
    er/BOOT2.BIN
    rm *.o -f
    nasmw -O32 -f elf user/user_program_c/start.asm -Iuser/user_program_c/ -o start.
    o
    i586-elf-gcc user/user_program_c/*.c -c -Iuser/user_program_c -m32 -fno-pic -Wer
    ror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builti
    n
    nasmw -O32 -f elf user/user_program_c/start.asm -o start.o
    i586-elf-ld *.o -T user/user_program_c/user.ld -Map user/user_program_c/kernel.m
    ap -nostdinc -o user/user_program_c/program.elf
    rm *.o -f
    tools/make_initrd user/init_rd_img/test1.txt file1 user/init_rd_img/test2.txt fi
    le2 user/init_rd_img/test3.txt file3 user/user_program_c/program.elf shell
    writing file user/init_rd_img/test1.txt->file1 at 0x1304
    writing file user/init_rd_img/test2.txt->file2 at 0x1327
    writing file user/init_rd_img/test3.txt->file3 at 0x134a
    writing file user/user_program_c/program.elf->shell at 0x1910
    mv initrd.dat kernel/initrd.dat
    rm *.o -f
    i586-elf-gcc kernel/*.c -c -Ikernel/include -std=c99 -march=i386 -mtune=i386 -m3
    2 -fno-pic -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostd
    inc -fno-builtin -fno-stack-protector -Iinclude
    nasmw -O32 -f elf kernel/data.asm -Ikernel/ -o data.o
    nasmw -O32 -f elf kernel/flush.asm -Ikernel/ -o flush.o
    nasmw -O32 -f elf kernel/interrupts.asm -Ikernel/ -o interrupts.o
    nasmw -O32 -f elf kernel/kernel.asm -Ikernel/ -o kernel.o
    nasmw -O32 -f elf kernel/process.asm -Ikernel/ -o process.o
    i586-elf-ld *.o -T kernel/kernel.ld -Map kernel/kernel.map -nostdinc -o kernel/K
    ERNEL.BIN
    syscall.o:(.rodata+0x20): undefined reference to `_flpydsk_read_directory'
    mingw32-make: *** [ckernel] Error 1
    

    Ich werd's jetzt mal unter Linux versuchen. Im übrigen habe ich mich vorher durch alle erdenklichen Schlagwörter hier im Forum umgesehen, aber ich finde einfach keine andere Lösung.

    Nachtrag: Revision 55 funktioniert unter Windows ohne Probleme ?!


  • Mod

    Revision 55 funktioniert unter Windows ohne Probleme

    Kann bitte mal jemand prüfen, was bei Rev. 56 falsch ist?

    Bei mir läuft das wie folgt durch:

    G:\OSDev\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
    nasmw -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader/boot.bin
    nasmw -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootloader/BOOT2.BIN
    rm .o -f
    nasmw -O32 -f elf user/user_program_c/start.asm -Iuser/user_program_c/ -o start.o
    i586-elf-gcc user/user_program_c/
    .c -c -Iuser/user_program_c -m32 -fno-pic -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
    nasmw -O32 -f elf user/user_program_c/start.asm -o start.o
    i586-elf-ld *.o -T user/user_program_c/user.ld -Map user/user_program_c/kernel.map -nostdinc -o user/user_program_c/program.elf
    rm *.o -f
    tools/make_initrd user/init_rd_img/test1.txt file1 user/init_rd_img/test2.txt file2 user/init_rd_img/test3.txt file3 user/user_program_c/program.elf shell
    writing file user/init_rd_img/test1.txt->file1 at 0x1304
    writing file user/init_rd_img/test2.txt->file2 at 0x1327
    writing file user/init_rd_img/test3.txt->file3 at 0x134a
    writing file user/user_program_c/program.elf->shell at 0x1910
    mv initrd.dat kernel/initrd.dat
    rm .o -f
    i586-elf-gcc kernel/
    .c -c -Ikernel/include -std=c99 -march=i386 -mtune=i386 -m32 -fno-pic -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostd
    inc -fno-builtin -fno-stack-protector -Iinclude
    nasmw -O32 -f elf kernel/data.asm -Ikernel/ -o data.o
    nasmw -O32 -f elf kernel/flush.asm -Ikernel/ -o flush.o
    nasmw -O32 -f elf kernel/interrupts.asm -Ikernel/ -o interrupts.o
    nasmw -O32 -f elf kernel/kernel.asm -Ikernel/ -o kernel.o
    nasmw -O32 -f elf kernel/process.asm -Ikernel/ -o process.o
    i586-elf-ld *.o -T kernel/kernel.ld -Map kernel/kernel.map -nostdinc -o kernel/KERNEL.BIN
    rm *.o -f
    tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin stage2_bootloader/BOOT2.BIN kernel/KERNEL.BIN
    rawwrite dd for windows version 0.5.
    Written by John Newbigin jn@it.swin.edu.au
    This program is covered by the GPL. See copying.txt for details
    512 100%
    1+0 records in
    1+0 records out
    1 Datei(en) kopiert.


  • Mod



  • Sag ich doch 😉

    PS.: Revision 60 lässt sich perfekt compilieren! Danke! 😃


  • Mod

    Sag ich doch 😉

    Ja, stimmte. Ist mir leider zunächst nicht aufgefallen, dass die fat12.c beim committen vergessen wurde. Nun haut's ja wieder hin.



  • Ich hab gestern das makefile von PrettyOS so umgebaut, das es unter Windows ohne msys funktioniert (unter Linux müsste es dank Nutzung von Variablen weiterhin funktionieren). Anlass war das nicht-funktionieren von msys bei mir (kann auch an mir liegen 😉 ). Ich möchte Euch das natürlich nicht vorenthalten und bitte um Tests (vlt. auch unter Linux, ob es da auch noch funktioniert):

    STAGE1DIR= stage1_bootloader
    STAGE2DIR= stage2_bootloader
    KERNELDIR= kernel
    USERRDDIR= user/init_rd_img
    USERDIR= user/user_program_c
    USERTEST= user/user_test_c
    
    ifeq ($(OS),WINDOWS)
        RM=cmd /c del
        MV=cmd /c move/Y
        NASM= nasmw
        CC= i586-elf-gcc
        LD= i586-elf-ld
        #NASM= tools/nasmw
        #CC= tools/i586-elf/bin/i586-elf-gcc
        #LD= tools/i586-elf/bin/i586-elf-ld
    else
        RM=rm -f
        MV=mv
        NASM=nasm
        CC=gcc
        LD=ld
    endif
    
    all: boot1 boot2 ckernel
    
    boot1: $(wildcard $(STAGE1DIR)/*.asm $(STAGE1DIR)/*.inc)
    	$(NASM) -f bin $(STAGE1DIR)/boot.asm -I$(STAGE1DIR)/ -o $(STAGE1DIR)/boot.bin
    
    boot2: $(wildcard $(STAGE2DIR)/*.asm $(STAGE2DIR)/*.inc)
    	$(NASM) -f bin $(STAGE2DIR)/boot2.asm -I$(STAGE2DIR)/ -o $(STAGE2DIR)/BOOT2.BIN
    
    ckernel: $(wildcard $(KERNELDIR)/* $(KERNELDIR)/include/*) initrd
    	$(RM) *.o
    	$(CC) $(KERNELDIR)/*.c -c -I$(KERNELDIR)/include -std=c99 -march=i386 -mtune=i386 -m32 -fno-pic -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude
    	$(NASM) -O32 -f elf $(KERNELDIR)/data.asm -I$(KERNELDIR)/ -o data.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/flush.asm -I$(KERNELDIR)/ -o flush.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/interrupts.asm -I$(KERNELDIR)/ -o interrupts.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/kernel.asm -I$(KERNELDIR)/ -o kernel.o
    	$(NASM) -O32 -f elf $(KERNELDIR)/process.asm -I$(KERNELDIR)/ -o process.o
    	$(LD) *.o -T $(KERNELDIR)/kernel.ld -Map $(KERNELDIR)/kernel.map -nostdinc -o $(KERNELDIR)/KERNEL.BIN
    	$(RM) *.o 
    	tools/CreateFloppyImage2 PrettyOS FloppyImage.bin $(STAGE1DIR)/boot.bin $(STAGE2DIR)/BOOT2.BIN $(KERNELDIR)/KERNEL.BIN $(USERTEST)/HELLO.ELF
    
    initrd: $(wildcard $(USERDIR)/*)
    	$(RM) *.o 
    	$(NASM) -O32 -f elf $(USERDIR)/start.asm -I$(USERDIR)/ -o start.o
    	$(CC) $(USERDIR)/*.c -c -I$(USERDIR) -m32 -fno-pic -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
    	$(NASM) -O32 -f elf $(USERDIR)/start.asm -o start.o
    	$(LD) *.o -T $(USERDIR)/user.ld -Map $(USERDIR)/kernel.map -nostdinc -o $(USERDIR)/program.elf
    	$(RM) *.o 
    	tools/make_initrd $(USERRDDIR)/test1.txt file1 $(USERRDDIR)/test2.txt file2 $(USERRDDIR)/test3.txt file3 $(USERDIR)/program.elf shell
    	$(MV) initrd.dat $(KERNELDIR)/initrd.dat
    

    Aufgrund des Tab-Problems hier noch zum download: http://kloke-witten.dyndns.org/~philipp/downloads/PrettyOS/makefile


Anmelden zum Antworten