(1) wildcard函数
作用是查找指定目录下指定类型的文件,并最终返回一个环境变量,需要用$取值赋值给另一个环境变量!该函数只有一个参数,如取出当前目录下的所有.c文件,并赋值给allc普通变量: allc=$(wildcard ./*.c)。
(2) patsubst函数
作用是更换文件的后缀格式,共有三个参数。如将allc的所有.c的文件更换为.o的文件: allo=$(patsubst %.c,%.o,$(allc))。
注意以上两个函数的返回值都为变量值,都必须用$取值。makefile中的所有函数都必须要有返回值。
allo1=$(patsubst %.c,./bin/%.o,$(allc)) 将替换后生成的.o文件都存放在./bin/中,指出路径。
(3)不带依赖条件的规则
对于没有依赖条件,只有目标和命令的规则,说明为了实现该目标,不需要任何依赖条件,直接执行命令即可。makefile直接执行命令。下面举例说明: 再次强调一点,每一行的命令前必须有一个tab缩进,这是makefile识别命令的判断符号。
clean:
-mkdir /aa //加-表示,该条命令执行失败了,也会继续向下执行下一条命令
rm -f $(allo) $(target)
hello: //举例说明,这一项在以后中不要
echo "hello, makefile"
[root@localhost src]# make clean //只是执行clea后面的命令即可
[root@localhost src]# make hello //只是执行hello后面的命令即可
如果在makefile文件目录中有一个以clean或hello名字为名的文件(即相同了),则make clean和make hello不会执行命令,需要进行伪目标声明,即:
.PHONY:clean //伪目标的声明
clean:
-mkdir /aa //加-表示,该条命令执行失败了,也会继续向下执行下一条命令
rm -f $(allo) $(target)
.PHONY:hello //伪目标的声明
hello: //举例说明,这一项在以后中不要
echo "hello, makefile"
最后,如果makefile文件不是以makefile或Makefile为名字,需要加上-f参数:make -f filename
下面给出之前例子makefile书写的最终版,即把一个规则,两个变量和三个函数结合:
[root@localhost src]# ls
a add.c div.c main.c makefile mul.c sub.c
[root@localhost src]# vim zsxmakefile
allc=$(wildcard ./*.c) //获取所有的.c文件
obj=$(patsubst %.c,%.o,$(allc)) //更换为.o文件,取得目标文件
target=zsx
$(target):$(obj)
$(CC) -ggdb3 $^ -o $@
main.o:main.c
$(CC) -pedantic -Wall -pipe -c $^ -o $@ -I ../include
%.o:%.c
$(CC) -pedantic -Wall -pipe -c $< -o $@
.PHONY:clean1 //伪目标的声明
clean1:
-mkdir b //-代表该条命令执行失败了,也会继续向下执行下一条命令
rm -f $(obj) $(target)
.PHONY:hello //伪目标的声明
hello:
echo "hello, makefile"
[root@localhost src]# rm -f makefile
[root@localhost src]# ls
a add.c div.c main.c mul.c sub.c zsxmakefile
[root@localhost src]# make -f zsxmakefile //此时需要加-f参数
cc -pedantic -Wall -pipe -c mul.c -o mul.o
cc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
cc -pedantic -Wall -pipe -c add.c -o add.o
cc -pedantic -Wall -pipe -c div.c -o div.o
cc -pedantic -Wall -pipe -c sub.c -o sub.o
cc -ggdb3 mul.o main.o add.o div.o sub.o -o zsx
[root@localhost src]# ls
a add.c add.o div.c div.o main.c main.o mul.c mul.o sub.c sub.o zsx zsxmakefile
[root@localhost src]# make -f zsxmakefile clean1 //注意使用方法 如果文件名字是makefile或Makefile,则直接为make clean1
mkdir b
rm -f ./mul.o ./main.o ./add.o ./div.o ./sub.o zsx
[root@localhost src]# ls
a add.c b div.c main.c mul.c sub.c zsxmakefile
[root@localhost src]# make -f zsxmakefile hello //注意使用方法
echo "hello, makefile"
hello, makefile
//注意区分make、make clean、make hello的作用