私たちが採用したアプローチの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.