2012-07-12 6 views
14

El GNU make manual dicecuando las reglas de patrones múltiples coincida con el destino

Es posible que más de una regla patrón cumplirá con estos criterios. En ese caso, make elegirá la regla con el tallo más corto (es decir, el patrón que coincida más específicamente).

Por lo tanto, me sorprende que:

$ touch make_specific.cpp 

$ cat Makefile.general_first 
%.o: %.cpp 
@echo using general rule 
$(CXX) -c $< -o [email protected] 

%_specific.o: %_specific.cpp 
@echo using specific rule 
$(CXX) -c $< -o [email protected] 

$ make -B -f Makefile.general_first make_specific.o 
using general rule 
g++44 -c make_specific.cpp -o make_specific.o 

reglas de patrones múltiples coinciden con el objetivo, y ya que la raíz de la regla %_specific.o : %_specific.cpp ('hacer' en este caso) es más corto que el tallo de la %.o : %.cpp regla, esperaba que se seleccionara la regla específica, pero no es así.

¿Qué me estoy perdiendo?

Respuesta

16

Probablemente esté utilizando una versión de marca inferior a 3.82.

En la versión 3.81 y más bajo, el criterio de selección fue diferente; make elegiría la primera regla que coincida con el patrón. La documentación a la que se refiere es para la versión 3.82. Esa versión elige la regla con la raíz más específica, que está de acuerdo con sus expectativas.

Desde el archivo NEWS en el árbol make fuente:

Version 3.82 
... 
* WARNING: Backward-incompatibility! 
    The pattern-specific variables and pattern rules are now applied in the 
    shortest stem first order instead of the definition order (variables 
    and rules with the same stem length are still applied in the definition 
    order). This produces the usually-desired behavior where more specific 
    patterns are preferred. To detect this feature search for 'shortest-stem' 
    in the .FEATURES special variable. 
+1

Gracias. Estoy usando 3.81, así que esa es probablemente la causa. Esperando a que los administradores del sistema instalen 3.82 para verificar. –

+0

¿Hay alguna manera de lograr esto con clearmake en lugar de hacer GNU? No puedo encontrar ninguna información sobre la selección de reglas de patrones en clearmake ... – dragonator

+0

Gracias. Me estaba rascando la cabeza tratando de entender por qué sucedía esto. Mi error; Nunca presté atención al número de versión que estaba usando :) – Fernando

Cuestiones relacionadas