Kapitel 10. Bygge og projekthåndtering

Bernd Pol

Ian Wadham

Indholdsfortegnelse

Sammendrag af Håndtering af automake
Behovet for et automatiseret byggesystem
Vejledninger om Autoconf, Automake og Libtool
Hvad gør Håndtering af automake?
Sammendrag af hvad Håndtering af automake gør
Indhold i automake-filer
Brug af Håndtering af automake
Vinduet Håndtering af automake
Oversigtsvinduet
Detaljevinduet
Navigering i Håndtering af automake
Sammenhængsafhængige menuer i Håndtering af automake
Automake-projekt
Autoconf
Automake
KDevelops Håndtering af automake
Bygning og installering af biblioteker
Egne byggefiler og byggescripter
Oversætterindstillinger
Byggetilvalg

Dette kapitel behandler kun kompilerede projekter, såsom projekter med C++, Java™ eller Fortran. Projekter for scriptsprog såsom Python og PHP, virker meget anderledes.

Her finder du information om følgende emner:

Sammendrag af Håndtering af automake

I kapitlet Byggesystemer har vi givet en grov oversigt over de byggesystem som almindeligvis bruges på UNIX®-systemer. I følgende afsnit kigger vi på dette i mere detalje.

Der er en vis forvirring angående hvordan sådanne ting skal navngives. GNU kalder dem “byggesystemer” når Automake, Autoconf og Libtool beskrives. Qmake kaldes “et værktøj til at skrive Makefiles for forskellige oversættere og platforme”. I KDE bruges ofte udtrykket “projekthåndteringssystem”. Vi bruger dette udtryk i en bredere forstand til at beskrive de indbyggede miljøer i KDevelop som bruges til at organisere og bygge projekter. I dette afsnits sammenhæng, taler vi dog hovedsageligt om “automatiserede byggesystemer”.

Behovet for et automatiseret byggesystem

Hvis du har et simpelt program som udskriver “Hej allesammen”, skrevet i C, kan du kompilere og linke det med gcc -o hej hej.c og køre det med ./hej, så du behøver du ikke engang en Makefile.

Hvis du har et C-program med flere moduler og deklarationsfiler og du kun skal køre det på din maskine (dvs. det er et lokalt program), behøver du kun en enkelt Makefile, som er ganske nem at skrive i hånden (brug info make for at lære dig mere).

Komplikationerne begynder når:

  • Din kildekode, dokumentation, grafik, lyd, oversættelser, datafiler osv. findes i mere end en mappe,

  • Du har et hierarki af mapper og undermapper,

  • Du bruger biblioteker som ikke er en del af det traditionelle sæt på UNIX®, såsom Qt™-objektbiblioteket eller KDE-desktopbiblioteker,

  • Du bruger en præprocessor til at oprette en del af din kildekode, som Qt's MOC præoversætter,

  • Du sigter mod at distribuere programmet i hele verden, til personer som ikke har samme UNIX®- eller Linux®-system, programmel og hardware som dig,

  • Du kræver en automatisk funktion for installation og afinstallation,

  • Du sigter mod at gøre dit program til en del af KDE's sæt af desktopprogrammer.

Hvis du befinder dig i en eller alle ovenstående situationer, behøver du formodentlig et byggesystem. I eksemplet ovenfor brugte vi kommandoen gcc til at kompilere og bygge programmet “Hej”, men alle C-oversættere hedder ikke “gcc”. Så hvis du distribuerer programmet til nogen som bruger en anden C-oversætter, skal din Makefile på en eller anden måde bruge navnet på denne persons oversætter, ellers mislykkes kompileringen af programmet—og dette er kun et af mange eksempler på hvad som kan gå galt.

Et byggesystem udjævner forskellene for dig.

  • Det kontrollerer at bibliotekerne som behøves er på hver maskine som tager imod programmet,

  • afsøger automatisk alle programmapper efter filer at forbehandle, kompilere eller installere og

  • installerer komponenterne som programmet består af i de rigtige mapper, og sikrer at

  • mapperne på maskinen som tager imod programmet laves efter behov.

