Parsear Makefiles (en Python)

Necesitaba parsear ficheros Makefile desde Python, y buscando… me cuesta encontrar cosas.

  • Makefile::Parser, en Perl, parsea Makefiles, pero no soporta toda la gramática, y está en pre-alpha. Además es en Perl y no en Python, y para prototipar no hay problema, pero para sacar algo más sólido me deja un poco “descubierto”.
  • Makefile::Parser::GmakeDB ejecuta make, y toma la base de datos que genera este comando (primera noticia de que hace esto, aunque si le quitamos los comentarios la base de datos es como un Makefile, pero ampliado). Parece estar más maduro que el anterior, aunque eso de requerir de un comando externo me sigue pareciendo un poco cojo.
  • Makefile::AST parte también del análisis de tal base de datos para generar ASTs (Abstract Syntax Trees).
  • Y Makefile::DOM genera árboles DOM a partir del fichero entero (cabía esperarse ésto, ¿no?).

¿Y qué tal si nos hacemos con la gramática y luego generamos un parser vía bison (o similares)? La gramática de los Makefiles no la encuentro, y eso que he visto varios mensajes en diferentes listas de correo solicitando el BNF de la gramática, así que tocará ir abriendo boca con un subconjunto de la gramática, y luego ya se irá ampliando si es preciso (gracias al manual de GNU Make).

Generadores de parsers en Python ando buscando, así que ya escribiré qué es lo que he encontrado.

Y por último mencionar SCons, que sigue la misma idea de make, pero está hecho sobre Python y usa la sintaxis de Python (ejemplos). En mi opinión, es poco práctico usar esa sintaxis para un Makefile (¿exceso de costumbre con los makes? ¿falta de bregaje con makes complicados?), pero desde luego le da la potencia de Python al script de compilación.