make与自动化
最近在学习lex和yacc的过程中,由于需要不断地执行一些重复的命令,比如yacc -d cal.y生成y.tab.c和y.tab.h,然后lex cal.l生成lex.yy.c最后编译链接gcc y.tab.c y.tab.h lex.yy.c -o Calc。但是只要编辑过程中出现一点失误,就要重新执行上面命令,非常低效和烦琐。
但是借助make就可以一步到位,实现自动化。上面的过程只需要写入makefile就可以完成自动化。
YFLAG = -d
PROGRAM = calc
OBJS = y.tab.o lex.yy.o
SRCS = y.tab.c lex.yy.c
CC = gcc
all:$(PROGRAM)
.c.o:$(SRCS)
$(CC) -c $*.c -o $@ -O
y.tab.c:cal.y
yacc $(YFLAGS) cal.y
lex.yy.c:cal.l
lex cal.l
calc:$(OBJS)
$(CC) $(OBJS) -o $@ -lfl -lm
clean:
rm -f $(OBJS) $(SRCS) y.tab.h
仔细思考make的作用,它就凸显出Linux下命令组合、程序之间相互协作的优势了。make就算胶水一样将yacc,lex粘合到一起,如果可以你还可以粘合很多命令。以前听说python,shell等是胶水语言,make应该也可以认为是一种胶水语言吧?
其实所谓的自动化其实也是一种很简单的想法,想必又是程序员高效“偷懒”的产物。由这件事我想到了工具的重要性,很多时间没有工具再厉害的工匠也做不出椅子来。如果没有专门的旋转切割刀,你面对PVC管时也只能是束手无策。所以,很多时候工具决定了你的效率和能力,尤其是在linux下,必须要学会一些必备的工具,同时要善于发现一些好的工具,来提高自己的能力,延伸自己的双手。