%XVFDUGHSHQGHQFLDVHQGLUHFWRULRV +DELWXDOPHQWH VH VXSRQH TXH WRGRV ORV DUFKLYRV IXHQWHV \ ELQDULRVHVWiQHQHOPLVPRGLUHFWRULR 9 ¿Qué ocurre si se organizan los archivos de otra manera? 9 Hay que buscar archivos (dependencias) fuera del directorio de trabajo (actual). 9DULDEOH93$7+(VSHFLILFDXQFRQMXQWRGHGLUHFWRULRVGRQGH PDNH GHEHEXVFDUDGHPiVGHOGLUHFWRULRDFWXDO Herramientas de Programación - Tema 1 (Clase 3) 1 (MHPSOR93$7+ (MHPSOR VPATH = src ../headers fecha.o: fecha.h $PSOtDODE~VTXHGDD $PSOtDODE~VTXHGDD VUF VUF KHDGHUV KHDGHUV %XVFDIHFKDK %XVFDIHFKDKHQ HQ IHFKDK IHFKDK VUFIHFKDK VUFIHFKDK KHDGHUVIHFKDK KHDGHUVIHFKDK Herramientas de Programación - Tema 1 (Clase 3) 2 'LUHFWLYDYSDWK 6LPLODUDODYDULDEOH93$7+SHURPiVVHOHFWLYD 9 Permite especificar el camino de búsqueda para un tipo específico de archivos. 8VRSRQHUYSDWK SDWUyQ!GLUHFWRULR! vpath %.o ../LIB 9 Significado “buscar cualquier dependecia con el sufijo ‘.o’ en ‘../LIB’ 8VRTXLWDUYSDWK SDWUyQ! 9 “Límpia” el camino de búsqueda establecido para el patrón. Herramientas de Programación - Tema 1 (Clase 3) 3 ,QFOXLURWURVPDNHILOHLQFOXGH (VWHGLUHFWLYDVXVSHQGHODOHFWXUDGHOPDNHILOH DFWXDOSDUD OHHUXQRRPiVPDNHILOH GLIHUHQWHVDQWHVGHFRQWLQXDU 6LQWD[LV include DUFKLYRV 3RVLEOHXWLOLGDGYDULRVSURJUDPDVHQGLUHFWRULRVGLIHUHQWHV\ FRQWURODGRV SRU PDNHILOH SDUWLFXODUHV UHTXLHUHQ GHILQLFLRQHVGHYDULDEOHVFRPXQHV 9DULDEOH GH HQWRUQR 0$.(),/(6 HV LQWHUSUHWDGD SRU PDNH FRPR XQD OLVWD GH DUFKLYRV PDNHILOH D SURFHVDU SUHYLDPHQWH Herramientas de Programación - Tema 1 (Clase 3) 4 /ODPDUDRWURVPDNHILOHPDNH & (VWHGLUHFWLYDVXVSHQGHODOHFWXUDGHOPDNHILOH DFWXDOSDUD HMHFXWDUHOPDNHILOH HQHOGLUHFWRULRLQGLFDGR 6LQWD[LV make etiqueta –C dir 3RVLEOHXWLOLGDGYDULRVSURJUDPDVHQGLUHFWRULRVGLIHUHQWHV\ FRQWURODGRV SRU PDNHILOH SDUWLFXODUHV 7HQHPRV XQ PDNHILOH SULQFLSDOTXHOODPDDORVRWURVPDNHILOH Herramientas de Programación - Tema 1 (Clase 3) 5 'LUHFWLYDVFRQGLFLRQDOHV 0HGLDQWH GLUHFWLYDV GH PDNH VH SXHGHQ GHILQLU SDUWHV FRQGLFLRQDOHVHQXQPDNHILOH (MHPSOR 6H GHVHDFRPSLODU FRQ XQD ELEOLRWHFD GLIHUHQWH VL HO FRPSLODGRU&;;HVJTXHVLHVRWURGLVWLQWR libs_para_gnu = -lgnu libs_normales = agenda: $(objs) ifeq ($(CXX),g++) $(CXX) –o agenda $(objs) $(libs_para_gnu) else $(CXX) –o agenda $(objs) $(libs_normales) endif Herramientas de Programación - Tema 1 (Clase 3) 6 2WUDVGLUHFWLYDVFRQGLFLRQDOHV LIQHT DUJDUJÆ verdad si DUJ es distinto de DUJ LIGHI YDULDEOH Æ verdad si la variable está definida y tiene un valor no vacío. LIQGHI YDULDEOHÆ verdad si la variable no está definida o tiene un valor vacío. 6LQWD[LVJHQHUDO directiva condicional (LIHT/LIQHT/LIGHI/LIQGHI) 2SFLRQDO 2SFLRQDO HOVH HQGLI texto si es cierta texto si es falsa Herramientas de Programación - Tema 1 (Clase 3) 7 'LUHFWLYDVFRQGLFLRQDOHV(MHPSOR var= var2= $(var) ifdef var2 estaDefinida= si else estaDefinida= no endif (VWD'HILQLGD VLVL (VWD'HILQLGD var2= ifdef var2 estaDefinida= si else estaDefinida= no endif (VWD'HILQLGD QR QR (VWD'HILQLGD 1RVHUHDOL]DXQDH[SDQVLyQGHODYDULDEOH Herramientas de Programación - Tema 1 (Clase 3) 8 0DFURVGLUHFWLYDGHILQH 3HUPLWHGHILQLUYDULDEOHVGHYDULDVOtQHDVGHWH[WR 6LQWD[LV GHILQHQRPEUH WH[WR HQGHI (MHPSOR define dos-lineas echo agenda echo $(objs) endef Herramientas de Programación - Tema 1 (Clase 3) 9 1RPEUHVGHHWLTXHWDVHVSHFLDOHV <DFRQRFHPRV3+21< 2WUDVHWLTXHWDVGHLQWHUpV 9 .PRECIOUS: La etiqueta de la que depende no se borra si make se ve interrumpido durante la ejecución de sus órdenes. 9 .DELETE_ON_ERROR: contrario +D\PiV 9 .IGNORE 9 .INTERMEDIATE 9 .SECONDARY, etc... Herramientas de Programación - Tema 1 (Clase 3) 10 LQVWDOO8QDHWLTXHWDKDELWXDO (VHOQRPEUHGHHWLTXHWDKDELWXDOSDUDIRU]DUODLQVWDODFLyQGHO SURJUDPDTXHVHJHQHUDFRQHOPDNHILOH 9 Compila todo. 9 Instala la aplicación, copiando los archivos necesarios para su funcionamiento en el directorio adecuado. 9 Establece los permisos de acceso adecuados. 9HUÆ PDQLQVWDOO (MHPSOR inst_flags= -D –mode=‘u=rwx,go=rx’ inst_dir= $(HOME)/bin install $(inst_flags) demo $(inst_dir) Herramientas de Programación - Tema 1 (Clase 3) 11 SDWVXEVW)XQFLRQHVGHVXEVWLWXFLyQGHFDGHQDV SDWVXEVW SDWURQUHHPSOD]RWH[WR %XVFD XQD FDGHQD VHSDUDGD SRU HVSDFLRV HQ HO WH[WR TXH FRQWHQJDHOSDWUyQLQGLFDGR\ORVXVWLWX\HSRUUHHPSOD]R 9 El patrón % funciona como “wildcard” (MHPSOR objs=$(patsubst %.c,%.cpp,x.c.c y.c) La variable $(objs) tendrá el valor x.c.cpp y y.cpp Herramientas de Programación - Tema 1 (Clase 3) 12 (MHUFLFLR 6HW 6XSRQJDPRV TXH WHQHPRV ORV VLJXLHQWH ILFKHURV HQ VXV FRUUHVSRQGLHQWHV GLUHFWRULRV +20(65&GHPRFSS +20(65&GHPRFSS +20(65&GHPRK +20(65&GHPRK +20(65&XWLOJHQHUDOK XVDGR SRUDPERV IXHQWHV +20(65&XWLOJHQHUDOFSS (VFULELU GRV PDNHILOHV TXH JHQHUHQ ORV HMHFXWDEOHV GHPR \ GHPR HO SULPHUR\HOREMHWR JHQHUDORHOVHJXQGR Herramientas de Programación - Tema 1 (Clase 3) 13 6ROXFLyQVRORGLUHFWRULR0DNHILOH todo: demo1 demo2 demo1: demo1.o general.o g++ demo1.o general.o -o demo1 demo2: demo2.o g++ demo2.o general.o -o demo2 demo1.o: demo1.h general.h demo1.cpp g++ -c demo1.cpp -Wall demo2.o: demo2.h general.h demo2.cpp g++ -c demo2.cpp -Wall general.o: general.h general.cpp g++ -c general.cpp –Wall limpiar: rm *.o rm demo1 demo2 Herramientas de Programación - Tema 1 (Clase 3) 14 6ROXFLyQVRORGLUHFWRULR0DNHILOH CXX= g++ CXXFLAGS= -Wall objs1= demo1.o general.o objs2= demo2.o general.o .PHONY: todo todo: demo1 demo2 $(objs1): general.h $(objs2): general.h demo1: $(objs1) $(CXX) $(objs1) -o demo1 demo2: $(objs2) $(CXX) $(objs2) -o demo2 (Q HVWH0DNHILOH XVDUHPRV YDULDEOHV\UHJODVLPSOtFLWDV GHPRRGHPRFSS \GHPRK LPSOtFLWRV\JHQHUDOK QR LPSOtFLWR GHPRRGHPRFSS \GHPRK LPSOtFLWRV\JHQHUDOK QR LPSOtFLWR JHQHUDORJHQHUDOFSS \JHQHUDOK VRQLPSOtFLWRV .PHONY: limpiar limpiar: rm *.o rm demo1 demo2 Herramientas de Programación - Tema 1 (Clase 3) 15 6ROXFLyQVRORGLUHFWRULR0DNHILOH CXX= g++ CXXFLAGS= -Wall objs= demo1.o demo2.o general.o objs1= demo1.o general.o objs2= demo2.o general.o .PHONY: todo todo: demo1 demo2 $(objs): general.h $(objs): %.o: %.cpp $(CXX) -c $(CXXFLAGS) $< -o $@ demo1: $(objs1) $(CXX) $< -o $@ (Q HVWH0DNHILOH XVDUHPRVYDULDEOHV\ UHJODVGHSDWUyQ HVWiWLFR (VWDEOHFHPRV ODUHJOD GHSDWURQHVHVWiWLFRV SDUDJHQHUDUORV REMHWRV (WLTXHWD SDWURQBHWLTXHWD SDWURQBGHSHQGHQFLD 1RPEUHGHOD SULPHUDGHSHQGHQFLD #1RPEUHGHOD HWLTXHWDGHODUHJOD demo2: $(objs2) $(CXX) $< -o $@ Herramientas de Programación - Tema 1 (Clase 3) 16 6ROXFLyQVRORGLUHFWRULR0DNHILOH CXX= g++ CXXFLAGS= -Wall objs= demo1.o demo2.o general.o objs1= demo1.o general.o objs2= demo2.o general.o .PHONY: todo (QHVWH0DNHILOH todo: demo1 demo2 KDUHPRVHO0DNHILOH FRQ ODPtQLPDH[SUHVLyQ $(objs): general.h SRVLEOHXVDQGR YDULDEOHVUHJODV demo1: $(objs1) LPSOtFLWDVUHJODVGH $(CXX) $< -o $@ SDWURQHVHVWiWLFRV demo2: $(objs2) $(CXX) $< -o $@ general: general.o $(CXX) $< -o $@ Herramientas de Programación - Tema 1 (Clase 3) 17 6ROXFLyQGLUHFWRULRV0DNHILOH VUF CXX= g++ CXXFLAGS= -Wall VPATH= ./util objs= demo1.o demo2.o .PHONY: todo todo: demo1 demo2 $(objs): general.h demo1: demo1.o general.o $(CXX) demo1.o ./util/general.o -o demo1 demo2: demo2.o general.o $(CXX) demo2.o ./util/general.o -o demo2 general.o: general.cpp general.h make todo –C util .PHONY: limpiar limpiar: rm $(objs) rm demo1 demo2 make limpiar –C util Herramientas de Programación - Tema 1 (Clase 3) 18 6ROXFLyQGLUHFWRULRV0DNHILOH XWLO CXX= g++ CXXFLAGS= -Wall objs= general.o .PHONY: todo todo: general.o general.o: general.h general.cpp $(CXX) -c general.cpp $(CXXFLAGS) .PHONY: limpiar limpiar: rm $(objs) Herramientas de Programación - Tema 1 (Clase 3) 19