I korthed tilbyder et byggesystem sikre metoder til at kompilere og installere programmet på alle maskiner som tager imod programmet. Som vi har vist tidligere i oversigten Projekthåndteringssystemer, tilbyder KDevelop tre automatiserede byggesystemer og mulighed at oprette din egen Makefile. I korthed (klik på projektnavnene for mere information):

  • Automake-projekt som bruger de almindelige udviklingsværktøjer for GNU.

  • Qmake-projekt som bruger Trolltechs Qmake-projekthåndtering.

  • ANT-projekt som bruger Apaches ANT-projekthåndtering for Java™-udvikling.

  • Eget projekt som kræver at du vedligeholder din egen Makefile.

Vigtigt

En af de fire valgmuligheder skal vælges når du laver et projekt, og valget er svært at ændre senere, så du bør tænke dig om inden du begynder.

Vejledninger om Autoconf, Automake og Libtool

Der er flere vejledninger tilgængelige om GNU's byggesystem (Autoconf, Automake og Libtool) som Håndtering af automake bruger.

  • En kort vejledning om autoconf, skrevet af Christopher W. Curtis er tilgængelig på KDevelops hjemmeside. Den koncentrerer sig om nogle grundlæggende skridt til at ændre en Makefile.

  • En mere detaljeret vejledning findes i et større sæt af øvelser på Udvikling af programmer med GNU.

  • Den berømte “gedebog”, som hedder “Autoconf, Automake, and Libtool”, findes også på http://sources.redhat.com/autobook. Den er en letlæst, men alligevel kortfattet, introduktion til alle vigtige aspekter af GNU's autoværktøjer.

Hvad gør Håndtering af automake?

Programguiden har oprettet nogle oprindelige Makefile.am filer da du oprettede et nyt projekt af en type som bruger GNU's byggesystem, såsom C++->KDE->Application framework. Under udviklingen laver Håndtering af automake alle yderligere Makefile.am filer for projekter som bruger GNU's byggesystem, og vedligeholder alle, både de som blev lavet med programguiden og Håndtering af automake.

Der er en Makefile.am i hver projektmappe som indeholder filer som skal kompileres eller installeres. Den indeholder dine specifikationer for at kompilere, bygge og installere filer og en reference til alle undermapper som også har en Makefile.am og muligvis nogle filer at kompilere, bygge og installere.

Bemærk

Projektets mapper og kildekodefiler kan struktureres til hvilken som helst dybde, eller du foretrækker måske en flad projektstruktur med alle undermapper på topniveau.

Formålet med GNU's byggesystem er at oprette filstrukturer for kildekode som kan kompileres, bygges og installeres på et hvilket som helst UNIX®- eller Linux®-system med de simple kommandoer:

./configure
make
make install    # Sædvanligvis som systemadministrator.

og kan afinstalleres med kommandoen make uninstall (oftest som systemadministrator).

Hvordan virker det? Ja, configure er et script som:

  • udarbejder detaljeret information om systemet som det køres på, såsom hvilken oversætter og hvilke biblioteker som skal bruges, hvor de kan findes, og derefter

  • rekursivt laver filerne Makefile ved at udfylde det som skal erstattes i de tilsvarende Makefile.in.

Filen Makefile.am er “inddata”—en skabelon som giver grundlæggende information for den Makefile som skal laves, ved at udfylde en vis systemafhængig information. Den laves af værktøjet Automake ud fra filen Makefile.am.

Processen at komme fra en Makefile.am (hvor .am angiver skabelonfiler for “Automake”) til Makefile håndteres automatisk af Kdevelops Håndtering af automake med værktøjet Autoconf, M4-makroer og andre mysterier vi ikke behøver at gå ind på her.

Så når make kører, henter det automatisk den rigtige information fra det nuværende miljø, såsom oversætter og biblioteker. På samme måde, placerer make install delene af programmet, som kørbare filer, dokumentation og datafiler på det rigtige stedet i dette miljø.

Hvis du distribuerer programmet som et “tar-arkiv” (en enkelt komprimeret fil som KDevelop kan oprette for dig), indeholder den filerne Makefile.in og scriptfilen configure, så modtageren kan kompilere, bygge og installere programmet uden at have Automake, Autoconf eller KDevelop på sin maskine. Filerne Makefile.am indgår også, ifald modtageren skal lave nogen ændringer i kildekoden.

