免费注册 查看新帖 |

Chinaunix

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

Makefile入门之二 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-10 02:11 |只看该作者 |倒序浏览
Make和makefile综述


  • Makefile包含的内容
  • Makefile的文件名
  • 引用其他的Makefile
  • 环境变量Makefiles
  • make的工作方式


包含有:显示规则、隐晦规则、文件指示、变量定义、注释。
显示规则 如何生成一个或多个目标文件
隐晦规则 自动推导
变量定义 前面有说明
文件指示 包括三个部分,第一是在一个makefile中引用另一个makefile,就象C中的include一样;第二是根据某些情况指定makefile中的有效部分,就象C语言中的段编译if#if;还有就是定义一个多行的命令.
注释 只有行注释 用"#".
值得注意的是,在makefile中的命令,必须用开头.

默认情况下,make命令会在当前目录下顺序找寻文件名为"GNUmakefile"、“makefile”“Makefile”的文件。但是,推荐使用“Makefile”。
当然也可以使用别的文件名来写Makefile,如“Makelinux”"MakeSolaris" "MakeAIX"等。
如果要指定特定的Makefile,你可以使用make的-f和-file参数,如:make -f MakeLinux 或MakeAIX。

引用其他的Makefile
在Makefile使用include关键字可以把别的Makefile包含进来,这很象C语言的#include。被包含的文件会按照原样展开在当前文件的包含位置,include的语法是:include
filename可以是当前操作系统shell的文件模式(可以仅含路径和统配符)

环境变量MAKEFILES
尽量不要用!!!

makefile书写规则

规则举例
规则的语法
在规则中使用统配符
文件搜索
伪目标
多目标
静态模式
自动生成依赖性

规则语法
target:prerequisites:command
或另起一行command
在规则中使用统配符
clean:
rm -f *.o
还有一个例子:
objects=*.o
这个例子表示,统配符同样可以用在变量中,并不是说明[.o]会合并.makefile中的变量其实就是C/C++中的宏.如果要想统配符在变量中展开,也就是让objects的值是所有[.o]的文件名的集合,那么可以这样表示
object:=${widekard*.o}
由关键字"widekard"指出.

文件搜索
VPATH=???
此部分很少用.
伪目标
为什么叫伪目标?没有相应的命令来生成目标.
如:clean:
rm -f *.o
我们并不生成"clean"这个文件,伪目标并不是一个文件,只是一个标签,由于此所以make无法生成它的依赖关系和决定它是否执行.我们只有通过显示的指明这个目标才能让其生效.
当然,为了避免和文件重名,我们可以使用一个特殊的标记"PHONY"来指明一个目标是伪目标,向make说明,不管是否有这个文件,这个目标就是伪目标.
PHONY:clean
clean:
rm -f *.o
多目标
Makefile的规则的目标不止一个,支持多目标.有共同的依赖并且生成规则相同."$@"表示目标规则中所有目标的集合.
静态模式
它可以更加容易的定义多目标的规则,可以让我们的规则变的更加有弹性和灵活,语法:
例子:
objects=foo.o bar.o
all:${objects}
${object}%.o%.c
${cc}-c${cflags}$
自动生成依赖性
利用GCC -M main.c
makefile命令使用
显示命令@echo 屏蔽命令
makefile命令使用

显示命令
命令执行
命令出错
嵌套执行make
定义命令包
makefile使用变量
变量的基础
变量中的变量
变量高级用法
追加变量值
override指示符
多行变量
环境变量
目标变量
模式变量
makefile使用变量-重点
定义:
左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处
左侧是变量,右侧是变量的值,右侧变量的值需要定义在之前,可以避免嵌套定义
foo?=bar 如果foo没有被定义过,那么变量foo的值就是bar,如果foo先前被定义过,那么这条语句将什么都不做.
+=符给变量追加值
objects=main.o foo.o bar.o utils.o
objects+=another.o
引用:
$(变量名)
makefile使用条件判断
条件关键字
ifeq
ifneq
ifdef
ifndef
语法
endif
或者:
else
endif

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP