LABORATORIO DI SISTEMI OPERATIVI Corso di Laurea Triennale in Ingegneria Informatica A.A. 2018/2019 Guglielmo Cola Email: g.cola@iet.unipi.it Web: iet.unipi.it/g.cola
Strumenti per lo sviluppo software Diff e patch Sistemi di controllo versione Subversion Make Cenni Installazione SW in Debian Esercitazione 10
Diff Uno strumento di "diff" o Permette di evidenziare le differenze fra due file di testo Solitamente usato per confrontare due versioni dello stesso file o L'output può essere interpretato dagli utenti o da altri strumenti software
Comand diff diff file1 file2 o Differenze riga per riga fra i due file di testo Frontend in ambiente grafico o meld o KDiff3 o
Patch L'output prodotto dal comando diff ("patch file") può essere utilizzato per aggiornare una vecchia versione di un file di testo utilizzando le differenze rispetto alla vecchia versione: patch original_file patch_file
Patch: esempio diff file.txt.v1 file.txt > file.txt.v1-2.patch patch file.txt file.txt.v1.patch file.txt.v1 file.txt file.txt file.txt (ver. 1) (ver. 2) (ver. 1) (ver. 2) diff file.txt.v1-2.patch file.txt.v1-2.patch patch
Sistemi di "versioning & revision" I sistemi di "controllo versione" sono degli strumenti software che permettono la gestione delle versioni (revisioni) di un insieme di file da parte di un team di utenti o Sono utilizzati, in particolare, per gestire le versioni del codice sorgente Esempi o cvs o svn o mercurial o git o
Subversion (svn) Apache Subversion (svn) è un esempio di strumento per il controllo di versione o I file sono archiviati in un database accessibile via internet (repository) o Permette di tenere traccia delle modifiche o Il set iniziale dei file costituisce la prima revisione o Dopo aver apportato delle modifiche a uno o più file, l'utente del repository può decidere di "consegnare" le modifiche agli altri (commit) A questo punto viene creata una nuova revisione del software
Subversion (svn) Creazione di un repository svnadmin create svnroot/nome_progetto Il contenuto della cartella nome_progetto NON va gestito manualmente.
Subversion (svn) E' necessario che gli utenti che utilizzano il repository abbiano i diritti di accesso o Creare un gruppo ad hoc e impostare il gruppo come group owner dei file del repository o Aggiungere gli utenti del repository al gruppo
Subversion (svn) Per lavorare sul repository è necessario fare un checkout (co) svn co [protocol://][user@][server][/repo] esempio: svn co svn+ssh://alice@myserver.it/home/alice/repo/project1 Con il checkout viene creata una copia locale del repository, sulla quale è possibile fare modifiche o I file già presenti possono essere modificati o Per aggiungere un file al repository: Si crea/copia il file nella cartella locale Si utilizza il comando svn add nomefile o Per rimuovere un file si utilizza svn delete nomefile
Subversion (svn) Le modifiche fatte in locale vengono inviate al database centrale (e quindi condivise con gli altri) con il comando svn commit [ m "messaggio"] o "messaggio" può contenere una breve descrizione della nuova revisione che si sta inviando (es. "corretto bug in file X") o Prima di fare un commit, è necessario aggiornare la propria copia locale all'ultima revisione con il comando svn update o Le operazioni di update/commit possono portare all'individuazione di conflitti fra la propria versione e l'ultima versione del repository (modifiche sulle stesse righe da parte di utenti diversi) I conflitti devono essere risolti dall'utente che fa il commit utilizzando uno strumento di diff Il comando svn log permette di consultare l'elenco delle revisioni (ciascuna caratterizzata dalla data di commit, dall'autore della revisione e dal messaggio di descrizione, se presente)
Subversion (svn) Il comando svn revert nomefile permette di annullare le modifiche effettuate in locale su un file rispetto all'ultima revisione E' possibile, con opportuni comandi, riportare la revisione corrente del repository ad una delle revisioni precedenti
Make Make è uno strumento software che permette di automatizzare la creazione di file che dipendono da altri file o Provvede automaticamente a risolvere le dipendenze e ad eseguire le operazioni necessarie o E' utilizzato in particolare per generare eseguibili o librerie a partire da codice sorgente, gestendo le fasi di compilazione
Make Il comportamento del comando make è definito dal makefile, ossia un file di nome "makefile" o "Makefile" contenente una serie di regole Le regole definiscono in che modo deve essere ottenuto un "target" o Da quali file dipende? o Quali comandi devono essere eseguiti?
Make Le regole hanno la seguente sintassi di base: target: dependencies TAB commands o Un target può essere il nome di un file da creare (ad esempio l'eseguibile da produrre come risultato della compilazione) oppure il nome di un'azione (es. "install" o "clean") o Le dipendenze sono uno o più file da cui il target dipende. Le operazioni per la generazione del target vengono eseguite solo se i file da cui dipende sono stati modificati o I comandi sono le operazioni che devono essere eseguite per ottenere il target
Make Da terminale make viene invocato in questo modo: make [target1 ] o Le operazioni relative ai target specificati vengono eseguite solo se i file da cui i target dipendono sono stati modificati o Se non viene specificato nessun target, viene eseguito il primo target definito nel makefile Solitamente un makefile definisce almeno i seguenti target: o Il primo target (quello eseguito con 'make' senza parametri) porta alla compilazione dei sorgenti e alla produzione degli eseguibili o install provvede a spostare gli eseguibili nelle cartelle apposite (installazione) o clean elimina i file prodotti dalla compilazione
Make esempio # Makefile. I commenti iniziano con '#' programma: main.o funzione.o gcc main.o funzione.o o programma main.o: main.c funzioni.h gcc c main.c funzione.o: funzione.c funzioni.h gcc c funzione.c clean: rm *.o programma
Make Make permette di definire delle macro MACRO = valore Sono definite alcune macro di default, ad esempio: CC contiene il compilatore C di default CFLAGS parametri del compilatore C
Make esempio # Makefile. I commenti iniziano con '#' CFLAGS = -Wall programma: main.o funzione.o $(CC) $(CFLAGS) main.o funzione.o o programma main.o: main.c funzioni.h $(CC) $(CFLAGS) c main.c funzione.o: funzione.c funzioni.h $(CC) $(CFLAGS) c funzione.c clean: rm *.o programma
Make Le regole viste finora sono dette "esplicite", in quanto è specificato il target E' possibile definire regole da applicare ad un insieme di target (regole implicite) Ci sono delle regole di default, ad esempio:.c.o: $(CC) $(CFLAGS) -c $< o I file con estensione.c vengono trasformati in file con estensione.o utilizzando il compilatore C e le opzioni descritte nella macro CFLAGS. $< indica il nome del file che ha determinato l'esecuzione della regola (in questo caso nome del file con estensione.c).
Make E' possibile sfruttare la regola implicita di default che permette di generare file.o a partire dai file.c per semplificare l'esempio visto prima: # Makefile. I commenti iniziano con '#' CFLAGS = -Wall programma: main.o funzione.o $(CC) $(CFLAGS) main.o funzione.o o programma main.o: funzioni.h funzione.o: funzioni.h clean: rm *.o programma
Installazione SW in Debian Linux Debian mette a disposizione degli archivi (repository) di pacchetti software o Gli archivi sono divisi in base alle release di Debian o I pacchetti software sono precompilati per facilitarne l'installazione o E' possibile operare sui pacchetti da terminale, oppure utilizzare un frontend grafico (es. synaptic) o Gli archivi utilizzati (sorgenti) sono indicati nel file /etc/apt/sources.list Installazione di pacchetti apt install nome_pacchetto Aggiornamento elenco pacchetti apt update Upgrade pacchetti con la versione più recente apt upgrade
Installazione SW in Debian Linux In alternativa, è possibile scaricare un archivio con i sorgenti (tarball) o L'archivio deve essere estratto, configurato, compilato e installato o Queste procedure sono facilitate dal makefile L'utilizzo dei sorgenti permette di installare software non disponibile negli archivi o E' importante controllare l'autenticità del tarball per non compromettere la sicurezza del sistema!
Esercizio 1 makefile Nella cartella es1 sono presenti due file.c (main.c factorial.c) e un header (functions.h) Scrivere un makefile per gestire la compilazione e la rimozione dei file compilati. Il file eseguibile prodotto da make deve chiamarsi "fattoriale". Dopo aver compilato, provare a modificare uno dei due file.c e verificare che viene ricompilato solo il file.c effettivamente modificato Cosa succede se non mettiamo il file header nelle dipendenze e lo modifichiamo?
Esercizio 2 svn Nella propria home, creare una cartella svnroot e al suo interno il repository "project" con svnadmin o o o o Creare un gruppo svnusers Aggiungere studenti a svnusers Impostare svnusers come group owner di project e del suo contenuto Garantire i permessi di accesso rwx su project per il gruppo Creare un utente giovanni e aggiungerlo a svnusers Nella propria home, creare la cartella localsvn e fare checkout del repository creato in precedenza in questa cartella: o o svn co file:///home/studenti/svnroot/project Aggiungere dei file alla copia locale del repository, ad esempio i sorgenti dell'esercizio 1 Aggiungerli al repository con svn add e poi fare commit Fare login come "giovanni" e fare checkout del repository in una cartella locale nella propria home o o Visualizzare il log delle revisioni Modificare un file qualunque e poi fare nuovamente commit