makefile知识点
小狼@http://blog.csdn.net/xiaolangyangyang
一、makefile函数的使用:
函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:
$(<function> <arguments>)
或是
${<function> <arguments>}
二、makefile常用函数
1.字符串处理函数:
subst:字符串替换函数
patsubst:模式字符串替换函数
strip:去掉空格函数
findstring:查找字符串函数
filter:过滤函数
filter-out:反过滤函数
sort:排序函数
word:取单词函数
wordlist:取单词串函数
words:单词个数统计函数
firstword:首单词函数
2.文件名操作函数:
dir:取目录函数
notdir:取文件函数
suffix:取后缀函数
basename:取前缀函数
addsuffix:加后缀函数
addprefix:加前缀函数
join:连接函数
3.foreach函数:循环函数
4.if函数:条件判断函数
5.call函数:表达式执行函数
6.origin函数:得出变量来历的函数
7.shell函数:执行shell命令的函数
三、makefile隐含规则使用的变量
1.主要的预定义变量
$@:目标文件
$%:当规则的目标文件是一个静态库文件时,代表静态的一个成员名
$<:第一个依赖文件
$?:所有比目标文件更新的依赖文件列表
$^:所有的依赖文件
$+:类似“$^”,但是它保留了依赖文件中重复出现的文件
$*:在静态规则和静态模式规则中,代表“茎”
2.关于命令的变量:
AR:函数库打包程序,默认命令是"ar"
AS:汇编语言编译程序,默认命令是”as“
CC:C语言编译程序,默认命令是”cc“
CXX:C++语言编译程序,默认命令是”g++“
CO:从RCS文件中扩展文件程序,默认命令是”co“
CPP:C程序的预处理器,默认命令是”$(CC) -E“
FC:Fortran和Ratfor的编译器和预处理程序,默认命令是”f77“
GET:从SCCS文件中扩展文件的程序,默认命令是”get“
LEX:lex方法分析器程序,默认命令是”lex“
PC:Pascal语言编译程序,默认命令是”pc“
YACC:yacc文法分析器,默认命令是”yacc“
YACCR:yacc文法分析器,默认命令是”yacc -r“
MAKEINFO:转换texinfo源文件(.texi)到info文件程序,默认命令是”makeinfo“
TEX:从tex源文件创建TeX DVI文件的程序,默认命令是”tex“
TEXI2DVI:从Texinfo源文件创建Tex DVI文件的程序,默认命令是“texi2dvi”
WEAVE:转换Web到TeX的程序,默认命令是“weave”
CWEAVE:转换C Web到TeX的程序,默认命令是“cweave”
TANGLE:转换Web到Pascal语言的程序,默认命令是“tangle”
CTANGLE:转换C Web到C语言的程序,默认命令是“ctangle”
RM:删除文件命令,默认命令是“rm -f”
3.关于命令参数的变量:
ARFLAGS:函数库打包程序AR命令的参数,默认值是“rv”
ASFLAGS:汇编语言编译器参数
CFLAGS:C语言编译器参数
CXXFLAGS:C++语言编译器参数
COFLAGS:RCS命令参数
CPPFLAGS:C预处理器参数
FFLAGS:Fortran语言编译器参数
GFLAGS:SCCS“get”程序参数
LDFLAGS:链接器参数
LFLAGS:lex文法分析器参数
PFLAGS:Pascal语言编译器参数
RFLAGS:Ratfor程序的Fortran编译器参数
YFLAGS:yacc文法分析器参数
四、makefile特殊变量
vpath/VPATH
五、makefile的后缀规则和模式规则
后缀规则(Suffix Rule):后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件(例如.c文件)转换为具有另外一种后缀的文件(例如.o文件)的方法。每个后缀规则以两个成对出现的后缀名定义,例如:将.c文件转换为.o文件的后缀规则可定义为:
.c.o:
$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<
模式规则(Pattern Rule):这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个%号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个.c文件转换为.o文件:
%.c:%.o
$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $@ $<
六、自动生成makefile工具:autotools
例解autoconf和automake生成makefile文件
使用autotools生成包含多文件的makefile
autotools生成Makefile
1.autotools工具集(使用which查看):
aclocal,autoscan,autoconf,autoheader,automake,libtools
2.使用autotools自动生成makefile:
a.利用文本编辑器创建项目源文件
b.使用autoscan生成configure.scan
c.编辑configure.scan,修改相关内容,并将其重命名为configure.in
d.使用aclocal生成aclocal.m4
e.使用autoconf生成configure
f.使用autoheader生成config.h.in
g.编辑makefile.am(手动创建)
h.使用automake生成makefile.in(将makefile.am转换为makefile.in)
i.使用configure生成makefile(将makefile.in转换为makefile)
j.使用make生成可执行程序
k.使用make install安装可执行程序
l.使用make dist生成可执行程序压缩包
m.解压可执行程序压缩包
n.执行可执行程序
3.使用autotools自动生成makefile实例
main.c
#include <stdio.h> int main(void) { printf("main start!\n"); print(); return 0; }
hello.c
#include "hello.h" void print(void) { char buf[32] = "123"; strcat(buf, "456"); printf("%s\n", buf); printf("hello,world!\n"); return; }
hello.h
#ifndef __HELLO_H__ #define __HELLO_H__ #include <stdio.h> #include <string.h> void print(void); #endif
1. # autoscan
2. # gedit configure.scan
++ AM_INIT_AUTOMAKE(main, 1.0)
++ AC_OUTPUT(Makefile)
# mv configure.scan configure.in
3. # aclocal
4. # autoconf
5. # autoheader
6. # gedit Makefile.am
++ AUTOMAKE_OPTIONS= foreign
++ bin_PROGRAMS= main
++ main_SOURCES= main.c hello.c
7. # automake --add-missing
8. # ./configure
9. # make
七、其他
1.PHONY:伪目标
2.SUFFIXES:当前makefile内支持文件后缀的类型列表
3.隐含规则:隐含规则
4.隐含规则链:
INTERMEDIATE/SECONDARY/PRECIOUS
5.相关连接:Makefile的学习笔记