Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ANSI C
Il C un linguaggio standardizzato dallANSI, American National Standards Institute,
nel 1983.
Lo standard di tale linguaggio ne consente la portabilit e la conformit della sintassi e
della libreria standard.
UNIX scritto in linguaggio C.
Sezione A - gcc
Lacronimo gcc sta per GNU Compiler Collection, si tratta di un compilatore ed in
quanto tale il suo compito tradurre un codice sorgente in codice macchina che possa
poi essere eseguito.
In realt non fa solo questo, il compilatore infatti, oltre a trasformare le istruzioni in
linguaggio macchina (binario), genera gli indirizzi nei quali il programma deve essere
allocato. Il programma da eseguire va allocato in memoria centrale e il compilatore
funge da allocatore di spazio nella memoria RAM.
Il compilatore gcc, nato come compilatore per C, ma ora mostra vari front end
(traduttori di codice sorgente) per molti altri linguaggi; tra i quali citiamo C/C+
+/Objective-C, Ada, Fortran, Java.
Questo compilatore molto utilizzato su UNIX ed il compilatore standard di Linux.
molto flessibile, ma soprattutto portabile:funziona infatti su molte piattaforme tra
cui GNU/Linux, BSD, Windows.
I passi della compilazione
wuninitialize
d
- wall
Sezione B Makefile
make un'utility di Unix utilizzata per conservare, aggiornare e ricreare file relativi ad
un dato progetto tenendo conto delle dipendenze che questi hanno con altri file e tra
di loro.
Affinch make svolga il suo compito ha bisogno di un file, chiamato makefile, in cui
siano descritte le cosiddette:
regole di dipendenza
azioni da eseguire
I makefile sono file di testo che consentono di specificare e gestire le dipendenze che
intercorrono tra un certo gruppo di file.
Storicamente i makefile sono stati inventati per coadiuvare il lavoro dei programmatori
minimizzando i tempi di compilazione dei programmi e gestendo in maniera
automatica le dipendenze tra i vari moduli.
In un progetto possiamo mettere pi file sorgente (.c), il principale sempre main.
Pu accadere che dei file siano dipendenti tra loro; ad esempio, supponiamo che il file
file.o dipenda da file.c e da t.h e r.h, in terminologia make avremo:
- file.o detto target (obiettivo), scritto in linguaggio macchina.
La macchina pu leggerlo ma non pu eseguirlo.
- file.c, t.h, r.h costituiscono una dependency list
makefile permette di esprimere cosa deve fare il sistema per aggiornare il target
se uno dei file nella dependency list stato modificato.
Ad esempio, se qualcuno ha modificato file.c, t.h e r.h, per aggiornare file.o si
pu semplicemente ricompilare file.c usando il comando
Una regola di dipendenza formata da una parte sinistra contenente il target che
deve essere creato e la parte destra contiene i file da cui dipende il file target.
Le due parti sono separate da ":", per cui il suo formato pi semplice Target list
Dependency list
L'azione viene scritta nella linea sotto i file di dipendenza e ricordiamo che tale linea
DEVE iniziare con un separatore Tab e non con uno spazio.
Per cui il suo formato pi semplice Target list : Dependency list
Comando 1
Lista di comandi
Comando n
1. Riprendendo lesempio precedente, possiamo scrivere:
ex
mentre ogni nodo della dependency list della radice viene appeso come foglio
(f.o, r.o)
exe
f.o
r.o
exe
f.o
f.c
r.o
r.o
r.h
r.c
exe
t2
f.odella regola
r.o
Se t1 > t2, si esegue la command list
che ha coma target il padre.
f.c
r.o
r.h
r.c
f.o
f.c
r.o
r.h
Variabili
possibile usare delle variabili per semplificare la scrittura del makefile.
Queste possono essere:
stringhe di testo definite una volta ed usate in pi punti
Ad esempio
# nomi oggetti
regole
exe : $ (objects)
ccc $(objects) -o exe
#
Regole implicite
Le regole viste finora sono pi estese del necessario.
Infatti make conosce gi delle regole generali di dipendenza fra file, basate sulle
estensioni dei nomi.
Ad esempio, nel caso di C, il make sa gi che per aggiornare XX.o necessario
ricompilare il corrispondente XX.c usando $CC e $FLAGS.
Quindi una regola della forma XXX.o : XXX.c t.h r.h
XXX.o : XXX.c
t.h r.h
Riscriviamo il nostro esempio con le regole implicite e le variabili:
CC = gcc
CFLAGS = -Wall -pedantic -o exe
objects = f.o r.o
exe : f.o r.o
$ (CC) $ (OBJECTS) -o exe
f.o : t.h r.h
r.o : r.h
Phony target
possible specificare target che non sono file e che hanno come scopo solo
lesecuzione di una sequenza di azioni.
Ad esempio
Clean :
rm $ (exe) $ (objects) *~ core
(core un file particolare, generato ogni volta che si verifica un errore di sistema nelle nostre
procedure. Solitamente UNIX non sin ferma per errori di questo tipo.)
Clean un target fittizio (phony) inserito per provocare lesecuzione del comando in
ogni caso.
Questo stile di programmazione tipico ma ha qualche controindicazione:
se casualmente nella directory viene creato un file chiamato clean il gioco non
funziona pi, siccome la dependency list vuota sempre aggiornato, ed
inefficiente, il make cerca prima in tutte le regole implicite per cercare di risolvere
una cosa che messa apposta per essere risolta.
La soluzione prendere labitudine di dichiarare esplicitamente i target
.PHONY : clean
clean :
-rm $ (exe) $ (objects) *~core
rm significa che lesecuzione del make pu continuare anche in caso di errori
nellesecuzione del comando rm (ad esempio, uno dei file specificati non c).