Bueno, viendo que se está desatando una tormenta de comentarios editoriales
respecto a cuando y a cuando no hace falta un "make dep" (que no son muy "editoriales", que digamos :-)) y que ya no tengo
ganas de estudiar, explico un poco como va esto del Makefile del kernel y las dependencias.
Ojo Quique, que esto no es lo que yo entiendo "para novatos" y no es la contribución que te prometí ;-)
A ver, ¿qué ocurre ahora cuando hacemos "make dep"?:
-
Se recorren todos los archivos *.c de las fuentes del kernel, se buscan
las directivas "#include" que contengan y se crea una lista de
los archivos de cabecera.
El conjunto de todas esas listas se guarda en el archivo .depend de cada
subdirectorio, en un formato por el cual entiende make(1) que cada archivo .c
depende de su lista de *.h. De esta manera si, por ejemplo, modificamos
linux/config.h, make "sabrá" que tiene que recompilar init/main.c puesto que
depende de aquel.
Podeis consultar el programa que interpreta individualmente cada archivo *.c, que
se encuentra en scripts/mkdep.c.
- Se procesan ahora los archivos de cabecera, de forma idéntica a la
anterior, para averiguar las dependencias entre ellos. Así se establece que linux/config.h depende de linux/autoconf.h, por ejemplo. La lista resultante
de todas estas dependencias se guarda en .hdepend.
Como vemos, hasta aquí no hay nada que dependa de la configuración,
$(TOPDIR)/.config, elegida por el usuario
Por cierto: hablo de los *.[ch], las fuentes en ensamblador siguen un camino
distinto, y más chapucilla, en esto de las dependencias.
- Ahora viene la parte sensible: si está definida la opción CONFIG_MODVERSION
(que no es en absoluto necesaria para tener un kernel modular e incluso puede estar presente en un kernel monolítico),
se crea el directorio $(TOPDIR)/include/linux/modules y un archivo
$(TOPDIR)/include/linux/*.ver por cada elemento susceptible de ser modular (no
por cada módulo seleccionado en la configuración) más un ksyms.ver, vía
genksyms(8). Además, se crea/actualiza el archivo
$(TOPDIR)/include/linux/modversions.h, a partir de la versión del kernel e
incluyendo todos los archivos
$(TOPDIR)/include/linux/modules/*.ver generados.
Resalto que modversions.h no entra en las dependencias de los *.h "normales",
no aparece en .hdepend.
¿Qué contiene los *.ver?: las etiquetas de versión que serán incluidas en la definición de cada símbolo exportado, por parte de todos los (posibles) módulos y por parte de lo que no
es modular (ksyms.ver). Esas etiquetas únicamente dependen de la versión del
kernel y no de la configuración del usuario.
Todos estos archivos (*.ver, .config, .depend, .hdepend) no desaparecen
después de un clean. Para borrarlos hace falta un mrproper.
Llegado a este punto quizás os estéis preguntando que
por qué nos dicen en la documentación que hay que hacer un "make dep" cada
vez que se cambia la configuración estando definida CONFIG_MODVERSION,
si, aún con esa opción, de la configuración no sacamos NADA para construir las
dependencias (Excepto, claro, el propio CONFIG_MODVERSION)... Y es una buena pregunta: ¿alguien se anima y la responde? ;-)
|