免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 943 | 回复: 0
打印 上一主题 下一主题

Makefile的初学 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-14 13:44 |只看该作者 |倒序浏览
先看一段代码,如果能看,就不用往下看了...
EXECUTABLE := mushroom.exe
LIBS := alleg
# Now alter any implicit rules' variables if you like, e.g.:
#
CFLAGS := -g -Wall -O3 -m486
CXXFLAGS := $(CFLAGS)
# You shouldn't need to change anything below this point.
#
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))
#===========================================================


都怪自己没有好好学习C/C++,现在用起来太费事了...自己落下好多的东西都不会,慢慢的从头赶吧,先看看Makefile:

一些设定好的内部变量,它们根据每一个规则内容定义。三个比较有用的变量是$@, $

make有一些叫做隐含规则的内置的规则,这些规则告诉它当你没有给出某些命令的时候, 应该怎么办。

在GNU Make里有一个叫'wildcard'的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔。你可以像下面所示使用这个命令:
SOURCES = $(wildcard *.c)
这行会产生一个所有以'.c'结尾的文件的列表,然后存入变量SOURCES里。当然你不需要一定要把结果存入一个变量。
另一个有用的函数是patsubst(patten substitude, 匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的字列。例如,处理那个经过上面定义后的变量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
这行将处理所有在SOURCES字列中的字(一列文件名),如果它的结尾是'.c',就 用'.o'把'.c'取代。注意这里的%符号将匹配一个或多个字符,而它每次所匹配的字串叫做一个‘柄’(stem)。在第二个参数里, %被解读成用第一参数所匹配的那个柄。
一个比较有效的 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已经知道怎么去生成目标文件(objectfiles)。下面可以设定产生依靠信息的规则:
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档被改动,依靠信息并不会被更新。但就基本工作来说,它也算相当有用的了。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15238/showart_85102.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP