makefile之.PHONY

1. 版本说明

首先说一下我用的make版本:

GNU Make 4.2.1

2. 无PHONY无clean的情况(无clean指当前目录下不存在clean文件)

文件名:makefile (听说M必须大写,我用小写也可以执行成功)

文件内容:

且目录下只有这一个文件

make 和 mak clean的效果一样 (这两个命令有什么区别?待查明后补充)

3. 术语补充

这里补充一个makefile的术语:规则

规则:用于说明如何生成一个或多个目标文件

规则的格式:

targets:prerequisites

    command(必须是一个tab键,不能多也不能少,但是可以设置一个tab=4个空格)

对应上面的makefile

targets为clean,  前置依赖为空, command为rm -rf test

 4. 无PHONY有clean的情况

提示clean是最新的,为什么会出现这条提示呢?

        因为targets无前置依赖的时候,总是认为targets为最新。

5. 有PHONY,有clean的情况

当我们make生成目标文件和一堆临时文件后,想清理这些文件,这么写make,明显不会删除。所以,PHONY来了,一旦声明为PHONY的前置依赖,那么,make 或 make clean将忽略targets是否存在,直接运行commands。

1. 当前目录下存在clean,和test文件。 

2. 当声明.PHONY:clean后,忽略clean文件的存在,直接执行命令

3. 所以test文件被删除了。

        

 补充:

一、make和make clean的区别

make
根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

上面举的例子不是一个正常的编译makefile,下面以一个正常的makefile举例。

test.c文件内容

#include<stdio.h>
void main()
{
    printf("hello world/n");
}

makefile内容:

ALL:test

test.o:test.c
        gcc -c test.c -o test.o

test:test.o
        gcc test.o -o test

clean:
        rm -rf test test.o

 可以看到,执行make后,makefile的前3个规则都执行了,make clean后,最后一个规则执行了。

此时,有2个问题:

1. 为什么make的时候,clean规则没有执行

2. clean规则可以改成别的名字吗,此时,还是执行make clean 还是 make 别的名字。

先来看第二个问题:

makefile内容:

ALL:test

test.o:test.c
        gcc -c test.c -o test.o

test:test.o
        gcc test.o -o test

aaa:
        rm -rf test test.o

make还是执行前3个规则,当clean改名后,再执行make clean是没有效果的,也就是说,make clean的clean是规则名,而不是约定的名称。再执行make aaa,则完成临时文件的清理。 即,我们也可以执行make test.o 或者make test,都是可以执行的。

此时,又产生了一个问题:

ALL规则没有command, clean 规则没有前置依赖, 在执行时,会怎么样?

这里再补充一个概念,默认目标。第一行的ALL就是默认目标。在这个脚本里,ALL同样还是一个伪目标,所以不会生成ALL文件,但是ALL的依赖文件会生成。

为什么clean没有执行?

当clean非第一行时,因为其没有依赖文件,所以,默认其为最新的,不需要编译,就无需执行。只能通过手动触发来执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值