Makefiles unter Linux



  • Hallo,

    habe PrettyOS 107er Version unter Linux mit diesen Makefiles gebaut:
    _stage1_bootloader/makefile_linux:

    all:
    	nasm -f bin boot.asm -o boot.bin
    	@echo No errors.
    

    _stage2_bootloader/makefile_linux:

    all:
    	nasm -f bin boot2.asm -o BOOT2.SYS
    	@echo No errors.
    

    kernel/makefile_linux:

    SOURCES = kernel.asm $(filter-out kernel.asm ,$(wildcard *.asm *.c))
    OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
    
    ASFLAGSOBJ= -O32 -f elf
    NASM = nasm
    
    CFLAGS=	-Werror -Wall \
    	-O -ffreestanding -fleading-underscore \
    	-nostdlib -nostdinc -fno-builtin \
    	-fno-stack-protector \
    	-Iinclude
    
    CC = gcc
    
    LDFLAGS= -T kernel.ld -Map kernel.map -nostdinc
    LD = ld
    
    all: ckernel.sys
    	@echo No errors.
    
    %.o: %.asm
    	$(NASM) $(ASFLAGSOBJ) $< -o $@
    	@echo No errors for asm.
    
    ckernel.sys: $(OBJECTS)
    	$(LD) $(LDFLAGS) $+ -o $@
    	@echo No errors for ckernel.sys.
    
    data.asm: initrd.dat
    	@echo No errors for data.asm.
    
    clean:
    	rm -fv *.o
    	@echo No errors.
    
    #    $<		Erste Abhängigkeit
    #    $+		Liste aller Abhängigkeiten
    #    $@		Name des Targets
    

    Und die USB-Floppy wird mit diesem Makefile erstellt:

    PRETTYOS_SRC = /home/abc.w/PrettyOS_107
    FLOPPY_DEVICE = /dev/sdc
    
    all:
    	mkfs.msdos -F 12 -v -I $(FLOPPY_DEVICE)
    	dd if=$(PRETTYOS_SRC)/_stage1_bootloader/boot.bin of=$(FLOPPY_DEVICE) bs=512 count=1
    	mount $(FLOPPY_DEVICE) /mnt -v
    	cp $(PRETTYOS_SRC)/_stage2_bootloader/BOOT2.SYS /mnt -v
    	cp $(PRETTYOS_SRC)/kernel/ckernel.sys /mnt -v
    	ls -l /mnt/BOOT2.SYS
    	ls -l /mnt/ckernel.sys
    	umount /mnt -v
    	eject $(FLOPPY_DEVICE)
    

    Kritik und Verbesserungsvorschläge gerne gewünscht 🙂



  • abc.w schrieb:

    _stage1_bootloader/makefile_linux:

    all:
    	nasm -f bin boot.asm -o boot.bin
    	@echo No errors.
    

    _stage2_bootloader/makefile_linux:

    all:
    	nasm -f bin boot2.asm -o BOOT2.SYS
    	@echo No errors.
    

    Man könnte hier auch mit den Dependencies arbeiten. Also

    all: boot.bin
    
    boot.bin: boot.asm
        nasm -f bin $< -o $@
    

    Analog für stage2.

    Man könnte da auch noch weiter treiben, und alle Makefiles zusammenführen (mittels include), um dann auch die Abhängigkeiten des Diskettenimages auf stage1 und stage2 sowie den Kernel behandeln zu können.



  • Schablone schrieb:

    ... Man könnte hier auch mit den Dependencies arbeiten....

    Ja, das könnte man noch machen. stage1 ist abhängig von Fat12_BPB.inc. stage2 ist abhängig von A20.inc, Fat12.inc, Fat12_BPB.inc, GetMemoryMap.inc und gdt.inc. Ich würde gerne die Makefile erstmal so lassen.

    Schablone schrieb:

    ...könnte da auch noch weiter treiben, und alle Makefiles zusammenführen (mittels include), um dann auch die Abhängigkeiten des Diskettenimages auf stage1 und stage2 sowie den Kernel behandeln zu können.

    Ja, wie würdest Du es machen (habe da keine Ahnung)?



  • Mittels include? Normalerweise schreibt man da aber eine Hauptmakefile, die die anderen Makefiles aufruft, also in etwa so:

    MAKE_DIR = make -C
    
    .PHONY: all kernel _stage1_bootloader _stage2_bootloader
    
    all: PrettyOS.img
    
    PrettyOS.img: kernel _stage1_bootloader _stage2_bootloader
    #   Hier irgendwie das Image erstellen...
    
    kernel:
        $(MAKE_DIR) $@
    
    _stage1_bootloader:
        $(MAKE_DIR) $@
    
    _stage2_bootloader:
        $(MAKE_DIR) $@
    


  • Wenn schon rekursiv aufrufen, ist es sauberer, $(MAKE) statt make zu benutzen.



  • Danke schön für die Tipps.
    Habe es jetzt wie folgt gemacht:
    ./makefile_linux

    all:
    	$(MAKE) -C kernel -f makefile_linux $@
    	$(MAKE) -C _stage1_bootloader -f makefile_linux $@
    	$(MAKE) -C _stage2_bootloader -f makefile_linux $@
    	@echo No errors for $@.
    
    clean:
    	$(MAKE) -C kernel -f makefile_linux $@
    	$(MAKE) -C _stage1_bootloader -f makefile_linux $@
    	$(MAKE) -C _stage2_bootloader -f makefile_linux $@
    	@echo No errors for $@.
    

    ./_stage1_bootloader/makefile_linux

    all:
    	nasm -f bin boot.asm -o boot.bin
    	@echo No errors for $@.
    
    clean:
    	rm -fv boot.bin
    	@echo No errors for $@.
    

    ./_stage2_bootloader/makefile_linux

    all:
    	nasm -f bin boot2.asm -o BOOT2.SYS
    	@echo No errors for $@.
    
    clean:
    	rm -fv BOOT2.SYS
    	@echo No errors for $@.
    

    ./kernel/makefile_linux

    SOURCES = kernel.asm $(filter-out kernel.asm ,$(wildcard *.asm *.c))
    OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
    
    ASFLAGSOBJ= -O32 -f elf
    
    CFLAGS=	-march=i386 -mtune=i386 \
    	-Werror -Wall \
    	-O2 -fomit-frame-pointer -ffreestanding -fleading-underscore \
    	-nostdlib -nostdinc -fno-builtin \
    	-fno-stack-protector \
    	-Iinclude
    
    CC = gcc
    
    LDFLAGS= -T kernel.ld -Map kernel.map -nostdinc
    LD = ld
    
    all: ckernel.sys
    	@echo No errors for $@.
    
    %.o: %.asm
    	nasm $(ASFLAGSOBJ) $< -o $@
    	@echo No errors for $@.
    
    ckernel.sys: $(OBJECTS)
    	$(LD) $(LDFLAGS) $+ -o $@
    	@echo No errors for $@.
    
    data.asm: initrd.dat
    	@echo No errors for $@.
    
    clean:
    	rm -fv *.o
    	@echo No errors for $@.
    
    #    $<		Erste Abhängigkeit
    #    $+		Liste aller Abhängigkeiten
    #    $@		Name des Targets
    

    Weitere Tipps gerne willkommen 🙂



  • Vielleicht kannst du ein paar Ideen von hier übernehmen:
    http://c-plusplus.net/forum/viewtopic-var-t-is-88418.html



  • Gibt es schon finale Versionen dieser Makefiles? Hat jemand das ganze mal auf Ubuntu Netbook Remix getestet?



  • Gamepower schrieb:

    Gibt es schon finale Versionen dieser Makefiles? Hat jemand das ganze mal auf Ubuntu Netbook Remix getestet?

    Die Makefiles sind in der finalen Version. Es sei denn, auf Ubuntu Netbool Remix gibt's Probleme damit 😉



  • Ich hab grad mal versucht PrettyOS unter 64 Bit Linux zu kompilieren. Da sind noch 2 kleine Änderungen nötig.

    - Zu den CFLAGS noch "-m32" hinzufügen
    - In das Linkerscript (kernel.ld) "OUTPUT_ARCH(i386)" hinzufügen


  • Mod

    in Rev 53 eingebaut


  • Mod

    Mein letzter Stand hier war, dass PrettyOS nun unter Linux mit 64 bit Kompilierung/Linken problemlos ablaeuft. Tobiking hatte dies in einem Versuch bestaetigt. Wie ist die allgemeine Erfahrung diesbezueglich?



  • Ich kann nichts zu 64 Bit Linux sagen, aber ich habe es gerade auf 32 Bit [Ubuntu 9.10] kompiliert. Ich habe das .tar.gz File runtergeladen und es make ausgefuehrt (also nichts veraendert).

    Leider gibt es ein kleines Problem mit dem Makefile. Das Makefile bindet ein Userprogramm ein ("HELLO.ELF"), allerdings existiert nur "hello.elf". Scheinbar sind alle Userspace Programme klein geschrieben, gibt es dafuer einen Grund (ich konnte klein geschriebene Dateien in PrettyOS nicht ausfuehren)? Sonst wuerde ich vorschlagen, dass man die Dateien umbenennt :). Dann funktioniert auch das Makefile prima.



  • Das ist das Problem was ich in http://www.c-plusplus.net/forum/viewtopic-var-t-is-261635.html angeführt hatte. Wenn man CreateFloppy2 als Parameter klein geschriebene Dateinamen übergibt werden diese auch in dem Image mit Fat12 Dateisystem klein geschrieben, was so nicht sein soll. Erhard wollte aber an dem Programm nichts ändern weil Badestrand das geschrieben hat.



  • Das Programm zu ändern, wäre ja kein Problem, der Source sollte eigentlich auch so simpel sein, dass da jeder drin rumpfuschen kann.

    Wie wär's denn, wenn wir die Binaries gleich groß-geschrieben erstellen? Sollte imho am Einfachsten sein. Ansonsten kann ich auch CreateFloppyImage umproggen, dass die Dateinamen groß werden.


Anmelden zum Antworten