web-dev-qa-db-ja.com

Makefile-ファイルが存在しない場合にのみ依存関係を作成します

タイトルが言うように、更新するたびにではなく、特定のファイルが存在しない場合にのみ依存関係を作成します。

ルートディレクトリ(makefileがあるディレクトリ)があり、その中に「example」というサブディレクトリがあります。私のルートディレクトリには4つの.hファイル(functions.h、parser.h、node.h、exception.h)があり、これらの.hファイルがまだ存在しない場合は、「example」サブディレクトリにコピーします。 「例」。

残念ながら、「example」のヘッダーファイルをチェックする標準の依存関係を作成することはできません。ルートから「example」にヘッダーファイルをコピーするたびに、「example」のヘッダーファイルが更新されたと見なされ、その依存関係がトリガーされます。 makeを実行するたびに。 makefileに「example」に存在しない場合にのみ、ルートファイルから「example」にヘッダーファイルをコピーさせる方法が欲しいのですが。

18
Daniel

これが 順序のみの前提条件/依存関係 の目的です。

ただし、これらのルールのいずれかが実行された場合にターゲットを強制的に更新せずに、呼び出されるルールに特定の順序を課したい場合があります。その場合、注文のみの前提条件を定義します。前提条件リストにパイプ記号(|)を配置することで、注文のみの前提条件を指定できます。パイプ記号の左側にある前提条件はすべて正常です。右側の前提条件は注文のみです。

あなたの場合:

examples/%.h : | %.h
    cp $| $@

参照: 注文のみの前提条件は$^または$+に表示されません。

27

依存関係は、相対的なファイル経過時間で表す必要があります。

一般的に使用される回避策は、操作の完了にフラグを付けるダミー(「センチネル」)ファイルを使用することです。

examples/%.h.hasbeencopied: %.h
    if [ -f example/[email protected] ] || cp -p $< examples/[email protected]; \
    then touch $@; \
    else rm -f $@; \
    fi

example/foo.hに依存するルールも作成します。example/foo.h.hasbeencopiedにも依存します。

4
reinierpost