#
# Makefile for the GoAhead web server reference source base
# for the Linux OS
#
# Copyright (c) GoAhead Software, Inc. 1995-2010
# Copyright (c) PeerSec Networks, Inc. 2010
#
#
all: compile
ARCH = libwebs.a
NAME = webs
# User Management switch
#UMSW = -DUSER_MANAGEMENT_SUPPORT
# Digest Access switch
DASW = -DDIGEST_ACCESS_SUPPORT
#
# This is set by the debug target below
#
ifdef WEBS_DEBUG
DFLAGS = -g -Wall -Winline -Wdisabled-optimization –DDEBUG
gcc的相关选项说明:
1.-g: 在可执行程序中包含可供gdb使用的标准调试信息。
2.-Wall: 允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告
3.-Winline:如果一个不能被内联却声明成了内联的形式,则加上次选项会产生警告信息。
4.-Wdisabled-optimization:如果用户请求的优化表达式被disable了,则产生警告信息。产生这个错误并不一定说你的代码有错误,而是说gcc的优化功能不能对你的代码起有效的作用。通常,原因是由于你的代码过于庞大或者过于复杂。
5.-D:
参数:-D 定义宏(D-define)
-D定义宏有两种情况,一种是-DMACRO 相当于程序中使用#define MACRO 另外可以-DMACRO=A 相当于程序中使用#define MACRO A 这只是一个编绎参数,在连接时没有意义
如: $gcc -c hello.c -o hello.o -DDEBUG
上面为hello.c定义了一个DEBUG宏,某些情况下使用-D 代替直接在文件中使用#define,也是为了避免修改源代码。例如一个程序希望在开发调试的时候能打印出调试信息,而正式发布的时候就不用打印了,而且发布前不用修改源代码。可以这样
#ifdefine DEBUG
printf("debug message\n");
#endif
对于这段代码,平时调试的时候就加上-DDEBUG 发布时不用-D选项
与之对应的是-UMACRO参数,相当于#undef MACRO,取消宏定义
6.-Os:对代码大小进行优化。“-Os”选项使能了-O2优化选项中那些不会增大代码大小的功能。同时会进行进一步的优化以减小代码大小。
else
DFLAGS = -Os
endif
debug:
@$(MAKE) compile "WEBS_DEBUG = 1"
通常,make会把要执行的命令在命令执行前输出到屏幕上。当我们用“@”字符在命令行前,那么这个命令将不被make显示出来。最具代表的例子是我们用这个功能向屏幕显示一些信息。如:
@echo 正在编译XXX模块....
当make执行时,会输出“正在编译XXX模块....”字串,但不会输出命令,如果没有“@”,那么make将会输出:
echo 正在编译XXX模块....
正在编译XXX模块....
如果make执行时,带入make参数“-n”或者“--just-print”,那么其只是显示命令,但不会执行命令,这个功能很利于我们调试我们的makefile,看看我们书写的makefile执行起来时什么顺序的或者是什么样子的。
而make参数“-s”或“--silent”则是全面禁止命令的显示。
gold:
@$(MAKE) compile
default: gold
#
# Enable SSL build if MatrixSSL package found in root source directory
# (if automation is not working, simply define SSLINC, SSLLIB, and SSLSW)
#
matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)
ifdef matrixsslDir
SSLINC = $(matrixsslDir)
SSLLIB = $(matrixsslDir)libmatrixssl.a
SSLSW = -DWEBS_SSL_SUPPORT -DPOSIX -I$(SSLINC)
OPT_FILES = ../matrixSSLSocket.o ../websSSL.o
else
OPT_FILES = ../md5c.o
endif
# If-Modified-Support switches (requires math library, libm.a)
# IFMODSW = -DWEBS_IF_MODIFIED_SUPPORT
# IFMODLIB = /usr/lib/libm.a
# Dependencies
DEPEND_FILES = $(OPT_FILES) ../asp.o ../balloc.o ../mime64.o \
../cgi.o ../default.o ../ejlex.o ../ejparse.o ../form.o \
../h.o ../handler.o ../mime.o ../misc.o ../page.o \
../ringq.o ../rom.o ../sock.o ../sockGen.o \
../security.o ../sym.o ../uemf.o ../url.o ../value.o \
../um.o ../umui.o ../websda.o ../emfdb.o \
../webrom.o ../webs.o ../websuemf.o main.o
CFLAGS = -DWEBS -DOS="LINUX" -DLINUX $(UMSW) $(DASW) $(SSLSW) $(IFMODSW)
9.3隐含变量
内嵌隐含规则的命令中,所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”,这些变量我们可以对它进行修改:在Makefile中,通过命令行参数或者设置系统环境变量的方式来对它进行重定义。无论是哪种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。当然,也可以使用-R 或—no-builtin-variables选项来取消所有的隐含变量(同时取消了所有的隐含规则)。
隐含规则中所使用的变量(隐含变量)分为两类:1.代表一个程序的名字(例如:“CC”代表了编译器这个可执行程序)。2.代表执行这个程序适用的参数(例如:变量“CFLAGS”),多个参数使用空格分开。当然也允许在程序的名字中包含参数。但是这种方式建议不要使用。对于参数的描述我们应该将它们集中在一个变量中,即就是整个工程存在一个必需的参数,我们也可以把它放置一个特殊命名的变量定义中,通用的代表参数的那个变量的定义对它引用;通过这种方式来实现,而不是将它和所要执行的程序名定义在一个变量中。我们的Makefile要尽量做到清晰、明了、干练的管理一个工程。而不要各个变量之间存在错综复杂的关系!模块化的编程思想也同样适用于我们编写Makefile.
一下是一些作为程序名的隐含变量定义:
9.3.1代表命令的变量
AR:函数库打包程序,可创建静态库.a文档,默认是ar.
AS:汇编程序。默认是as.
CC:C编译程序。默认是cc.
CXX:C++编译程序,默认是g++.
CO:从RCS中提取文件的程序。默认是co.
CPP:C程序的预处理器(输出是标准输出设备)。默认是$(CC) –E
FC:编译器和预处理Fortran和Ratfor源文件的编译器,默认是f77.
GET:从SCCS中提取文件程序。默认是get。
LEX:将Lex语言转变为C或Ratfor的程序。默认是lex
PC:Pascal语言编译器。默认是pc。
YACC:Yacc文法分析器(针对C程序)。默认命令是yacc.
YACCR:Yacc文法分析器(针对于Ratfor程序)。默认是yacc –r
MAKEINFO:转换Texinfo源文件(.texi)到Info文件程序。默认是makeinfo.
TEX:从TeX源文件创建TeX DVI文件的程序。默认是tex
TEXI2DVI:从Texinfo源文件创建TeX DVI文件的程序。默认是texi2dvi.
WEAVE:转换Web到TeX的程序。默认是weave。
CWEAVE:转换C Web到TeX的程序。默认是cweave.
TANGLE:转换Web到Passcal语言的程序。默认是tangle.
CTANGLE:转换C Web到C。默认是ctangle。
RM:删除命令。默认是rm –f.
9.3.2命令参数的变量
下面的是代表命令执行参数的变量。如果没有给出默认值则默认值为空。
ARFLAGS
执行AR命令的命令行参数。默认值是rv.
ASFLAGS
执行汇编器AS的命令行参数。(当明显的调用.s或.S文件时)
CFLAGS
执行CC编译器的命令行参数(编译.c源文件的选项)。
CXXFLAGS
执行g++编译器的命令行参数(编译.cc源文件的选项)。
COFLAGS
执行co的命令行参数(在RCS中提取文件的选项)。
CPPFLAGS
执行C预处理器 cc –E的命令行参数(C和Fortran编译器会用到)。
FFLAGS
Fotran语言编译器f77执行的命令行参数(编译Fortran源文件的选项)。
GFLAGS
SCCS “get”程序参数。
LDFLAGS
连接器参数。(如:ld)
LFLAGS
Lex文法分析器参数。
PFLAGS
Pascal语言编译器参数。
RFLAGS
Ratfor程序的Fortran编译器参数。
YFLAGS
Yacc文法分析器参数
OTHERS = -DB_STATS -DB_FILL
IFLAGS = -I..
LDFLAGS = $(SSLLIB) $(IFMODLIB)
compile: $(NAME)
#
# Build archive of objects
#
$(ARCH): $(DEPEND_FILES)
$(AR) $(ARFLAGS) $(ARCH) $?
$?:所有比目标新的依赖目标的集合。以空格分隔。
#
# Primary link
#
$(NAME): Makefile $(ARCH)
$(CC) -o $(NAME) $(DFLAGS) \
$(CFLAGS) $(IFLAGS) \
main.o $(ARCH) $(LDFLAGS)
clean:
rm -f $(NAME) $(ARCH) $(DEPEND_FILES)
#
# Dependencies
#
../asp.o: ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../balloc.o: ../balloc.c ../uemf.h
../mime64.o: ../mime64.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../cgi.o: ../webs.h ../wsIntrn.h ../uemf.h
../default.o: ../default.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../ejlex.o: ../ejlex.c ../ej.h ../ejIntrn.h ../uemf.h
../ejparse.o: ../ejparse.c ../ej.h ../ejIntrn.h ../uemf.h
../emfdb.o: ../emfdb.h ../wsIntrn.h ../uemf.h
../form.o: ../form.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../h.o: ../h.c ../uemf.h
../handler.o: ../handler.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../md5c.o: ../md5.h ../wsIntrn.h ../uemf.h
../mime.o: ../mime.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../misc.o: ../misc.c ../uemf.h
../page.o: ../page.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../ringq.o: ../ringq.c ../uemf.h
../rom.o: ../rom.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../security.o: ../security.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../sock.o: ../sock.c ../uemf.h
../sockGen.o: ../sockGen.c ../uemf.h
../sym.o: ../sym.c ../uemf.h
../uemf.o: ../uemf.c ../uemf.h
../um.o: ../webs.h ../wsIntrn.h ../um.h ../uemf.h
../umui.o: ../webs.h ../wsIntrn.h ../um.h ../uemf.h
../url.o: ../url.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../value.o: ../value.c ../uemf.h
../webrom.o: ../webrom.c ../webs.h ../wsIntrn.h ../uemf.h
../webs.o: ../webs.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../websda.o: ../webs.h ../wsIntrn.h ../websda.h ../uemf.h
../websuemf.o: ../websuemf.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../websSSL.o: ../websSSL.c ../websSSL.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../matrixSSLSocket.o: ../matrixSSLSocket.c ../matrixSSLSocket.h
main.o: main.c ../wsIntrn.h ../webs.h ../ej.h ../ejIntrn.h ../uemf.h
#
# Transition rules (add -o to put object in right directory)
#
.c.o:
$(CC) -c -o $@ $(DFLAGS) $(CFLAGS) $(IFLAGS) $<