Re:I Like Makefiles
by ReleaseCandidat on Saturday September 21, 2024 @07:32AM
(#41609305)
I have been unclear in my formulation, sorry.
The problem is a target with more than one output files, that target would look something like, which does work
foo bar: baz
compile $< -o foo -o bar
but as this is the same as writing foo: baz
compile $< -o foo -o bar
bar: baz
compile $< -o foo -o bar
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.
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).
Yes, but this is not particularly relevant to the user. With pattern rules it's trivial to define a large number of targets automatically, such as in the example (from the manual):