Eric Blake <ebl...@redhat.com> writes: > On 12/4/19 12:56 AM, Markus Armbruster wrote: > >>>> +++ b/Makefile >>>> @@ -130,6 +130,15 @@ GENERATED_QAPI_FILES += qapi/qapi-doc.texi >>>> generated-files-y += $(GENERATED_QAPI_FILES) >>>> +GENERATED_QGA_FILES := qga-qapi-types.c qga-qapi-types.h >>>> +GENERATED_QGA_FILES += qga-qapi-visit.c qga-qapi-visit.h >>>> +GENERATED_QGA_FILES += qga-qapi-commands.h qga-qapi-commands.c >>>> +GENERATED_QGA_FILES += qga-qapi-init-commands.h qga-qapi-init-commands.c >>>> +GENERATED_QGA_FILES += qga-qapi-doc.texi >>>> +GENERATED_QGA_FILES := $(addprefix qga/qapi-generated/, >>>> $(GENERATED_QGA_FILES)) >>> >>> Would it be worth using two separate variable names (maybe >>> GENERATED_QGA_BASEFILES for the first list) rather than exploiting the >>> arcane knowledge that consecutive use of := causes GNU make to rewrite >>> an existing variable with new contents? >> >> Our rules.mak relies on this already. It's full of magic, which >> admittedly diminishes its suitability to serve as a good example. >> >> Your worry might be rooted in old "=" burns. "=" makes the variable >> recursively expanded, and >> >> GENERATED_QGA_FILES = $(addprefix qga/qapi-generated/, >> $(GENERATED_QGA_FILES)) > > Indeed, but I have to refer to the manual to remind myself of whether > = or := is what I want in a given situation.
Trust me, you're either sure you want "=", or you want ":=". On a green field, I recommend a hard rule "no = without a comment explaining why". >> would be an infinite loop. ":=" makes it simply expanded; there's not >> even a loop, let alone an infinite one. The GNU Make manual explains >> this clearly at >> https://www.gnu.org/software/make/manual/html_node/Flavors.html >> >> Aside: there's a reason one of the two flavors is called "simple". It >> could additionally be called "not as slow". One of my pet makefile >> peeves: unthinking use of recursively expanded variables, complicating >> semantics and slowing down builds. >> >> Back to this patch. I had started to write the thing in longhand, but >> got tired of repeating qga/qapi-generated/, so I factored that out. >> Would longhand be easier to understand? > > It's more verbose. My suggestion was more: > > GENERATED_QGA_BASENAMES := qga-qapi-types.c qga-qapi-types.h > GENERATED_QGA_BASENAMES += qga-qapi-visit.c qga-qapi-visit.h > ... > GENERATED_QGA_FILES := $(addprefix qga/qapi-generated/, > $(GENERATED_QGA_BASENAMES)) > > to avoid the reassignment-to-self issue altogether, while still > remaining concise compared to longhand. Either way, we use multiple assignments to build GENERATED_QGA_FILES. The only difference is that the version using two variables would also work with recursive expansion, due to the magic of +=.