boa是一个小型的webserver,设计目标是速度和安全,虽然这个项目已经很多年没有更新了,但是对于初学linux编程,网络编程的同学来说。。还是很有价值的。boa的实际代码量只有7000+(去掉autotools自动生成的东西),初看压力不大。当然还有一些适合学习的开源项目,如thttpd(也是一个http server,代码12000+行),redis(key-value存储系统,和Memcached类似,里面貌似有好多数据结构?两万多行)和coreutils (常用linux命令源码,什么cd,chmod,cp等等),还有好多,github和sourceforge上有很丰富资源。。
直接入题吧,boa也用到了Autotools,但是我实在是搞不清楚autotools的几个命令是怎么组织的。。干脆直接./configure ,开始分析Makefile。
# Generated automatically from Makefile.in by configure. # $Id: Makefile.in,v 1.59 2002/03/24 22:20:19 jnelson Exp $ //注释换成了//,虽然好像不合法,但是语法高亮让解释更清晰一点 .SUFFIXES: .SUFFIXES: .o .c//去掉原有后缀,建立新的后缀 .PHONY: clean mrclean distclean depend all dist //伪目标 //这个GCC_FLAGS也是隐式变量? GCC_FLAGS = -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wcast-qual\ -Wtraditional\ -Wshadow\ -Wconversion\ -Waggregate-return\ -Wmissing-prototypes\ -Wnested-externs\ -Wall \ -Wundef -Wwrite-strings -Wredundant-decls -Winline srcdir = . VPATH = .:./../extras LDFLAGS = -g LIBS = CFLAGS = -g -O2 -pipe -Wall -I. // Change these if necessary YACC = yacc LEX = lex CC = gcc //c编译器 CPP = gcc -E //c预处理 //源文件 SOURCES = alias.c boa.c buffer.c cgi.c cgi_header.c config.c escape.c \ get.c hash.c ip.c log.c mmap_cache.c pipe.c queue.c read.c \ request.c response.c select.c signals.c util.c sublog.c //目标文件,其中$(SOURCES:.c=.o)用了替换,将SOURCES中的.c替换成了.o OBJS = y.tab.o lex.yy.o $(SOURCES:.c=.o) timestamp.o //all是伪目标,默认目标 all: boa boa_indexer //目标文件生成 boa boa: $(OBJS) $(CC) -o $@ $^ $(LDFLAGS) $(LIBS) boa_indexer: index_dir.o escape.o $(CC) -o $@ $^ $(LDFLAGS) $(LIBS) //清理不必要的文件 clean: rm -f $(OBJS) boa core lex.yy.c y.tab.c y.tab.h *~ boa_indexer index_dir.o distclean: mrclean mrclean: clean rm -f config.status config.cache config.h Makefile config.log // parser dependencies // flex,bison什么的,我都不会,还没有时间学习,,总之他们生成的东西语法分析其是用来分析配置文件的吧 y.tab.c y.tab.h: boa_grammar.y $(YACC) -d $^ lex.yy.c: boa_lexer.l $(LEX) $^ // timestamp timestamp.o: $(SOURCES) boa_grammar.y boa_lexer.l // depend stuff // 用gcc -MM可以生成源文件的依赖关系,.depend文件原来都有了,可以make depend重新制作 .depend: $(CPP) -MM $(SOURCES) > .depend depend: -rm -f .depend $(MAKE) .depend //把生成的依赖关系包含进来 include .depend // tags // 万行源码中寻找定义,ctags实在方便 tags: $(SOURCES) ctags -o tags $^ *.h // dist dist: $(MAKE) clean ./makedist.sh // object dump boa.objdump: boa objdump --disassemble-all --source boa > $@
makefile文件书写你们学过吗???
没有学过..都是在网上看的…
coreutils 是好东西
你是来挖坟的么