Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1181485
  • 博文数量: 181
  • 博客积分: 4968
  • 博客等级: 上校
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-13 21:52
文章分类

全部博文(181)

文章存档

2015年(2)

2013年(6)

2012年(22)

2011年(41)

2010年(27)

2009年(51)

2008年(32)

我的朋友

分类: LINUX

2009-02-10 13:10:25

今天看书敲例子,编写了在一个文件夹中多个独立程序的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可以执行分号分割的多条命令,因此有了分号后都不会出错,否则有些情况下会出错。
阅读(7146) | 评论(0) | 转发(0) |
0

上一篇:Makefile常用函数表

下一篇:Linux进程间通信

给主人留下些什么吧!~~