On Thu, May 06, 2021 at 10:05:20AM +0900, Junio C Hamano wrote: > As to the simply-expanded vs recursively-expanded variable, there is > aneed to use former, which comes from what the original commit > 07d90ead did outside the context of this patch, which is: > > PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES)) > GIT-PERL-DEFINES: FORCE > @FLAGS='$(PERL_DEFINES)'; \ > if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \ > echo >&2 " * new perl-specific parameters"; \ > echo "$$FLAGS" >$@; \ > fi > > That is, up to this point PERL_DEFINES accumulate various build-time > settings with += (i.e. space separated tokens), and at this point > finally it is turned into a colon separated tokens, which cannot be > written with a recursively expanded variable. > > But I tend to agree that you do not have to := clear the list in > this patch. OK, that matches my understanding. Thanks for laying out. In general, I would say that the later use that you quoted above would do better to use a second variable (because then there is no question of when PERL_DEFINES is space-separated and when it is colon-separated). But that is not that big a deal, and certainly very orthogonal to Ævar's patch. I'd also question whether the colon transformation is even necessary. The point of the file is to change when the values change. Being sloppy with delimiters means we _could_ miss a change, but in practice I doubt it is very likely (and it is not like colons cannot appear in values, either, so they are not foolproof). But again, not really important for this patch. -Peff P.S. I also wondered briefly if make would preserve spaces even for empty variables (since without that, we might miss delimiters and confuse one of the variables for another). I.e., we know that: FOO = $(one):$(two):$(three) will have two colons even if some of the variables are empty. But does it preserve them even for "$(one) $(two) $(three)", or more importantly, when using "+=" (which _would_ be relevant to this patch)? The answer is yes, they are all fine. You can demonstrate it with the Makefile below, running "make one=foo three=bar", "make two=foo", etc. -- >8 -- empty := space := $(empty) $(empty) COLONS = $(one):$(two):$(three) SPACES_SINGLE = $(one) $(two) $(three) SPACES_SINGLE := $(subst $(space),:,$(SPACES_SINGLE)) SPACES_PLUS = SPACES_PLUS += $(one) SPACES_PLUS += $(two) SPACES_PLUS += $(three) SPACES_PLUS := $(subst $(space),:,$(SPACES_PLUS)) all: @echo "COLONS=$(COLONS)" @echo "SPACES_SINGLE=$(SPACES_SINGLE)" @echo "SPACES_PLUS=$(SPACES_PLUS)"