5

Windows 2003マシンで実行されるMakefileがあり、それにmingw32-makeを使用しています。Makefileには多くのインクルードパスがあるため、cmdが処理できる8Kのバッファーサイズを超えています[参照-http ://support.microsoft.com/kb/830473/EN-US/これにより、コンパイルの結果は「入力」になります。行が長すぎます」という問題。

私は次のことを知りたかった-

  1. 不要なコンパイラスイッチやインクルードパスなどをすでに削除しているので、Makefileを最適化するための最良の方法は何でしょうか。

  2. すべてのINCLUDEパスを1つの.txtファイルに入れてMakefileにインポートする方法はありますか?同じもののmingw32ドキュメントが見つかりませんでした。

その他の入力/ヒント/参照リンクは大歓迎です。

ありがとう、
-HJSblogger

4

2 に答える 2

4

私たちが採用したアプローチの1つは(よりクリーンなビルドシステムが必要だったという理由だけで、コマンドラインスペースが不足したためではありませんでした)、各「モジュール」にビルドインパスを実行させることでした。

たとえば、A、B、Cの3つのモジュールがあるとします。

コントロールのmakefileは、同じターゲットを持つ各モジュールのmakefileを呼び出すだけです。

次に、ターゲットを一貫したclean、header、lib、およびexecに設定します。

したがって、コントロールのmakefileは次のようになります。

modules=A B C
clean:
    for i in $modules:
        ( cd $i ; make clean ; cd .. )
header:
    for i in $modules:
        ( cd $i ; make header ; cd .. )
lib:
    for i in $modules:
        ( cd $i ; make lib ; cd .. )
exec:
    for i in $modules:
        ( cd $i ; make exec ; cd .. )

他のモジュールが必要とするヘッダーファイルを持つすべてのモジュールは、ヘッダーフェーズ中にそれらのヘッダーファイルを中央の場所にコピーしました。次に、libまたはexecフェーズ中に、各モジュールはその中央の場所を使用するだけで、すべてのヘッダーを見つけることができました。これにより、モジュールは、他のモジュールによって中央の場所に公開されたヘッダーのみを使用するように制限されました。

同様に、execフェーズで必要なライブラリを作成したすべてのモジュールは、そのライブラリを中央の場所にコピーしました。-Iこれにより、ビルドコマンドの(includeディレクトリ)および-L(libraryディレクトリ)句が大幅に最小化されました。

make clean header lib execそのスキームを使用すると、トップレベルで実行するだけで全体を再構築できます(またはclean、依存関係を考慮して、適切なmakeビルドのためにを省略します)。

それはあなたの問題を回避する一つの方法ですが、私は実際にあなたがどのように限界を超えているのか疑問に思っています。8Kは、パスあたり25文字であっても、約300の個別のインクルードパスを必要とします。あなたの階層は本当に膨大ですか?

アップデート1:

makefileの「アーキテクチャ」を変更せずにすばやく動作させるための「汚い」方法を探している場合は、ディレクトリのリストを指定して、すべてのヘッダーファイルをそれらのディレクトリから中央の場所にコピーするスクリプトを記述します。

次に、それをすべてのルールの最初のステップとして実行し、コンパイル行のincludeステートメントを変更して、大きなリストではなくその場所を参照するようにします。段階的にコピーすることもできます(たとえば、一度に20個のディレクトリx 20回で合計400個のディレクトリを処理できます)。

これにより、makefileに小さな変更を加えるだけで、提案したソリューションと同じ効果が得られます。

アップデート2:

コメントで述べたように、もう1つの解決策は、パスのエイリアスを作成することでした。

次のような方法でそれを実行できるはずですsubst.exe

> subst x: "c:\Documents and Settings\Pax\My Documents\Not my directory"
> dir x:
  Volume in drive X has no label.
  Volume Serial Number is 8AA3-703A

  Directory of X:\

  08/09/2009  10:12 AM    <DIR>          .
  08/09/2009  10:12 AM    <DIR>          ..
  24/08/2009  01:54 PM             6,409 p0rn_sites.txt
  09/07/2008  02:49 PM    <DIR>          downloaded_p0rn
  : : :
  09/07/2008  02:52 PM    <DIR>          other_suspect_stuff
                 3 File(s)         18,520 bytes
                18 Dir(s)  63,840,849,920 bytes free

> subst x: /d
> dir x:
  The system cannot find the path specified.
于 2009-09-08T06:25:40.927 に答える
0

NACL SDKバージョンの「make」を使用すると、「コマンドラインが長すぎる」という問題が発生しました。

この問題の原因は、Windowsシェル(cmd.exe)のコマンドラインで8191文字のサイズ制限があることです: http ://support.microsoft.com/kb/830473/en

問題は、コンパイルが「ar」を使用してライブラリを作成する段階に達すると、ソースファイルが多すぎて、コマンドラインが長すぎることでした。

したがって、これを解決するには、「nacl_llvm.mk」ファイルを変更する必要がありました。

#
# LIB Macro
#
# $1 = Target Name
# $2 = List of Sources
# $3 = POSIX Link Flags
# $4 = VC Link Flags (unused)
define LIB_RULE
$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
    @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp

all: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
$(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src)))
    $(MKDIR) -p $$(dir $$@)
    $(RM) -f $$@
# Comment this line!    
#    $(call LOG,LIB,$$@,$(PNACL_LIB) -cr $$@ $$^ $(3))

# Add these other lines
    $(shell echo cmd /C $(subst /,\,$(PNACL_LIB) -cr $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a) > create_lib.bat)
    $(foreach src,$(2),$(shell echo cmd /C $(subst /,\,$(PNACL_LIB) -r $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a $(call SRC_TO_OBJ,$(src))) $(3) >> create_lib.bat))
    create_lib.bat

endef

ライブラリファイルを作成するために実行する必要のあるすべてのコマンドを含む「bat」ファイルを作成してから、オブジェクトファイルを1つずつ追加するという考え方です。その後、「bat」ファイルが適切なタイミングで実行されます。

よろしくお願いします

于 2015-01-29T13:54:31.260 に答える