2012-01-27 4 views
0

まず、ここに私のMakefileがあります。 現在のディレクトリにあるすべての 'c'ファイルに対して実行可能ファイルを生成します。 シェルとの些細な、メイクとPITAが...私はここでターゲットを不必要に再コンパイルする

CC = gcc 
#List all 'c' files by wildcard. 
SOURCES=$(wildcard *.c) 
#Get the 'exe' equivalent of said file 
EXECUTABLES=$(SOURCES:%.c=%) 

#For each of the '*.exe' files 
#append a 'c' suffix to the target 
build: $(EXECUTABLES) 
    $(CC) -c $(<:%=%.c) -o $< 

clean: 
    find ./ ! -name "*.c" -a ! -name "Makefile" -type f -delete 

rebuild: clean build 

が私のディレクトリの内容です...ので、笑わないでください、私は「十年C'Dていませんが、言及しました:

% ls -la 
total 32 
drwxr-xr-x 2 yomom yomom 4096 2012-01-27 13:38 ./ 
drwx------ 94 yomom yomom 4096 2012-01-27 13:38 ../ 
-rw-r--r-- 1 yomom yomom 990 2012-01-27 12:47 array_example.c 
-rw-r--r-- 1 yomom yomom 341 2012-01-27 13:38 Makefile 
-rw-r--r-- 1 yomom yomom 430 2011-12-05 13:08 pointers.c 
-rw-r--r-- 1 yomom yomom 319 2012-01-27 12:45 should_create_warning.c 
-rw-r--r-- 1 yomom yomom 1472 2011-12-19 16:16 socket-client.c 
-rw-r--r-- 1 yomom yomom 1150 2011-12-19 16:15 socket-server.c 

今、私は

% make 
gcc  array_example.c -o array_example 
gcc  pointers.c -o pointers 
gcc  should_create_warning.c -o should_create_warning 
gcc  socket-client.c -o socket-client 
gcc  socket-server.c -o socket-server 
gcc -c array_example.c -o array_example 

グレート、それは再コンパイルされ、すべてをmakeを実行し、出力の最後の行は、しかし少し矛盾して見えました。 どのように他の人と違うのですか?私はNOPにそれを期待し、再びmakeを実行

% ls -la 
total 68 
drwxr-xr-x 2 yomom yomom 4096 2012-01-27 13:38 ./ 
drwx------ 94 yomom yomom 4096 2012-01-27 13:38 ../ 
-rw-r--r-- 1 yomom yomom 1428 2012-01-27 13:38 array_example 
-rw-r--r-- 1 yomom yomom 990 2012-01-27 12:47 array_example.c 
-rw-r--r-- 1 yomom yomom 341 2012-01-27 13:38 Makefile 
-rwxr-xr-x 1 yomom yomom 7164 2012-01-27 13:38 pointers* 
-rw-r--r-- 1 yomom yomom 430 2011-12-05 13:08 pointers.c 
-rwxr-xr-x 1 yomom yomom 7139 2012-01-27 13:38 should_create_warning* 
-rw-r--r-- 1 yomom yomom 319 2012-01-27 12:45 should_create_warning.c 
-rwxr-xr-x 1 yomom yomom 7515 2012-01-27 13:38 socket-client* 
-rw-r--r-- 1 yomom yomom 1472 2011-12-19 16:16 socket-client.c 
-rwxr-xr-x 1 yomom yomom 7579 2012-01-27 13:38 socket-server* 
-rw-r--r-- 1 yomom yomom 1150 2011-12-19 16:15 socket-server.c 

は、結局、私は何も

% make 
gcc -c array_example.c -o array_example 

を変更していない。しかし、それは与えるもの、出力をproducted?

% ls -la 
total 68 
drwxr-xr-x 2 yomom yomom 4096 2012-01-27 13:51 ./ 
drwx------ 94 yomom yomom 4096 2012-01-27 13:51 ../ 
-rw-r--r-- 1 yomom yomom 1428 2012-01-27 13:51 array_example 
-rw-r--r-- 1 yomom yomom 990 2012-01-27 12:47 array_example.c 
-rw-r--r-- 1 yomom yomom 341 2012-01-27 13:38 Makefile 
-rwxr-xr-x 1 yomom yomom 7164 2012-01-27 13:38 pointers* 
-rw-r--r-- 1 yomom yomom 430 2011-12-05 13:08 pointers.c 
-rwxr-xr-x 1 yomom yomom 7139 2012-01-27 13:38 should_create_warning* 
-rw-r--r-- 1 yomom yomom 319 2012-01-27 12:45 should_create_warning.c 
-rwxr-xr-x 1 yomom yomom 7515 2012-01-27 13:38 socket-client* 
-rw-r--r-- 1 yomom yomom 1472 2011-12-19 16:16 socket-client.c 
-rwxr-xr-x 1 yomom yomom 7579 2012-01-27 13:38 socket-server* 
-rw-r--r-- 1 yomom yomom 1150 2011-12-19 16:15 socket-server.c 

