2012-06-21 9 views
6

Estoy usando SCons para construir un proyecto en el trabajo, y estoy tratando de analizar a través de la salida de texto de GCC para hacer un informe de resumen de todas las advertencias del compilador cada objetivo porque nuestros scripts de compilación son bastante largos, y hay una gran cantidad de salida de texto a la consola.SCons: guardar/redirigir salida de texto gcc (advertencias)

He buscado en Google y este sitio durante bastante tiempo, y no puedo encontrar un método incorporado a SCons para lograr esto. He intentado redirigir todo el flujo stdout y stderr a un archivo por this example, pero solo se captura el resultado de SCons y no el de las herramientas que llama.

Mi siguiente pensamiento fue encontrar dónde SCons compila los argumentos para enviar a GCC y agregar la redirección al final de la cadena de argumentos. Después de leer la documentación, parece que las variables de construcción CCCOM y CXXCOM contienen la línea de comando utilizada para compilar. Sin embargo, cuando agregué las líneas a continuación a mi SConstruct, nada cambió en las líneas de comando que SCons está ejecutando.

baseEnv['CCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt" 

Una cosa que hizo el trabajo se redirige el flujo stderr en todo el comando SCons:

scons 2> stderr.txt 

me gustaría evitar esto, sin embargo, y contienen todo dentro SCons si es posible. La salida tampoco necesariamente tiene que ir a un archivo. Se puede guardar en cualquier lugar siempre que pueda acceder a él para analizar y guardarlo en un archivo al final de la compilación.

He buscado durante tanto tiempo y no he encontrado nada, así que no sé qué más probar. Tengo que creer que no soy el primero que ha querido hacer algo como esto.

Respuesta

5

Voy a responder mi propia pregunta aquí, ya que descubrí lo que estaba haciendo mal. Las variables CCCOM y CXXCOM fueron las correctas para modificar, pero el problema era que estaba creando objetos de biblioteca compartida, por lo que estas variables no se estaban utilizando. Los que debería haber estado modificando son SHCCCOM y SHCXXCOM.

El código siguiente hizo el trabajo para redireccionar la salida de advertencia GCC (advertencias y errores se escriben en stderr solamente):

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt" 

Esperamos que esta respuesta ayude a otros, ya que no pude encontrar mucha información sobre este tema al buscar.

0

En lugar de las variables de construcción CCCOM y CXXCOM, ¿ha probado con las variables CC y CXX? Here's una lista completa de las variables de construcción SCons, por si acaso.

Incluso puede considerar configurar CC y CXX en las secuencias de comandos en su sistema que hace la redirección internamente.

EDIT: se me olvidó mencionar que las variables CCCOM y CXXCOM se utilizan los comandos para compilar los archivos fuente realidad, con todas las cflags, etc. Me sorprende que se haya podido establecer que, como yo pensaba que eran de sólo lectura variables.

+0

Sé que esas variables son en realidad los comandos utilizados para elaborar la cual es por lo pensaron que serían buenos candidatos para modificar, pero parece que SCons está ignorando mis modificaciones. Incluso traté de configurar sus valores en una cadena vacía, y todavía se compiló bien. Siento que algo no está bien porque lo he visto mencionar para modificar esas variables mientras busco una solución. Aunque no pensé en envolver los ejecutables GCC. Exploraré esa opción mientras espero una respuesta SConsy potencialmente más. – EarlCrapstone

+0

@EarlCrapstone, estoy bastante seguro de que el valor de esas 2 variables cambiará (se sobrescribirá) por cada archivo cc compilado, así que no estoy sorprendido de que tus mods no hayan hecho nada. Intenta usar el CC y el CXX en su lugar, y eso realmente marcará la diferencia. Los modifiqué para especificar un compilador diferente y eso funciona. – Brady

+0

Descubrí lo que estaba haciendo mal, pero como soy nuevo no me deja responder mi propia pregunta por otras cuatro horas. @ Brady. Esas variables en realidad no se cambian durante la compilación. Mi problema era que estaba construyendo objetos de biblioteca compartida, por lo que estaba usando 'SHCCCOM' y' SHCXXCOM' en su lugar. – EarlCrapstone

3

Para un control total, puede anular la variable de construcción env['SPAWN']. A continuación, proporcionará un método de Python que será responsable de ejecutar la línea de comando que se le asigna por argumento.Normalmente, tomaría este argumento y generaría un subproceso (usando alguna forma de subprocess.Popen). Esto haría un reemplazo de transferencia para el valor predeterminado env['SPAWN'].

Pero ahora tiene control total sobre la invocación subprocess.Popen. Usted es libre de redirigir STDOUT, STDERR o ambos a cualquier buffer/archivo. También puede hacer un postprocesamiento en esa salida antes de imprimirlo en la consola y/o guardarlo en un archivo. Lo he usado para colorear advertencias en amarillo y errores en rojo, por ejemplo.

Para obtener un código de ejemplo sobre cómo anular env['SPAWN'], consulte this page en la Wiki de SCons.

+0

utilizando el método SPAWN se rompe en Windows cuando la línea de comando es demasiado larga y scons utiliza un archivo de temp para realizar el paso de enlace. :( – Nick

0

Use como siguiendo;

baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"

0

¿Qué tal:

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt" 

Esto debe darle un archivo separado para cada archivo fuente ..

Cuestiones relacionadas