250 likes | 382 Views
make. Presentació desenvolupada al Departament d’Arquitectura de Computadors com a Projecte de Millora Docent (curs 2000-01). Introducció. Aquesta presentació explica la utilitat i el funcionament de l’eina make S’assumeix que ja saps compilar i muntar
E N D
make Presentació desenvolupada al Departament d’Arquitectura de Computadors com a Projecte de Millora Docent (curs 2000-01) Departament d’Arquitectura de Computadors
Introducció • Aquesta presentació explica la utilitat i el funcionament de l’eina make • S’assumeix que ja saps compilar i muntar • Pots seguir la presentació de dues formes: • Nivell bàsic: Es descriu la utilitat de l’eina i les seves característies més importants • Nivell avançat: S’expliquen aspectes com els objectius estàndar, paràmetres de make, ... Departament d’Arquitectura de Computadors
Índex (nivell bàsic) • Pots seguir la presentació seqüencialment o anar directament al punt que vulguis: • Descripció del problema • Interfície de l’eina i fitxer de dependències • Exemples • Variables • Errors típics Departament d’Arquitectura de Computadors
Problema • Hi ha programes amb molts fitxers font(102) Escriure comandes per a compilar i muntar tots aquests fitxers és laboriós • Al desenvolupar/mantenir un programa només modifiquem alguns fitxers Si els recompilem tots desaprofitem CPU Si recompilem selectivament és fàcil errar Departament d’Arquitectura de Computadors
Solució: eina make • make és una eina per facilitar l’actualització de fitxers executables Només regenera els fitxers desfasats Automatitza la detecció de fitxers desfasats Departament d’Arquitectura de Computadors
Interfície de l’eina make • Fitxer de dependències • Per defecte es diu Makefile o makefile • Indica els fitxers involucrats i les línies de comandes necessàries per a generar-los • Opcions a la línia de comandes: make [-ffile] [opts] [targets] -f file i opts: es veuràn més endavant targets: fitxers a construir Departament d’Arquitectura de Computadors
Fitxers requisits Fitxer objectiu Línies de comandes (comencen amb tabulador) Fitxer de dependències: regles • Descriuen dependències entre fitxers • Hi ha una regla per cada fitxer objecte i per cada fitxer executable • Les regles tenen la següent sintaxi: target: req1 req2 ... reqn <TAB>comanda1 ... <TAB>comandam Departament d’Arquitectura de Computadors
Exemple • 3 fitxers font: prog.c, aux.ci aux.h • aux.h és referenciat a prog.c i aux.c • 2 fitxers objectes (prog.o i aux.o) i un executable (prog) Departament d’Arquitectura de Computadors
Per a generar aux.o cal llegir aux.c i aux.h. La línia de comandes que cal executar és cc -c aux.c Per a generar prog cal llegir prog.o i aux.o La línia de comandes que cal executar és ld -o prog prog.o aux.o Fitxer makefile de l’exemple prog: prog.o aux.o ld -o prog prog.o aux.o prog.o: prog.c aux.h cc -c prog.c aux.o: aux.c aux.h cc -c aux.c Departament d’Arquitectura de Computadors
prog Fitxer executable prog.o aux.o Fitxers objecte prog.c aux.h aux.c Fitxers font Exemple: representació en arbrede les dependències entre fitxers prog: prog.o aux.o cc -o prog prog.o aux.o prog.o: prog.c aux.c cc -c prog.c aux.o: aux.c aux.h cc -c aux.c Departament d’Arquitectura de Computadors
Interpretació de les regles • target: req1 req2 ... reqn • <TAB>comanda1 • ... • <TAB>comandam IF ((target no existeix) OR (req1és més recent que target) OR (req2és més recent que target) OR ... (reqnés més recent que target)) THEN executa comanda1 ... comandam Departament d’Arquitectura de Computadors
Interpretació fitxer dependències • S’invoca: make target • Recorregut descendent: de forma recursiva, es busquen: la regla que defineix target, les que defineixen els seus requisits, les dels requisits dels requisits, ..., fins arribar als fitxers font. • Recorregut ascendent: s’avaluen les regles on tots els requisits són fitxers font i, de forma recursiva, les regles que vagin tenint tots els requisits avaluats Departament d’Arquitectura de Computadors
La sortida per stdout haurà estat: • prompt$ make prog • cc -c prog.c • cc -c aux.c • cc -o prog prog.o aux.o • prompt$ Exemple: Primera compilació • Suposem que ∄prog, prog.o ni aux.o • Executem: make prog 14: Fi d’execució de make 13: Fi de recorregut dels requisits de prog Com prog no existeix, s’executa cc -o prog prog.o aux.o 7: Recorregut dels requisits de prog Continuem amb aux.o 1: Recorregut dels requisits de prog Comencem per prog.o prog prog: prog.o aux.o cc -o prog prog.o aux.o prog.o: prog.c aux.c cc -c prog.c aux.o: aux.c aux.h cc -c aux.c 8: Recorregut dels requisits de aux.o Comencem amb aux.h 2: Recorregut dels requisits de prog.o Comencem per prog.c 6: Fi de recorregut dels requisits de prog.o Com prog.o no existeix, s’executa cc -c prog.c 4: Recorregut dels requisits de prog.o Continuem amb aux.h 12: Fi de recorregut dels requisits de aux.o Com aux.o no existeix, s’executa cc -c aux.c 10: Recorregut dels requisits de aux.o Continuem amb aux.c prog.o aux.o 3: prog.c és un fitxer font Tornem a prog.o 5: aux.h és un fitxer font Tornem a prog.o 9: aux.h és un fitxer font Tornem a aux.o 11: aux.c és un fitxer font Tornem a aux.o prog.c aux.h aux.c Departament d’Arquitectura de Computadors
La sortida per stdout haurà estat: • prompt$ make prog • cc -c prog.c • cc -o prog prog.o aux.o • prompt$ Exemple: modifiquem prog.c • Suposem que ∃prog, prog.o i aux.o • Executem: make prog 14: Fi d’execució de make 13: Fi de recorregut dels requisits de prog Com prog és més antic que prog.o, s’executa cc -o prog prog.o aux.o 7: Recorregut dels requisits de prog Continuem amb aux.o 1: Recorregut dels requisits de prog Comencem per prog.o prog prog: prog.o aux.o cc -o prog prog.o aux.o prog.o: prog.c aux.c cc -c prog.c aux.o: aux.c aux.h cc -c aux.c 8: Recorregut dels requisits de aux.o Comencem amb aux.h 2: Recorregut dels requisits de prog.o Comencem per prog.c 12: Fi de recorregut dels requisits de aux.o Com aux.o és més actual que aux.c i aux.h, no s’executa res. 6: Fi de recorregut dels requisits de prog.o Com prog.o és més antic que prog.c, s’executa cc -c prog.c 4: Recorregut dels requisits de prog.o Continuem amb aux.h 10: Recorregut dels requisits de aux.o Continuem amb aux.c prog.o aux.o 3: prog.c és un fitxer font Tornem a prog.o 5: aux.h és un fitxer font Tornem a prog.o 9: aux.h és un fitxer font Tornem a aux.o 11: aux.c és un fitxer font Tornem a aux.o prog.c aux.h aux.c Departament d’Arquitectura de Computadors
Variables • Permeten parametritzar l’escriptura de makefiles. • Assignar valor: nom_var = valor • Referenciar: $(nom_var) • Tenim accés a totes les variables d’entorn fent $(nom) Exemple: $(HOME) • Algunes estan predefinides (més endavant es veurà com llistar-les) Departament d’Arquitectura de Computadors
Si algun dia volem fer servir un altre compilador, només cal modificar aquesta línia. Si algun dia volem afegir un flag, només cal modificar aquesta línia Exemple amb variables CC = /bin/cc CFLAGS = -c prog: prog.o aux.o $(CC) -o prog prog.o aux.o prog.o: prog.c aux.c $(CC) $(CFLAGS) prog.c aux.o: aux.c aux.h $(CC) $(CFLAGS) aux.c Departament d’Arquitectura de Computadors
Alguns errors típics • Oblidar el tabulador a l’inici d’una línia de comandes (make donarà el missatge d’error Separator not found) • Equivocar-se a l’escriure el nom d’una variable (make no dóna cap error) • Referir-se al home directory utilitzant ~ Cal utilitzar $(HOME) • Línies llarges amb el símbol \ Departament d’Arquitectura de Computadors
Índex (nivell avançat) • Pots seguir la presentació seqüencialment o anar directament al punt que vulguis: • Objectius all, clean i install • Alguns paràmetres de la comanda make • Execució d’altres comandes • On trobar més informació Departament d’Arquitectura de Computadors
Objectiu all • Per conveni, construeix tots els executables gestionats al fitxer de dependències • Els seus requisits són la llista de fitxers executables. No té comandes associades. • Típicament és la primera regla del fitxer. Per tant, és la que s’executa per defecte. • Exemple: all: prog1 prog2 prog3 Departament d’Arquitectura de Computadors
Objectiu clean • Per conveni, esborra els fitxers temporals, objectes, llibreries i executables existents • No té requisits. Per tant, sempre que es demani aquest objectiu s’executaran les comandes associades. • Exemple: clean: rm core *.o *.a prog Departament d’Arquitectura de Computadors
Objectiu install • Per conveni, fa les accions d’instal.lació dels executables generats • Exemple: copiar l’executable a un directori install: prog <TAB>cp prog $(HOME)/bin Departament d’Arquitectura de Computadors
Alguns paràmetres de make make [-f file][opts] [targets] -f file: nom del fitxer de dependències -n: mostra quines comandes invocaria per a construir targets, però no les executa -i: si make invoca una comanda que finalitza retornant error, make no avorta -p: mostra variables i regles implícites Departament d’Arquitectura de Computadors
Execució d’altres comandes • A les línies de comandes d’un makefile podem invocar a qualsevol comanda. • Exemples: • crear un directori $(HOME)/dir: mkdir $(HOME)/dir • passar la data de compilaciò com símbol DATE file.c: file.o cc -c -DDATE="\"`date`\"" file.c Departament d’Arquitectura de Computadors
On trobar més informació • Pàgina de manual de la comanda makeman make • Manual de la comanda make de GNU http://www.gnu.org/manual/make/ • Llibre: “Managing Projects with make, 2nd Edition” Editorial O’Reilly http://www.oreilly.com/catalog/make2/ Departament d’Arquitectura de Computadors
that's all folks Comentaris: enricm@ac.upc.es Departament d’Arquitectura de Computadors