5. 伪目标
伪目标 是 Makefile 中不对应文件的目标。
在编写 Makefile 时,通常为了达成某种目标来编写一些规则。但此规则并不是要生成这些目标,而是需要执行这个规则中的命令。我们把这种目标称为伪目标。
示例:
我们改写 Makefile 文件如下:
all: hello # 编译最终目标
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -o hello.o -c hello.c
install: # 安装程序
cp hello /usr/local/bin/
clean: # 清除目标文件
rm hello.o
distclean: # 恢复成源码状态
rm hello.o hello
在上述 Makefile 文件中,我们编写了目标为 all、install、clean 和 distclean 的规则,但我们并不是要生成这些文件,而是使用 make 命令后跟参数就可以执行相应的命令。
上述 Makefile 的执行规则如下:
make或make all生成目标文件和可执行程序。make install将生成的目标安装在指定位置。make clean删除目标文件。make distclean函数目标文件和最终可执行程序,恢复成源码状态。
但上述程序有个问题,就是如果当前目标已经存在,如存在名为 clean 的文件,则 make clean 则不会执行规则中的语句。为此我们要使用 .PHONY 声明来告诉 make 命令,这些目标不需要找对应文件,直接执行即可,这些目标是伪目标。
语法:
.PHONY: 伪目标1 伪目标2 伪目标3
完整示例如下:
# 声明如下目标是伪目标
.PHONY: all install clean distclean
all: hello # 编译最终目标
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -o hello.o -c hello.c
install: # 安装程序
cp hello /usr/local/bin/
clean: # 清除目标文件
rm hello.o
distclean: # 恢复成源码状态
rm hello.o hello
编译结果如下
weimingze@mzstudio:~$ ls
Makefile hello.c
weimingze@mzstudio:~$ make
gcc -o hello.o -c hello.c
gcc -o hello hello.o
weimingze@mzstudio:~$ ls
Makefile hello hello.c hello.o
weimingze@mzstudio:~$ make distclean
rm hello.o hello
weimingze@mzstudio:~$ ls
Makefile hello.c
weimingze@mzstudio:~$ make all
gcc -o hello.o -c hello.c
gcc -o hello hello.o
weimingze@mzstudio:~$ ls
Makefile hello hello.c hello.o
weimingze@mzstudio:~$ make clean
rm hello.o
weimingze@mzstudio:~$ ls
Makefile hello hello.c
用户标准目标
在使用 Makefile 时,为了统一伪目标的用法,Makefile 规定了 用户标准目标,这些目标如下表所示
标准目标
说明
all编译整个程序。这应该是缺省的目标。
install安装编译后的可执行程序到系统中。
uninstall卸载安装,
install 的反向操作。clean删除当前目录下创建目标程序时的所有中间文件。
distclean删除所有中间文件和最终程序,恢复源码状态。
check执行自我检查。
实验:
在上述示例中,在本地创建一个名为 clean 的文件,然后执行 make clean 规则 clean: 中的命令是否执行。