2017-06-21 78 views
-1

我有一個make文件,其中有下面幾行:我不明白,在make文件中的正則表達式

EXECUTABLE = $(ONLINE_HOME)/bin/sec2ici 
OBJECTS = $(ONLINE_HOME)/src/dte_mq.o \  
    $(ONLINE_HOME)/src/sec2ici.o  

ALLINCL = -I$(ONLINE_HOME)/inc -I$(MQM_HOME)/inc -I$(ORACLE_HOME)/rdbms/public  

MQLIB = -L${MQM_HOME}/lib64 -lmqm -lmqmcs -lmqmzse 
MYLIB =  

ORALIB = -L${ORACLE_HOME}/lib/ -lclntsh  

ALLLIB  =  $(MQLIB) \  
    $(ORALIB) \  
    $(MYLIB) \  
    -lnsl -ldl  

CFLAGS  = -g \  
    $(ALLINCL)  


all: $(EXECUTABLE)  

COMPILE.c = $(CC) $(CFLAGS)  

.SUFFIXES: .o 

.c.o: 
    $(COMPILE.c) -c $*.c -o ${<:.c=.o} 

能否請您給我解釋一下$後的正則表達式(COMPILE.c)手段?

另外,在src目錄中只有20個文件中只有4個必要文件的規則在哪裏?

+3

沒有reqular表達 –

+0

我的猜測:抓住所有的C文件並將它們編譯爲與C文件相同名稱的O文件,只是不同的擴展名。 – tilz0R

+0

我不確定這件事情是否真的有效。 '$ *'是模式中'%'匹配的任何內容,但是這個規則沒有'%'。 – aragaer

回答

1

.c.o:聲明瞭一個簡單模式規則匹配與.c結尾的文件,並定義了相同的名稱,但.o爲目標。

$*是一個自動make變量,並擴展到模式的匹配部分。如果匹配main.c,$*將爲main

$<也是一個自動make變量,其中包含第一個先決條件的名稱(例如main.c)。用:xx=yy,你可以在make的變量末尾替換字符串,所以${<:.c=.o}main.c轉換爲main.o


這就解釋了,語法很奇怪,也沒有必要。寫這樣的規則,規範的方法是:

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

,或者對於make不具有這種模式的規則

.SUFFIXES: .c .o 

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

我的問題:在src目錄中我有20個文件* .c,但makefile只能編譯4個文件sec2dte_mq.c,sec2dte_2ici.c,adt.c,dte_mq.c。它如何在所有其他人中找到它們?或者它編譯所有,不管我們是否需要它們 – SamOl

+1

這與您顯示的規則無關。如果只需要4個文件,那麼可能有一個規則鏈接這4個目標文件。 「make」就是「做需要的」來制定最終的目標。如果沒有其他的'.o'文件依賴,'make'不會應用這個規則,只是因爲它找到了一些匹配的先決條件。 –

+0

,我會更新我的帖子,把完整的makefile,請嘗試解釋我在哪裏提到的那四個文件 – SamOl