このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

諸悪の根源は擬似ターゲット その1

[追記]このエントリーに書いてあることは事実だが、「レッドヘリング」参照。[/追記]

擬似ターゲットは運用手法/技法であってメカニズムではない。.PHONYがない時代から使われていて、その頃のMakefileとの互換性を考慮している、と思われる。その結果があの惨状だ。

  • makeは実リソース名と擬似名(実体のない単なる名前)との区別は付かない。
  • 実リソース名だとすると明らかなエラーでも、擬似名の可能性からエラーには出来ないので、エラーにしない。エラーにすると擬似ターゲット技法が使えなくなる。
  • 擬似名が実リソース名として存在する時にトラブルが発生する。例:cleanというファイルがあと、`clean' is up to data. で実行されない。
  • そのために .PHONY が追加された。
  • .PHONYは、その名前が「リソースとしても実在しても存在しないとみなす」マーカーに過ぎない。

次にFORCEファイル。名前は何でもいいのだが、習慣としてFORCE。

  • FORCEはターゲットだが前提を持たない。
  • FORCEはレシピを持たない。

FORCEファイルの扱いは

  • FORCEファイルが存在しない時でもエラーとはしない(非存在がエラーとなるのは、非ターゲットである前提だけだ)。
  • FORCEファイルが存在しないとき、当然何もしない。
  • FORCEファイルが存在しても、レシピがないので何もしない。
  • FORCEファイルが存在してしなくても、ゴールとしての処理結果は、 Nothing to be done for `FORCE'.

どのルールのターゲットでもない非存在ファイルが前提になるとき、これはエラーとなる。だが、FORCEはターゲットなのでエラーではない。

一般にターゲット名(どれかのルールのターゲット位置に出現する名前)は、非存在でもエラーにはできない。技法としての擬似ターゲット名(ほんとのPHONYではない)の可能性があるからだ。擬似名だと指定するのが.PHONYだが、反対に実リソース名だと指定する方法がない

非存在がエラーとなるのは

  • その名前は.PHONYと指定されてない。(指定されてれば、非存在は問題にならない)
  • その名前はターゲット、またはコマンドラインからのゴールとして出現しない。
  • その名前は前提だけに出現する。

逆に、次のいずれかの場合は非存在でもエラーにできない。

  • その名前は.PHONYと指定されている。
  • その名前はターゲットである。パターンターゲットの具体化でもよい。