一、make常见参数(目标)
make all 编译所有目标;
make -j8 使用8个核心编译目标
make install 安装已编译的程序;
make uninstall 卸载已编译的程序;
make clean 删除由make命令产生的文件,通常删除目标文件.o;
make check 测试刚编译的软件;
make dist 重新打包packname-version.tar.gz
二、Makefile文件及其语法规则
- Makefile文件告诉make命令如何编译和链接程序;
1.make如何工作
先在当前目录下找“Makefile”或“makefile”文件,若找到就查找文件中第一个目标文件.o;
若目标文件不存在,根据依赖关系查找.s文件;
若.s文件不存在,根据依赖关系查找.i文件;
若.i文件不存在,根据依赖关系查找.c文件;此时.c文件一定存在,于是生成一个.o文件,再去执行;2.Makefile文件
Makefile文件由一系列规则rules构成,每条规则形式如下:
<target>:<prerequisites> #冒号前为目标(必须的),冒号后为前置条件(可选的);
[Tab]<command> #由Tab键起首,后接命令(可选); 前置条件和后接命令至少存在一个;
#目标target:可以是文件名,指明make命令要构建的对象;也可以是某个操作的名称(伪目标);
eg:
clear:
rm *.o #一个实例,目标文clean,命令是rm *.o;执行make clean命令,实现对象文件的删除;
前置条件prerequisites:前置条件通常由一组文件名,用空格隔开;指定目标是否构建的判断标准;
eg:
result.txt:source.txt
cp source.txt result.txt
#当前路径下source.txt存在,make result.txt可正常执行;否则生成source.txt;
eg:
source.txt:
echo "a source file." > source.txt
#没有前置条件,只要该文件不存在,每次指向make source.txt命令都会生成该文件;
命令commands:表示如何更新目标文件,由一行或多行shell命令组成;每一行命令前都要有一个Tab键;上行命令与下行无关;
3.Makefile语法:
- # 注释
- echoing 正常情况下,make打印每条命令,称回声;再命令前加@,关闭回声,即只输出命令的执行结果,出错则停止执行;
- % make命令允许对文件名进行类似正则运算的匹配,主要用到%;
- $() 调用变量,将变量名放如$();
- 赋值运算符:
= 递归展开赋值; 可以使用后面的变量;
:= 直接赋值,不会递归展开; 使得前面的变量不呢个使用后面的变量;
?= 若未初始化,则赋值; 若初始化,则不会赋值;
+= 将值追加到现有内容末尾; - 判断语句:
<条件语句>
<条件为真,指向程序段>
else
<执行内容>
endif
ifeq比较两个参数值是否相等; ifneq比较两个参数值是否不等; ifdef判断变量是否有值; ifndef判断变量是否无值; - 循环:all目标后的命令是shell命令,引用shell变量需使用$$作为开头,
LIST= one two three all: for i in $(LIST);do echo $$i; done