关于Makefile

关于Makefile

关于Makefile:make命令会根据Makefile中的定义来编译文件,默认情况下会使用当前文件夹下名为Makefile的文件,如果不是这个名字,你可以用make -f make-file-name来手动指定Makefile文件。


测试环境:docker容器

# 运行容器debian 11精简版
docker run -itd --name test-makefile debian:bullseye-slim

# 进入容器
docker exec -it test-makefile bash

# 更新一下apt缓存
apt update

# 安装make和vim命令
apt install -y make vim

# 在/root目录下创建一个test-makefile文件夹
mkdir /root/test-makefile/

# 进入前面创建的test-makefile文件夹
cd /root/test-makefile

# 创建Makefile文件
touch Makefile

vim Makefile打开Makefile,把下面的放进去

default: aa

.DEFAULT:
    echo ".DEFAULT"

aa:
    echo "aa"

bb:
    echo "bb"

instal: bb
    echo "install"

上面保存后我们执行make,输出如下

root@9e061231e5db:~/test-makefile# make
echo "aa"
aa

解释:第一行输出是命令本身,第二行输出是执行命令后的结果。


如果不想输出命令本身,在命令前加个@符号即可

default: aa

.DEFAULT:
    echo ".DEFAULT"

aa:
    @echo "aa"

bb:
    echo "bb"

install: bb
    echo "install"

再次make就显示aa了

root@9e061231e5db:~/test-makefile# make
aa

  • 1、冒号左边的key都是选项,代表make命令后面可加的参数,比如default,你make后面不加default,默认就是make default,而default调用的是aa,所以它会执行aa中的命令;
  • 2、如果default的值在下边找不到,比如default: ab,下边没有key为“ab”的,所以它会默认执行.DEFAULT中的命令。
  • 3、对于make install,后面的install就是Makefile中的一个key,事实上它可以是任何值,只要它在Makefile中有定义,比如make aa就会执行aa中的命令;
  • 4、install后面有个bb,说明它依赖于bb,执行的时候,它会先执行bb对应的命令,再执行它自己的命令。

.PHONY的作用:指定key为假的(假的文件)

Makefile内容如下,执行make clean,一切正常

default: aa

.DEFAULT:
    echo ".DEFAULT"

install:
    echo "install"

clean:
    rm -rf some-files

还是用以上的Makefile,我们创建一个clean文件:touch clean,然后再执行make clean,它会显示

make: ‘clean’ is up to date.

它并没有执行clean对应的清理语句,这是因为make默认都会把make后面的参数认为是文件名,前面没有“clean”文件的时候,它找不到文件之后,就自动会把它当作命令,但是现在有“clean”文件之后,make就会去编译这个“文件”,但其实我们想做的是执行“clean”这个key对应的命令,而不是编译名为“clean”的文件。


使用.PHONY指定“clean”,代表它是“假的文件”,这样执行make clean,它就不会把“clean”当成文件,而是会执行clean对应的命令

default: aa

.DEFAULT:
    echo ".DEFAULT"

install:
    echo "install"

clean:
    rm -rf some-files

.PHONY: clean

还是上例的Makefile,如果我再touch install创建一个install文件,那么执行make install也会发生这种情况,所以install也要设置为.PHONY

default: aa

.PHONY: clean

.PHONY: install

.DEFAULT:
    echo ".DEFAULT"

install:
    echo "install"

clean:
    rm -rf some-files
打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

关于Makefile