2012-01-27 108 views
0

首先,這是我的Makefile,它確實很酷。 它爲當前目錄中的每個'c'文件生成一個可執行文件。 瑣碎外殼,PITA用make ...我提到,十年來我沒有「C'D所以請不要笑...不必要地重新編譯目標

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 

這裏是我的目錄內容:

% 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

% 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 

大,它重新編譯的一切,輸出的最後一行看起來有點雖然不一致。 它與其他人有什麼不同?

% 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,它期待NOP,畢竟,我沒有改變任何東西

% make 
gcc -c array_example.c -o array_example 

但它開發生產輸出,怎麼辦?

% 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文件,爲什麼總是那個?

的解決方案(感謝埃爾達爾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 

最後一次會議

刪除所有生成的文件

% 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再次

% 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文件。其次,回答你爲什麼只有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) 

製作建立使用an implicit rule使由C來源的可執行$(EXECUTABLES)列出的所有程序。沒有必要指定其他任何東西。

如果隱式規則不正確,則可以覆蓋它,例如,如下:

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

我花了一段時間才能弄清楚你的意思到底是什麼,但現在我已經得到了那裏,我不想使用隱式的東西,因爲我還要編譯一堆特克斯和一些ASM也是如此。多謝兄弟。 – 2012-01-27 18:08:33

+0

@BryanHunt,不客氣,如果理解困難的原因是我的英語,我很抱歉。 ;-) – 2012-01-27 18:15:45

+0

Spaziba bolshoi – 2012-01-27 18:16:22