Ontwerp en bouw een besturingssysteem/Organisatie/Makefiles: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Virtlink (overleg | bijdragen)
 
Virtlink (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 1:
Steeds weer voor elk bestand die compileeropdracht intypen, wordt een beetje vervelend. Gelukkig is er een oplossing die in de Linux wereld erg veel gebruikt wordt voor het compileren van applicaties. Die oplossing is '''<tt>make</tt>''', een hulpmiddel dat zogenaamde ''makefile'' scripts kan uitvoeren, en speciaal bedoeld is voor het compileren van applicaties, het genereren van documentatie, en dat soort taken.
#DOORVERWIJZING [[Ontwerp en bouw een besturingssysteem/Appendix B/Automake]]
 
Het schrijven van goede makefiles is een kust op zich, en in dit boek ligt de nadruk op het bouwen van een besturingssysteem, dus worden makefiles niet uitgebreid behandeld. Maar omdat ze zo onmisbaar zijn volgt hier een korte uitleg van makefiles zoals die direct voor het besturingssysteem gebruikt kunnen worden.
 
== Basisbestand ==
Maak in de hoofdmap van het project (<tt>/</tt>) een nieuw <tt>Makefile.inc</tt> bestand aan. Dit is het basisbestand voor alle andere makefiles, en heeft de volgende inhoud:
{{Code|Titel=/'''Makefile.inc'''|Code=<source lang="text">
CC = gcc
CFLAGS = -Wall -O -fno-stack-protector -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdlib -nostdinc -fno-builtin -I./include
AS = nasm
ASFLAGS =
LD = ld
LDFLAGS =
RM = rm
ECHO = echo
 
# De naam van het uiteindelijke bestand:
KERNELFILE = kernel
 
.SILENT :
 
force_look :
true
</source>}}
 
 
{{Bericht
|titel=Cross-platform toolchain?
|bericht=Gebruik je een ''cross-platform toolchain'', pas dan de namen van de tools <tt>ld</tt> en <tt>gcc</tt> in dit bestand aan.
 
<tt>gcc</tt> wordt dan bijvoorbeeld <tt>i586-elf-gcc</tt>.
|type=info}}
 
== Hoofdmap makefile ==
Het vorige bestand is geen echte makefile, maar bevat alleen de basis ervan. Dat gebruiken we in de echte makefile die gemaakt moet worden in dezelfde map (<tt>/</tt>), <tt>Makefile</tt> genaamd, zonder extentie. Het bestand heeft de volgende inhoud:
{{Code|Titel=/'''Makefile'''|Code=<source lang="text">
include Makefile.inc
 
# Alle submappen waarin 'make' uitgevoerd kan worden.
DIRS = kernel
 
.PHONY: all clean
 
all : $(KERNELFILE)
 
# Kopieer dit en pas het aan voor elke submap waarin 'make' uitgevoerd kan worden.
$(KERNELFILE) : force_look
$(ECHO) "Entering directory 'kernel'..."
cd kernel; $(MAKE) -$(MAKEFLAGS) all
$(ECHO) "Leaving directory 'kernel'."
clean :
-for d in $(DIRS); do (cd $$d; $(MAKE) clean ); done
</source>}}
 
== Kernel makefile ==
Omdat de voorgaande makefile <tt>make</tt> aanroept in de submappen (alleen <tt>kernel</tt> in dit geval), moeten al die submappen ook een <tt>Makefile</tt> bestand bevatten. In <tt>/kernel/Makefile</tt> gebeurt het echte werk, en staat dan het volgende:
{{Code|Titel=/kernel/'''Makefile'''|Code=<source lang="text">
include ../Makefile.inc
 
MAINFILE = ../$(KERNELFILE)
# Het bestand met de multiboot header (en het bijbehorende object-bestand)
BOOTFILE = src/boot.asm
BOOTOBJFILE = src/boot.obj
# Andere .asm bestanden
ASMFILES =
# De C bestanden
SRCFILES = \
src/system.c \
src/memory.c \
src/kernel.c
 
LINKFILE = link.ld
OBJFILES = $(BOOTOBJFILE) $(patsubst %.asm,%.obj,$(ASMFILES)) $(patsubst %.c,%.o,$(SRCFILES))
 
.PHONY: all clean
 
all : $(MAINFILE)
 
$(MAINFILE) : $(LINKFILE) $(OBJFILES)
$(LD) $(LDFLAGS) -o $(MAINFILE) -T $(LINKFILE) $(OBJFILES)
 
$(BOOTOBJFILE) : $(BOOTFILE)
$(AS) $(ASFLAGS) -I./src/ -o $(BOOTOBJFILE) -f elf $(BOOTFILE)
 
%.obj : %.asm
$(AS) $(ASFLAGS) -I./src/ -o $*.obj -f elf $*.asm
%.o : %.c
$(CC) $(CFLAGS) -c -o $*.o $*.c
 
clean:
-$(RM) ./src/*.o ./src/*.obj $(MAINFILE)
</source>}}
 
 
{{Bericht
|titel=Mappenstructuur
|bericht=Deze makefiles gaan er van uit dat je je aan de eerder genoemde [[Ontwerp en bouw een besturingssysteem/Organisatie/Mappenstructuur|mappenstructuur]] hebt gehouden.
|type=nb}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.