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