Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccin
En este documento se tratan los temas relacionados con la modificacin, compilacin, generacin de la imagen de Kernel para MINIX y la forma de utilizarla para bootear el minix. Para generar la imagen de kernel, se usan utilitarios para simplificar la tarea, pero dichos utilitarios deben estar bien configurados para poder tener los resultados buscados. Razn por la cual comenzaremos revisando algunos temas que parecen ser insignificantes pero muy necesarios.
A.R.G.
1/5
make hdboot
A.R.G.
2/5
El archivo makefile
Las macros nos ayudarn a simplificar el trabajo. Muchas veces es conveniente especificar una lista de archivos, o de opciones, que vamos a pasar a varios programas. Si la lista es muy larga es mejor definir una macro que represente toda esta lista. Las macros se especifican en la cabecera del archivo, antes de las reglas. Una macro puede tener cualquier nombre compuesto por caracteres alfanumricos. A la hora de insertarla en la regla correspondiente, ha de ir precedida del signo peso $ y si consta de ms de un carcter, el nombre de la macro debe ir entre parntesis (el peso se pone fuera). Las reglas constan de tres partes: Una etiqueta, que usaremos en la llamada al programa make . Cada etiqueta distingue un grupo de acciones a realizar. Un conjunto de dependencias, esto es, aquellos archivos que son necesarios para llevar a cabo las acciones que corresponden a la etiqueta. Los comandos a ejecutar, aqu especificamos lo que queremos hacer realmente: compilar, generar un nuevo formato, cargar un programa en memoria, etc.
A.R.G.
3/5
Hay que tener en cuenta que, para cada lnea de comando, make crear un proceso distinto, por ejemplo, estas lneas indican a make que cambie de directorio y, a parte, que compile el archivo prueba.c. all: cd .. gcc prueba.c Si el archivo prueba.c est en el directorio padre obtendremos un error porque realmente no hemos cambiado de directorio. Lo correcto sera: all: cd ..; prueba.c La forma en la que se escriben las reglas es esta: etiqueta : [dependencia1 ...] [;comandos] [# comentarios] [(tabulacin) comandos] [# comentarios]
Ejecutando make
Generalmente escribiremos simplemente make y l mismo se encargar, guiado por el archivo makefile, de llevar a cabo aquello que le pedimos. Si hacemos esto, make buscar la primera etiqueta de todas y har aquello que especifica. Otras veces queremos que nos ejecute los comandos especificados en otra etiqueta. Esto es tan simple como escribir make nombre_de_la_etiqueta. Cada comando que ejecute make nos aparecer escrito por pantalla. Si deseamos que algn comando no lo escriba, podemos poner una @ delante del comando en cuestin para que no lo haga. Adems del nombre de la etiqueta, es posible pasarle otras opciones. Hay bastantes, pero las ms tiles son: Ignora todos los errores que encuentre durante el proceso. No parar cuando -i encuentre alguno, sino que seguir ejecutando comandos hasta el final. No escribe en pantalla los comandos conforme los va ejecutando. -s No usa las reglas internas ni las que se refieren a los sufijos. -r Escribe los comandos que deberan ejecutarse, pero no lo hace. Incluso las lneas -n que comienzan con "@". Actualiza las fechas de los comandos, como si se hubiesen ejecutado los comandos -t correspondientes. Devuelve cero o distinto de cero dependiendo de si el archivo objetivo est -q actualizado o no. Escribe en pantalla el conjunto completo de macros y reglas. -p Permite especificar el nombre del archivo de configuracin. Se supone que el -f siguiente argumento es el nombre de dicho archivo. En la pgina manual del make se puede encontrar una lista completa de todas las opciones.
Reglas implcitas
A la hora de tratar con archivos, make es capaz de reconocerlos a partir de la extensin (o sufijo) que lleven. Entonces, dado un archivo concreto, si alguno de los archivos de los que depende ha sido modificado, si ha reconocido el tipo puede actualizarlo de manera eficiente. Es posible que make se engae si usamos algunos de los sufijos que reconoce para otras cosas, as que aqu se incluye una pequea relacin de ellos: .c archivo fuente de cdigo C. .f archivo fuente de Fortran. .s archivo fuente de Ensamblador. .y archivo fuente de Bison-Yacc.
A.R.G.
4/5
Algunos Ejemplos
Como se puede apreciar en el siguiente ejemplo si una lnea es demasiado larga, podemos poner una contrabarra y continuar en la lnea siguiente, tanto en la definicin de macros como en la de comandos. La etiqueta all se refiere a la creacin del ejecutable final, mientras que comp se encarga de compilar los fuentes y save para hacer una copia de seguridad de todo el trabajo. Realmente, la eitqueta comp sobra, segn las reglas implcitas del make.
FILES= flectura.c fagnadir.c agnadir.c ini.c estad.c varios.c mensaje.c flujo.c\ describe.c juntar.c selec.c ordenar.c OFILES=flectura.o fagnadir.o agnadir.o ini.o estad.o varios.o mensaje.o flujo.o\ describe.o juntar.o selec.o ordenar.o PFILE= main.c LIBS= -lm NOMBRE= xx all: $(OFILES) gcc -g -o $(NOMBRE) $(OFILES) $(PFILE) $(LIBS) comp: $(FILES) gcc -g -c $(FILES) save: tar cvfz /home/xx.tgz /home/xx
En el siguiente caso si un programa llamado hello ya existe entonces se le compara la fecha con hello.c y hello.h y si alguno de estos dos archivos han cambiado desde que se cre hello se recompila hello, caso contrario no se hace nada. hello : hello.cc hello.h g++ hello.cc -o hello En el prximo ejemplo se generan primero los archivos objetos y luego se linkea el programa ejecutable lab13. El argumento -c en g++ significa que solo genere el archivo .o. Como esta clase de cosas es comn existen reglas por defecto que hacen esto automticamente.
default : lab13 lab13 : lab13.o openfiles.o g++ lab13.o openfiles.o -o lab13 openfiles.o : openfiles.cc openfiles.h g++ openfiles.cc -o openfiles.o -c lab13.o : lab13.cc openfiles.h g++ lab13.cc -o lab13.o -c
En el ltimo ejemplo no existen reglas para generar los archivos objetos correspondientes a los archivos .cc. Esto se debe a la existencia de las reglas implcitas del make, en caso que no exista una regla asociada al archivo .o se ejecutar por defecto la siguiente regla: $(CPP) $(CPPFLAGS) -o *.o *.cc -c
TARG = program_name OFILES = support_obj1.o support_obj2.o support_obj3.o ... CPP = g++ CPPFLAGS = -g -O2 -Wall default : $(TARG) $(TARG) : $(TARG).o $(OFILES) $(CPP) $(CPPFLAGS) -o $(TARG) $(TARG).o $(OFILES)
A.R.G.
5/5