Boa源码分析 – 1 – Makefile

于 2012年03月20日 发布在 linux应用 跳到评论

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

本文共有 4条评论 | 沙发:文章评论

  1. kissss说道:

    makefile文件书写你们学过吗???

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)