荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (我命由我不由天), 信区: Linux
标  题: GNU make指南[转](五)
发信站: BBS 荔园晨风站 (Wed Jun  7 08:23:33 2000), 转信

【 以下文字转载自 zzt 的信箱 】
【 原文由 zzt.bbs@flanker.uestc.edu.cn 所发表 】
发信人: bclz (依然是不见不散), 信区: Linux
标  题: GNU make指南[转](五)
发信站: 一网深情 (Wed May 26 10:31:50 1999), 转信


   2.8 一个更好的 makefile
   这是一个我为我大多数项目设计的 makefile 。它应该可以不需要修
   改的用在大部分项目里。我主要把它用在 djgpp 上,那是一个 DOS 版的 gcc
   编译器。因此你可以看到执行的命令名、 'alleg' 程序包、 和 RM -F
   变量都反映了这一点。
   === makefile 开始 ===
   ######################################
   #
   # Generic makefile
   #
   # by George Foot
   # email: george.foot@merton.ox.ac.uk
   #
   # Copyright (c) 1997 George Foot
   # All rights reserved.
   # 保留所有版权
   #
   # No warranty, no liability;
   # you use this at your own risk.
   # 没保险,不负责
   # 你要用这个,你自己担风险
   #
   # You are free to modify and
   # distribute this without giving
   # credit to the original author.
   # 你可以随便更改和散发这个文件
   # 而不需要给宰髡呤裁慈儆?
   # (你好意思?)
   #
   ######################################
   ### Customising
   # 用户设定
   #
   # Adjust the following if necessary; EXECUTABLE is the target
   # executable's filename, and LIBS is a list of libraries to link in
   # (e.g. alleg, stdcx, iostr, etc). You can override these on make's
   # command line of course, if you prefer to do it that way.
   #
   # 如果需要,调整下面的东西。 EXECUTABLE 是目标的可执行文件名, LIBS
  # 是一个需要连接的程序包列表(例如 alleg, stdcx, iostr 等等)。当然你
   # 可以在 make 的命令行覆盖它们,你愿意就没问题。
   #
   EXECUTABLE := mushroom.exe
   LIBS := alleg
   # Now alter any implicit rules' variables if you like, e.g.:
   #
   # 现在来改变任何你想改动的隐含规则中的变量,例如
   CFLAGS := -g -Wall -O3 -m486
   CXXFLAGS := $(CFLAGS)
   # The next bit checks to see whether rm is in your djgpp bin
   # directory; if not it uses del instead, but this can cause (harmless)
   # `File not found' error messages. If you are not using DOS at all,
   # set the variable to something which will unquestioningly remove
   # files.
   #
   # 下面先检查你的 djgpp 命令目录下有没有 rm 命令,如果没有,我们使用
   # del 命令来代替,但有可能给我们 'File not found' 这个错误信息,这没
   # 什么大啊H绻悴皇怯? DOS ,把它设定成一个删文件而不废话的命令。
   # (其实这一步在 UNIX 类的系统上是多余的,只是方便 DOS 用户。 UNIX
   # 用户可以删除这5行命令。)
   ifneq ($(wildcard $(DJDIR)/bin/rm.exe),)
   RM-F := rm -f
   else
   RM-F := del
   endif
   # You shouldn't need to change anything below this point.
   #
   # 从这里开始,你应该不需要改动任何东西。(我是不太相信,太NB了!)
   SOURCE := $(wildcard *.c) $(wildcard *.cc)
   OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE)))
   DEPS := $(patsubst %.o,%.d,$(OBJS))
   MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
   MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS))
   \
   $(patsubst %.d,%.cc,$(MISSING_DEPS)))
   CPPFLAGS += -MD
   .PHONY : everything deps objs clean veryclean rebuild
   everything : $(EXECUTABLE)
   deps : $(DEPS)
   objs : $(OBJS)
   clean :
     @$(RM-F) *.o
     @$(RM-F) *.d
   veryclean: clean
     @$(RM-F) $(EXECUTABLE)
   rebuild: veryclean everything
   ifneq ($(MISSING_DEPS),)
   $(MISSING_DEPS) :
     @$(RM-F) $(patsubst %.d,%.o,$@)
   endif
   -include $(DEPS)
   $(EXECUTABLE) : $(OBJS)
     gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))
   === makefile 结束 ===
   有几个地方值得解释一下的。首先,我在定义大部分变量的时候使 用的是 :=
   而不是 = 符号。它的作用是立即把定义中参考到的函
   数和变量都展开了。如果使用 = 的话,函数和变量参考会留在那
   儿,就是说改变一个变量的值会导致其它变量的值也被改变。例 如:
   A = foo
   B = $(A)
   # 现在 B 是 $(A) ,而 $(A) 是 'foo' 。
   A = bar
   # 现在 B 仍然是 $(A) ,但它的值已随着变成 'bar' 了。
   B := $(A)
   # 现在 B 的值是 'bar' 。
   A = foo
   # B 的值仍然是 'bar' 。
   make 会忽略在 # 符号后面直到那一行结束的所有文字。
   ifneg...else...endif 系统是 makefile 里让某一部分码有条件的
   失效/有效的工具。 ifeq 使用两个参数,如果它们相同,它把直 到 else
   (或者 endif ,如果没有 else 的话)的一段码加进 makefile
   里;如果不同,把 else 到 endif 间的一段码加入 makefile (如果有 else
   )。 ifneq 的用法刚好相反。
   'filter-out' 函数使用两个用空格分开的列表,它把第二列表中所
   有的存在于第一列表中的项目删除。我用它来处理 DEPS 列表,把所 有已?-
   存在的项目都删除,而只保留缺少的那些。
   我前面说过, CPPFLAGS 存有用于隐含规则中传给预处理器的一些 旗标。而
   -MD 开关类似 -M 开关,但是从源码文件 .c 或 .cc 中
   形成的文件名是使用后缀 .d 的(这就解释了我形成 DEPS 变量的
   步骤)。DEPS 里提到的文件后来用 '-include' 加进了 makefile
   里,它隐藏了所有因文件不存在而产生的错误信息。
   如果任何依靠文件不存在, makefile 会把相应的 .o 文件从磁碟
   上删除,从而使得 make 重建它。因为 CPPFLAGS 指定了 -MD , 它的 .d
   文件也被重新产生。
   最后, 'addprefix' 函数把第二个参数列表的每一项前缀上第一 个参数值。
   这个 makefile 的那些目的是(这些目的可以传给 make 的命令行
   来直接选用):
   everything:(预设) 更新主要的可执行程序,并且为每一个
   源码文件生成或更新一个 '.d' 文件和一个 '.o' 文件。
   deps: 只是为每一个源码程序产生或更新一个 '.d' 文件。
   objs: 为每一个源码程序生成或更新 '.d' 文件和目标文件。
   clean: 删除所有中介/依靠文件( *.d 和 *.o )。
   veryclean: 做 `clean' 和删除可执行文件。
   rebuild: 先做 `veryclean' 然后 `everything' ;既完全重建。
   除了预设的 everything 以外,这里头只有 clean , veryclean , 和
   rebuild 对用户是有意义的。
   我还没有发现当给出一个源码文件的目录,这个 makefile 会失败的
   情况,除非依靠文件被弄乱。如果这种弄乱的情况发生了,只要输入 `make
   clean' ,所有的目标文件和依靠文件会被删除,问题就应该
   被解决了。当然,最好不要把它们弄乱。如果你发现在某种情况下这 个
   makefile 文件不能完成它的工作,请告诉我,我会把它整好的。
   3 总结
   ~~~~~~~~~~~~~~~
   我希望这篇文章足够详细的解释了多文件项目是怎么运作的,也说明了
   怎样安全而合理的使用它。到此,你应该可以轻松的利用 GNU Make 工
   具来管理小型的项目,如果你完全理解了后面几个部分的话,这些对于
   你来说应该没什么困难。
   GNU Make 是一件强大的工具,虽然它主要是用来建立程序,它还有很多
   别的用处。如果想要知道更多有关这个工具的知识,它的句法,函数,
   和许多别的特点,你应该参看它的参考文件 (info pages, 别的 GNU
   工具也一样,看它们的 info pages. )。
     _________________________________________________________________

   C Scene 官方网站: http://cscene.differnet.org
   C Scene 官方电邮: cscene@mindless.com
     _________________________________________________________________

   This page is Copyright ? 1997 By C Scene. All Rights Reserved
     _________________________________________________________________

--

           执子之手,与子谐老。

※ 来源:.一网深情 bbs.uestc.edu.cn.[FROM: 202.115.16.2]
--
※ 转寄:.一网深情 bbs.uestc.edu.cn.[FROM: 210.39.3.50]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.11]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店