Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2367802
  • 博文数量: 145
  • 博客积分: 8668
  • 博客等级: 中将
  • 技术积分: 3922
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-09 21:21
个人简介

work hard

文章分类

全部博文(145)

文章存档

2016年(1)

2015年(1)

2014年(1)

2013年(12)

2012年(3)

2011年(9)

2010年(34)

2009年(55)

2008年(20)

2007年(9)

分类: LINUX

2010-01-28 14:11:06

今天看书敲例子,编写了在一个文件夹中多个独立程序的Makefile文件。
其中我的文件夹下有如下文件:
abort.c  child.c  execve.c  getname.c  pripds.c  system.c  waiter.c
现在想通过写一个Makefile来编译这些文件,然后通过make clean清楚所有可执行程序。
根据这个需求写了如下Makefile。

SOURCES:=$(wildcard *.c)
TARGETLIST:=$(patsubst %.c,%,$(SOURCES))

all:${TARGETLIST}

.PHONY:clean

clean:
    $(foreach TARGET,${TARGETLIST},rm -f $(TARGET);)

wildcard是通配符,利用它可以取得所有.c结尾的源文件,SOURCES是这些源文件以空格分割的文件名列表。
TARGETLIST通过模式替换将SOURCES中.c去掉,生成一个目标文件名列表。
all是makefile中的第一个目标,因此在执行make时调用,由于它依赖TARGETLIST,因此make会逐一检查依赖中的文件是否存在以及是否最新,如果不是就调用默认规则进行编译。
PHONY表明clean是一个伪目标,所以clean可以没有依赖。

foreach是makefile中的函数,原型为:$(foreach VAR,LIST,TEXT)。它是一个循环函数。类似于Linux的shell中的循环(for语句)。这个函数的工作过程是这样的:如果必要(存在变 量或者函数的引用),首先展开变量“VAR”和“LIST”;而表达式“TEXT”中的变量引用不被展开。执行时把“LIST”中使 用空格分割的单词依次取出赋值给变量“VAR”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为空时结束)。“TEXT”中的变量 或者函数引用在执行时才被展开,因此如果在“TEXT”中存在对“VAR”的引用,那么“VAR”的值在每一次展开式将会到的不同的值。返回值:空格分割 的多次表达式“TEXT”的计算的结果。

rm -f $(TARGET);中的分号也可以不要,但是由于shell可以执行分号分割的多条命令,因此有了分号后都不会出错,否则有些情况下会出错。
阅读(3747) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

godbach2011-11-01 15:53:03

bjthemost: 给个 完整的makefile哦.....
上面的几行代码就是 Makefile 的内容

bjthemost2011-10-30 03:33:18

给个 完整的makefile哦