Minimal example: $ cat makefile $(shell rm -rf /tmp/blah) $(shell mkdir -p /tmp/blah) ASDF = $(info $1 $(wildcard /tmp/blah/*) $(if ${BLAH},$(info before $(wildcard /tmp/blah/*))) $(shell touch /tmp/blah/{a,b,c}.txt) $(info after $(wildcard /tmp/blah/*.txt))
$ make --version GNU Make 4.1 ...snip... $ make after /tmp/blah/a.txt /tmp/blah/b.txt /tmp/blah/c.txt make: *** No targets. Stop. $ make BLAH= before after make: *** No targets. Stop. Take note: I specified different strings in each wildcard: $(info before $(wildcard /tmp/blah/*)) $(info after $(wildcard /tmp/blah/*.txt)) -brian On Fri, Nov 30, 2018 at 5:40 AM Gaëtan Harter <gaetan.har...@fu-berlin.de> wrote: > Hello, > > > I tried to use `wildcard` in place of doing `ls` and found some > limitation I did not know about. > > I faced the issue that, even with deferred variables, the value of > `wildcard` was cached to the value it has on first evaluation and does > not reflect the last state of the filesystem. > > Which makes adding `$(info $(VARIABLE_VALUE))` change the behavior. > > > In my case, if I do not want to change the original behavior, I need to > do twice `ls` to have the initial and the final state, as I cannot > before running, know the name of the target directory. > It is generated by `scan-build` that uses a dynamic name. > I could move it to a fixed name, but that would be working around > instead of understanding if there is a low level solution. > > Also I did not find any reference in the documentation on the behavior > or any way to force re-evaluating `wildcard` and it took me a while to > understand what was happening. Maybe I looked in the wrong place and the > right link would also be a good answer. > > > ### Testing procedure > > > I tested with make from `ubuntu bionic` and also on another machine > using `arch linux`, so more recent, but do not have the version number. > > make --version > GNU Make 4.1 > > In the following test snippet [1], I would imagine that doing > > make and make EVALUATE_WILDCARD=1 would both work > > But when doing `make EVALUATE_WILDCARD=1` the last `test -f` uses the > value of the first time where `wildcard` was evaluated. > > Any hint on how to force the evaluation again, or a way to do twice this > `ls` without relying on the shell is welcome. > I know I can just use a fixed name, or use the shell but that would be > working around before understanding :) > > > Thank you in advance. > > Best regards, > Gaëtan > > > 1: > > # I am trying to use `wildcard` as a way to do `ls`. > # > # > # This simulate a local use case of `scan-build`. > # > # The final name '$(OUTDIR)/*/index.html' is not known in advance. > # It is generated by 'scan-build' so not predictable directory name. > # > # I tried to get the name using `wildcard` but if wildcard > # is used before, the initial value is returned. > # > # Try running 'make' and 'make EVALUATE_WILCARD=1' > > OUTDIR = tmp > OUTPUT_FILE = $(addsuffix /index.html,$(wildcard $(OUTDIR)/*)) > > # Just be sure about the initial context > # One file in 'tmp/a/index.html' > $(shell rm -rf $(OUTDIR)/*) > $(shell mkdir -p $(OUTDIR)/a) > $(shell touch $(OUTDIR)/a/index.html) > > > ifneq (,$(EVALUATE_WILDCARD)) > $(info Evaluate `wildcard` before creating the new file) > $(info OUTPUT_FILE=$(OUTPUT_FILE)) > endif > > .PHONY: all create clean > > all: create > test -f $(OUTPUT_FILE) > > create: clean > mkdir -p $(OUTDIR)/b/ > touch $(OUTDIR)/b/index.html > > clean: > rm -rf $(OUTDIR)/ > > > > > > > > _______________________________________________ > Bug-make mailing list > Bug-make@gnu.org > https://lists.gnu.org/mailman/listinfo/bug-make >
_______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make