3

次のようなルールを作成したいと思います。

foo.out: (out of date if foo.in is newer than foo.out.stamp)
    # update foo.out if and only if the new foo.out has different contents
    # than the old foo.out (a change to foo.in may or may not change foo.out)
    && touch foo.out.stamp

私はこれを行うことはできません:

foo.out.stamp: foo.in
    # update foo.out if and only if the new foo.out has different contents
    # than the old foo.out (a change to foo.in may or may not change foo.out)
    && touch foo.out.stamp

foo.out: foo.out.stamp

foo.in変更されたが、のレシピfoo.out.stampは変更されない場合、foo.outmake常に古いものとして表示foo.outされるためです。

この種のルールを書く方法はありますか?

編集:私が無条件に触れない理由の説明foo.out

私はヴァラと仕事をしています。Valaのコンパイルプロセスは次のようになります。

  1. ファイルごと.valaに、ファイルを生成し.vapiます(ヘッダーファイルと同様)。
  2. ファイルごと.valaに、ファイルを生成し.cます(これには、個々の.valaファイルとすべて .vapiのファイルをコンパイラーに渡す必要があります)
  3. 通常のプロセスを続行し.c -> .o -> executable/libraryます。

手順1と2の場合、Valaコンパイラは/ファイルの内容が変更された場合にのみ.vapi/ファイルを更新します。.cこれは、不必要な.c -> .o再コンパイルを防ぐためです。

makefileの用語で:

  • Valaコンパイラが最後にファイルを再生成してから(ファイルが最後に変更されたときではなく)ファイルが変更された.vapi場合、ファイルは古くなっています。.vala.vapi.vapi
  • Valaコンパイラが最後にファイルを再生成してから(またはファイルが最後に変更されたときではなく)ファイルが変更された.c場合、ファイルは古くなっています。.vala .vapi.c.c
4

4 に答える 4

1

Kernighan & Pike 'The UNIX Programming Environment' (1984) で使用したいとおおむね同等の手法があり、Yacc 文法で使用されていました。

Yacc ソース ファイルはgrammar.y. Yacc からのデフォルトの出力ファイルはy.tab.cy.tab.h. 他のファイル (特に語彙アナライザー) はヘッダーに依存しますが、文法 (アクション) の C コードは変更されますが、ヘッダーは変更されないことがよくあります。したがって、Yacc によって生成されたヘッダーが異なる場合にのみ、語彙アナライザーによって使用されるヘッダーが変更されるようにすることは賢明でした。それを処理する方法は、字句解析器に include x.tab.h(not ) を持たせ、違いがある場合にのみ古いものの上にy.tab.h新しいものをコピーすることでした。y.tab.hx.tab.h

x.tab.h: y.tab.h
   -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h

これは、同じように使用できるファイル名を制御できないように見えるため、コンテキストに適用するのが難しくなります —filename.valaファイルは と を生成filename.vapifilename.c、コードのサービスを必要とする他の Vala ソース ファイルにはfilename.valaが自動的に含まれますfilename.vapi


あなたは言う:

メイクファイルの用語:

  • Vala コンパイラが最後にファイルを再生成したとき (ファイルが最後に変更されたときではない) 以降にファイルが変更されている場合、.vapiそのファイルは古くなっています。.vala.vapi.vapi
  • Vala コンパイラが最後にファイルを再生成したとき (ファイルが最後に変更されたときではない) 以降に、またはいずれかのファイルが変更されて.cいる場合、そのファイルは古くなっています。.vala .vapi.c.c

最初のルールは、単純に通常のソース/オブジェクトの関係です。

%.vapi: %.vala
    $(VALAC) -h $*.vala

オプションはValaソースから-hヘッダー ( ) ファイルを生成し、対応するオプションは C ソース ( ) ファイルを生成します。.vapi-c.c

2 番目の規則も、通常のソース/オブジェクトの関係です。

%.c: %.vala
    $(VALAC) -c $*.vala

これは、ファイルがファイルよりも新しい場合、ファイルがファイル.cから再生成されることを示しています。さらに、ファイルは含まれるファイルによって異なります。.vala.vala.c.c.vapi

file1.c:  file2.vapi file3.vapi file4.vapi ...
于 2012-07-19T13:49:07.080 に答える
0

以下が機能するかどうかを確認してください。

foo.out.stamp: foo.in
    # if the new foo.out has different contents than the old foo.out
    update foo.out && touch foo.out.stamp
    #else
    touch -r foo.out foo.out.stamp

foo.out: foo.out.stamp

の 2 回目の呼び出しによりtouch、 のタイム スタンプが のタイム スタンプで更新foo.out.stampされますfoo.out。マンページから:

-r, --reference=FILE
      use this file's times instead of current time
于 2012-07-18T22:21:24.177 に答える
0

スタンプが常に実行されることを保証する最上位のルールと、実際の出力ファイル用の空のルールを追加することで、これを解決することになりました。

all: %.out.stamp

%.out: ;

技術的には、Makefile を手動で作成していないため (私は cmake を使用しています)、正確にはそうではありません。.vapi.stampCMake の用語では、すべてのand .dep(a に類似.c.stamp) ファイルに依存するカスタム ターゲットを追加しました。ファイルから実行可能ファイル/ライブラリをビルドする CMake ターゲットは.c、このターゲットに依存します。

于 2012-07-19T20:15:48.550 に答える
0

.vapa以下は、と.valiファイル間の関係の説明と一致しているようです。

% cat Makefile
VFILES=A B

.PRECIOUS: $(VFILES:=.vapi)

%.vapi: %.vala
    touch $@

%.c: %.vala $(VFILES:=.vapi)
    echo "$^" >$@

%.o: %.c
    touch $@

all: A.o
% ls
A.vala      B.vala      Makefile
% make A.o
touch A.vapi
touch B.vapi
echo "A.vala A.vapi B.vapi" >A.c
touch A.o
rm A.c
% make B.o
echo "B.vala A.vapi B.vapi" >B.c
touch B.o
rm B.c
% touch A.vala
% make B.o    
touch A.vapi
echo "B.vala A.vapi B.vapi" >B.c
touch B.o
rm B.c
% make A.o
echo "A.vala A.vapi B.vapi" >A.c
touch A.o
rm A.c
% ls -lt
total 24
-rw-r--r--  1 norman  wheel    0 19 Jul 00:11 A.o
-rw-r--r--  1 norman  wheel    0 19 Jul 00:11 A.vapi
-rw-r--r--  1 norman  wheel    0 19 Jul 00:11 B.o
-rw-r--r--  1 norman  wheel    6 19 Jul 00:11 A.vala
-rw-r--r--  1 norman  wheel    0 19 Jul 00:10 B.vapi
-rw-r--r--  1 norman  wheel    6 19 Jul 00:10 B.vala
-rw-r--r--  1 norman  wheel  141 19 Jul 00:09 Makefile
% 

それは動作しますか?

于 2012-07-18T23:13:35.450 に答える