13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 132 — #170<br />

✐<br />

Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />

Para lo demás, por norma g<strong>en</strong>eral los espacios <strong>en</strong> blanco se ignoran de modo que se<br />

pued<strong>en</strong> usar a efectos de legibilidad.<br />

Las reglas no están restringidas a llamadas al compilador; puede llamar a cualquier<br />

programa que quiera. Creando grupos de reglas de dep<strong>en</strong>d<strong>en</strong>cia, puede modificar<br />

sus ficheros fu<strong>en</strong>tes, escribir make y estar seguro de que todos los fichero<br />

afectados serán re-construidos correctam<strong>en</strong>te.<br />

Macros<br />

Un makefile puede cont<strong>en</strong>er macros (t<strong>en</strong>ga <strong>en</strong> cu<strong>en</strong>ta que estas macros no ti<strong>en</strong><strong>en</strong><br />

nada que ver con las del preprocesador de C/<strong>C++</strong>). La macros permit<strong>en</strong> reemplazar<br />

cad<strong>en</strong>as de texto. Los makefiles del libro usan una macro para invocar el<br />

compilador de <strong>C++</strong>. Por ejemplo,<br />

CPP = mycompiler<br />

hello.exe: hello.cpp<br />

$(CPP) hello.cpp<br />

El = se usa para indicar que CPP es una macro, y el $ y los paréntesis expand<strong>en</strong><br />

la macro. En este caso, la expansión significa que la llamada a la macro $(CPP)<br />

será reemplazada con la cad<strong>en</strong>a mycompiler. Con esta macro, si quiere utilizar un<br />

compilador difer<strong>en</strong>te llamado cpp, sólo ti<strong>en</strong>e que cambiar la macro a:<br />

CPP = cpp<br />

También puede añadir a la macro opciones del compilador, etc., o usar otras macros<br />

para añadir dichas opciones.<br />

Reglas de sufijo<br />

Es algo tedioso t<strong>en</strong>er que decir a make que invoque al compilador para cada<br />

fichero cpp del proyecto, cuando se sabe que básicam<strong>en</strong>te siempre es el mismo proceso.<br />

Como make está diseñado para ahorrar tiempo, también ti<strong>en</strong>e un modo de<br />

abreviar acciones, siempre que dep<strong>en</strong>dan del sufijo de los ficheros. Estas abreviaturas<br />

se llaman reglas de sufijo. Una regla de sufijo es la la forma de indicar a make<br />

cómo convertir un fichero con cierta ext<strong>en</strong>sión (.cpp por ejemplo) <strong>en</strong> un fichero con<br />

otra ext<strong>en</strong>sión (.obj o .exe). Una vez que le haya indicado a make las reglas para<br />

producir un tipo de fichero a partir de otro, lo único que ti<strong>en</strong>e que hacer es decirle a<br />

make cuales son las dep<strong>en</strong>d<strong>en</strong>cias respecto a otros ficheros. Cuando make <strong>en</strong>cu<strong>en</strong>tra<br />

un fichero con una fecha previa a otro fichero del que dep<strong>en</strong>de, usa la regla para<br />

crear la versión actualizada del fichero objetivo.<br />

La regla de sufijo le dice a make que no se necesitan reglas explícitas para construir<br />

cada cosa, <strong>en</strong> su lugar le explica cómo construir cosas <strong>en</strong> base a la ext<strong>en</strong>sión del<br />

fichero. En este caso dice «Para contruir un fichero con ext<strong>en</strong>sión .exe a partir de<br />

uno con ext<strong>en</strong>sión .cpp, invocar el sigui<strong>en</strong>te comando». Así sería para ese ejemplo:<br />

CPP = mycompiler<br />

.SUFFIXES: .exe .cpp<br />

.cpp.exe:<br />

$(CPP) $<<br />

La directiva .SUFFIXES le dice a make que debe vigilar las ext<strong>en</strong>siones que se<br />

132<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!