2009-05-20 24 views
6

A menudo, cuando estoy trabajando en un proyecto con otros, la cantidad de rutas de biblioteca e incluye rutas que obtienen los compiladores en el archivo Makefile se hacen más numerosas con el paso del tiempo. También los caminos pueden ser muy largos también.¿Qué haces para acortar las líneas de compilación?

He aquí un ejemplo:

g++ -c -pipe -O2 -Wall -W -DQT_BOOTSTRAPPED -DQT_MOC -DQT_NO_CODECS 
-DQT_LITE_UNICODE -DQT_NO_LIBRARY -DQT_NO_STL -DQT_NO_COMPRESS 
-DQT_NO_DATASTREAM -DQT_NO_TEXTSTREAM -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES 
-DQT_NO_THREAD -DQT_NO_REGEXP -DQT_NO_QOBJECT -DQT_NO_SYSTEMLOCALE 
-DQT_NO_GEOM_VARIANT -DQT_NO_USING_NAMESPACE -D_LARGEFILE64_SOURCE 
-D_LARGEFILE_SOURCE -I../../../mkspecs/qws/linux-generic-g++ -I. 
-I../../corelib/arch/generic -I../../../include -I. -I../../../include/QtCore 
-I. -I.uic/release-shared -o release-shared/moc.o moc.cpp 

Me pregunto qué tipo de recetas que se utiliza para hacer líneas compilador mucho más corto, mientras que todavía da al usuario la opción de mostrar las líneas primas si realmente necesitan esa información luego.

¿Hay herramientas que hacen esto automáticamente?

Respuesta

3

¿Qué le parece usar variables de entorno?

export LONGPATH=/usr/local/projects/include/foo/system/v1 
gcc foo.c -o foo -I$LONGPATH 

Para escenarios más complejos, se puede usar envolturas para invocar el compilador, por lo que las órdenes reales y sus parámetros sólo aparecen en los errores o advertencias. Usando cmake, por ejemplo, gran parte de la salida convencional ya se ha reducido considerablemente.

Del mismo modo, existe la posibilidad de utilizar spec files with gcc.

+0

+1 para archivos de especificación –

+0

¿Algún ejemplo real del uso de archivos de especificaciones? – florin

1

En scons, inserto en mis saltos de línea de comando para hacer generadores de comandos largos más legible:

por ejemplo,

tool \ 
    -opt1 bar1 \ 
    -opt2 bar2 \ 
    -opt3 bar3 \ 
    -opt4 bar4 

luego creo un método local al construir la cadena de comandos para reducir el desorden.

cmds = [] 
def l(line,indent=1): 
    cmds.append(indent*' '+line) 
l('tool',0) 
l('-opt1 bar1') 
l('-opt2 bar2') 
l('-opt3 bar3') 
l('-opt4 bar4') 

return '\\\n'.join(cmds) 
4

Si es sobre todo lanzar fuera los enormes colas durante 'hacer' que causa la molestia, también puede cambiar su Makefile para no hacerse eco de la línea de compilador, pero tener lugar algo así como:

 .cpp.o: 
      @echo $(CC) $< 
      @$(CC) $(FLAGS) -c -o [email protected] $< 

El '@' suprime el eco de la línea de comando

7

No solo puede hacer que la salida del compilador sea más corta, puede colorearla y agregar un indicador detallado. La salida será algo como esto:

alt text http://img526.imageshack.us/img526/9572/sconsf.png

Así es como (tema de color robado del SCons Wiki):

import os,sys 
colors = {} 
colors['cyan'] = '\033[96m' 
colors['purple'] = '\033[95m' 
colors['blue'] = '\033[94m' 
colors['green'] = '\033[92m' 
colors['yellow'] = '\033[93m' 
colors['red'] = '\033[91m' 
colors['end'] = '\033[0m' 

#If the output is not a terminal, remove the colors 
if not sys.stdout.isatty(): 
    for key, value in colors.iteritems(): 
     colors[key] = '' 

compile_source_message = '%s\nCompiling %s==> %s$SOURCE%s' % \ 
    (colors['blue'], colors['purple'], colors['yellow'], colors['end']) 

compile_shared_source_message = '%s\nCompiling shared %s==> %s$SOURCE%s' % \ 
    (colors['blue'], colors['purple'], colors['yellow'], colors['end']) 

link_program_message = '%s\nLinking Program %s==> %s$TARGET%s' % \ 
    (colors['red'], colors['purple'], colors['yellow'], colors['end']) 

link_library_message = '%s\nLinking Static Library %s==> %s$TARGET%s' % \ 
    (colors['red'], colors['purple'], colors['yellow'], colors['end']) 

ranlib_library_message = '%s\nRanlib Library %s==> %s$TARGET%s' % \ 
    (colors['red'], colors['purple'], colors['yellow'], colors['end']) 

link_shared_library_message = '%s\nLinking Shared Library %s==> %s$TARGET%s' % \ 
    (colors['red'], colors['purple'], colors['yellow'], colors['end']) 

java_compile_source_message = '%s\nCompiling %s==> %s$SOURCE%s' % \ 
    (colors['blue'], colors['purple'], colors['yellow'], colors['end']) 

java_library_message = '%s\nCreating Java Archive %s==> %s$TARGET%s' % \ 
    (colors['red'], colors['purple'], colors['yellow'], colors['end']) 

env = Environment() 
AddOption("--verbose",action="store_true", dest="verbose_flag",default=False,help="verbose output") 
if not GetOption("verbose_flag"): 
    env["CXXCOMSTR"] = compile_source_message, 
    env["CCCOMSTR"] = compile_source_message, 
    env["SHCCCOMSTR"] = compile_shared_source_message, 
    env["SHCXXCOMSTR"] = compile_shared_source_message, 
    env["ARCOMSTR"] = link_library_message, 
    env["RANLIBCOMSTR"] = ranlib_library_message, 
    env["SHLINKCOMSTR"] = link_shared_library_message, 
    env["LINKCOMSTR"] = link_program_message, 
    env["JARCOMSTR"] = java_library_message, 
    env["JAVACCOMSTR"] = java_compile_source_message, 

compilar con "scons --verbose" para ver el gcc voluminosos normales salida.

Cuestiones relacionadas