参考文章:
makefile中wildcard的用法:http://blog.csdn.net/liangkaiming/article/details/6267357
makefile函数集锦:http://blog.csdn.net/turkeyzhou/article/details/8612841
一个通用的Makefile:http://www.cnblogs.com/lidabo/p/4521123.html
makefile使用总结: http://www.cnblogs.com/wang_yb/p/3990952.html
1、常用变量
1)自动变量
$@ 规则的目标所对应的文件名
$< 规则中的第一个相关文件名
$^ 规则中所有相关文件的列表,以空格分割
$? 规则中日期新于目标的所有相关文件的列表,以空格分割
$(@D) 目标文件的目录部分
$(@F) 目标文件的文件名部分
2)预定义变量
AR 归档维护程序,默认值=ar
CPP c预处理程序,默认值=cpp
CC c编译程序,默认值=cc
AS 汇编程序,默认值=as
RM 文件删除程序,默认值=rm -f
ARFLAGS 传给归档维护程序的标志,默认值=rv
CPPFLAGS 传给c预处理程序的标志,无默认值
CFLAGS 传给c编译程序的标志,无默认值
ASFLAGS 传给汇编程序的标志,无默认值
LDFLAGS 传给链接程序(ld)的标志,无默认值
-c 只编译,不链接
-C 告诉预处理器不要丢弃注释,配合-E使用
-E 预处理后立即停止,不进行编译,预处理后的代码默认送往标准输出
-S 编译后立即停止,不生成目标文件.o,输出汇编文件
-P 告诉预处理器不要产生#line命令
-s --slient :禁止命令显示
-n --just-print : 只显示命令,不执行
-i --ignore-errors : 忽略命令错误
-k --keep-going : 忽略某个规则错误,继续执行其他规则
-w --print-directory : 输出信息看到进入或者离开当前目录
-e : 使用环境变量
-f --file : 指定Makefile文件
-t --touch : 更新目标文件时间,但不更新目标文件,假装编译过目标,但不是真正的编译目标,只是把目标变成编译过的状态
有的时候我们不想执行Makefile规则,只是想检查下命令或者执行序列,(用于调试) 可以使用以下参数:
-n --just-print --dry-run --recon
-q --question : 找目标,如果目标存在不打印,若不存在,打印一条出错信息
-W <file>
--what-if=<file>
--assume-new=<file>
--new-file=<file> : 需要指定一个文件(通常是源文件或者依赖文件),和-n参数一起使用,用来查看依赖文件所发生的规则命令
和-p -v参数一起,来输出makefile被执行时的信息
-b -m 忽略和其他版本make的兼容性
-B --always-make :认为所有目标都更新
-C <dir> --directory=<dir> : 指定读取makefile的目录
-debug[=<options>] : 输出make的调试信息级别
-d : 等同于 --debug=a
-e --environment-overrides : 指明环境变量的值覆盖makefile中定义的变量的值
-j [num] --jobs[=num] : 同时运行命令的个数(多核并行)
-p --print-data-base : 输出makefile中所有的数据,包括规则和变量
-q --question : 不运行也不输出,仅仅检查目标是否需要更新,0需要更新,2错误发生
-r --no-builtin-rules : 禁止make使用任何隐含规则
-R --no-builtin-variabes : 禁止make使用任何作用于变量上的隐含规则
【函数】
wildcard : 获取工作目录下所有c文件列表
subst : 字符串替换
patsubst : 模式字符串替换
strip : 去空格
findstring : 查找字符串
filter : 过滤,保留符合格式的字符串
filter-out : 过滤,保留不符合格式的字符串
sort : 升序 排序
word : 去字符串中n个单词
wordlist :取单词串
words : 统计单词个数
firstword : 去首字母
dir : 从文件名中取目录
notdir :从文件名中取出非目录部分
suffix : 取后缀
basename : 取前缀
addsuffix : 加后缀
addprefix : 加前缀
join : 连接单词
foreach : 循环
call : 用来创建新的参数化函数
shell : 新生成一个shell程序来执行命令
【隐含规则】
C的隐含规则:$(CC) -c $(CPPFLAGS) $(CFLAGS)
C++隐含规则: $(CXX) -c $(CPPFLAGS) $(CFLAGS)
ARFLAGS : 打包程序AR命令参数,默认值是rv
CFLAGS : c语言编译器参数
CXXFLAGS : c++编译器参数
CPPFLAGS : c预处理器参数
LDFLAGS : 链接器参数
安装交叉编译工具链
1)获取工具链的绝对路径,例如:/opt/buildroot-gcc342/bin
2)修改环境变量PATH的值
$ cd ~
$ vim .bashrc
在最后一行中添加:
export PATH=$PATH: /opt/buildroot-gcc342/bin
保存退出
执行 $source ~/.bashrc
或者
$vim /etc/profile
添加:
export PATH=$PATH: /opt/buildroot-gcc342/bin
保存退出
最后执行:source /etc/profile
执行 $source ~/.bashrc
添加环境变量,例如:
1)对linux下所有用户永久有效
vim /etc/profile文件,添加CLASSPATH变量
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
执行 #source /etc/profile后生效
2)对单个用户永久有效
vim /home/用户/.bash.profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
执行 #source /home/用户/.bash.profile后生效