On Fri, 15 Jul 2022, at 10:07 PM, Paul Smith wrote: > There are multiple ways to work around this. One way is to use > secondary expansion[2], which would mean doing something like this:
Thanks! Yes, secondary expansion was what I needed. And thanks for the $(addprefix ...) tip as well. This is what I ended up with, which seems to work for me: ``` find_prerequisites = $(addprefix requirements/,$(shell grep '^[[:blank:]]*\(-r\|-c\)[[:blank:]]*' "requirements/$*.in" | sed 's/^[[:blank:]]*\(-r\|-c\)[[:blank:]]*//')) .SECONDEXPANSION: requirements/%.txt: requirements/%.in $$(find_prerequisites) > @touch -a $(subst requirements.txt,dev.txt,$@) > @tox -qe $(subst requirements,dev,$(basename $(notdir $@))) --run-command > 'pip-compile --allow-unsafe --quiet $(args) $<' .PHONY: requirements requirements/ requirements requirements/: $(foreach file,$(wildcard requirements/*.in),$(basename $(file)).txt) ``` The recipe for compiling a requirements/%.txt file has to do with our particular setup. See the real thing here: https://github.com/hypothesis/lms/pull/4231 Usage: If you've edited one or more requirements/*.in's just run `make requirements` to recompile the *.txt's that need to be recompiled. To upgrade all packages in all *.txt's to their latest versions: make --always-make requirements args=--upgrade To upgrade one package to its latest version in all *.txt's where that package appears: make --always-make requirements args='--upgrade-package foo' To upgrade or downgrade a package to a particular version in all *.txt's where that package appears: make --always-make requirements args='--upgrade-package foo==1.2.3' You can also ask it to compile particular requirements files with `make requirements/foo.txt` or `make requirements/foo.txt requirements/bar.txt`.