2016-05-12 77 views
1

我正在查看net-snmp代碼,並在snmplib本身的Makefile中發現了一些奇怪的東西。最後幾千行是這種形式的規則:用現有目標,現有先決條件但沒有配方制定規則

./dir_utils.lo: ../include/net-snmp/output_api.h 

對於每個庫對象和頭文件。即使那些沒有編譯的,取決於在配置腳本中選擇了哪些標誌。

我看了一下「make」手冊,但沒有找到確切的案例。可能(如5.9所述)他們這樣做是爲了排除在目標上調用隱式配方的可能性,但除此之外我不知道。

另一個原因可能是如果庫被篡改(刪除項目中的任何頭部導致實際上makefile因爲無法執行規則而崩潰)時「中斷」編譯。

這是一個有教養的猜測,但我想知道這背後的理論。我的意思是makefile已經構建了它的任何構建,爲什麼要以明確的形式包含所有這些規則?

感謝

+0

Makefile中是否有'.c.lo' *後綴規則*?如果是這樣,那麼對於每個目標都不需要明確的配方。 –

+0

是有: '.c.lo:' \t \t'$(libtool的)--mode =編譯$(CC)$(CPPFLAGS)$(CFLAGS)-c -o $ @ $ <' – mfloris

回答

2

正如我希望你知道,Makefile./configure腳本生成。 您感興趣的所有行都是自動生成的依賴關係。實際上, 它們只是 目錄中文件Makefile.depend的附加內容,它是分發的一部分,並且是在gcc的幫助 提前生成的。

因此,例如,

./dir_utils.lo: ../include/net-snmp/output_api.h 

只是通知說./dir_utils.lo 取決於../include/net-snmp/output_api.h的極其重要的事實make。那麼如果./dir_utils.lo../include/net-snmp/output_api.h舊,make將重新制作 ./dir_utils.lo只要它有一些配方可以做到這一點,它有。

這裏是一個項目:

的main.c

#include "hw.h" 
#include <stdio.h> 

int main(void) 
{ 
    puts(HW); 
    return 0; 
} 

hw.h

#ifndef HW_H 
#define HW_H 
#define HW "Hello World" 
#endif 

的Makefile

CC := gcc 

.PHONY: all clean 

all: hw 

hw: main.o 
    $(CC) -o [email protected] $< 


clean: 
    rm -f hw main.o 

生成並運行它:

$ make && ./hw 
gcc -c -o main.o main.c 
gcc -o hw main.o 
Hello World 

但是有在Makefile中的錯誤。它不知道main.o 取決於hw.h

$ touch hw.h 
$ make 
make: Nothing to be done for 'all'. 

追加一條依賴於生成文件:

main.o: hw.h 

,然後重試:

$ make 
gcc -c -o main.o main.c 
gcc -o hw main.o 

錯誤修正。

+0

「如果./dir_utils.lo早於../include/net-snmp/output_api.h,make會重新制作./dir_utils.lo,前提是它有一些配方可以做到這一點,它具有。」謝謝,這正是我正在尋找的答案。 – mfloris