我不明白make文件中的正则表达式

时间:2017-06-21 13:35:41

标签: makefile

我有一个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个必需文件的规则在哪里?

1 个答案:

答案 0 :(得分:2)

.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 -o$@ $<

或者,对于没有此类模式规则的make

.SUFFIXES: .c .o

.c.o:
    $(CC) $(CFLAGS) -c -o$@ $<