Tal como se mencionaba, la herramienta de extracción de código
ExtractCode.cpp
genera automáticamente
makefiles
para cada capítulo. Por eso, los
makefiles
de cada capítulo no aparecen en
el libro (todos los makefiles
están
empaquetados con el código fuente, que se puede descargar de
www.BruceEckel.com).
Sin embargo, es útil ver un ejemplo de un
makefile
. Lo siguiente es una versión
recortada de uno de esos makefiles
generados automáticamente para este capítulo. Encontrará más de
un makefile
en cada subdirectorio (tienen
nombres diferentes; puede invocar uno concreto con make
-f. Éste es para GNU C++:
CPP = g++ OFLAG = -o .SUFFIXES : .o .cpp .c .cpp.o : $(CPP) $(CPPFLAGS) -c $< .c.o : $(CPP) $(CPPFLAGS) -c $< all: \ Return \ Declare \ Ifthen \ Guess \ Guess2 # Rest of the files for this chapter not shown Return: Return.o $(CPP) $(OFLAG)Return Return.o Declare: Declare.o $(CPP) $(OFLAG)Declare Declare.o Ifthen: Ifthen.o $(CPP) $(OFLAG)Ifthen Ifthen.o Guess: Guess.o $(CPP) $(OFLAG)Guess Guess.o Guess2: Guess2.o $(CPP) $(OFLAG)Guess2 Guess2.o Return.o: Return.cpp Declare.o: Declare.cpp Ifthen.o: Ifthen.cpp Guess.o: Guess.cpp Guess2.o: Guess2.cpp
La macro CPP contiene el nombre del compilador. Para usar un
compilador diferente, puede editar el
makefile
o cambiar el valor de la macro
desde línea de comandos, algo como:
$ make CPP=cpp
Tenga en cuenta, sin embargo, que
ExtractCode.cpp
tiene un esquema automático
para construir makefiles
para compiladores
adicionales.
La segunda macro OFLAG
es la opción que se
usa para indicar el nombre del fichero de salida. Aunque muchos
compiladores asumen automáticamente que el fichero de salida
tiene el mismo nombre base que el fichero de entrada, otros no
(como los compiladores GNU/Unix, que por defecto crean un
fichero llamado a.out
).
Como ve, hay dos reglas de sufijo, una para ficheros
.cpp
y otra para fichero
.c
(en caso de que se necesite compilar
algún fuente C). El objetivo por defecto es
all
, y cada línea de este objetivo está
«continuada» usando la contrabarra, hasta
Guess2
, que el el último de la lista y por
eso no tiene contrabarra. Hay muchos más fichero en este
capítulo, pero (por brevedad) sólo se muestran algunos.
Las reglas de sufijo se ocupan de crear fichero objeto (con
extensión .o
) a partir de los fichero
.cpp
, pero en general se necesita escribir
reglas explícitamente para crear el ejecutable, porque
normalmente el ejecutable se crea enlazando muchos fichero
objeto diferente y make no puede adivinar
cuales son. También, en este caso (GNU/Unix) no se usan
extensiones estándar para los ejecutables de modo que una regla
de sufijo no sirve para esas situaciones. Por eso, verá que
todas las reglas para construir el ejecutable final se indican
explícitamente.
Este makefile
toma el camino más seguro
usando el mínimo de prestaciones de make;
sólo usa los conceptos básicos de objetivos y dependencias, y
también macros. De este modo está prácticamente asegurado que
funcionará con la mayoría de las implementaciones de
make. Eso implica que se producen fichero
makefile
más grandes, pero no es algo
negativo ya que se generan automáticamente por
ExtractCode.cpp
.
Hay muchísimas otras prestaciones de make que no se usan en este libro, incluyendo las versiones más nuevas e inteligentes y las variaciones de make con atajos avanzados que permiten ahorrar mucho tiempo. La documentación propia de cada make particular describe en más profundidad sus características; puede aprender más sobre make en Managing Projects with Make de Oram y Taiboot (O'Reilly, 1993). También, si el fabricante de su compilador no proporciona un make o usa uno que no es estándar, puede encontrar GNU Make para prácticamente todas las plataformas que existen buscado en los archivos de GNU en internet (hay muchos).