2016-06-23 9 views
0

私はメイクファイルについてもっと学んでいますが、私はあまり理解できません。 make cleanで何が起こっていますか?/obj内のすべてのオブジェクトファイルを強制的に削除しますが、それ以降は失われます。私はそれもexeファイルを削除することを知っているが、どのようにコードで翻訳されていますか?このクリーンで何が起こっていますか?

IDIR =../include 
CC=gcc 
CFLAGS=-I$(IDIR) 

ODIR=obj 
LDIR =../lib 

LIBS=-lm 

_DEPS = hellomake.h 
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) 

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 


$(ODIR)/%.o: %.c $(DEPS) 
     $(CC) -c -o [email protected] $< $(CFLAGS) 

../hellomake: $(OBJ) 
     gcc -o [email protected] $^ $(CFLAGS) $(LIBS) 

.PHONY: clean 

clean: 
     rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 
+0

'hellomake'が削除されているように見えません。 – melpomene

+0

'$(INCDIR)'は 'INCDIR'がどこにも定義されていないので' $(IDIR) 'と思われるようです。 – melpomene

+0

hellomakeを削除しないと '*〜core $(INCDIR)/ *〜'で何が起こっていますか? – user256017

答えて

2

最初makeは、$(...)変数の拡大につながっているんのは、ライン

rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

を見てみましょう:

rm -f obj/*.o *~ core /*~ 

最後の部分はおそらくバグです:INCDIRです定義されていないので、何も展開しません。代わりに$(IDIR)を意味しましたか?

makeは、結果の行を/bin/sh -c ...で実行しています。シェルはワイルドカードのようなものを展開します。

objのオブジェクトファイルがhellomake.ohellofunc.oであるとします。 obj/*.oobj/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エラーを無視して

    を入力してください。

  • +0

    本当に素敵な答え.. –

    関連する問題