鹰之歌

既然你崇拜鹰,就要像鹰一样翱翔天际,俯瞰大地。哪怕会摔的粉身碎骨。

导航

GoAhead Linux目录下Makefile注释

#

# 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) $<

 

posted on 2011-05-29 18:36  鹰之歌  阅读(1220)  评论(0编辑  收藏  举报