【问题标题】:What do you do to make compiler lines shorter?您如何使编译器行更短?
【发布时间】:2025-11-29 11:15:02
【问题描述】:

通常,当我与其他人一起处理项目时,随着时间的推移,编译器在 Makefile 中获取的库路径和包含路径的数量会越来越多。路径也会变得很长。

这是一个例子:

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

我想知道您使用什么样的配方来缩短编译器行数,同时如果用户以后真的需要这些信息,他们仍然可以选择显示原始行。

是否有自动执行此操作的工具?

【问题讨论】:

    标签: makefile compilation scons


    【解决方案1】:

    您不仅可以缩短编译器输出,还可以对其进行颜色编码,并添加详细标志。输出将如下所示:

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

    方法如下(从 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,
    

    使用“scons --verbose”编译以查看正常的大容量 gcc 输出。

    【讨论】:

      【解决方案2】:

      如果主要是在“make”期间喷出大行导致烦恼,您还可以更改 Makefile 以不回显编译器行,而是改为:

           .cpp.o:
                @echo $(CC) $<
                @$(CC) $(FLAGS) -c -o $@ $<
      

      '@' 抑制命令行的回显

      【讨论】:

        【解决方案3】:

        使用环境变量怎么样?

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

        对于更复杂的场景,可以使用包装器来调用编译器,这样实际的命令及其参数只会在错误或警告时显示。 以使用 cmake 为例,很多传统的输出已经被大量缩减了。

        同样,也可以使用spec files with gcc

        【讨论】:

        • 有任何使用规范文件的真实例子吗?
        【解决方案4】:

        在 scons 中,我在命令生成器中插入换行符以使长命令更具可读性:

        例如

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

        然后我在构造命令字符串时创建一个本地方法来减少混乱。

        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)
        

        【讨论】: