Departament d’Arquitectura de Computadors make Presentació desenvolupada al Departament d’Arquitectura de Computadors com a Projecte de Millora Docent (curs 2000-01) make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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, ... make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 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 [-f file] [opts] [targets] -f file i opts: es veuràn més endavant targets: fitxers a construir make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 Fitxer objectiu Fitxers requisits Línies de comandes (comencen amb tabulador) make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Departament d’Arquitectura de Computadors Exemple 3 fitxers font: prog.c, aux.c i aux.h aux.h és referenciat a prog.c i aux.c 2 fitxers objectes (prog.o i aux.o) i un executable (prog) make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Fitxer makefile de l’exemple 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 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 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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Exemple: representació en arbre de les dependències entre fitxers prog.c aux.c aux.h prog.o aux.o prog Fitxer executable 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 Fitxers objecte Fitxers font make V1.0 Set.-2001 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 make V1.0 Set.-2001 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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Exemple: Primera compilació Suposem que ∄ prog, prog.o ni aux.o Executem: make prog 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 14: Fi d’execució de make 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$ 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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Exemple: modifiquem prog.c Suposem que ∃ prog, prog.o i aux.o Executem: make prog 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 14: Fi d’execució de make La sortida per stdout haurà estat: prompt$ make prog cc -c prog.c cc -o prog prog.o aux.o prompt$ 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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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) make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Departament d’Arquitectura de Computadors Exemple amb variables Si algun dia volem fer servir un altre compilador, només cal modificar aquesta línia. 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 Si algun dia volem afegir un flag, només cal modificar aquesta línia make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 \ make V1.0 Set.-2001 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ó make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
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 make V1.0 Set.-2001 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 make V1.0 Set.-2001 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 make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
On trobar més informació Pàgina de manual de la comanda make man 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/ make V1.0 Set.-2001 Departament d’Arquitectura de Computadors
Departament d’Arquitectura de Computadors that's all folks Comentaris: enricm@ac.upc.es make V1.0 Set.-2001 Departament d’Arquitectura de Computadors