Ontwerp en bouw een besturingssysteem/Appendix B/Automake
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 make, 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.
Het vereist nogal wat moeite en kundigheid om goede make-files te schrijven. Gelukkig zijn er de Autotools, hulpprogramma's die het schrijven van correcte makefiles en het configureren van het systeem veel makkelijker maken. In dit boek ligt de nadruk op het bouwen van een besturingssysteem, daarom worden make-files en de Autotools niet uitgebreid behandeld.
Automake bestand in elke map
[bewerken]Met automake kunnen de makefiles gegenereerd worden vanaf een klein bestand met instellingen. Dit automake-bestand heeft de naam makefile.am
en moet in vrijwel elke map voorkomen.
Maak in de map /kernel/src
een nieuw makefile.am
bestand met de volgende inhoud:
/kernel/src/makefile.am
## Process this file with automake to produce Makefile.in
## Mappen die in de uiteindelijke distributie moeten komen.
## Elk van deze mappen moet een makefile.am bestand bevatten.
## Geef de mappen op in de volgorde waarin ze verwerkt moeten worden.
SUBDIRS =
## Bestanden die niet verwerkt hoeven worden, maar wel in de uiteindelijke
## distributie moeten komen.
EXTRA_DIST =
## Map met headerbestanden.
INCLUDES = -I../include
## Opsomming van alle packages die vanaf deze broncode gebouwd kunnen worden.
bin_PROGRAMS = kernel
## Voor elke package een <naam>_SOURCES met alle bestanden die verwerkt
## moeten worden, in de juiste volgorde.
kernel_SOURCES =
## Flags voor de compiler en linker.
kernel_CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin
kernel_LDFLAGS = -Wl,-T link.ld -nodefaultlibs -nostdlib
## Ondersteuning voor assember bestanden voor NASM.
SUFFIXES = .asm
.asm.o:
nasm -f aout -o $@ $<
De regels die beginnen met een hekje zijn commentaarregels. Merk ook op dat er achter kernel_SOURCES
niks staat. Straks als we de eerste bestanden van de kernel hebben geschreven, moeten de bestandsnamen in een lijst bij deze regel worden gezet.
In alle andere mappen behalve de include
mappen, maar inclusief de hoofdmap, moeten ook makefile.am
bestanden worden gemaakt. Deze zijn simpeler dan die hierboven.
makefile.am
## Process this file with automake to produce Makefile.in
## Mappen die in de uiteindelijke distributie moeten komen.
## Elk van deze mappen moet een makefile.am bestand bevatten.
## Geef de mappen op in de volgorde waarin ze verwerkt moeten worden.
SUBDIRS =
## Bestanden die niet verwerkt hoeven worden, maar wel in de uiteindelijke
## distributie moeten komen.
EXTRA_DIST =
Vul in elk bestand bij SUBDIRS
de namen van de submappen in waarin zich een makefile.am
bestand bevindt:
- In
/makefile.am
:SUBDIRS = kernel doc
- In
/doc/makefile.am
:SUBDIRS =
- In
/kernel/makefile.am
:SUBDIRS = arch src
- In
/kernel/arch/makefile.am
:SUBDIRS = i686
- In
/kernel/arch/i686/makefile.am
:SUBDIRS = src
- In
/kernel/arch/i686/src/makefile.am
:SUBDIRS =
Configuratiebestand
[bewerken]Er is nog een configuratiebestand nodig dat door autoconf gelezen wordt om het compileren van de applicatie in goede banen te leiden.
/configure.ac
# Process this file with autoconf to produce a configure script.
# Vul hier de naam van de applicatie, het versienummer en eventueel
# een contact e-mailadres voor bugreports in.
AC_INIT(OSNaam, 0.0.1, anonymous@example.com)
AM_INIT_AUTOMAKE
AC_PROG_CC
AM_PROG_AS
# Lijst met paden naar de (te genereren) makefile bestanden in alle
# submappen. Doe de haakjes '])' direct na het laatste item.
AC_CONFIG_FILES([
makefile
doc/makefile
kernel/makefile
kernel/src/makefile
kernel/arch/makefile
kernel/arch/i686/makefile
kernel/arch/i686/src/makefile])
AC_OUTPUT
Script
[bewerken]Straks genereren de Autotools allerlei bestanden, en het is handig om die ook weer op te kunnen ruimen. Het volgende scriptje kan dat voor je doen:
/clean.sh
#!/bin/sh
make distclean
rm -f config.cache
rm -r -f autom4te.cache
rm -f aclocal.m4
rm -f compile
rm -f config.log
rm -f config.status
rm -f configure
rm -f depcomp
rm -f install-sh
rm -f missing
find . -type f -name "makefile.in" -exec rm {} \;
echo Opgeruimd!
Bestanden genereren
[bewerken]Nu moet het configure.ac
-bestand en de makefile.am
bestanden nog gevoerd worden aan de Autotools. Gebruik daarvoor de volgende commando's, vanuit de hoofdmap:
autoreconf -i
./configure --host=i686-unknown-linux-gnu
Vanaf nu kan je je code compileren met het volgende commando (ook weer vanuit de hoofdmap):
make
De bestanden die het resultaat zijn van de compilatie kan je indien nodig (meestal hoeft het niet) weer verwijderen met het volgende commando:
make distclean
Alle gegenereerde en gecompileerde bestanden verwijderen doe je door het volgende commando in de hoofdmap uit te voeren:
./clean.sh