Bernd
Pol
Ian
Wadham

# Bygge og projekthåndtering

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 indeholder en oversigt over Håndtering af automake,

- Anvendelse af Håndtering af automake beskriver det basale i hvordan man arbejder med Håndtering af automake.

## 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 (&ie; 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 &etc; 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`.

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å . 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.

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.

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 (&eg; 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 (&eg; `bin`),

- En kvalifikation for den primære del (&eg; 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`.

## Brug af Håndtering af automake

I dette kapitel finder du en grundlæggende beskrivelse af elementerne i Håndtering af automake, og hvordan de bruges. Dette dækker:

- Vinduet Håndtering af automake beskriver den grundlæggende struktur i hovedvinduet i Håndtering af automake.

- Oversigtsvinduet beskriver elementerne i det øverst delvindue.

- Detaljevinduet beskriver elementerne i det nederste delvindue.

- Navigering i Håndtering af automake giver en liste af nogle grundlæggende handlinger du kan udføre i Håndtering af automake.

- Sammenhængsafhængige menuer i Håndtering af automake beskriver menuerne som dukker op når du vælger en handling i Håndtering af automake.

### Vinduet Håndtering af automake

- Håndtering af automake bruger et delt vindue. Den øverste del kaldes Oversigtsvinduet og den nederste del kaldes Detaljevinduet. Mellem dem er en smal linje som kan trækkes med musen for at justere vinduestørrelserne. I IDEA-vinduestilstand kan du også trække sidekanten på det delte vinduet for at ændre bredden.

- Ovenfor hvert vindue er der en værktøjslinje, hvor knapperne bliver aktive når et element i vinduet markeres. Dette tilbyder en måde at få adgang til handlingerne som der sørges for for dette element. Det andet sæt er sammenhængsafhængige menuer, som dukker op ved klik med højre museknap som beskrevet nedenfor.

- I IDEA-vinduetilstand er der yderligere to små knapper til venstre i navnelisten på vinduet Håndtering af automake—en trekantformet højrepil, og en knap med en prik. Pileknappen bruges til at lukke for vinduet. Prikknappen på den anden side, holder vinduet åbent også selvom om et andet vindue vælges i &kdevelop;. (Ellers lukkes vinduet Håndtering af automake automatisk så snart et andet vindue får indtastningsfokus.)

### Oversigtsvinduet

Oversigtsvinduet indeholder en træliste med alle mapper i projektet som indeholder programfiler, dokumentation eller data. Hver sådan mappe indeholder en fil `Makefile.am` og er kendt som et delprojekt i Håndtering af automake. Der er tre typiske delprojekter i et &kde;-baseret projekt, som vises på billedet ovenfor:

- `src`: kildekodefiler for programmet,

- `doc`: brugermanualen eller håndbogen,

- `po`—uddrag af strenge i dine kildekodefiler som kræver oversættelse til andre menneskelige sprog (f.eks. vinduestitler, menunavne, navne på knapper, tekst i dialoger og meddelelser af forskellige slags).

Bemærk at delprojektet `doc` altid har et delprojekt som hedder `en`, som du kan se hvis du klikker på symbolet + før ordet `doc`. Dette skyldes at grundsproget for al dokumentation i KDE er amerikansk engelsk (en). Hvis programmet bliver en del af KDE, kan KDE's oversættelsesgrupper oversætte din dokumentation fra engelsk til andre sprog, og oversættelserne havner så i andre delprojekter, såsom `da` (dansk), `de` (tysk) eller `fr` (fransk). Strengene i delprojektet `po` kan også oversættes og opbevares i andre filer under `po`, for på den måde at lade programmet bruges af personer som ikke kan engelsk.

Delprojekterne `doc` og `po` tjener forskellige formål. `doc` indeholder dokumentation, såsom en brugerhåndbog, mens `po` indeholder tekststrenge som kan oversættes fra brugergrænsefladen som indgår i programmets kildekode.

Oversigtsvinduet virker—blandt andet—som et navigeringsværktøj. Hvis du vælger et delprojekt i oversigtsvinduet, vises tilsvarende detaljeret information i detaljevinduet.

### Detaljevinduet

Detaljevinduet indeholder en liste med alle filer i delprojektet som for øjeblikket er markeret i oversigtsvinduet, samt kompilerings-, bygge- og installationsreglerne for delprojektet. På den måde kan vinduerne tilsammen give dig mulighed for at komme til alle komponenter i programmet, og al information om hvordan det skal kompileres, bygges og installeres.

#### Mål

Trælisten i detaljevinduet har to niveauer. Det øverste niveau består af såkaldte mål i Håndtering af automake, og næste niveau indeholder lister med filer som bruges for at oprette hvert mål.

Dette begreb med et mål i Håndtering af automake, adskiller sig noget fra hvad et mål i en `Makefile` som oftest er. I korthed:

- Definitionen af hvordan et antal filer skal kompileres, bygges eller installeres er kendt som et mål i Håndtering af automake, men som en variabel i selve `Automake`.

- Et mål i `make` er ofte noget helt andet, eftersom det kan være en parameter til kommandoen `make` (&eg; `make install`, `make clean`).

  Visse af variablerne i `Makefile.am` repræsenterer dog et underliggende delmål for `make`.

### Navigering i Håndtering af automake

Både i oversigtsvinduet og detaljevinduet kan du venstreklikke på + eller - foran et delprojekt eller målnavn for at udvide eller trække trævisningen sammen. Hvis du gør dette med et delprojekt i oversigtsvinduet, vises eller skjules delprojektets næste underliggende niveau (hvis der er et sådant). Hvis du gør dette med et mål i detaljevinduet, vises eller skjules listen med filer som indgår i målet.

#### Åbn en fil til redigering

Hvis du venstreklikker på et filnavn i detaljevinduet, åbnes den tilsvarende fil i KDevelops redigeringsvindue.

#### Aktivér værktøjslinjeknapperne i Håndtering af automake

Hvis du venstreklikker på et delprojektnavn i oversigtsvinduet eller et mål i detaljevinduet, markeres navnet og visse knapper i værktøjslinjen bliver aktive længst oppe i vinduet.

Du anbefales at bruge højre museknap og sammenhængsafhængige menuer, i stedet for knapperne i værktøjslinjen, eftersom det så er meget nemmere at se og forstå hvad du gør.

Handlinger for delprojekter og mål har langtvirkende effekter for struktur, kompilering, bygning og installation af programmet.

#### Vælg handlinger og sammenhængsafhængige menuer

Hvis du højreklikker på et delprojektnavn, mål eller fil, dukker en menu op og du kan derefter vælge handlinger at udføre for delprojektet, målet eller filen, såsom at tilføje et mål til delprojektet, tilføje en fil til målet eller logisk fjerne den markerede filen fra sit mål.

### Sammenhængsafhængige menuer i Håndtering af automake

Følgende afsnit forklarer kortfattet hvilke handlinger som menuerne gør tilgængelige, som dukker op ved klik med højre museknap i vinduet Håndtering af automake. Afsnittene er kun beregnet som en oversigt. Du finder detaljerede beskrivelser af de fleste handlinger i et senere kapitel.

#### Sammenhængsafhængig menu for en fil

Når du højreklikker på et filnavn i detaljevinduet, dukker følgende menu op som lader dig vælge en af flere handlinger at udføre med filen. I billedet nedenfor, markeredes ikonfilen `hi-16app-myapp.png` i målet Ikondata i kde_icon fra delprojektet myapp/src.

- Hovedpunktet i den sammenhængsafhængige menu er at Fjerne filen fra målet (&ie; den kommer ikke længere at blive brugt til at kompilere, bygge eller installere dette mål).

- Punktet CVS tilbyder en hel del forskellige CVS-handlinger for filen.

- Punktet Åbn med lader dig åbne filen med et antal editorer eller med et hvilket som helst program (&eg; kan du åbne ikonfilen i vort eksempel med Kiconedit).

- Punktet Perforce bruges til lignende handlinger som i CVS, men med det kommercielle versionshåndteringssystem Perforce.

#### Sammenhængsafhængig menu for et mål

Når du højreklikker på et mål i detaljevinduet, dukker følgende menu op som lader dig vælge en af flere handlinger at udføre med det. I billedetnedenfor, markeredes målet myapp (Program i bin) i delprojektet myapp/src.

- Punktet Indstillinger for et mål gælder kun kildekodefiler. I den tilsvarende dialog kan du angive linkerflag og søgestier hvor biblioteker kan findes, og du kan angive en liste med egentlige biblioteker som skal linkes med i programmet.

- Punktet Opret ny fil viser en dialog hvor du kan angive filnavnet og filtypen som skal laves (i et dropned-felt).

- Punktet Tilføj eksisterende filer viser en dialog hvor du kan tilføje en eksisterende fil til målet.

- Punktet Fjern for et mål lader dig logisk fjerne målet og alle dets filer fra projektstrukturen.

- Punktet Gør mål aktivt gælder kun for mål som indeholder kildekodefiler. Nye filer tilføjes altid til et sådant aktivt mål.

- Punktet Byg mål kalder alle nødvendige kompilerings- og byggehandlinger for at bygge koden kun for dette mål.

#### Sammenhængsafhængig menu for et delprojekt

Når du højreklikker på et delprojekt i oversigtsvinduet, dukker følgende menu op som lader dig gøre udføre ændringer i projektets struktur og måden det kompileres, bygges og installeres. Du kan bruge den til at udvide eller ændre den grundlæggende projektstruktur som programguiden har oprettet.

- Punktet Indstillinger for et delprojekt styrer måden som delprojektet kompileres, bygges og installeres. Dialogen som dukker op har fanblade for Oversætter, Deklarationsfiler, Præfiks og Byggerækkefølge.

- Punktet Tilføj delprojekt laver en ny mappe og Makefile.am skeletfil.

- Punktet Tilføj mål viser en dialog, hvor du kan indstille regler for kompilering, bygning eller installation for en filgruppe inde i delprojektet.

- Tilføj tjeneste (... endnu ikke skrevet ...)

- Tilføj program (... endnu ikke skrevet ...)

- Tilføj eksisterende delprojekt (... endnu ikke skrevet ...)

- Punktet Fjern delprojekt i den sammenhængsafhængige menu for et delprojekt er den rigtige måde at fjerne et delprojekt. Det justerer filerne `Makefile.am` på tilsvarende måde. Du tilbydes også mulighed at fjerne alle filer (eller link) i de tilsvarende undermappe. Det er klart at funktionen skal bruges med forsigtighed.

- Punktet Byg kalder alle nødvendige kompilerings- og byggehandlinger for at bygge koden kun for dette delprojekt.

- Påtving omredigering (... endnu ikke skrevet ...)

- Ryd (... endnu ikke skrevet ...)

- Installér (... endnu ikke skrevet ...)

- Installér (som systemadministrator) (... endnu ikke skrevet ...)

## Automake-projekt

(... endnu ikke skrevet ...)

### Autoconf

#### Effekten af configure-scriptet

`Makefile.in` til `Makefile`

    prefix = @prefix@
    INSTALL = @INSTALL@
    build_triplet = @build@
    CXX = @CXX@

    prefix = /home/bernd/kde3
    INSTALL = /usr/bin/ginstall -c -p
    build_triplet = i686-pc-linux-gnu
    CXX = g++

`config.h.in` til `config.h`

    /* Define if you have libz */
    #undef HAVE_LIBZ
    /* The size of a `int', as computed by sizeof. */
    #undef SIZEOF_INT

    /* Define if you have libz */
    #define HAVE_LIBZ 1
    /* The size of a `int', as computed by sizeof. */
    #define SIZEOF_INT 4

### Automake

(... endnu ikke skrevet ...)

### KDevelops Håndtering af automake

#### Et skærmaftryk af Håndtering af automake

### Bygning og installering af biblioteker

- -rpath

- PIC

- static

- plugins: no-undefined

## Egne byggefiler og byggescripter

(... endnu ikke skrevet ...)

## Oversætterindstillinger

(... endnu ikke skrevet ...)

## Byggetilvalg

(... endnu ikke skrevet ...)