Therefore, the rm command will be executed every time you say make clean . The phony target will cease to work if anything ever does create a file named clean in this directory. Since it has no dependencies, the file clean would inevitably be considered up to date, and its commands would not be executed. Once this is done, make clean will run the commands regardless of whether there is a file named clean . This is why declaring a target phony is good for performance, even if you are not worried about the actual file existing.
Phony targets can have dependencies.
Since the target remade by default will be the first one in the makefile, it is common to make this a phony target named all and give it, as dependencies, all the individual programs. When one phony target is a dependency of another, it serves as a subroutine of the other.