----伪目标----
target :
commands
如果makefile 所在目录没有target 同名文件:make target 则导致commands 总是被执行。
如果makefile 所在目录下存在target 同名文件:make target 则commands 不被执行,认为target 总是最新的。
.PHONY:target
target:
commands
不论makefile 所在目录下存不存在与target 同名文件,make target 导致commands 的执行,与上一种写法的区别是引用'.PHONY' 的意义所在。
-----强制目标-----
target:
因为没有命令,所以make target ,与makefile 所在目录下是否存在与target 同名的文件没有直接关系。
-----双冒号规则-----
target::
commands
无论makefile 所在目录下存不存在与target 同名文件,make target 导致commands 的执行,与使用'.PHONY' 定义的伪目标效果相同。
-----------------------------------------------------------------
----------1
.PHONY target
all:target
commands1
# 伪目标
target:
commands
----------2
all:target
commands1
# 伪目标
target:
commands
---------3
all:target
commands1
# 强制目标
target:
---------4
all:target
commands1
# 双冒号规则
target::
commands
1 和4make all 执行情况相同,无论makefile 所在目录下存不存在与target 同名文件,commands1 和commands 都被执行。
2 和3make all 执行情况在makefile 所在目录下存在与target 同名文件,commads 不被执行( 认为target 目标是最新的) ,commands1 将被执行;而如果不存在与target 同名的文件,则2 运行效果与1 和4 相同,3 运行将导致commands1 的执行。
>rm *
>vim Makefile
>cat -n Makefile
1 .PHONY:target1
2 all1:target1
3 echo "all1_target1_.PHONY_command_all1"
4 target1:
5 echo "all1_target1_.PHONY_command_target1"
6
7 all2:target2
8 echo "all2_target2_command_all2"
9 target2:
10 echo "all2_target2_command_target2"
11
12 all3:target3
13 echo "all3_target3_force_command_all3"
14 target3:
15
16 all4:target4
17 echo "all4_target4_::_command_all4"
18 target4::
19 echo "all4_target4_::_command_target4"
20
>make all1
echo "all1_target1_.PHONY_command_target1"
all1_target1_.PHONY_command_target1
echo "all1_target1_.PHONY_command_all1"
all1_target1_.PHONY_command_all1
>make all2
echo "all2_target2_command_target2"
all2_target2_command_target2
echo "all2_target2_command_all2"
all2_target2_command_all2
>make all3
echo "all3_target3_force_command_all3"
all3_target3_force_command_all3
>make all4
echo "all4_target4_::_command_target4"
all4_target4_::_command_target4
echo "all4_target4_::_command_all4"
all4_target4_::_command_all4
>touch target{1,2,3,4}
>ls
>make all1
echo "all1_target1_.PHONY_command_target1"
all1_target1_.PHONY_command_target1
echo "all1_target1_.PHONY_command_all1"
all1_target1_.PHONY_command_all1
>make all2
echo "all2_target2_command_all2"
all2_target2_command_all2
>make all3
echo "all3_target3_force_command_all3"
all3_target3_force_command_all3
>make all4
echo "all4_target4_::_command_target4"
all4_target4_::_command_target4
echo "all4_target4_::_command_all4"
all4_target4_::_command_all4
-----------
以上测试在GNU Make 3.81 版本进行