DEV Community

Simone Gentili
Simone Gentili

Posted on • Edited on

3 3

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.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

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 ^^!

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs