2009-09-03 15 views
0

ソースファイルをオブジェクトファイルにコンパイルするための依存関係規則の前提条件を生成するためにgcc -MMを使用しています。私は、オブジェクトファイルを保持するディレクトリと実行可能な変数をBIN_DIR = bin/release /という変数で指定します。 2例があります。メインC++オブジェクトファイルのディレクトリとMakefileの実行ファイルを指定します。


CASE 1

%.d: *.h *.cc Makefile 
    @$(CXX) -MM $(CXXFLAGS) *.cc > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; $(RM) -rf [email protected]$$$$ 

sedのために慣れていないけれども、私は、sedのユーティリティの目的は(たとえば)翻訳することであることを学びました.o:main.cc defs.h

into:

main.o main.d: ビン//main.dリリース/ main.oビン/発売:main.cc defs.h

私の質問は、に、さらにそれを変更する方法です。 main.cc defs.h

もし誰かがここでsedの使い方を説明できたら、それは大いに感謝しています!


CASEファイルMakefile.dependで2

Makefile.depend: *.h *.cc Makefile 
    $(CXX) -MM $(CXXFLAGS) *.cc > Makefile.depend 

、あなたはそれぞれのルールは、この例のようなものですが表示されます:

main.o:defs.h main.cc

変更方法:

ビン/リリース/ main.o:defs.h main.cc

おかげに関して!


注:私は今はコメントできない理由

私は知りません。だから私はここに私の更新を入れた:

VPATHは、ソースコードのディレクトリを指定することです。しかし、make -f path2Makefileを実行する必要があります。ここではどこからでもmake -f path2 Makefileを実行できるようにしたいと思います。したがって、オブジェクトファイルのディレクトリを指定することをお勧めします。ベータ版へ


:あなたの助けを

ありがとう!あなたの答えにコメントすることができないのであれば、私を許してください。 2番目の場合のメソッドの問題は、コマンドの後に、いくつかの行を持ついくつかの規則がすべての1行に接頭辞を受け取ることです。例えば

main.o:main。

のsrc/misc.h

\のcc defs.hは次のようになります。

$(このBin_dir)main.o:defs.h main.cc \

$(このBin_dir )src/misc.h

+0

ああ、ご容赦ください。私が従業員に触れてからずっとずっとずっと忘れていた。私はそれを修正しようとしましょう... – Beta

答えて

1

ケース1のためには使用することができます。

 
sed 's,\($*\)\.o[ :]*,$(BIN_DIR)\1.o $(BIN_DIR)[email protected] : ,g' 

正規表現は初心者のための読み悪名高い困難ですが、基本的に、これは「対象の幹を取るの.o続く、ガツガツ食べる(その事1のように覚えている)言いますBIN_DIR、記憶されたもの、.o、スペース、BIN_DIR、ルールのターゲット、スペース、コロン "で置き換えてください。

ケース1で問題が発生します。まず、main.oとmain.dは、本当に必要かどうかを再構築します。この問題を解決するにはいくつかの方法があります。最も簡単な方法はターゲット$(BIN_DIR)main.dと$(BIN_DIR)main.oを作成することですが、後で試すことができるより洗練された方法があります。正規表現は、「このBin_dirに行の先頭を変更する」と言う。ここ

 
sed 's,^,$(BIN_DIR),' 

ケース2については

これはトリックを行う必要があります。

EDIT:二

 
sed 's,\(.*:\),$(BIN_DIR)\1,' 

を試してみてくださいこれは、 "コロンで終わるものを見つけると、その前にこのBin_dirスティック" と言います。防弾対策の次のステップは、「複数の行を吸って、コロンの前のすべての単語の前にBIN_DIRを置く」でしょうが、それは恐らく必要ではないでしょう。

0

gnu.org makeマニュアルで「vpath」を参照してください。私はそれがあなたが必要とするものだと思う。

関連する問題