2 ms·
Every makefile recipe should produce exactly one output: $@. The makefile as a whole produces an arbitrary number of outputs since rules can depend on other rul
by matheusmoreira 2y ago
Every makefile recipe should produce exactly one output: $@. The makefile as a whole produces an arbitrary number of outputs since rules can depend on other rules.
This leads us to a neat rule of thumb for phony targets: any recipe that does not touch $@ and only $@ should have $@ marked as phony.
I find that keeping track of phony targets with a list makes things much easier.
phonies :=
phonies += something
something:
./do-something
phonies += something-else
something-else: something
./do-something-else
# touches $@ and thus does not need to be phony
create-file:
./generate-some-output > $@
.PHONY: $(phonies)
- Brian_K_White 2y agoI don't know if it's actually saner than just normal phonys but man I like it. What does it get you other than the ability to print the list of all phonys?
- matheusmoreira 2y agoIt's mostly so I can immediately see which targets are phonies. Every phony has a line directly above it adding it to the list of phonies. When a makefile gets complex enough we need all the help we can get. I use phony targets so much I wrote a shell script to parse the makefile database dump into some sort of help text. It doesn't depend on that variable at all. https://github.com/matheusmoreira/.files/blob/master/~/.local/bin/phony-targets https://github.com/matheusmoreira/.files/blob/master/~/.loca... Prints output like: phony1 phony2 dependency1 dependency2
- 153957 2y agoIt is also possible to define `.PHONY` multiple times, so you can simplify this to: .PHONY: something something: ./do-something .PHONY: something-else something-else: something ./do-something-else create-file: ./generate-some-output > $@
- matheusmoreira 2y agoGood tip! Never realized this could be done.