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 文件中,我们编写了目标为 allinstallcleandistclean 的规则,但我们并不是要生成这些文件,而是使用 make 命令后跟参数就可以执行相应的命令。

上述 Makefile 的执行规则如下:

  1. makemake all 生成目标文件和可执行程序。
  2. make install 将生成的目标安装在指定位置。
  3. make clean 删除目标文件。
  4. 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: 中的命令是否执行。