Re:I Like Makefiles
by frumiousirc on Saturday September 21, 2024 @07:48AM
(#41609375)
https://www.gnu.org/software/make/manual/html_node/Multiple-...
Scroll down to "Grouped targets". I think these address the concern you raise.
The snippet you have shown is an example of the "independent targets" pattern which the first half of that page also covers.
Re:I Like Makefiles
by ReleaseCandidat on Saturday September 21, 2024 @10:15AM
(#41610126)
Thanks, that's it.
It has been introduced with GNU Make 4.3, January 2020 https://lists.gnu.org/archive/html/info-gnu/2020-01/msg00004...
Re:I Like Makefiles
by robinsonb5 on Saturday September 21, 2024 @07:45AM
(#41609359)
So can that be solved like this, or is there some other subtlety I'm missing?
foo: baz
compile $< -o foo -o bar
bar: foo
(Can someone tell me how to do code tags on HN please? :) Edit: fixed now, thanks!)
Re:I Like Makefiles
by oneeyedpigeon on Saturday September 21, 2024 @07:54AM
(#41609398)
> Text after a blank line that is indented by two or more spaces is reproduced verbatim. (This is intended for code.)
Among other things, now you have to maintain a set of dummy targets. If you have a variable (possibly generated) that is basically
A_MESS_OF_FILES := foo bar zot
You now have to create dummy targets for bar, baz, and zot and not forget to add them. Or maybe break it into MAIN_FILE := foo
SUBORDINATE_FILES := bar zot
foo: baz
sudo make me a foo
$(SUBORDINATE_FILES): %: foo
Re:I Like Makefiles
by ReleaseCandidat on Saturday September 21, 2024 @10:18AM
(#41610151)
Subtlety. Now the dependencies are `baz` -> `foo` -> `bar`, that is `foo` is a temporary target and won't be (re)build if `bar` already exists. Which may or may not be a problem. This temporary target (whatever the actual term is) can be "elevated" to a "normal" target with the use of some special target (which I'm too lazy to look up right now).
The problem is a target with more than one output files, that target would look something like, which does work
but as this is the same as writing to generate `foo` and `bar` the rule is run twice in a parallel build (`make -j 2`. Which may just be unnecessary or it may break the whole build.