DEV Community

Simone Gentili
Simone Gentili

Posted on • Edited on

What hell are .phony targets?

A brief introduction to rules

In previous article about this Makefile serie I wrote a very very simple Makefile. Rules are written in a very very simple way:

target_name:
   <instruction 1>
   <instruction 2>
    ....
Enter fullscreen mode Exit fullscreen mode

or a little more complex, but still very simple way:

target_name: another_target
   <instruction 1>
   <instruction 2>
    ....
Enter fullscreen mode Exit fullscreen mode

Sometimes I met something more complex in some open source project or simply in my working projects. Here a little example:

target_name: another_target
   <instruction 1>
   <instruction 2>
    ....
.PHONY :target_name
Enter fullscreen mode Exit fullscreen mode

The question is. What the hell is the .PHONY?

Conflict with a file with the same name

Suppose to have this kind of rule:

bighello:
    echo "hello"
Enter fullscreen mode Exit fullscreen mode

After run make bihello we can see prompted "hello". But what happens when a file called bighello is created in the same folder?

touch bighello
Enter fullscreen mode Exit fullscreen mode

So, ... we have a rule called bighello and a file called in the same way. What happens now when we run bighello?

make bighello                                                                                                                                                                                 
make: `bighello' is up to date.
Enter fullscreen mode Exit fullscreen mode

Here we have a conflict!

Phony targets

This kind of target is not the name of a file. It is just a name for a recipe. A recipe that must be executed when you make an explicit request. This manner to write rules avoids conflicts with a file of the same name.

In other words, ... adding .PHONY to a target will prevent make from confusing the phony target with a file name.

We can rewrite the rule with the .PHONY sintax:

bighello:
    echo "hello"
.PHONY: bighello
Enter fullscreen mode Exit fullscreen mode

Now it works!

Conclusion

As said before, ... .PHONY syntax helps to avoid conflicts with a file of the same name. There is more complexity in this special targets. I think that for non complex usages of Makefile is enough. But if you want to go deep into the phony targets I suggest you to red gnu official documentation about .Phony targes.

Top comments (2)

Collapse
 
iqium profile image
IQIUM

Thank you for your article, I have never understanded what is .phony until I read this.

Collapse
 
sensorario profile image
Simone Gentili

Thank you. Happy to share for comments like this ^^!