linux for循环编译不同多个文件,编译多个独立程序的Makefile的一种写法

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

阅读(6198) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值