2016-12-16 13 views
1

gccプリプロセッサを使用して、依存関係の自動生成を伴う一般的な非再帰的Makefileをビルドしようとしています(http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#combine。 Iそうするために、私はトラッキング変数$(DIR)と各ディレクトリのローカルサブファイルを使用していますここhttps://evbergen.home.xs4all.nl/nonrecursive-make.htmlメイクファイルで呼び出されたときにSedコマンドと同じ効果がありません

彼らはプロジェクトツリーの任意のレベルから利用できるように生成されたすべてのファイルは、そのローカルディレクトリに生成されている。

これは、依存関係を含んでいますファイル。 は旗-MT $(notdir [email protected]) -MP -MMD -MF file.d.tmpとgccのプリプロセッサの出力は、(次のようになります。今

target.o: target.c includefile.h includefile2.h 

includefile.h: 

includefile2.h: 

、私は、その依存ファイル$(DIR)(展開されていない)内の各単語の先頭に追加したいたびにそのようにファイルが含まれ、変数を展開し、makeは正しく、それが呼び出されたどこからでもファイルを探すことができているである。

だから私はこれを行うにはsedコマンドsed -E "s/[a-z],_,.,:]+/\$(DIR)&/g" file.d.tmp > file.dを書きました。

Makefileのコマンドがあること書かれていますway(余分な$ on $(DIR)とex以外PANDそれ)とは

sed -E "s/[a-z],_,.,:]+/\$$(DIR)&/g" file.d.tmp > file.d

、ここで私の問題であり、より読みやすくするための変数に含まれている:私は、端末上のsedコマンドは、それは私が期待していることに使用 :$を追加します(DIR)各単語の先頭に。 しかし、私はMakefileを実行し、同じsedコマンド(正しい方法で出力されるので、Makefile内の拡張問題ではないようです)を実行しますが、何もしません。あなたはこの上でいくつかのリードを持っている場合、私は感謝される

(と私はfile.dは、私のfile.d.tmp同じように見えます);)

PS:Makefileの関係の完全な部分があります。 :

DEPFLAGS = -MT [email protected] -MP -MMD -MF $(word 2,$^).tmp 

COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $< 
POSTCOMPILE = sed -E "s/[a-z],_,.,:]+/\$$(DIR)&/g" $(word 2,$^).tmp > $(word 2,$^) 

と暗黙のルール:

%.o: %.c 
%.o: %.c %.d 
    $(COMPILE) 
    $(POSTCOMPILE) 
+0

2つのコメント:1.暗黙のルール '%.o:%.c%.d'は本当に実行されていますか? '%.d'がないため、' $(word 2、$ ^) 'が空である最初のルールに頼らざるを得ませんでした。 $(subst .cpp、.d、$ ^)を使用しなければならなかった 2. POSTCOMPILEがいつ評価され、その時点で$ ^が空であるかわかりません。 'sed -E 's/[az]、_、。、:] +/\ $$(DIR)&/ g" $(subst .cpp、.d、$ ^)。tmp> $(subst .cpp、.d、$ ^) 'を直接実行します。 –

答えて

0

私はここ2つの提案をしている正確に差はどこから来るのかわからないんだけど、:

1)あなたは、まったくの拡張をしたいだけで、単一引用符を使用し、代わりのもの

2を逃れるためにフープを介してジャンプしていないように思えるので)あなたの文字クラスの仕様が間違っているようですが、あなたは[a-z_.:]を意味しました?

0

sed -E "s/[a-z],_,.,:]+/\$(DIR)&/g" file.d.tmp > file.dは、シェルプロンプトから実行するとどのように動作するのかわかりません。文字クラス[a-z],_,.,:]+は、[a-z](1文字a〜z)の後にリテラルキャラクター,_,.,:]+が続くことを意味するので、正しくはありません。これは出力ファイルにないとみなします。

私はあなたのような何かをしたいと思っただろう:

sed -E "s/[]a-z,_.:]+/\$(DIR)&/g" file.d.tmp > file.d 

閉じ括弧が来るオープンブラケットは文字クラスでブラケットを含み、右後、それはそれを閉じていません。 regexについては、ドキュメントを参照してください。カンマを複数回組み込む必要もありません。

+0

それは実際に書かれた正規表現でした。私はそれがどのように働いていたのですか。 – VannTen

+0

どのように動作しているのか分かりません。私は別のシステムでそれをテストしました(最初はMacOS、2番目のLinuxでした)。shinobiが推論したように、「[a-z_.:]'は私が望んだものでした。 – VannTen

関連する問題