当前位置: 主页 > 操作系统 > FreeBSD > freebsd Makefile帮助中文说明

freebsd Makefile帮助中文说明

时间:2010-4-13来源:互联网 点击:

2.6 函数 (Functions)
makefile 里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函 数名,空格后跟一列由逗号分隔的参数,最后 用关括号结束。例如,在 GNU Make 里 有一个叫 ‘wildcard‘ 的函 数,它有一个参数,功能是展开成一列所有符合由其参数 描述的文 件名,文件间以空格间隔。你可以像下面所示使用这个命令:

SOURCES = $(wildcard *.c)

这行会产生一个所有以 ‘.c‘ 结尾的文件的列表,然后存入变量 SOURCES 里。当然你不需要一定要把结果存入一个变量。另一个有用的函数是 patsubst ( patten substitude, 匹配替 换的缩写)函数。它 需要3个参数——第一个是一个需要匹配的 式样,第二个表示用什么来替换它,第三 个是一个需要被处理的 由空格分隔的字列。例如,处理那个经过上面定义后的变量,

OBJS = $(patsubst %.c,%.o,$(SOURCES)) 这行将处理所有在 SOURCES 字列中的字(一列文件名),如果它的 结尾是 ‘.c‘ ,就 用 ‘.o‘ 把 ‘.c‘ 取代。注意这里的 % 符号将匹 配一个或多个字符,而它每次所匹配 的字串叫做一个‘柄’(stem) 。 在第二个参数里, % 被解读成用第一参数所匹配的 那个柄。
2.7 一个比较有效的 makefile
利用我们现在所学的,我们可以建立一个相当有效的 makefile 。 这个 makefile 可 以完成大部分我们需要的依靠检查,不用做太大 的改变就可直接用在大多数的项目里。首先我们需要一个基本的 makefile 来建我们的程序。我们可以让 它搜索当前目录,找到源码文件,并且假设它们都是属于我们的项 目的,放进一个叫 SOURCES 的变量。 这里如果也包含所有的 *.cc 文件,也许会更保险,因为源码文件可能是 C++ 码的。 SOURCES = $(wildcard *.c *.cc) 利用 patsubst ,我们可以由源码文件名产生目标文件名,我们需 要编译出这些目标 文件。如果我们的源码文件既有 .c 文件,也有 .cc 文件,我们需要使用相嵌的 patsubst 函数呼叫:

OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))

最里面一层 patsubst 的呼叫会对 .cc 文件进行后缀替代,产生的结 果被外层的 patsubst 呼叫处理,进行对 .c 文件后缀的替代。现在我们可以设立一个规则来建可执行文件:

myprog : $(OBJS)
gcc -o myprog $(OBJS)

进一步的规则不一定需要, gcc 已经知道怎么去生成目标文件 (object files) 。下面我们可以设定产生依靠信息的规则:

depends : $(SOURCES)
gcc -M $(SOURCES) > depends

在这里如果一个叫 ‘depends‘ 的文件不存在,或任何一个源码文件 比一个已存在的 depends 文件新,那么一个 depends 文件会被生 成。depends 文件将会含有由 gcc 产生的关于源码文件的规则(注 意 -M 开关)。现在我们要让 make 把这些规则当做 makefile 档 的一部分。这里使用的技巧很像 C 语言中的 #include 系统——我 们要 求 make 把这个文件 include 到 makefile 里,如下:

include depends

GNU Make 看到这个,检查 ‘depends‘ 目的是否更新了,如果没有, 它用我们给它的命令重新产生 depends档。然后它会把这组(新) 规则包含进来,继续处理最终目标 ‘myprog‘ 。当看到有关 myprog 的规则,它会检查所有的目标文件是否更新——利用 depends 文件 里的规则,当然这些规则现在已经是更新过的了。
这个系统其实效率很低,因为每当一个源码文件被改动,所有的源码 文件都要被预处 理以产生一个新的‘depends‘ 文件。而且它也不是 100% 的安全,这是因为当一个 header 档被改动,依靠信息并不会 被更新。但就基本工作来说,它也算相当有用的 了。
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‘ 这个错误信息,这没 # 什么大碍。如果你不是用 DOS ,把它设定成一个删文件而不废话的命令。 (其实这一步在 UNIX 类的系统上是多余的,只是方便 DOS 用户。 UNIX 用户可以删除这5行命令。)

站长资讯网
.
分页: [1] [2] [3] [4]
TAG: freebsd makefile
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言