2012-02-20 14 views
5

en Makefile del núcleoMakefile: *** reglas implícitas y normales mixtas

# Modules                                            
/%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

errores que causan reglas implícitas y normales mixtas Makefile. (a primera cadena de código proporcionado)

Creo que algo malo con la sintaxis /%/, ¿cómo puedo repararlo?

hasta ahora estoy pensando en la separación de las reglas de esta manera:

# Modules                                            
/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

pero es confuso para mí.

Respuesta

4

¿Qué crees que está haciendo la regla / %/ (además de confundirte y make - y yo)? ¿Qué estás tratando de lograr con el bit %/?

Puede tener dos (o más) objetivos a la izquierda de los dos puntos, pero ambos deben ser porcentuales menos.

prog1 prog2: something 
    $(CC) -o [email protected] [email protected] ${LIBRARIES} 

El metacarácter % no se puede utilizar con una regla sin ningún % en ella, pero make está interpretando:

/ %/: 

como similar al ejemplo prog1 prog2, pero uno de los blancos tiene una % y el otro no, y no puedes mezclarlos. La regla / es la regla explícita; parece ser instrucciones sobre cómo actualizar el directorio raíz de su sistema. El %/ es la regla implícita; podría estar haciendo algo relacionado con hacer directorios actualizados.


copiar algún material a partir de los comentarios:

DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

%/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

Esta notación debe trabajar (que es por lo usé en el comentario), pero lo que me gustaría escribir en un makefile es:

DIRECTORY_DEPENDENCIES = prepare scripts FORCE 
DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

%/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

Si esto todavía causa problemas, revise lo que hace la primera regla (la /:). ¿Estás seguro de que es necesario?

+0

Bueno, pero ¿mi solución es correcta? Por lo que yo entiendo, necesito separarlo de esta manera, pero ejecutar el mismo make 2 veces me parece extraño. – Cynede

+2

Sí; la separación será necesaria. Sí, escribir las mismas reglas dos veces no es genial. Tal vez crear una macro para las acciones, y luego usar eso en las reglas. 'DIRECTORY_BUILD_RULES = $ (cmd_crmodverdir); $ (Q) $ (MAKE) KBUILD_MODULES = $ (si $ (CONFIG_MODULES), 1) $ (compilación) = $ (compilación-dir) ', luego:' /: prepare las secuencias de comandos FORCE; $ (DIRECTORY_BUILD_RULES) 'y'% s: prepare los scripts FORCE; $ (DIRECTORY_BUILD_RULES) '. Incluso podría hacer que la lista de dependencias entre en otra macro ... –

+0

ahora dice: La variable recursiva 'DIRECTORY_BUILD_RULES 'se refiere a sí misma (eventualmente). Detener. – Cynede

Cuestiones relacionadas