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)
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、$ ^) 'を直接実行します。 –