makefile的语法格式:
$(函数名[空格]参数列表1,参数列表2,参数列表3,....)
或者
${函数名[空格]参数列表1,参数列表2,参数列表3,....}
我建议呢使用第一种,这个可以把变量调用和函数调用区分开。
根据学习,Makefile中我认为常用的函数分这么几类:
1,字符串操作函数
这类函数主要应用在前缀和后缀名的提取,前缀名后缀名修改,前缀名后缀名修改等
1> $(subst from,to,字符串)
字符串替换,把<字符串>中的字符串,换成中的字符串
2>$(patsubst PATTERN,replacement,text )
查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式pattern,如果匹配的话,则以replacement替换。这里,pattern可以包括通配符“%”,表示任意长度的字串。如果replacement中也包含“%”,那么, replacement中的这个“%”将是pattern中的那个“%”所代表的字串。(可以用“\” 来转义,以“\%”来表示真实含义的“%”字符)
3>其他字符串操作,如合并啊,查找啊啥的。目前不用所以不细说。
2,文件操作函数
这类函数主要是去目标文件的目录结构,或者在把目标文件从目录结构中拿出来。具体取到什么位置,需要自己去验证下
1>$(dir name...)
取name文件的路径
2>$(notdir name)
取最后一个/之后的部分
3>取文件前缀啊,后缀啊等等,不签不用暂不细说
3,其他有用函数
这类函数主要是辅助前两种函数的操作
1>$(wildcard PATTERN)
函数名称:获取匹配模式文件名函数—wildcard
函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。 函数说明:“PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。
2>$(shell 符合shell语法的语句)
主要目的是使我们可以在makefile文件里执行shell语句。
下面举例,把之前的makefile再进行修改:
原料:main.c printfun.c methed.c 及其.h文件
Makefile文件:
target=main
src=$(wildcard *.c)
obj=$(patsubst %.c,%.o,${src})
${target}:${obj}
gcc -o ${target} ${obj}
all:
echo "${src}"
echo "${obj}"
clean:
rm -rf *.o ${target}
第二行的意思是:把当前目录下所有.c文件赋给src,那么变量src中就是当前目录下的所有.c文件。
第三行的意思是把src中的.c文件全部换个.o的名字并且把值附给obj,那么变量obj中就全部都是前缀与当前目录下.c名字相同的.o文件名。
运行结果:
[root@bogon c3]# make all
echo "printfun.c main.c methed.c "
printfun.c main.c methed.c
echo "printfun.o main.o methed.o"
printfun.o main.o methed.o
[root@bogon c3]# make
cc -c -o printfun.o printfun.c
cc -c -o main.o main.c
cc -c -o methed.o methed.c
gcc -o main printfun.o main.o methed.o
显示当前文件夹下内容:
-rwxr-xr-x. 1 root root 8570 Mar 17 18:39 main
-rw-r--r--. 1 root root 54 Mar 17 18:25 main.c
-rw-r--r--. 1 root root 61 Mar 15 18:59 main.h
-rw-r--r--. 1 root root 1488 Mar 17 18:39 main.o
-rw-r--r--. 1 root root 170 Mar 17 18:34 Makefile
-rw-r--r--. 1 root root 0 Mar 17 18:21 methed.c
-rw-r--r--. 1 root root 53 Mar 15 18:45 methed.h
-rw-r--r--. 1 root root 938 Mar 17 18:39 methed.o
-rw-r--r--. 1 root root 0 Mar 17 18:21 printfun.c
-rw-r--r--. 1 root root 35 Mar 14 12:25 printfun.h
-rw-r--r--. 1 root root 940 Mar 17 18:39 printfun.o
-rw-r--r--. 1 root root 506 Mar 15 20:41 tags
那么,现在我们写的makefile文件已经有了基本的自动化功能了:
1,我们现在再往当前编译目录下任意增加.c文件都不需要修改makefile了。
2,相对来说这个makefile已经比较简洁了。
3,我相信至此,别人写的一些简单的makefile我们已经能读懂了。
4,但是对于稍微有点洁癖的人来说,编译目录下这么多.c 啊.o啊.h啊,好烦人呢。那么怎么办呢,当然是要把.h,.c,.o分到不同的目录下了。。但是如果你这么做了,我们的makefile就编译不出来东西了。
5,怎么办啊,下次研究。。。。