.PHONY Targets Explained

Understand .PHONY in Makefiles: why it exists, when to use it, performance implications, and common mistakes with phony targets.

Reference

Detailed Explanation

Understanding .PHONY

The .PHONY declaration is one of the most important and misunderstood features in Make. It tells Make that a target name does not represent a real file.

The Problem Without .PHONY

clean:
	rm -rf build/

If a file or directory named clean exists in your project, running make clean would say:

make: 'clean' is up to date.

Make checks if the file clean exists and has no prerequisites that are newer. Since it exists and has no dependencies, Make considers it up to date and skips the recipe.

The Solution

.PHONY: clean
clean:
	rm -rf build/

With .PHONY, Make always runs the recipe regardless of whether a file named clean exists. The recipe is unconditionally executed.

When to Use .PHONY

Always use .PHONY for:

  • Action targets: all, clean, install, uninstall
  • Workflow targets: test, lint, check, deploy
  • Alias targets: build, run, dev

Do NOT use .PHONY for:

  • Targets that produce files: main.o, app, libutils.a
  • Pattern rules: %.o: %.c

Grouping .PHONY Declarations

# Option 1: Single declaration
.PHONY: all build test lint clean install

# Option 2: Per-target declarations (more readable for large files)
.PHONY: build
build:
	go build -o bin/app ./...

.PHONY: test
test:
	go test ./...

Both styles are valid. A single declaration is concise; per-target declarations keep the .PHONY close to its target.

Performance Impact

.PHONY targets are always considered out of date. If a phony target is a prerequisite of a file-producing target, that target will always be rebuilt:

.PHONY: force
data.json: force
	curl -o $@ https://api.example.com/data

This technique forces unconditional rebuilding of data.json every time.

Common Mistakes

  • Forgetting .PHONY on clean — fails if a clean file exists
  • Making file-producing targets .PHONY — forces unnecessary rebuilds
  • Declaring all as .PHONY but not its dependencies — partial effect

Use Case

Understanding and correctly applying .PHONY declarations in any Makefile to ensure action targets always execute and file-producing targets use dependency checking properly.

Try It — Makefile Generator

Open full tool