今天看书敲例子,编写了在一个文件夹中多个独立程序的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) |