2012-06-02 20 views
5
  1. ¿Es posible tratar los avisos como errores en un Makfile (y por tanto de salida antes de Makefile procede)¿Cómo tratar una advertencia como un error en un Makefile?

  2. Por otra parte, es posible filtrar los cuales advertencia produce un error?

Mi caso de uso: Quiero utilizar --warn-undefined-variables en combinación con esto para que Makefile saldrá cuando una variable no está definida, que es una fuente muy común de error. Obviamente, no quiero verificar manualmente cada variable ya que es propensa a errores/tediosa. No pude encontrar nada sobre esto, pero es una característica bastante importante/básica.

Nota: No estoy buscando -Werror que es un comando específico de gcc no aplicable a mi caso de uso.

+1

Bienvenido a StackOverflow. El diseño aquí es "una pregunta por publicación", por lo que puede haber una respuesta clara. Múltiples preguntas significa que más de una respuesta puede ser correcta (respondo la pregunta 1, otra persona responde la pregunta 2), y es imposible seleccionar una sola respuesta como aceptada. Revise las [preguntas frecuentes] (http://stackoverflow.com/faq) para que esté más familiarizado con el funcionamiento de SO. Gracias. –

+2

Esto me parece una pregunta razonable. Tristemente, sospecho que la respuesta es 1) no, 2) discutible, y 3) difícil. – Beta

+0

Depende de lo que quiera decir con 'variable no definida', pero las variables sin valor ('VAR =') pueden ser bastante importantes (cualquier cosa menos un error). Me encuentro con más frecuencia con las variables no utilizadas; esa es una definición que una vez (presumiblemente) se usó en el archivo MAKE pero ya no existe. –

Respuesta

2

La versión estándar de make no es compatible con lo que está buscando. Sin embargo, no debería ser difícil crear su propia versión de make para cumplir con su caso de uso.

Si examina el código fuente de la que 3,82, echa un vistazo a la macro warn_undefined en variable.h:

214 /* Warn that NAME is an undefined variable. */ 
215 
216 #define warn_undefined(n,l) do{\ 
217        if (warn_undefined_variables_flag) \ 
218         error (reading_file, \ 
219          _("warning: undefined variable `%.*s'"), \ 
220         (int)(l), (n)); \ 
221        }while(0) 

No he probado esto, pero creo que debería ser suficiente para reemplazar error con fatal.

3

Si está preparado para agregar una dependencia a cada objetivo, puede hacer que las advertencias se conviertan en errores.

Aquí es un archivo de maquillaje con un error en el mismo ("Sociedad Nacional" en lugar de "SRC"):

# Turn on the warning we want 
MAKEFLAGS += --warn-undefined-variables 

# Make sure MAKECMDGOALS is defined, so it doesn't cause an error itself 
ifndef MAKECMDGOALS 
MAKECMDGOALS = all 
endif 

SRC=hello.c 

all: compile 

# Fails if the Makefile contains any warnings. 
# Run this Makefile with the same goals, but with the -n flag. 
# Grep for warnings, and fail if any are found. 
no-make-warnings: 
    ! make -n $(MAKECMDGOALS) 2>&1 >/dev/null | grep warning 

# Targets you want to check must depend on no-make-warnings 
compile: no-make-warnings 
    gcc -o hello $(SRCS) 

Cuando corro, veo esto:

$ make 
! make -n all 2>&1 >/dev/null | grep warning 
Makefile:17: warning: undefined variable `SRCS' 
make: *** [no-make-warnings] Error 1 

Sólo Es necesario que todos los objetivos que desee controlar estén en función del objetivo no-make-warnings.

Si alguien sabe cómo hacerlo automáticamente, por favor repórtelo.

Cuestiones relacionadas