6

私が他の人と一緒にプロジェクトに取り組んでいるとき、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

コンパイラの行をはるかに短くするためにどのようなレシピを使用しているのか疑問に思っていますが、ユーザーが後でその情報を本当に必要とする場合は、生の行を表示するオプションをユーザーに提供しています。

これを自動的に行うツールはありますか?

4

4 に答える 4

7

コンパイラの出力を短くするだけでなく、色分けして詳細フラグを追加することもできます。出力は次のようになります。

代替テキスト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出力を確認します。

于 2009-06-17T20:57:08.863 に答える
4

煩わしさの原因となるのが主に「make」中の巨大な行の噴出である場合は、Makefileを変更して、コンパイラー行をエコーせず、代わりに次のようにすることもできます。

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

'@'は、コマンドラインのエコーを抑制します

于 2009-05-21T13:47:01.983 に答える
3

環境変数を使用するのはどうですか?

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

より複雑なシナリオでは、ラッパーを使用してコンパイラーを呼び出すことができるため、実際のコマンドとそのパラメーターはエラーまたは警告でのみ表示されます。たとえばcmakeを使用すると、従来の出力の多くはすでに大幅にダウンストリップされています。

同様に、gccでスペックファイルを使用する可能性があります。

于 2009-05-20T20:50:29.967 に答える
1

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)
于 2009-05-20T21:59:44.273 に答える