关闭

编译多个独立程序的Makefile的一种写法

1196人阅读 评论(0) 收藏 举报
今天看书敲例子,编写了在一个文件夹中多个独立程序的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:
    $(foreachTARGET,${TARGETLIST},rm -f $(TARGET);)

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

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

rm -f$(TARGET);中的分号也可以不要,但是由于shell可以执行分号分割的多条命令,因此有了分号后都不会出错,否则有些情况下会出错。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:146784次
    • 积分:1835
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:96篇
    • 译文:0篇
    • 评论:18条
    最新评论