諸悪の根源は擬似ターゲット その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と指定されている。
- その名前はターゲットである。パターンターゲットの具体化でもよい。