Bemærk

Reglerne er væsentligt anderledes hvis du distribuerer via et netbaseret kildekodearkiv såsom KDE's CVS.

Sammendrag af hvad Håndtering af automake gør

  • Opretter filerne Makefile.am i undermapperne som det kender til som “delprojekter”.

  • Opdaterer filerne Makefile.am når projektstrukturen ændres.

  • Opdaterer filerne Makefile.am når filer tilføjes eller fjernes fra projektet.

  • Accepterer definitioner om hvordan de forskellige filer skal bygges eller installeres, og ændrer Makefile.am ifølge dem.

  • Accepterer parametre som bruges ved bygning eller installation (f.eks. biblioteksnavne), og sikrer at de bruges i de nødvendige kompilerings- og byggeskridt.

Indhold i automake-filer

Filen Makefile.am har linjer som indeholder variabelnavne fulgt af et lighedstegn og en liste med filer eller parameterværdier. “Variabler” har todelte navne, såsom bin_PROGRAMS, mitpgm_SOURCES eller kdelnk_DATA. Den anden del kaldes den primære og repræsenterer noget som skal bygges eller installeres. Den første del kaldes præfiks og repræsenterer:

  • En mappe hvor installationen skal gøres (f.eks. bin),

  • En kvalifikation for den primære del (f.eks. mitpgm for SOURCES, som angiver at kildekodefiler som er på listen efter mitpgm_SOURCES indgår i at bygge mitpgm.

  • Et særligt præfiks noinst (kort for “ingen installation”), som oftest bruges til en liste over programmets deklarationsfiler (.h),

  • Eller det specielle præfiks EXTRA, for indstillingsafhængige ting.

For mere information om Automake og filerne Makefile.am, slå det op i info Automake.

I hovedsagen laver og opdaterer Håndtering af automake variabelnavne og fillister eller parametre. Se følgende eksempel på en Makefile.am for et typisk program, som kaldes mitpgm.

## Makefile.am for mitpgm

# dette er programmet som installeres. Dets navn bruges for alle
# andre Makefile.am variabler
bin_PROGRAMS = mitpgm

# indstil søgestien for deklarationsfiler til X, Qt og KDE
INCLUDES = $(all_includes)

# bibliotekssøgestien.
mitpgm_LDFLAGS = $(KDE_RPATH) $(all_libraries)

# bibliotekerne at linke med.
mitpgm_LDADD   = $(LIB_KFILE) $(LIB_KDEPRINT)

# hvilke kildekodefiler skal kompileres for mitpgm
mitpgm_SOURCES = main.cpp mitpgm.cpp mitpgmvy.cpp

# dette er deklarationsfilerne for projektet
noinst_HEADERS = mitpgm.h mitpgmvy.h

# lad automoc håndtere alle metakildefiler (moc)
METASOURCES = AUTO

KDE_ICON = mitpgm

# det er her kdelnk-filen havner 
kdelnkdir = $(kde_appsdir)/Utilities
kdelnk_DATA = mitpgm.desktop

# det er her XML-GUI ressourcefilen havner
rcdir = $(kde_datadir)/mitpgm
rc_DATA = mitpgm_ui.rc

AM_CXXFLAGS = -DMY_C++_PREPROCESSOR_ALTERNATIV

Som du kan se er mange af objekterne på højresiden symboler på formen $(xxxx). De er miljøvariabler som defineres i selve KDE-miljøet og erstattes med rigtige værdier når ./configure laver de endelige Makefile-filer på maskinen som tager imod programmet.

Det er også en god ide at køre kommandoen ./configure --help en gang efter du er begyndt med KDevelop, hvilket viser dig de forskellige ting du kan ændre på bygge- og installationstidspunktet, såsom et testmiljø. I særdeleshed kommandoen:

./configure --prefix=/hvor/du/vil
som flytter hele installationen til en mappestruktur som du vælger, ved at ændre den interne variabel $(prefix) til værdien /hvor/du/vil.