さらに、array_exampleファイルを再コンパイルしていますが、なぜそれはいつもですか?

SOLUTION(エルダーAbusalimovのおかげで)

CC = gcc 
#List all 'c' files by wildcard. 
SOURCES=$(wildcard *.c) 
#Get the 'exe' equivalent of said file 
EXECUTABLES=$(SOURCES:%.c=%) 

all: $(EXECUTABLES) 
.PHONY: all 
$(EXECUTABLES): % : %.c 
    $(CC) -c $< -o [email protected] 

.PHONY clean: 
clean: 
    find ./ ! -name "*.c" -a ! -name "Makefile" -type f -delete 

rebuild: clean all 

FINAL SESSION

それはdoesnの

% make clean 
find ./ ! -name "*.c" -a ! -name "Makefile" -type f -delete 

% ls -la 
total 48 
drwxr-xr-x 2 yomom yomom 4096 2012-01-27 18:07 ./ 
drwx------ 94 yomom yomom 4096 2012-01-27 18:07 ../ 
-rw-r--r-- 1 yomom yomom 990 2012-01-27 17:38 array_example.c 
-rw-r--r-- 1 yomom yomom 428 2012-01-27 17:38 array_of_pointers.c 
-rw-r--r-- 1 yomom yomom 274 2012-01-27 17:38 const_ptr.c 
-rw-r--r-- 1 yomom yomom 293 2012-01-27 17:38 function_pointers.c 
-rw-r--r-- 1 yomom yomom 313 2012-01-27 18:06 Makefile 
-rw-r--r-- 1 yomom yomom 430 2012-01-27 17:38 pointers.c 
-rw-r--r-- 1 yomom yomom 228 2012-01-27 17:38 pointer_to_constant.c 
-rw-r--r-- 1 yomom yomom 253 2012-01-27 17:38 pointer_to_pointer.c 
-rw-r--r-- 1 yomom yomom 1472 2012-01-27 17:38 socket-client.c 
-rw-r--r-- 1 yomom yomom 1150 2012-01-27 17:38 socket-server.c 

実行して、今再び

% make 
gcc -c array_example.c -o array_example 
gcc -c array_of_pointers.c -o array_of_pointers 
gcc -c const_ptr.c -o const_ptr 
gcc -c function_pointers.c -o function_pointers 
gcc -c pointers.c -o pointers 
gcc -c pointer_to_constant.c -o pointer_to_constant 
gcc -c pointer_to_pointer.c -o pointer_to_pointer 
gcc -c socket-client.c -o socket-client 
gcc -c socket-server.c -o socket-server 

を行い、生成されたすべてのファイルを削除しますもう馬鹿なことはしないで...

% make 
make: Nothing to be done for `all'. 

答えて

3

build: $(EXECUTABLES)のレシピを削除するだけです。まず、そのようなルールはbuildファイルを作成するものではありません。第2に、array_exampleのみが常に再コンパイルされている理由についての質問に答えると、$(<:%=%.c)は、最初にリストされた前提条件になります。wildcard(結果は辞書順で並べ替えられますが、usually it does )。つまり、

SOURCES=$(wildcard *.c)# returns 'array_example.c pointers.c ...'. 
EXECUTABLES=$(SOURCES:%.c=%)# is 'array_example pointers ...'. 

build: $(EXECUTABLES) 
# Here '$<' is the first item of '$(EXECUTABLES)', which is 'array_example'. 
# And '$(<:%=%.c)' returns 'array_example.c' 
    $(CC) -c $(<:%=%.c) -o $< 

最後に、.PHONYターゲットを追加することを忘れないでくださいされています。

.PHONY: build 
build: $(EXECUTABLES) 

メイクは、Cソースから実行ファイルを作るためにan implicit ruleを使用して$(EXECUTABLES)に記載されているすべてのプログラムを構築します。他に何も指定する必要はありません。

暗黙のルールがOKでない場合は、無効にすることができます。

+0

私はあなたが意味するものを正確に理解するためにしばらく時間をとったが、私は今そこにいた。暗黙のものを使用したくない.Texといくつかのものをコンパイルするからだ。 ASMも同様です。ありがとう兄貴。 –

+0

@BryanHunt、あなたは大歓迎です。理解が困難な理由が私の英語であるのなら、すみません。 ;-) –

+0

Spaziba bolshoi –