关于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
觉得文章对你有用的话鼓励一下我吧