最初make
は、$(...)
変数の拡大につながっているんのは、ライン
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
を見てみましょう:
rm -f obj/*.o *~ core /*~
最後の部分はおそらくバグです:INCDIR
です定義されていないので、何も展開しません。代わりに$(IDIR)
を意味しましたか?
make
は、結果の行を/bin/sh -c ...
で実行しています。シェルはワイルドカードのようなものを展開します。
obj
のオブジェクトファイルがhellomake.o
とhellofunc.o
であるとします。 obj/*.o
はobj/hellofunc.o obj/hellomake.o
になります。
*~
は、現在のディレクトリ内で末尾が~
のすべてのファイルと一致します。なぜあなたはそのようなファイルを持っていますか?なぜなら、emacsを使ってファイルfoo
を編集すると、デフォルトでbackup copy under foo~
のままになるからです。これは、emacsのバックアップファイルを削除することを意図しています。
core
は、core dumpsを有効にして、クラッシュするプログラムを有効にした場合(通常はsystemdを使用していない場合)に通常得られるものです。クラッシュをデバッグするのに使用できます。
最後のパターンは、INCDIR
のemacsバックアップファイルと一致するように見えますが、設定されていないため、ルートディレクトリのバックアップファイル(/
)を検索しようとします。通常、emacsのバックアップだけでなく、/
にはファイルがありません。
パターンがファイルと一致しない場合、シェルのデフォルトの動作は展開されません。したがって、最後の部分(/*~
)はそのまま残されます。あなたがそう*~
も放置され、いずれかのカレントディレクトリにはバックアップファイルを持っていないと仮定しましょう:
rm -f obj/hellofunc.o obj/hellomake.o *~ core /*~
この行はそれを引数として文字列の配列を渡し、rm
を実行します:
{ "rm", "-f", "obj/hellofunc.o", "obj/hellomake.o", "*~", "core", "/*~" }
rm
(以下の規則)は、引数として、-
で始まる文字列をスキャンし、オプションとして処理します。この場合、1つのオプション、f
があります。 f
( "force")は、書き込み権限のないファイルについては尋ねないようにrm
に指示します。とにかくそれらを削除してください。また、存在しないファイルを削除しようとするなどのエラーを抑制します。 (特に、文字通り*~
と呼ばれるファイルはありません。)
だから、全体のことは、現在のディレクトリにobj/
core
で
- オブジェクトファイル
- emacsの
/
で現在のディレクトリにバックアップファイル
- emacsのバックアップファイル(おそらくドンを削除します存在しない場合は、削除する権限がない可能性があります)
0エラーを無視してを入力してください。
'hellomake'が削除されているように見えません。 – melpomene
'$(INCDIR)'は 'INCDIR'がどこにも定義されていないので' $(IDIR) 'と思われるようです。 – melpomene
hellomakeを削除しないと '*〜core $(INCDIR)/ *〜'で何が起こっていますか? – user256017