问题
Bash can produce permutations (cartesian product):
$ echo {1,2}{a,b}
1a 1b 2a 2b
I would like to do something similar with a makefile. Here is an example makefile:
all: 1a 1b 2a 2b
I would like something like this if possible:
NOV = 1 2
OSC = a b
all: $(NOV)$(OSC)
However when I use an example like that it just creates "1 2a b" instead of combining them. Is this possible?
回答1:
No need for any complex loops or borrowing from shell. It is much simpler than that.
$(foreach p, $(NOV), $(addprefix $p, $(OSC)))
回答2:
SHELL := /bin/bash
NOV := 1,2
OSC := a,b
NOVW := 1 2
OSCW := a b
EXP := $(shell printf "%s " {$(NOV)}{$(OSC)})
EXPW := $(foreach X,$(NOVW),$(foreach Y,$(OSCW),$(X)$(Y)))
.PHONY: all a b $(EXP) $(EXPW)
all: a b
a: $(EXP)
@echo target a
@printf "my first prerequisite is %s\n" "$<"
@printf "all my prerequisites are %s\n" "$^"
b: $(EXPW)
@echo target b
@printf "my first prerequisite is %s\n" "$<"
@printf "all my prerequisites are %s\n" "$^"
Output:
$ make target a my first prerequisite is 1a all my prerequisites are 1a 1b 2a 2b target b my first prerequisite is 1a all my prerequisites are 1a 1b 2a 2b
Note: the SHELL
is needed because brace expansion isn't a POSIX feature. The shell used by GNU Make is /bin/sh
by default. When Bash is run as /bin/sh
, it doesn't support brace expansion.
来源:https://stackoverflow.com/questions/35028167/makefile-permutation